Skip to content
Fresh 🌱

Create a Browser ​

on-demand browsers for your agents

Kernel browsers were designed to be lightweight and fast. Your agent can quickly create them on-demand and tear them down as soon as it is done using them. They can be used as part of the Kernel app platform or connected to from another service with the Chrome DevTools Protocol.

1. Create a Kernel browser ​

INFO

First, install the Kernel SDK:

  • Typescript/Javascript: npm install @onkernel/sdk
  • Python: pip install kernel

Use our SDK to create a browser:

typescript
  import Kernel from '@onkernel/sdk';

  const kernel = new Kernel();

  const kernelBrowser = await kernel.browsers.create();
  console.log(kernelBrowser.session_id);
python
from kernel import Kernel

kernel = Kernel()

kernel_browser = kernel.browsers.create()
print(kernel_browser.session_id)

2. Connect to the browser ​

Kernel browsers support three connection methods: CDP for framework-level browser automation, WebDriver BiDi for W3C-standard control, and Computer Controls for OS-level mouse/keyboard input ideal for vision-based LLM loops.

CDP

Connect with any Chrome DevTools Protocol framework like Playwright or Puppeteer. Use `cdp_ws_url` from the created browser session.

```typescript
  import { chromium } from 'playwright';

  const browser = await chromium.connectOverCDP(kernelBrowser.cdp_ws_url);
  const context = browser.contexts()[0];
  const page = context.pages()[0];

  await page.goto('https://example.com');
  const title = await page.title();
  console.log(title);
  ```

  ```python
  from playwright.async_api import async_playwright

  async with async_playwright() as playwright:
      browser = await playwright.chromium.connect_over_cdp(kernel_browser.cdp_ws_url)
      context = browser.contexts[0]
      page = context.pages[0]

      await page.goto('https://example.com')
      title = await page.title()
      print(title)
  ```

WebDriver BiDi

Connect with [Vibium](/integrations/vibium) or any WebDriver BiDi-compatible client. Use `webdriver_ws_url` from the created browser session.

```typescript
  import { browser } from 'vibium';

  const bro = await browser.start(kernelBrowser.webdriver_ws_url);
  const page = await bro.page();

  await page.goto('https://example.com');
  const title = await page.title();
  console.log(title);
  ```

  ```python
  from vibium.sync_api import browser

  bro = browser.start(kernel_browser.webdriver_ws_url)
  page = bro.page()

  page.goto('https://example.com')
  title = page.title()
  print(title)
  ```

Computer Controls

Control the browser's mouse, keyboard, and screen directly through the Kernel SDK , no CDP or WebDriver connection needed. This is ideal for vision-based LLM loops like [Claude Computer Use](/integrations/computer-use/anthropic).

```typescript
  import Kernel from '@onkernel/sdk';

  const kernel = new Kernel();
  const kernelBrowser = await kernel.browsers.create();

  // Take a screenshot
  const response = await kernel.browsers.computer.captureScreenshot(kernelBrowser.session_id);

  // Click at coordinates
  await kernel.browsers.computer.clickMouse(kernelBrowser.session_id, {
    x: 100,
    y: 200,
  });

  // Type text
  await kernel.browsers.computer.typeText(kernelBrowser.session_id, {
    text: 'Hello, World!',
  });
  ```

  ```python
  from kernel import Kernel

  kernel = Kernel()
  kernel_browser = kernel.browsers.create()

  # Take a screenshot
  screenshot = kernel.browsers.computer.capture_screenshot(id=kernel_browser.session_id)

  # Click at coordinates
  kernel.browsers.computer.click_mouse(
      id=kernel_browser.session_id,
      x=100,
      y=200,
  )

  # Type text
  kernel.browsers.computer.type_text(
      id=kernel_browser.session_id,
      text="Hello, World!",
  )
  ```

3. Tear it down ​

When you're finished with the browser, you can delete it:

typescript
  import Kernel from '@onkernel/sdk';

  const kernel = new Kernel();

  await kernel.browsers.deleteByID(kernelBrowser.session_id);
python
from kernel import Kernel

kernel = Kernel()
await kernel.browsers.delete_by_id(kernel_browser.session_id)

Browsers automatically delete after a timeout (default 60 seconds) if they don't receive a CDP or live view connection. You can configure this timeout when creating the browser.

Full example ​

Once you've connected to the Kernel browser, you can do anything with it.

INFO

Kernel browsers launch with a default context and page. Make sure to access the existing context and page (contexts()[0] and pages()[0]), rather than trying to create a new one.

typescript
  import Kernel from '@onkernel/sdk';
  import { chromium } from 'playwright';

  const kernel = new Kernel();

  const kernelBrowser = await kernel.browsers.create();
  const browser = await chromium.connectOverCDP(kernelBrowser.cdp_ws_url);

  try {
    const context = browser.contexts()[0] || (await browser.newContext());
    const page = context.pages()[0] || (await context.newPage());
    await page.goto('https://www.onkernel.com');
    const title = await page.title();
  } catch (error) {
    console.error(error);
  } finally {
    await browser.close();
    await kernel.browsers.deleteByID(kernelBrowser.session_id);
  }
python
from kernel import Kernel
from playwright.async_api import async_playwright

kernel = Kernel()

kernel_browser = kernel.browsers.create()

async with async_playwright() as playwright:
    browser = await playwright.chromium.connect_over_cdp(kernel_browser.cdp_ws_url)

    try:
        context = browser.contexts[0] if browser.contexts else await browser.new_context()
        page = context.pages[0] if context.pages else await context.new_page()
        await page.goto('https://www.onkernel.com')
        title = await page.title()
    except Exception as e:
        print(e)
    finally:
        await browser.close()
        await kernel.browsers.delete_by_id(kernel_browser.session_id)