Appearance
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)