Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@
]
},
"integrations/magnitude",
{
"group": "Migrations",
"pages": [
"integrations/migrations/scrapybara/scrapybara"
]
},
"integrations/stagehand",
"integrations/valtown",
"integrations/vercel"
Expand Down
198 changes: 198 additions & 0 deletions integrations/migrations/scrapybara/scrapybara.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
---
title: "Scrapybara"
---

Scrapybara is shutting down their cloud browser service on **October 15, 2025**. If you're currently using Scrapybara for browser automation, Kernel is here to help you migrate seamlessly.

This guide shows you how to migrate your Scrapybara browser automation code to Kernel with minimal changes to your existing workflow.

---

## Browser API Comparison

| Feature | Scrapybara | Kernel |
|---------|-----------|--------|
| **Create Browser** | `client.start_browser()` → `instance.browser.start()` | `client.browsers.create()` |
| **Get CDP URL** | `instance.browser.get_cdp_url()` | Returns `cdp_ws_url` in create response |
| **Get Live View** | `instance.get_stream_url()` | Returns `browser_live_view_url` in create response |
| **Delete Browser** | `instance.browser.stop()` | `client.browsers.deleteByID(session_id)` |
| **List Browsers** | `client.get_instances()` | `client.browsers.list()` |
| **Save Auth State** | `instance.browser.save_auth(name)` | Create profile with `save_changes: true` |
| **Load Auth State** | `instance.browser.authenticate(auth_state_id)` | `client.browsers.create({ profile: { name } })` |
| **Pause/Resume** | `instance.pause()` / `instance.resume()` | Automatic standby mode (no manual control) |
| **Screenshot** | `instance.screenshot()` | Use Playwright after CDP connection |
| **Timeout Config** | `timeout_hours` parameter | `timeout_seconds` parameter |
| **Stealth Mode** | ❌ Not available | `stealth: true` parameter |
| **Headless Mode** | Not explicitly documented | `headless: true` parameter |
| **Session Persistence** | Auth state only | Full state via `persistence: { id }` |
| **Video Replays** | ❌ Not available | `client.browsers.replays.*` |
| **File Upload** | `instance.upload()` | `client.browsers.fs.upload()` or Playwright |
| **File Download** | Via browser, then `instance.file()` | `client.browsers.fs.readFile()` |
| **Process Control** | `instance.bash()` | `client.browsers.process.*` |
| **Proxy Support** | Not documented | `proxy_id` parameter + `client.proxies.*` |

---

## Migration Examples

### 1. Basic Browser Creation & CDP Connection

#### Scrapybara
```python
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)
browser_session = instance.browser.start()
cdp_url = browser_session.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.browser.stop()
```

#### Kernel
```python
from kernel import Kernel
from playwright.async_api import async_playwright

client = Kernel(api_key="your_api_key")
kernel_browser = client.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 client.browsers.delete_by_id(kernel_browser.session_id)
```

---

### 2. Save & Reuse Authentication

#### Scrapybara
```python
# First session - save auth
instance = client.start_browser()
instance.browser.start()
# ... 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.start()
instance2.browser.authenticate(auth_state.auth_state_id)
# ... browser now has saved cookies ...
```

#### Kernel
```python
# First session - save auth
profile = await client.profiles.create(name="my-login")
browser1 = await client.browsers.create(
profile={"name": "my-login", "save_changes": True}
)
# ... login to website via Playwright ...
await client.browsers.delete_by_id(browser1.session_id)

# Second session - load auth
browser2 = await client.browsers.create(
profile={"name": "my-login"}
)
# ... browser now has saved cookies ...
```

---

### 3. Stealth Mode & Anti-Detection

#### Scrapybara
```python
# No built-in stealth mode
instance = client.start_browser()
# Must handle anti-detection manually or use external tools
```

#### Kernel
```python
# Built-in stealth mode with CAPTCHA solving
browser = await client.browsers.create(
stealth=True # Enables proxy + auto CAPTCHA solver
)
```

---

### 4. File Download

#### Scrapybara
```python
instance = client.start_browser()
# ... trigger download in browser ...
# Then use file operations
downloaded_file = instance.file(action="read", path="/download/path")
```

#### Kernel
```python
browser = await client.browsers.create()
# ... trigger download in browser via Playwright ...
# Then read from filesystem
file_response = await client.browsers.fs.read_file(
browser.session_id,
path="/tmp/downloads/file.pdf"
)
await file_response.write_to_file("local-file.pdf")
```

---

### 5. Long-Running Sessions

#### Scrapybara
```python
# 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
# Automatic standby mode + persistence
browser = await client.browsers.create(
persistence={"id": "my-long-session"},
timeout_seconds=86400 # 24 hours
)
# ... do some work ...
await client.browsers.delete_by_id(browser.session_id)

# Later - automatically restored with full state
browser2 = await client.browsers.create(
persistence={"id": "my-long-session"}
)
# Browser state fully restored (DOM, cookies, zoom, etc.)
```

---

## Need Help?

* **Documentation**: [docs.onkernel.com](https://www.onkernel.com/docs/introduction)
* **Dashboard**: [dashboard.onkernel.com](https://dashboard.onkernel.com)
* **Quick Templates**: `npx @onkernel/create-kernel-app`

---

*Welcome to Kernel! We're excited to help you build crazy fast, reliable browser automations.*