Scrapybara
Scrapybara has shut down their virtual desktop and browser service as of October 15, 2025. If you were using Scrapybara for browser automation, Kernel is here to help you migrate seamlessly.
Key Concepts
| Feature | Scrapybara | Kernel |
|---|---|---|
| Start Browser | client.start_browser() | kernel.browsers.create() |
| Standby Mode | instance.pause() / instance.resume() | Automatic standby mode |
| CDP URL | instance.get_cdp_url().cdp_url | Returns cdp_ws_url in create response |
| Live View | instance.get_stream_url().stream_url | Returns browser_live_view_url in create response |
| Stealth Mode | ❌ Not available | Create browser with stealth: true |
| Replays | ❌ Not available | kernel.browsers.replays.start() and kernel.browsers.replays.stop() |
| Save Auth | instance.browser.save_auth(name="default") | Create Profile. Then create browser with kernel.browsers.create(profile={"name": "profile1", "save_changes": true}) |
| Click | instance.computer(action="click_mouse", button="left") | kernel.browsers.computer.click_mouse(id=session_id, x=100, y=200) |
| Drag | instance.computer(action="drag_mouse", path=[[100, 200], [300, 400]]) | kernel.browsers.computer.drag_mouse(id=session_id, path=[[100, 200], [150, 220], [200, 260]]) |
| Screenshot | instance.computer(action="take_screenshot").base64_image | kernel.browsers.computer.capture_screenshot(id=session_id) |
How to migrate
Basic Browser Creation
Scrapybara
from scrapybara import Scrapybara
from playwright.async_api import async_playwright
client = Scrapybara(api_key="your_api_key")
instance = client.start_browser(timeout_hours=1)
cdp_url = instance.get_cdp_url().cdp_url
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(cdp_url)
page = browser.contexts[0].pages[0]
await page.goto("https://example.com")
await browser.close()
instance.stop()Kernel
from kernel import Kernel
from playwright.async_api import async_playwright
kernel = Kernel()
kernel_browser = kernel.browsers.create(timeout_seconds=3600)
cdp_url = kernel_browser.cdp_ws_url
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(cdp_url)
page = browser.contexts[0].pages[0]
await page.goto("https://example.com")
await browser.close()
await kernel.browsers.delete_by_id(kernel_browser.session_id)Save & Reuse Authentication
Scrapybara
# First session - save auth
instance = client.start_browser()
# ... login to website via Playwright ...
auth_state = instance.browser.save_auth(name="my-login")
instance.stop()
# Second session - load auth
instance2 = client.start_browser()
instance2.browser.authenticate(auth_state_id=auth_state.auth_state_id)
# ... browser now has saved cookies ...Kernel
# First session - save auth
profile = await kernel.profiles.create(name="my-login")
kernel_browser = await kernel.browsers.create(
profile={"name": "my-login", "save_changes": True}
)
# ... login to website via Playwright ...
await kernel.browsers.delete_by_id(kernel_browser.session_id)
# Second session - load auth
kernel_browser2 = await kernel.browsers.create(
profile={"name": "my-login"}
)
# ... browser now has saved cookies ...File Download
Scrapybara
instance = client.start_browser()
# ... trigger download in browser ...
# Then use file operations
downloaded_file = instance.file(command="read", path="/download/path")Kernel
kernel_browser = await kernel.browsers.create()
# ... trigger download in browser via Playwright ...
# Then read from filesystem
file_response = await kernel.browsers.fs.read_file(
kernel_browser.session_id,
path="/tmp/downloads/file.pdf"
)
await file_response.write_to_file("local-file.pdf")Long-Running Sessions
Scrapybara
# Pause/resume for long-running sessions
instance = client.start_browser(timeout_hours=24)
# ... do some work ...
instance.pause() # Pause to save costs
# ... later ...
instance.resume() # Resume workKernel
# Automatic standby mode + extended timeout
kernel_browser = await kernel.browsers.create(
timeout_seconds=86400
)
# ... do some work ...
# Browser enters standby mode between connections
# Later - reuse the exact browser instance with full state
kernel_browser2 = await kernel.browsers.create(
timeout_seconds=86400
)Computer Controls
Both Scrapybara and Kernel provide Computer Controls APIs that allow you to programmatically control the browser environment at the system level - including mouse movements, clicks, keyboard input, and screenshots.
Scrapybara
instance = client.start_browser()
# Click at specific coordinates
instance.computer(action="click_mouse", button="right", coordinates=[300, 400])
# Drag from one position to another
instance.computer(action="drag_mouse", path=[[100, 200], [300, 400]])
# Type text
instance.computer(action="type_text", text="Hello World")
# Take a screenshot
screenshot = instance.computer(action="take_screenshot").base64_imageKernel
kernel_browser = await kernel.browsers.create()
# Click at specific coordinates
kernel.browsers.computer.click_mouse(
id=kernel_browser.session_id,
x=100,
y=200
)
# Drag from one position to another
kernel.browsers.computer.drag_mouse(
id=kernel_browser.session_id,
path=[[100, 200], [150, 220], [200, 260]],
button="left",
delay=0,
steps_per_segment=10,
step_delay_ms=50,
hold_keys=["Shift"]
)
# Type text with optional delay
kernel.browsers.computer.type_text(
id=kernel_browser.session_id,
text="Hello World",
delay=100
)
# Take a full screenshot
with open('screenshot.png', 'wb') as f:
image_data = kernel.browsers.computer.capture_screenshot(id=kernel_browser.session_id)
f.write(image_data.read())For a complete reference of all available Computer Controls methods in Kernel, see the Computer Controls documentation.
Full API Comparison
| Feature | Scrapybara | Kernel |
|---|---|---|
| Create Browser | client.start_browser() | kernel.browsers.create() |
| Get CDP URL | instance.get_cdp_url().cdp_url | Returns cdp_ws_url in create response |
| Get Live View | instance.get_stream_url().stream_url | Returns browser_live_view_url in create response |
| Delete Browser | instance.stop() | kernel.browsers.delete_by_id(session_id) |
| List Browsers | kernel.get_instances() | kernel.browsers.list() |
| Save Auth State | instance.browser.save_auth(name="default") | Create Profile. Then create browser with kernel.browsers.create(profile={"name": "profile1", "save_changes": True}) |
| Load Auth State | instance.browser.authenticate(auth_state_id="xyz") | kernel.browsers.create(profile={"name": "profile1"}) |
| Pause/Resume | instance.pause() / instance.resume() | Automatic standby mode |
| Screenshot | instance.screenshot() | Use Playwright or Puppeteer |
| Timeout Config | timeout_hours parameter | timeout_seconds parameter |
| Stealth Mode | ❌ Not available | Create browser with stealth: true |
| Headless Mode | ❌ Not available | Create browser with headless: true |
| Session Persistence | Auth state only | Full browser state via creating browser with extended timeout |
| Video Replays | ❌ Not available | kernel.browsers.replays.start() and kernel.browsers.replays.stop() |
| File Upload | instance.upload() | kernel.browsers.fs.upload() or Playwright |
| File Download | Via browser, then instance.file() | kernel.browsers.fs.read_file() |
| Process Control | instance.bash() | kernel.browsers.process.* |
| Proxy Support | ❌ Not available | Create Proxy. Then create browser with kernel.browsers.create(proxy_id=proxy.id) |
| Click Mouse | instance.computer(action="click_mouse", button="left") | kernel.browsers.computer.click_mouse(id=session_id, x=100, y=200) |
| Move Mouse | instance.computer(action="move_mouse", coordinates=[100, 200]) | kernel.browsers.computer.move_mouse(id=session_id, x=100, y=200) |
| Drag Mouse | instance.computer(action="drag_mouse", path=[[100, 200], [300, 400]]) | kernel.browsers.computer.drag_mouse(id=session_id, path=[[100, 200], [150, 220], [200, 260]]) |
| Scroll | instance.computer(action="scroll", coordinates=[100, 100], delta_x=0, delta_y=200) | kernel.browsers.computer.scroll(id=session_id, delta_x=0, delta_y=100) |
| Type Text | instance.computer(action="type_text", text="Hello") | kernel.browsers.computer.type_text(id=session_id, text="Hello") |
| Press Key | instance.computer(action="press_key", keys=["ctrl", "c"]) | kernel.browsers.computer.press_key(id=session_id, keys=["Ctrl+t"]) |
| Take Screenshot | instance.computer(action="take_screenshot").base64_image | kernel.browsers.computer.capture_screenshot(id=session_id) |
| Get Cursor Position | instance.computer(action="get_cursor_position").output | Use move_mouse with tracking |