Skip to main content
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

FeatureScrapybaraKernel
Start Browserclient.start_browser()kernel.browsers.create()
Standby Modeinstance.pause() / instance.resume()Automatic standby mode
CDP URLinstance.get_cdp_url().cdp_urlReturns cdp_ws_url in create response
Live Viewinstance.get_stream_url().stream_urlReturns browser_live_view_url in create response
Stealth Mode❌ Not availableCreate browser with stealth: true
Replays❌ Not availablekernel.browsers.replays.start() and kernel.browsers.replays.stop()
Save Authinstance.browser.save_auth(name="default")Create Profile. Then create browser with kernel.browsers.create(profile={"name": "profile1", "save_changes": true})
Clickinstance.computer(action="click_mouse", button="left")kernel.browsers.computer.click_mouse(id=session_id, x=100, y=200)
Draginstance.computer(action="drag_mouse", path=[[100, 200], [300, 400]])kernel.browsers.computer.drag_mouse(id=session_id, path=[[100, 200], [150, 220], [200, 260]])
Screenshotinstance.computer(action="take_screenshot").base64_imagekernel.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 work
Kernel
# Automatic standby mode + persistence
kernel_browser = await kernel.browsers.create(
    persistence={"id": "my-long-session"}
)
# ... do some work ...
# Browser enters standby mode between connections

# Later - reuse the exact browser instance with full state
kernel_browser2 = await kernel.browsers.create(
    persistence={"id": "my-long-session"}
)

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_image
Kernel
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

FeatureScrapybaraKernel
Create Browserclient.start_browser()kernel.browsers.create()
Get CDP URLinstance.get_cdp_url().cdp_urlReturns cdp_ws_url in create response
Get Live Viewinstance.get_stream_url().stream_urlReturns browser_live_view_url in create response
Delete Browserinstance.stop()kernel.browsers.delete_by_id(session_id)
List Browserskernel.get_instances()kernel.browsers.list()
Save Auth Stateinstance.browser.save_auth(name="default")Create Profile. Then create browser with kernel.browsers.create(profile={"name": "profile1", "save_changes": True})
Load Auth Stateinstance.browser.authenticate(auth_state_id="xyz")kernel.browsers.create(profile={"name": "profile1"})
Pause/Resumeinstance.pause() / instance.resume()Automatic standby mode
Screenshotinstance.screenshot()Use Playwright or Puppeteer
Timeout Configtimeout_hours parametertimeout_seconds parameter
Stealth Mode❌ Not availableCreate browser with stealth: true
Headless Mode❌ Not availableCreate browser with headless: true
Session PersistenceAuth state onlyFull browser state via creating browser with persistence={"id": "persist-id"}
Video Replays❌ Not availablekernel.browsers.replays.start() and kernel.browsers.replays.stop()
File Uploadinstance.upload()kernel.browsers.fs.upload() or Playwright
File DownloadVia browser, then instance.file()kernel.browsers.fs.read_file()
Process Controlinstance.bash()kernel.browsers.process.*
Proxy Support❌ Not availableCreate Proxy. Then create browser with kernel.browsers.create(proxy_id=proxy.id)
Click Mouseinstance.computer(action="click_mouse", button="left")kernel.browsers.computer.click_mouse(id=session_id, x=100, y=200)
Move Mouseinstance.computer(action="move_mouse", coordinates=[100, 200])kernel.browsers.computer.move_mouse(id=session_id, x=100, y=200)
Drag Mouseinstance.computer(action="drag_mouse", path=[[100, 200], [300, 400]])kernel.browsers.computer.drag_mouse(id=session_id, path=[[100, 200], [150, 220], [200, 260]])
Scrollinstance.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 Textinstance.computer(action="type_text", text="Hello")kernel.browsers.computer.type_text(id=session_id, text="Hello")
Press Keyinstance.computer(action="press_key", keys=["ctrl", "c"])kernel.browsers.computer.press_key(id=session_id, keys=["Ctrl+t"])
Take Screenshotinstance.computer(action="take_screenshot").base64_imagekernel.browsers.computer.capture_screenshot(id=session_id)
Get Cursor Positioninstance.computer(action="get_cursor_position").outputUse move_mouse with tracking

Need Help?