> ## Documentation Index
> Fetch the complete documentation index at: https://tbd-6fc993ce-hypeship-docs-ia-v2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Scrapybara

[Scrapybara](https://scrapybara.com/) 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](/browsers/profiles). 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**

```python theme={null}
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**

```python theme={null}
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**

```python theme={null}
# 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**

```python theme={null}
# 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**

```python theme={null}
instance = client.start_browser()
# ... trigger download in browser ...
# Then use file operations
downloaded_file = instance.file(command="read", path="/download/path")
```

**Kernel**

```python theme={null}
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**

```python theme={null}
# 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**

```python theme={null}
# 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**

```python theme={null}
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**

```python theme={null}
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](/browsers/computer-controls).

## 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](/browsers/profiles). 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](/proxies/overview#create-a-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 |

***

## Need Help?

* **Contact Us** on [Discord](https://discord.gg/FBrveQRcud)
* **Sign up** [here](https://dashboard.onkernel.com/sign-up)
* **Check out** our open source repos [here](https://github.com/onkernel/kernel-images)
