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
Scrapybarafrom 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()
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 ...
# 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
Scrapybarainstance = client.start_browser()
# ... trigger download in browser ...
# Then use file operations
downloaded_file = instance.file(command="read", path="/download/path")
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
# 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. Scrapybarainstance = 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_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())
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 |