From c39da853c97f2bb737c48939c10504cdeb00fb38 Mon Sep 17 00:00:00 2001 From: "tembo-io[bot]" <208362400+tembo-io[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 01:43:43 +0000 Subject: [PATCH 01/10] docs: Add Scrapybara migration guide --- docs.json | 6 + .../migrations/scrapybara/scrapybara.mdx | 198 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 integrations/migrations/scrapybara/scrapybara.mdx diff --git a/docs.json b/docs.json index a89271b..d5472e6 100644 --- a/docs.json +++ b/docs.json @@ -106,6 +106,12 @@ ] }, "integrations/magnitude", + { + "group": "Migrations", + "pages": [ + "integrations/migrations/scrapybara/scrapybara" + ] + }, "integrations/stagehand", "integrations/valtown", "integrations/vercel" diff --git a/integrations/migrations/scrapybara/scrapybara.mdx b/integrations/migrations/scrapybara/scrapybara.mdx new file mode 100644 index 0000000..f974d4f --- /dev/null +++ b/integrations/migrations/scrapybara/scrapybara.mdx @@ -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.* From be8364307c1aaa4c126b6614a6eab8b4b0ceec89 Mon Sep 17 00:00:00 2001 From: "tembo-io[bot]" <208362400+tembo-io[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 01:52:08 +0000 Subject: [PATCH 02/10] docs(scrapybara): update shutdown notice for virtual desktop service --- integrations/migrations/scrapybara/scrapybara.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/migrations/scrapybara/scrapybara.mdx b/integrations/migrations/scrapybara/scrapybara.mdx index f974d4f..28663fe 100644 --- a/integrations/migrations/scrapybara/scrapybara.mdx +++ b/integrations/migrations/scrapybara/scrapybara.mdx @@ -2,7 +2,7 @@ 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. +Scrapybara is shutting down their virtual desktop and 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. From cc2ea4476dcc9d6de9ba81e01de5f6cf09ea039a Mon Sep 17 00:00:00 2001 From: "tembo-io[bot]" <208362400+tembo-io[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 02:11:34 +0000 Subject: [PATCH 03/10] docs: add key concepts section and move full API comparison --- .../migrations/scrapybara/scrapybara.mdx | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/integrations/migrations/scrapybara/scrapybara.mdx b/integrations/migrations/scrapybara/scrapybara.mdx index 28663fe..6f0e825 100644 --- a/integrations/migrations/scrapybara/scrapybara.mdx +++ b/integrations/migrations/scrapybara/scrapybara.mdx @@ -8,28 +8,17 @@ This guide shows you how to migrate your Scrapybara browser automation code to K --- -## Browser API Comparison +## Key Concepts | 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 | +| **Start Browser** | `client.start_browser()` → `instance.browser.start()` | `client.browsers.create()` | +| **Standby Mode** | `instance.pause()` / `instance.resume()` | Automatic standby mode (no manual control) | +| **CDP URL** | `instance.browser.get_cdp_url()` | Returns `cdp_ws_url` in create response | +| **Live View** | `instance.get_stream_url()` | Returns `browser_live_view_url` in create response | | **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.*` | +| **Replays** | ❌ Not available | `client.browsers.replays.*` | +| **Save Auth** | `instance.browser.save_auth(name)` | Create profile with `save_changes: true` | --- @@ -187,6 +176,33 @@ browser2 = await client.browsers.create( --- +--- + +## Full 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.*` | + +--- + ## Need Help? * **Documentation**: [docs.onkernel.com](https://www.onkernel.com/docs/introduction) From 3b4d16b2ad7ede9f8eb1f8e950db374bf200d606 Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Wed, 1 Oct 2025 19:21:10 -0700 Subject: [PATCH 04/10] Move migrations section --- docs.json | 12 ++++++------ .../scrapybara => migrations}/scrapybara.mdx | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) rename {integrations/migrations/scrapybara => migrations}/scrapybara.mdx (95%) diff --git a/docs.json b/docs.json index d5472e6..def92e1 100644 --- a/docs.json +++ b/docs.json @@ -106,17 +106,17 @@ ] }, "integrations/magnitude", - { - "group": "Migrations", - "pages": [ - "integrations/migrations/scrapybara/scrapybara" - ] - }, "integrations/stagehand", "integrations/valtown", "integrations/vercel" ] }, + { + "group": "Migrations", + "pages": [ + "migrations/scrapybara" + ] + }, { "group": "Community", "pages": [ diff --git a/integrations/migrations/scrapybara/scrapybara.mdx b/migrations/scrapybara.mdx similarity index 95% rename from integrations/migrations/scrapybara/scrapybara.mdx rename to migrations/scrapybara.mdx index 6f0e825..543e5ba 100644 --- a/integrations/migrations/scrapybara/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -2,7 +2,7 @@ title: "Scrapybara" --- -Scrapybara is shutting down their virtual desktop and browser service on **October 15, 2025**. If you're currently using Scrapybara for browser automation, Kernel is here to help you migrate seamlessly. +[Scrapybara](https://scrapybara.com/) is shutting down their virtual desktop and 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. @@ -13,7 +13,7 @@ This guide shows you how to migrate your Scrapybara browser automation code to K | Feature | Scrapybara | Kernel | |---------|-----------|--------| | **Start Browser** | `client.start_browser()` → `instance.browser.start()` | `client.browsers.create()` | -| **Standby Mode** | `instance.pause()` / `instance.resume()` | Automatic standby mode (no manual control) | +| **Standby Mode** | `instance.pause()` / `instance.resume()` | Automatic standby mode | | **CDP URL** | `instance.browser.get_cdp_url()` | Returns `cdp_ws_url` in create response | | **Live View** | `instance.get_stream_url()` | Returns `browser_live_view_url` in create response | | **Stealth Mode** | ❌ Not available | `stealth: true` parameter | @@ -189,7 +189,7 @@ browser2 = await client.browsers.create( | **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) | +| **Pause/Resume** | `instance.pause()` / `instance.resume()` | Automatic standby mode | | **Screenshot** | `instance.screenshot()` | Use Playwright after CDP connection | | **Timeout Config** | `timeout_hours` parameter | `timeout_seconds` parameter | | **Stealth Mode** | ❌ Not available | `stealth: true` parameter | From 26d235403b6dda634de49c4ccccf4899b3e1b0ca Mon Sep 17 00:00:00 2001 From: Catherine Jue Date: Wed, 1 Oct 2025 19:23:29 -0700 Subject: [PATCH 05/10] Merge --- migrations/scrapybara.mdx | 75 ++++++++++----------------------------- 1 file changed, 19 insertions(+), 56 deletions(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index 543e5ba..d548600 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -4,10 +4,6 @@ title: "Scrapybara" [Scrapybara](https://scrapybara.com/) is shutting down their virtual desktop and 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. - ---- - ## Key Concepts | Feature | Scrapybara | Kernel | @@ -20,13 +16,11 @@ This guide shows you how to migrate your Scrapybara browser automation code to K | **Replays** | ❌ Not available | `client.browsers.replays.*` | | **Save Auth** | `instance.browser.save_auth(name)` | Create profile with `save_changes: true` | ---- +## How to migrate -## Migration Examples +### Basic Browser Creation -### 1. Basic Browser Creation & CDP Connection - -#### Scrapybara +**Scrapybara** ```python from scrapybara import Scrapybara from playwright.async_api import async_playwright @@ -45,7 +39,7 @@ async with async_playwright() as p: instance.browser.stop() ``` -#### Kernel +**Kernel** ```python from kernel import Kernel from playwright.async_api import async_playwright @@ -63,11 +57,9 @@ async with async_playwright() as p: await client.browsers.delete_by_id(kernel_browser.session_id) ``` ---- - -### 2. Save & Reuse Authentication +### Save & Reuse Authentication -#### Scrapybara +**Scrapybara** ```python # First session - save auth instance = client.start_browser() @@ -83,7 +75,7 @@ instance2.browser.authenticate(auth_state.auth_state_id) # ... browser now has saved cookies ... ``` -#### Kernel +**Kernel** ```python # First session - save auth profile = await client.profiles.create(name="my-login") @@ -100,30 +92,9 @@ browser2 = await client.browsers.create( # ... 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 +### File Download -#### Scrapybara +**Scrapybara** ```python instance = client.start_browser() # ... trigger download in browser ... @@ -131,7 +102,7 @@ instance = client.start_browser() downloaded_file = instance.file(action="read", path="/download/path") ``` -#### Kernel +**Kernel** ```python browser = await client.browsers.create() # ... trigger download in browser via Playwright ... @@ -143,11 +114,9 @@ file_response = await client.browsers.fs.read_file( await file_response.write_to_file("local-file.pdf") ``` ---- - -### 5. Long-Running Sessions +### Long-Running Sessions -#### Scrapybara +**Scrapybara** ```python # Pause/resume for long-running sessions instance = client.start_browser(timeout_hours=24) @@ -157,7 +126,7 @@ instance.pause() # Pause to save costs instance.resume() # Resume work ``` -#### Kernel +**Kernel** ```python # Automatic standby mode + persistence browser = await client.browsers.create( @@ -174,9 +143,6 @@ browser2 = await client.browsers.create( # Browser state fully restored (DOM, cookies, zoom, etc.) ``` ---- - ---- ## Full API Comparison @@ -190,25 +156,22 @@ browser2 = await client.browsers.create( | **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 | -| **Screenshot** | `instance.screenshot()` | Use Playwright after CDP connection | +| **Screenshot** | `instance.screenshot()` | Use Playwright or Puppeteer | | **Timeout Config** | `timeout_hours` parameter | `timeout_seconds` parameter | | **Stealth Mode** | ❌ Not available | `stealth: true` parameter | -| **Headless Mode** | Not explicitly documented | `headless: true` parameter | +| **Headless Mode** | ❌ Not available | `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.*` | +| **Proxy Support** | ❌ Not available | `proxy_id` parameter + `client.proxies.*` | --- ## 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` - ---- +* **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) -*Welcome to Kernel! We're excited to help you build crazy fast, reliable browser automations.* From 01a6895c6105ae567a0c8c9ef02d2089e8fcd5e8 Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Thu, 2 Oct 2025 08:26:17 -0700 Subject: [PATCH 06/10] Update scrapybara.mdx --- migrations/scrapybara.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index d548600..049decb 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -8,7 +8,7 @@ title: "Scrapybara" | Feature | Scrapybara | Kernel | |---------|-----------|--------| -| **Start Browser** | `client.start_browser()` → `instance.browser.start()` | `client.browsers.create()` | +| **Start Browser** | `client.start_browser()` | `client.browsers.create()` | | **Standby Mode** | `instance.pause()` / `instance.resume()` | Automatic standby mode | | **CDP URL** | `instance.browser.get_cdp_url()` | Returns `cdp_ws_url` in create response | | **Live View** | `instance.get_stream_url()` | Returns `browser_live_view_url` in create response | From eefa80a2f7cfe4b3d02035bba049fc1342158489 Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Thu, 2 Oct 2025 08:33:11 -0700 Subject: [PATCH 07/10] Update to CDP URL Added correct method for retrieving cdp_url on scrapybara --- migrations/scrapybara.mdx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index 049decb..4ba5854 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -10,7 +10,7 @@ title: "Scrapybara" |---------|-----------|--------| | **Start Browser** | `client.start_browser()` | `client.browsers.create()` | | **Standby Mode** | `instance.pause()` / `instance.resume()` | Automatic standby mode | -| **CDP URL** | `instance.browser.get_cdp_url()` | Returns `cdp_ws_url` in create response | +| **CDP URL** | `instance.get_cdp_url().cdp_url` | Returns `cdp_ws_url` in create response | | **Live View** | `instance.get_stream_url()` | Returns `browser_live_view_url` in create response | | **Stealth Mode** | ❌ Not available | `stealth: true` parameter | | **Replays** | ❌ Not available | `client.browsers.replays.*` | @@ -27,8 +27,7 @@ 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 +cdp_url = instance.get_cdp_url().cdp_url async with async_playwright() as p: browser = await p.chromium.connect_over_cdp(cdp_url) @@ -148,8 +147,8 @@ browser2 = await client.browsers.create( | 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 | +| **Create Browser** | `client.start_browser()` | `client.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()` | 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()` | From f9a5972776e84795b08c8f4ea6be970d1845406d Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Thu, 2 Oct 2025 08:49:04 -0700 Subject: [PATCH 08/10] Update scrapybara.mdx A few more parameter comparison updates --- migrations/scrapybara.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index 4ba5854..9df4c93 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -11,8 +11,8 @@ title: "Scrapybara" | **Start Browser** | `client.start_browser()` | `client.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()` | Returns `browser_live_view_url` in create response | -| **Stealth Mode** | ❌ Not available | `stealth: true` parameter | +| **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 | `client.browsers.replays.*` | | **Save Auth** | `instance.browser.save_auth(name)` | Create profile with `save_changes: true` | @@ -149,7 +149,7 @@ browser2 = await client.browsers.create( |---------|-----------|--------| | **Create Browser** | `client.start_browser()` | `client.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()` | Returns `browser_live_view_url` in create response | +| **Get Live View** | `instance.get_stream_url().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` | @@ -157,8 +157,8 @@ browser2 = await client.browsers.create( | **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 | `stealth: true` parameter | -| **Headless Mode** | ❌ Not available | `headless: true` 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 state via `persistence: { id }` | | **Video Replays** | ❌ Not available | `client.browsers.replays.*` | | **File Upload** | `instance.upload()` | `client.browsers.fs.upload()` or Playwright | From 0057bd1d0b55c71de135e94ef693579a3eddf578 Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Thu, 2 Oct 2025 11:14:40 -0700 Subject: [PATCH 09/10] More API Comparison Changes --- migrations/scrapybara.mdx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index 9df4c93..45af97a 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -13,8 +13,8 @@ title: "Scrapybara" | **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 | `client.browsers.replays.*` | -| **Save Auth** | `instance.browser.save_auth(name)` | Create profile with `save_changes: true` | +| **Replays** | ❌ Not available | `client.browsers.replays.start()` and `client.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})` | ## How to migrate @@ -35,7 +35,7 @@ async with async_playwright() as p: await page.goto("https://example.com") await browser.close() -instance.browser.stop() +instance.stop() ``` **Kernel** @@ -150,21 +150,21 @@ browser2 = await client.browsers.create( | **Create Browser** | `client.start_browser()` | `client.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.browser.stop()` | `client.browsers.deleteByID(session_id)` | +| **Delete Browser** | `instance.stop()` | `client.browsers.delete_by_id(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 } })` | +| **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 state via `persistence: { id }` | -| **Video Replays** | ❌ Not available | `client.browsers.replays.*` | +| **Session Persistence** | Auth state only | Full browser state via creating browser with `persistence={"id": "persist-id"}` | +| **Video Replays** | ❌ Not available | `client.browsers.replays.start()` and `client.browsers.replays.stop()` | | **File Upload** | `instance.upload()` | `client.browsers.fs.upload()` or Playwright | -| **File Download** | Via browser, then `instance.file()` | `client.browsers.fs.readFile()` | +| **File Download** | Via browser, then `instance.file()` | `client.browsers.fs.read_file()` | | **Process Control** | `instance.bash()` | `client.browsers.process.*` | -| **Proxy Support** | ❌ Not available | `proxy_id` parameter + `client.proxies.*` | +| **Proxy Support** | ❌ Not available | Create [Proxy](/proxies/overview#1-create-a-proxy). Then create browser with `client.browsers.create(proxy_id=proxy.id)` | --- From 8363aaa301e4af3e90ac1832d8faa7d646eca002 Mon Sep 17 00:00:00 2001 From: Daniel Prevoznik Date: Thu, 2 Oct 2025 12:06:35 -0700 Subject: [PATCH 10/10] Updated code examples Updated code examples comparing Scrapybara and Kernel --- migrations/scrapybara.mdx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/migrations/scrapybara.mdx b/migrations/scrapybara.mdx index 45af97a..c107a17 100644 --- a/migrations/scrapybara.mdx +++ b/migrations/scrapybara.mdx @@ -62,15 +62,13 @@ await client.browsers.delete_by_id(kernel_browser.session_id) ```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) +instance2.browser.authenticate(auth_state_id=auth_state.auth_state_id) # ... browser now has saved cookies ... ``` @@ -98,7 +96,7 @@ browser2 = await client.browsers.create( instance = client.start_browser() # ... trigger download in browser ... # Then use file operations -downloaded_file = instance.file(action="read", path="/download/path") +downloaded_file = instance.file(command="read", path="/download/path") ``` **Kernel** @@ -129,17 +127,15 @@ instance.resume() # Resume work ```python # Automatic standby mode + persistence browser = await client.browsers.create( - persistence={"id": "my-long-session"}, - timeout_seconds=86400 # 24 hours + persistence={"id": "my-long-session"} ) # ... do some work ... -await client.browsers.delete_by_id(browser.session_id) +# Browser enters standby mode between connections -# Later - automatically restored with full state +# Later - reuse the exact browser instance with full state browser2 = await client.browsers.create( persistence={"id": "my-long-session"} ) -# Browser state fully restored (DOM, cookies, zoom, etc.) ```