From a5eb21273f64c63f6f9e5796209dca66070be4d3 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:09:17 +0000 Subject: [PATCH 01/78] Restructure docs navigation around how it works Replace the difficulty-tier sidebar with four groups: Overview, Start building, How it works (configure, control, scale, observe, manage), and Partnering with KERNEL. Cookbooks, Agent Skills, and Integrations become single card-grid pages instead of long sidebar lists, and the Cookbooks tab is removed. Add See all products, Why KERNEL?, Quickstart, Browser Loop, Concurrency and Limits, Enterprise, Trust Center, and Contact Sales pages. Merge the control-surface and where-the-loop-runs guidance into the Control page. Co-Authored-By: Claude Opus 5.5 --- auth/fill-from-vault.mdx | 2 +- auth/managed-auth.mdx | 2 +- browsers/browser-loop.mdx | 87 +++++++ browsers/concurrency-and-limits.mdx | 61 +++++ browsers/payments.mdx | 1 + cookbooks.mdx | 1 + docs.json | 346 ++++++++++------------------ index.mdx | 2 + info/contact-sales.mdx | 18 ++ info/enterprise.mdx | 41 ++++ info/pricing.mdx | 1 + info/trust-center.mdx | 17 ++ integrations/overview.mdx | 159 +++++++++---- integrations/wallets/overview.mdx | 2 +- introduction/control.mdx | 66 +++++- introduction/observe.mdx | 1 + introduction/scale.mdx | 1 + overview/products.mdx | 63 +++++ overview/why-kernel.mdx | 36 +++ skills/overview.mdx | 72 +++++- start/quickstart.mdx | 111 +++++++++ 21 files changed, 814 insertions(+), 276 deletions(-) create mode 100644 browsers/browser-loop.mdx create mode 100644 browsers/concurrency-and-limits.mdx create mode 100644 info/contact-sales.mdx create mode 100644 info/enterprise.mdx create mode 100644 info/trust-center.mdx create mode 100644 overview/products.mdx create mode 100644 overview/why-kernel.mdx create mode 100644 start/quickstart.mdx diff --git a/auth/fill-from-vault.mdx b/auth/fill-from-vault.mdx index f81bbf4c..675d208b 100644 --- a/auth/fill-from-vault.mdx +++ b/auth/fill-from-vault.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Fill from Vault" description: "Collect end-user credentials and inject them into browser forms while controlling the login workflow" --- diff --git a/auth/managed-auth.mdx b/auth/managed-auth.mdx index 8d1a0f4d..4c3bfd55 100644 --- a/auth/managed-auth.mdx +++ b/auth/managed-auth.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Managed Auth" description: "Handle website login, reuse session state, and recover eligible connections automatically" --- diff --git a/browsers/browser-loop.mdx b/browsers/browser-loop.mdx new file mode 100644 index 00000000..8302fc60 --- /dev/null +++ b/browsers/browser-loop.mdx @@ -0,0 +1,87 @@ +--- +title: "Browser Loop" +description: "A framework-neutral browser tool catalog for your agent, executed against a Kernel browser" +--- + +Browser Loop gives your agent browser tools. You pick the tools, it supplies the declarations each model provider accepts, executes every action against a [Kernel browser](/introduction/create), and returns plain objects your existing agent loop can use. + +It's open source ([`kernel/browser-loop`](https://github.com/kernel/browser-loop), MIT) and published as [`@onkernel/browser-loop`](https://www.npmjs.com/package/@onkernel/browser-loop). + +Reach for it when you're building an agent and don't want to write the translation layer between "the model asked to click at (420, 280)" and an actual browser action. If you're driving the browser yourself from a script, use [Playwright execution](/browsers/playwright-execution) or [computer controls](/browsers/computer-controls) directly. + +## What it handles + +Frontier models expose browser and computer control differently: native computer-use declarations, predefined browser action sets, ordinary function tools, different coordinate systems, different screenshot and result contracts. Every one of them still expects you to run a real browser, translate each action into an SDK call, and capture the right feedback so the model can verify the action landed. + +Browser Loop does that and stops there. It doesn't supply an agent class, a session format, or a UI — your framework already has those. + +- **Framework-neutral tool catalog.** Tool identities (`kloop.*.v1`) and model-facing names are byte-identical across bindings, so transcripts and evals stay comparable. +- **Kernel-browser execution.** Canonical actions run through Kernel's computer API or a raw-CDP executor against a session with your [profile](/browsers/profiles) and [proxy](/proxies/overview). +- **Per-model compatibility.** Provider transforms compose only the declarations and request fields the tools you selected require. +- **A pi binding and extension**, with Eve and AI SDK bindings next. + +## Install + +```bash +npm install @onkernel/browser-loop +``` + +## Build an agent + +`attach()` binds a browser once; `compile()` turns a (model, tools) pair into plain agent objects. + +```typescript +import Kernel from '@onkernel/sdk'; +import { Agent } from '@earendil-works/pi-agent-core'; +import { loop } from '@onkernel/browser-loop'; +import { attach } from '@onkernel/browser-loop/pi'; + +const client = new Kernel(); +const browser = await client.browsers.create({ stealth: true }); +const kb = attach({ client, browser }); + +const { model, agentTools, models } = kb.compile({ + model: 'anthropic:claude-opus-5', + tools: [...loop.toolsets.browser(), loop.tools.browser.act()], +}); + +const agent = new Agent({ + streamFn: (selected, context, options) => models.streamSimple(selected, context, options), + initialState: { model, tools: [...agentTools], systemPrompt: 'Use the supplied browser tools.' }, +}); + +try { + await agent.prompt('Open example.com and report the heading.'); +} finally { + await kb.dispose(); + await client.browsers.deleteByID(browser.session_id); +} +``` + +The compiled `model` and `agentTools` have to reach the agent together: selecting a provider-native browser or computer surface can change the transport the model needs, and that's derived from the tools you chose. + +## Check which tools a model accepts + +Not every model accepts every tool, and two providers' native surfaces can't coexist. Ask instead of guessing — and rebuild the menu after each change rather than caching a per-tool verdict: + +```typescript +import { loopToolMenu } from '@onkernel/browser-loop'; +import { getLoopModel } from '@onkernel/browser-loop/pi'; + +for (const entry of loopToolMenu(getLoopModel('openai:gpt-5.6-sol'))) { + console.log(entry.label, entry.available ? 'ok' : `unavailable: ${entry.unavailableReason}`); +} +``` + +## Try it from a terminal first + +The pi extension contributes the same tools to a pi session, so you can find out which tools and which model actually work for your use case before deploying anything. Same catalog, same tool identities, same model knowledge as the SDK path: + +```bash +pi install npm:@onkernel/browser-loop +pi -p --browser-tools browser,browser-act "open example.com and report the heading" +``` + + + Harness variant, swapping tools on a running session, and tool contexts. + diff --git a/browsers/concurrency-and-limits.mdx b/browsers/concurrency-and-limits.mdx new file mode 100644 index 00000000..15b8c0ba --- /dev/null +++ b/browsers/concurrency-and-limits.mdx @@ -0,0 +1,61 @@ +--- +title: "Concurrency and Limits" +description: "How many browsers you can run, how fast you can create them, and what each one gets" +--- + +Three separate limits shape a scaled workload, and they're easy to confuse. Concurrency caps how many browsers exist at once. The create rate caps how fast you can ask for new ones. Per-browser resources cap what one browser can do. + +## Concurrency + +One org-wide limit covers every browser you're running, whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools). The full limit is available to either API in any mix. + +| Plan | Concurrent browsers | +| --- | --- | +| Developer | 5 | +| Hobbyist | 10 | +| Start-Up | 150 | +| Enterprise | Custom | + +Two things count against it that people don't expect: + +- **Reserved pool capacity counts whether or not it's acquired.** A pool sized to 40 browsers uses 40 of your limit for as long as it exists. +- **Browsers in [standby](/browsers/standby) count.** Standby stops usage charges, not the concurrency slot. Delete the browser to release it. + +Set per-project caps if you're splitting one org limit across teams or environments — see [project concurrency limits](/info/projects#concurrency-limits). + +## Create rate + +Browser creation is rate limited separately from concurrency. The create rate caps how fast you can create browsers, not how many you may run. + +{/* TODO: add the per-plan browser-create rate table once the numbers are confirmed. */} + +Acquiring from a [browser pool](/browsers/pools) isn't subject to the create rate — the pool's browsers already exist. If your traffic arrives in bursts, that's the reason to use a pool even when your concurrency headroom is fine. + +### What happens at the limit + +Exceeding the create rate returns `429 Too Many Requests` with a `Retry-After` header, and rate-limited responses carry `X-RateLimit-Limit` and `X-RateLimit-Remaining`. + +All Kernel SDKs retry a `429` up to 2 times, honoring `Retry-After`. If retries are exhausted, the SDK raises a typed `RateLimitError` carrying the response headers, so you can apply your own backoff. Queue on your side rather than tightening the retry loop: a `429` means the org is over budget for the minute, so retrying faster doesn't help. + +If you're hitting the ceiling in normal operation, [contact us](https://calendly.com/d/d3tn-5kp-5yt) — the limit is raisable. + +## Per-browser resources + +| Resource | Headful | Headless | +| --- | --- | --- | +| Default memory | 8 GB | 1 GB | + +Memory is the practical ceiling on how many tabs and how heavy a page one browser handles. A [headless](/browsers/headless) browser at 1 GB is sized for short-lived, single-page, high-concurrency automation; open a dozen heavy tabs in one and Chromium starts killing renderers. If your workload needs many concurrent pages, spread it across more browsers rather than more tabs in one. [Browser pools](/browsers/pools) accept a `memory` setting when a workload needs more than the default. + +[GPU acceleration](/browsers/gpu-acceleration) is a separate browser type with its own [usage rate](/info/pricing#usage-rates), available on Start-Up and Enterprise. + +## Other limits worth knowing + +| Limit | Where | +| --- | --- | +| Browser `timeout_seconds` (default 60, max 259200 / 72h) | [Termination](/browsers/termination) | +| Pool `timeout_seconds` (default 600) and fill rate | [Browser pools](/browsers/pools) | +| App invocation concurrency, per plan and per app | [Pricing](/info/pricing#concurrency-limits) | +| Managed auth health check interval, per plan | [Connection lifecycle](/auth/connection-lifecycle) | +| Replay retention, extensions, projects, per plan | [Pricing](/info/pricing#managed-infrastructure) | +| Monthly spend | [Spending caps](/info/spending-caps) | diff --git a/browsers/payments.mdx b/browsers/payments.mdx index eab30059..3003d03b 100644 --- a/browsers/payments.mdx +++ b/browsers/payments.mdx @@ -1,5 +1,6 @@ --- title: "Payments" +sidebarTitle: "Overview" description: "Let browser agents complete purchases without handling raw payment details" --- diff --git a/cookbooks.mdx b/cookbooks.mdx index 44984ef2..2b6f86ea 100644 --- a/cookbooks.mdx +++ b/cookbooks.mdx @@ -1,5 +1,6 @@ --- title: "cookbooks" +sidebarTitle: "Cookbooks" description: "end-to-end recipes to teach agents to use the internet" mode: "wide" --- diff --git a/docs.json b/docs.json index 156f16b3..be641e16 100644 --- a/docs.json +++ b/docs.json @@ -103,6 +103,9 @@ } ] }, + "seo": { + "indexing": "all" + }, "navigation": { "tabs": [ { @@ -112,84 +115,70 @@ "group": "Overview", "pages": [ "index", - "introduction/create", - "introduction/control", - "introduction/observe", - "introduction/scale" + "overview/products", + "overview/why-kernel" ] }, { - "group": "Working with your browser", + "group": "Start building", + "pages": [ + "start/quickstart", + "cookbooks", + "skills/overview", + "integrations/overview" + ] + }, + { + "group": "How it works", "pages": [ { - "group": "Basics", - "expanded": true, + "group": "Configure", "pages": [ - "browsers/live-view", - "browsers/termination", - "browsers/standby", - "browsers/headless", - "info/projects", { - "group": "Profiles", + "group": "Browser Settings", "pages": [ - "browsers/profiles", - "browsers/profiles/save-and-reuse", - "browsers/profiles/concurrency", - "browsers/profiles/agent-patterns" + "introduction/create", + "browsers/termination", + "browsers/standby", + "browsers/headless", + "browsers/viewport", + "browsers/regions", + "browsers/gpu-acceleration", + "browsers/extensions", + "browsers/chrome-policies", + "browsers/private-networking", + "config-registry" ] - } - ] - }, - { - "group": "Intermediate", - "expanded": true, - "pages": [ + }, { - "group": "Bot Anti-Detection", + "group": "Stealth", "pages": [ "browsers/bot-detection/overview", "browsers/bot-detection/stealth", "browsers/bot-detection/hcaptcha", - { - "group": "Proxies", - "pages": [ - "proxies/overview", - "proxies/custom", - "proxies/residential", - "proxies/mobile", - "proxies/isp", - "proxies/datacenter", - "proxies/errors" - ] - }, "browsers/bot-detection/web-bot-auth", "bots" ] }, { - "group": "Auth", + "group": "Proxies", "pages": [ - "auth/overview", - { - "group": "Fill from Vault", - "pages": [ - "auth/fill-from-vault" - ] - }, - { - "group": "Managed Auth", - "pages": [ - "auth/managed-auth", - "auth/hosted-ui", - "auth/react", - "auth/programmatic", - "auth/configuration", - "auth/connection-lifecycle", - "auth/credentials", - "auth/faq" - ] - } + "proxies/overview", + "proxies/residential", + "proxies/isp", + "proxies/mobile", + "proxies/datacenter", + "proxies/custom", + "proxies/errors" + ] + }, + { + "group": "Profiles", + "pages": [ + "browsers/profiles", + "browsers/profiles/save-and-reuse", + "browsers/profiles/concurrency", + "browsers/profiles/agent-patterns" ] }, { @@ -201,159 +190,114 @@ "vaults/fill" ] }, - "browsers/payments", - "browsers/replays", - "browsers/viewport", - "browsers/regions", - "browsers/gpu-acceleration", - "config-registry", - "info/api-keys", - "info/audit-logs", - "browsers/file-io", - "browsers/process-execution", - "browsers/curl", - "browsers/ssh", - "browsers/computer-controls", - "browsers/playwright-execution", - "browsers/webmcp", - "browsers/repl" + { + "group": "Authentication", + "pages": [ + "auth/overview", + "auth/fill-from-vault", + "auth/managed-auth", + "auth/hosted-ui", + "auth/react", + "auth/programmatic", + "auth/configuration", + "auth/connection-lifecycle", + "auth/credentials" + ] + }, + { + "group": "Payments", + "pages": [ + "browsers/payments", + "integrations/wallets/overview", + "integrations/wallets/stripe-link", + "integrations/wallets/agentcard" + ] + } ] }, { - "group": "Advanced", - "expanded": true, + "group": "Control", "pages": [ - "browsers/extensions", - "browsers/private-networking", - "browsers/chrome-policies", + "introduction/control", + "browsers/playwright-execution", + "browsers/computer-controls", + "browsers/repl", + "browsers/webmcp", + "browsers/browser-loop", + "browsers/process-execution", + "browsers/file-io", + "browsers/curl", + "browsers/ssh", { - "group": "Telemetry", + "group": "Code Execution Platform", "pages": [ - "browsers/telemetry/overview", - "browsers/telemetry/categories", - "browsers/telemetry/streaming" + "apps/develop", + "apps/deploy", + "apps/invoke", + "apps/stop", + "apps/secrets", + "apps/status", + "apps/logs" ] - }, - "browsers/pools" + } ] }, { - "group": "FAQ", + "group": "Scale", "pages": [ + "introduction/scale", + "browsers/pools", + "browsers/concurrency-and-limits", "browsers/performance" ] - } - ] - }, - { - "group": "Integrations", - "pages": [ - "integrations/overview", - "integrations/browser-use", - { - "group": "Claude", - "icon": "/images/integration-icons/claude.svg", - "pages": [ - "integrations/claude/overview", - "integrations/claude/claude-code-and-desktop", - "integrations/claude/claude-agent-sdk", - "integrations/claude/claude-managed-agents" - ] }, { - "group": "Computer Use Models", - "icon": "/images/integration-icons/computer-cursor-rounded.svg", + "group": "Observe", "pages": [ - "integrations/computer-use/overview", - "integrations/computer-use/anthropic", - "integrations/computer-use/gemini", - "integrations/computer-use/openagi", - "integrations/computer-use/openai", - "integrations/computer-use/tzafon", - "integrations/computer-use/yutori" + "introduction/observe", + "browsers/live-view", + "browsers/replays", + "browsers/telemetry/overview", + "browsers/telemetry/categories", + "browsers/telemetry/streaming" ] }, { - "group": "Wallets", - "icon": "/images/integration-icons/payments.svg", + "group": "Manage", "pages": [ - "integrations/wallets/overview", - "integrations/wallets/stripe-link", - "integrations/wallets/agentcard" + "info/projects", + "info/api-keys", + "info/audit-logs", + "info/network-access", + "info/spending-caps" ] - }, - "integrations/hermes-agent", - "integrations/laminar", - "integrations/replit", - "integrations/stagehand", + } + ] + }, + { + "group": "Partnering with KERNEL", + "pages": [ + "info/pricing", { - "group": "Stripe Projects", - "icon": "/images/integration-icons/stripe.svg", + "group": "Enterprise", "pages": [ - "integrations/stripe-projects", - "integrations/stripe-projects-browser" + "info/enterprise", + "security", + "shared-responsibility-model", + "info/zero-data-retention", + "security-vulnerability-reporting", + "info/trust-center", + "info/contact-sales" ] }, - "integrations/terraform", - "integrations/valtown", + "info/support", { - "group": "Vercel", - "icon": "/images/integration-icons/vercel.svg", + "group": "Community", "pages": [ - "integrations/vercel/overview", - "integrations/vercel/agent-browser", - "integrations/vercel/ai-sdk", - "integrations/vercel/marketplace", - "integrations/vercel/eve-extension", - "integrations/vercel/foreman", - "integrations/vercel/fx" + "community/github", + "community/discord" ] - }, - "integrations/vibium", - "integrations/1password" - ] - }, - { - "group": "deploying your agent", - "pages": [ - "apps/develop", - "apps/deploy", - "apps/invoke", - "apps/stop", - "apps/secrets", - "apps/status", - "apps/logs" - ] - }, - { - "group": "Agent Skills", - "pages": [ - "skills/overview", - "skills/kernel-cli", - "skills/bot-detection", - "skills/profiles", - "skills/kernel-auth", - "skills/create-site-skills" - ] - }, - { - "group": "Community", - "pages": [ - "community/github", - "community/discord" - ] - }, - { - "group": "Info", - "pages": [ - "info/network-access", - "browsers/faq", - "info/concepts", - "info/zero-data-retention", - "info/pricing", - "info/spending-caps", - "info/support", - "info/unikernels" + } ] } ] @@ -362,42 +306,6 @@ "tab": "API Reference", "openapi": "https://api.onkernel.com/spec.json" }, - { - "tab": "Cookbooks", - "pages": [ - "cookbooks", - { - "group": "Common Patterns", - "pages": [ - "browsers/playwright-computer-use-fallback", - "browsers/telemetry/pausing-for-captcha-solves", - "browsers/enable-payments-in-browser-agent", - "browsers/use-vault-credentials-in-browser-agent" - ] - }, - { - "group": "Harnesses & Models", - "pages": [ - "cookbooks/ai-sdk-agent", - "cookbooks/browser-use-model", - "cookbooks/claude-managed-agents", - "cookbooks/claude-computer-use-loop", - "cookbooks/e2b", - "cookbooks/eve-foreman", - "cookbooks/eve-managed-auth", - "cookbooks/fx-colocated-agent", - "cookbooks/jev-browser-use", - "cookbooks/jev-browser-use-val-town", - "cookbooks/mastra-web-task-assistant", - "cookbooks/modal-web-scraper", - "cookbooks/modal-pr-qa-agent", - "cookbooks/stagehand-google-cua-agent", - "cookbooks/tinker-rl", - "cookbooks/vibium" - ] - } - ] - }, { "tab": "CLI", "groups": [ diff --git a/index.mdx b/index.mdx index 801dbaa8..73b4a5cc 100644 --- a/index.mdx +++ b/index.mdx @@ -36,6 +36,8 @@ We build crazy fast, open source infra for AI agents to access the internet. Tru +[Concepts](/info/concepts) covers Kernel's object model, and [browsers on unikernels](/info/unikernels) covers the architecture underneath it. + import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx';
diff --git a/info/contact-sales.mdx b/info/contact-sales.mdx new file mode 100644 index 00000000..1e2f1269 --- /dev/null +++ b/info/contact-sales.mdx @@ -0,0 +1,18 @@ +--- +title: "Contact Sales" +description: "Talk to Kernel about an enterprise plan, custom limits, or a pilot" +--- + +**[Book a call](https://calendly.com/d/d3tn-5kp-5yt).** + +Worth reaching out when: + +- You need **custom concurrency or create-rate limits** beyond the published plans — see [concurrency and limits](/browsers/concurrency-and-limits). +- You need a **BAA, zero data retention, or continuous audit log export** — see [Enterprise](/info/enterprise). +- You're **migrating a fleet** and want help choosing between browser pools, on-demand browsers, and the [code execution platform](/apps/develop). +- You're running **thousands of end-user identities** and want the project and profile layout reviewed. +- Your target sites have **aggressive bot detection** and you want them tested before you commit. + +Bring the sites you need to automate, your expected concurrency, and how the automation is triggered. That's usually enough to scope pricing and the right architecture on the first call. + +Already a customer with a support question? Use [support](/info/support) instead. diff --git a/info/enterprise.mdx b/info/enterprise.mdx new file mode 100644 index 00000000..87e04d55 --- /dev/null +++ b/info/enterprise.mdx @@ -0,0 +1,41 @@ +--- +title: "Enterprise" +sidebarTitle: "Overview" +description: "Security, compliance, HIPAA, and zero data retention on Kernel's Enterprise plan" +--- + +What changes on the Enterprise plan, and where the security and compliance artifacts live. + +## Security and compliance + +The [security practices](/security) page covers Kernel's information security program, product and infrastructure security, and current compliance status. The [shared responsibility model](/shared-responsibility-model) covers what Kernel secures and what you do. Reports and security artifacts are available through the [trust center](/info/trust-center). + +## HIPAA + +Kernel signs a BAA on the Enterprise plan. Each browser runs in its own [microVM](/info/unikernels) with its own kernel and filesystem. Pair it with [zero data retention](/info/zero-data-retention) if PHI must not persist after a session ends. + +## Zero data retention + +[Zero data retention](/info/zero-data-retention) is Enterprise-only and configured per organization. With it enabled, session recordings, live view streams, and telemetry aren't retained after the browser terminates. + +## What else the Enterprise plan includes + +| | Enterprise | +| --- | --- | +| Concurrency | Custom — see [concurrency and limits](/browsers/concurrency-and-limits) | +| [Support](/info/support) | Tiered support with defined response times and dedicated channels | +| Data processing | [DPA](/dpa) | + +The full plan comparison is on [pricing](/info/pricing). + +## Legal + +- [Terms of service](/tos) +- [Privacy policy](/privacy) +- [Acceptable use policy](/acceptable-use) +- [Data processing addendum](/dpa) +- [Vulnerability reporting](/security-vulnerability-reporting) + +## Talk to us + +Scoping an enterprise deployment, a BAA, or zero data retention starts with a conversation: [contact sales](/info/contact-sales). diff --git a/info/pricing.mdx b/info/pricing.mdx index 69b7e5c1..c0b68625 100644 --- a/info/pricing.mdx +++ b/info/pricing.mdx @@ -1,5 +1,6 @@ --- title: "Pricing & Limits" +sidebarTitle: "Plans and Pricing" --- With Kernel, you only pay for what you use and nothing more. You don't pay for idle time thanks to [Standby Mode](/browsers/standby), idle browsers in a browser pool incur no usage charges, and you're never charged for proxies. diff --git a/info/trust-center.mdx b/info/trust-center.mdx new file mode 100644 index 00000000..5739a8d1 --- /dev/null +++ b/info/trust-center.mdx @@ -0,0 +1,17 @@ +--- +title: "Trust Center" +description: "Where to get Kernel's compliance reports and security artifacts" +--- + +Kernel's compliance artifacts live in the trust center: **[trust.kernel.sh](https://trust.kernel.sh)**. + +What you'll find there: + +- The **SOC 2 Type II** report, available on request. +- Current compliance status. +- The [authorized subprocessor list](https://trust.kernel.sh/subprocessors), referenced by the [DPA](/dpa). +- Security artifacts and questionnaire responses for vendor review. + +For how the program works rather than the paperwork, see [security practices](/security) and the [shared responsibility model](/shared-responsibility-model). For what changes on an Enterprise plan — BAA and zero data retention — see [Enterprise](/info/enterprise). + +Security questions go to [security@kernel.sh](mailto:security@kernel.sh). Reporting a vulnerability? See [vulnerability reporting](/security-vulnerability-reporting). diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 4f9ffdc9..7c7710bd 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -1,55 +1,134 @@ --- -title: "Overview" +title: "Integrations" +sidebarTitle: "Integrations" +description: "Run Kernel browsers from the agent frameworks, models, and platforms you already use" +mode: "wide" --- -Kernel's browsers are compatible with all browser and Computer Use frameworks. +Kernel browsers work with any tool that speaks the Chrome DevTools Protocol or WebDriver BiDi. The guides below cover the integrations with first-class support. For anything else, see [how you drive the browser](/introduction/control). -## Universal CDP compatibility +## Agent frameworks -Kernel browsers work with any framework or tool that supports the Chrome DevTools Protocol (CDP). This means you can: +Build the agent in code and run its browser on Kernel. -- **Use any agent framework**: Integrate with popular frameworks like Browser Use, Stagehand, Playwright, Puppeteer, Selenium, and more -- **Connect via CDP**: All browsers expose a CDP WebSocket URL for direct connection -- **No vendor lock-in**: Switch between frameworks or use multiple frameworks simultaneously -- **Standard protocols**: Built on open standards that work with the entire browser automation ecosystem + + + Run Browser Use agents on Kernel browsers. + + + Build Claude agents that drive Kernel browsers with playwright execution. + + + Mix code and natural language browser automation on Kernel. + + + Give AI SDK agents Kernel browser tools. + + + Drive Kernel browsers with a WebDriver BiDi automation framework. + + + Run Hermes Agent browser tools on Kernel browsers. + + -## Computer Use +## Computer use models -For vision-language models (VLMs) that predict browser actions from screenshots, Kernel provides [Computer Controls APIs](/browsers/computer-controls) that enable direct mouse, keyboard, and screen interactions. These low-level controls let you: +Run a vision model's screenshot-and-act loop against a Kernel browser. -- Capture screenshots to send to your VLM -- Execute predicted actions (clicks, typing, scrolling, dragging) -- Build custom agentic loops with any VLM provider + + + How computer use agents run on Kernel browsers. + + + Claude computer use. + + + Gemini computer use. + + + Yutori Navigator pixels-to-actions model. + + + OpenAI computer use. + + + OpenAGI Lux computer use model. + + + Tzafon Northstar CUA Fast. + + -This approach works with any computer use model, including Anthropic Claude, OpenAI CUA, Google Gemini, and others. +## Agents and coding tools -## Popular Framework Integrations +Give an agent you already use a Kernel browser. -Kernel provides detailed guides for popular agent frameworks: + + + Vercel's browser automation CLI for AI agents. + + + Run Anthropic's hosted agent harness against Kernel browsers. + + + Give your Vercel Eve agent a Kernel browser. + + + Give Claude Code and Claude Desktop a Kernel browser. + + + Give Replit Agent a Kernel browser. + + + Give your Foreman agent a Kernel browser. + + + Give Vercel's fx coding agent a Kernel browser over MCP. + + -- **[Agent Browser](/integrations/vercel/agent-browser)** - Browser automation CLI for AI agents -- **[fx](/integrations/vercel/fx)** - Give Vercel's fx coding agent a Kernel cloud browser via MCP -- **[Browser Use](/integrations/browser-use)** - AI browser agent framework -- **[Hermes Agent](/integrations/hermes-agent)** - Run Hermes browser tools on Kernel cloud browsers -- **[Claude Code and Desktop](/integrations/claude/claude-code-and-desktop)** - Give the Claude apps a Kernel browser via the marketplace plugin or MCP -- **[Claude Agent SDK](/integrations/claude/claude-agent-sdk)** - Run Claude Agent SDK automations in cloud browsers -- **[Claude Managed Agents](/integrations/claude/claude-managed-agents)** - Run Anthropic's hosted agent harness against cloud browsers -- **[Replit](/integrations/replit)** - Give Replit Agent a Kernel cloud browser -- **[Stagehand](/integrations/stagehand)** - AI browser automation with natural language -- **[Terraform](/integrations/terraform)** - Manage durable Kernel infrastructure as code -- **[Computer Use (Anthropic)](/integrations/computer-use/anthropic)** - Claude's computer use capability -- **[Computer Use (OpenAI)](/integrations/computer-use/openai)** - OpenAI's computer use capability -- **[Computer Use (Gemini)](/integrations/computer-use/gemini)** - Gemini's computer use capability -- **[Computer Use (OpenAGI)](/integrations/computer-use/openagi)** - OpenAGI's computer use capability -- **[Computer Use (Yutori)](/integrations/computer-use/yutori)** - Yutori Navigator n1.5 pixels-to-actions model -- **[Laminar](/integrations/laminar)** - Observability and tracing for AI browser automations -- **[wallets](/integrations/wallets/overview)** - connect payment methods through native wallet integrations -- **[Val Town](/integrations/valtown)** - Serverless function runtime -- **[Stripe Projects](/integrations/stripe-projects)** - Provision Kernel plans and API keys via the Stripe Projects CLI -- **[Vercel](https://github.com/onkernel/vercel-template)** - Deploy browser automations to Vercel -- **[Web Bot Authentication](/browsers/bot-detection/web-bot-auth)** - Create signed Chrome extensions for web bot authentication -- **[1Password](/integrations/1password)** - Use credentials from your 1Password vaults for Managed Auth +## Platforms and infrastructure -## Custom Integrations +Provision and run Kernel from the platforms you deploy on. -Kernel works with any tool that supports CDP. Check out our [browser control guide](/introduction/control) to learn how to connect any other agent framework. + + + Add Kernel to a Vercel project through the Marketplace. + + + Provision Kernel browsers and plans with the Stripe Projects CLI. + + + Manage durable Kernel infrastructure with Terraform. + + + Run browser automations from Val Town's serverless runtime. + + + +## Tools + +Connect Kernel to the rest of your stack. + + + + Use credentials from your 1Password vaults. + + + Trace and evaluate browser agents with Laminar. + + + +## By vendor + +Every Kernel integration from one vendor, on one page. + + + + Claude Code, Claude Desktop, the Agent SDK, and Managed Agents. + + + The AI SDK, Agent Browser, Eve, Foreman, fx, and the Marketplace. + + diff --git a/integrations/wallets/overview.mdx b/integrations/wallets/overview.mdx index b23fd4cf..e48f15e9 100644 --- a/integrations/wallets/overview.mdx +++ b/integrations/wallets/overview.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Wallets" description: "Connect user wallets through KERNEL's native integrations" --- diff --git a/introduction/control.mdx b/introduction/control.mdx index 5ec902ce..d0016a28 100644 --- a/introduction/control.mdx +++ b/introduction/control.mdx @@ -1,11 +1,32 @@ --- -title: "Control" -description: "Drive the browser with computer use, playwright execution, CDP, or WebDriver BiDi" +title: "How You Drive the Browser" +sidebarTitle: "Overview" +description: "Choose a control surface and where your agent loop runs" --- -Kernel browsers expose four ways to drive a session. For agents, we recommend starting with playwright execution and falling back to computer use, here's our guide: [playwright w/ computer use fallback](/browsers/playwright-computer-use-fallback). +You make two choices before you write any automation. They're independent, but the first constrains the second: -Both run co-located with the browser and avoid the bot-detection surface a direct CDP connection introduces. +1. **How you drive the browser** — the control surface your code or model uses to act on the page. +2. **Where the loop runs** — the machine your decision-making code runs on, relative to the browser. + +## 1. How you drive the browser + +Kernel browsers accept four control surfaces. Pick by what's driving the page, not by what you already know. + +| Surface | Use it when | Trade-off | +| --- | --- | --- | +| [Playwright execution](/browsers/playwright-execution) | **Default.** You know what to do on the page — navigate, fill, extract, upload. | Needs a selector or DOM path that exists. | +| [Computer controls](/browsers/computer-controls) | **Recommended fallback.** A model is looking at pixels, or the page can't be driven programmatically. | Slower per step, and the model has to see the state to act. | +| CDP | You have an existing Playwright, Puppeteer, or CDP codebase to point at Kernel. | Adds a protocol fingerprint and a network hop. | +| WebDriver BiDi | You need the W3C standard protocol. | Smaller client ecosystem. | + +For agents, start with [playwright execution with a computer use fallback](/browsers/playwright-computer-use-fallback): script the deterministic steps, and hand the page to a computer use model when a step doesn't respond to a selector. + +### Why the choice matters on hardened sites + +CDP is what Playwright and Puppeteer speak, and anti-bot vendors scan for its signatures. Computer controls carry no CDP connection, so there's no protocol fingerprint to leak. That makes them the stronger option on sites with aggressive detection, and it's why [managed auth](/auth/managed-auth) drives logins with coordinate-based input rather than CDP. How much this matters is site-specific, so test before you commit — see [bot anti-detection](/browsers/bot-detection/overview). + +### Control surface examples @@ -210,6 +231,41 @@ fmt.Println(response.Result) +## 2. Where the loop runs + +Your loop is whatever decides the next action: a script, an agent, or a model. It can run in three places. + + + + Connect to `cdp_ws_url` or `webdriver_ws_url` from wherever your code already runs. Any CDP client works, and there's no lock-in. + + **Costs:** a network round trip per action, disconnects to handle, screenshot and DOM bandwidth, and the CDP fingerprint above. It's fine for low-frequency or deterministic work, and it hurts most in a vision loop. + + + Send code, not commands. Each call runs in the browser's VM against the live session, so state carries across calls and an agent can drive the page turn by turn — one tool call per step, structured data back. + + **Costs:** the code you send has to be self-contained per call. There's nothing to install and no connection to manage. + + + Deploy the whole agent next to the browser with the [code execution platform](/apps/develop), invoked on demand or on a schedule, with no infrastructure of your own. + + **Costs:** your agent has to be deployable as a Kernel app. It's worth it once the automation is long-running, stateful, or triggered by events rather than by a person. + + + +### Where computer use fits + +A computer use agent answers the first question, not the second — it still has to run its loop somewhere. Because every turn ships a screenshot instead of a small script, running that loop off-platform costs far more than it does for a Playwright-driven agent: you pay image bandwidth and a round trip on every step. That makes computer use the strongest case for running your loop next to the browser. Model inference stays with the model vendor either way. + +### Putting it together + +| Your automation | Control surface | Where the loop runs | +| --- | --- | --- | +| Scheduled scrape of a known page | Playwright execution | Anywhere — one call, one result | +| Agent doing multi-step work on a normal site | Playwright execution, computer use fallback | Playwright execution API, or the code execution platform once it's long-running | +| Agent on a site with aggressive detection | Computer controls | Code execution platform | +| Existing Playwright suite you're migrating | CDP | Your own CI, then move hot paths to playwright execution | + ## Why computer use for agents Kernel's computer controls are built to match how computer-use models were trained — the same primitives the model emits (screenshot, click at coords, type, key, scroll, drag) map 1:1 onto the API. There's no harness translating model output into framework calls. @@ -232,7 +288,7 @@ If you're reaching for Playwright, prefer the execution API over `connectOverCDP ## Computer use + playwright execution -Computer controls drive the browser the way a person would — they don't speak the programmatic API surface. Anything you'd reach for the DOM or Playwright client for (reading text and attributes, `page.goto`, file uploads, cookie or storage access, switching tabs) belongs on the [playwright execution](/browsers/playwright-execution) side. The recommended pattern for agents is computer controls for interaction, playwright execution as a tool the agent can call when it needs structured data or a programmatic action. +Computer controls drive the browser the way a person would — they don't speak the programmatic API surface. Anything you'd reach for the DOM or Playwright client for (reading text and attributes, `page.goto`, file uploads, cookie or storage access, switching tabs) belongs on the [playwright execution](/browsers/playwright-execution) side. When computer use is driving, expose playwright execution to the agent as a tool it can call for structured data or a programmatic action. For the full pattern in the other direction — playwright execution first, computer use when a step doesn't respond to a selector — see [playwright with computer use fallback](/browsers/playwright-computer-use-fallback). ```typescript Typescript/Javascript diff --git a/introduction/observe.mdx b/introduction/observe.mdx index 167e470f..b94194e0 100644 --- a/introduction/observe.mdx +++ b/introduction/observe.mdx @@ -1,5 +1,6 @@ --- title: "Observe" +sidebarTitle: "Overview" description: "Watch your agent work, debug what went wrong" --- diff --git a/introduction/scale.mdx b/introduction/scale.mdx index 53947ebb..aaa7b8f8 100644 --- a/introduction/scale.mdx +++ b/introduction/scale.mdx @@ -1,5 +1,6 @@ --- title: "Scale" +sidebarTitle: "Overview" description: "Recommended practices for scaling in production" --- ## Overview diff --git a/overview/products.mdx b/overview/products.mdx new file mode 100644 index 00000000..064553f8 --- /dev/null +++ b/overview/products.mdx @@ -0,0 +1,63 @@ +--- +title: "See All Products" +description: "Kernel's primitives and the products built on them, each linking to its documentation" +mode: "wide" +--- + +Kernel is built from three primitives: a browser, the state it carries, and the secrets it can use. Products combine them to solve a specific problem, like logging in or checking out. + +## Primitives + + + + Sandboxed Chromium in its own microVM, created in under 30ms, with GPU acceleration when you need it. + + + Persisted browser state — cookies, storage, logins, history, open tabs — that you load into any browser. + + + Credentials and payment items a browser can fill into a page without your agent ever reading them. + + + +## Products + + + + Fill logins from a vault, or let managed auth log in, handle MFA, and keep the session alive. + + + Let agents complete checkouts through Link or AgentCard without exposing card data. + + + Anti-detection defaults on every browser, plus a managed CAPTCHA solver. + + + Datacenter, ISP, residential, mobile, or your own. Kernel-provided proxies aren't billed. + + + Pre-configured browsers kept ready, so acquiring one skips start-up latency. + + + Give it a URL and get browser and proxy settings that have worked on that site. + + + Watch or take over a running session, and record any session as an MP4. + + + Structured events for navigation, network, CDP, captcha, and proxy activity. + + + Deploy your agent next to its browser and invoke it on demand or on a schedule. + + + +## Ways in + +| Surface | Where to start | +| --- | --- | +| SDKs (TypeScript, Python, Go) | [Quickstart](/start/quickstart) | +| [CLI](/reference/cli) | `brew install kernel/tap/kernel` | +| [MCP server](/reference/mcp-server) | Give any MCP client a cloud browser | +| [Agent Skills](/skills/overview) | Add Kernel know-how to your coding agent | +| [Integrations](/integrations/overview) | Framework- and vendor-specific guides | diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx new file mode 100644 index 00000000..1e382291 --- /dev/null +++ b/overview/why-kernel.mdx @@ -0,0 +1,36 @@ +--- +title: "Why KERNEL?" +description: "What Kernel gives you that a Chrome process doesn't" +--- + +Kernel runs Chromium as infrastructure: an isolated, GPU-capable browser you create in milliseconds, drive over four protocols, watch live, record, authenticate, and throw away. If your agent or automation needs a real browser and you'd rather not operate a browser fleet, this is what Kernel replaces. + +## Why not just run Chrome yourself? + +You can. Running one Chrome locally is easy, and it's the right call while you're prototyping. The work starts when the automation has to run unattended, more than once, at more than one at a time. + +| What you hit | Running it yourself | On Kernel | +| --- | --- | --- | +| Start-up latency | Cold container pull plus Chromium launch — seconds per task | P50 30ms browser creation ([performance](/browsers/performance)), or zero-wait acquisition from a [browser pool](/browsers/pools) | +| Isolation | One compromised page shares a kernel with everything else on the box | Each browser is a [microVM](/info/unikernels) with its own kernel and filesystem | +| Idle cost | You pay for the container while the agent thinks | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | +| Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview) that aren't metered | +| Logins | Credentials end up in your agent's context or in a secret store you now own | [Managed auth](/auth/overview) logs in, keeps sessions warm, and hands your agent a [profile](/browsers/profiles) — no credentials in the loop | +| Debugging a failure | Reproduce it locally and hope | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | +| Scaling | Autoscaling group, image pipeline, cleanup jobs, orphan reaper | `browsers.create()`, or a pool with a fill rate | + +## What's structural about Kernel + +**MicroVM isolation, not containers.** Every browser gets its own kernel via [unikernel-based virtualization](/info/unikernels). That's what makes both the isolation story and the 30ms start possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are available inside a session at all. + +**Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. + +**Auth is a product, not a cookie jar.** [Managed auth](/auth/overview) handles the login, MFA prompts, SSO redirects, and background reauthentication, then persists the result as a profile your agent attaches to any browser. + +## When Kernel isn't the answer + +If the site you need has a real API, use the API. Browsers are the right tool when the work only exists behind a UI — a portal with no API, a checkout flow, a document you can only reach after logging in, or a task that a computer-use model has to see to do. + + + Every primitive and product, each linking to its documentation. + diff --git a/skills/overview.mdx b/skills/overview.mdx index d0f1df5e..c7e2e2fc 100644 --- a/skills/overview.mdx +++ b/skills/overview.mdx @@ -1,15 +1,69 @@ --- -title: "Overview" +title: "Agent Skills" +sidebarTitle: "Agent Skills" +description: "Kernel skills that teach your coding agent how to use cloud browsers" +mode: "wide" --- -Kernel offers a suite of agent skills that can be used to debug your development workflows and give your browser agents runtime superpowers. +Skills give your coding agent Kernel know-how it keeps across sessions, so it doesn't have to re-read the docs every time. Install all of them into your project: -If you're building an agent that needs to access the internet, check out the [Kernel CLI skill](https://www.skills.sh/kernel/skills/kernel-cli). It gives your agent a direct path to Kernel's browser, proxy, profile, and authentication capabilities. It's a great starting point for users building custom agent harnesses. +```bash +npx skills add kernel/skills +``` -Especially useful skills: -- [Bot Detection](/skills/bot-detection) — teaches your agent how to profile a site's bot-detection setup and land on a browser configuration that gets through it. -- [Browser Profiles](/skills/profiles) — teaches your agent how to compare the actual contents of two Kernel browser profiles to identify state differences that could explain a reported issue. -- [Kernel Auth](/skills/kernel-auth) — teaches your agent best practices for using managed auth to log in to websites. -- [Create Site Skills](/skills/create-site-skills) — teaches your agent how to turn a verified browser workflow into a reusable skill for automating a specific site. +If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It gives your agent a direct path to Kernel's browser, proxy, profile, and authentication capabilities. -View Kernel's full list of available skills [here](https://skills.sh/kernel/skills). +## Get started + + + + Manage browsers, apps, profiles, proxies, managed auth, API keys, and projects from the CLI. + + + Build browser automation in TypeScript with playwright execution or CDP, profiles, and proxies. + + + Build and debug Python browser automation with the Kernel SDK. + + + +## Build reliable automations + + + + Turn a verified browser workflow into a reusable skill for automating a specific site. + + + Use managed auth to log in to websites that require an authenticated session. + + + Profile a site's bot-detection vendors and find a browser configuration that gets through. + + + Best practices for using agent-browser with Kernel cloud browsers. + + + Best practices for using browser-use's browser-harness with Kernel over CDP. + + + +## Debug + + + + Debug VM issues, network errors, Chrome crashes, page-load failures, and live view problems. + + + Compare two profile snapshots to find state differences that explain an issue. + + + +## Create content + + + + Render smooth MP4 videos from a web page or animated visualization with headless Chromium. + + + +See every skill on [skills.sh](https://skills.sh/kernel/skills). diff --git a/start/quickstart.mdx b/start/quickstart.mdx new file mode 100644 index 00000000..e2e616b4 --- /dev/null +++ b/start/quickstart.mdx @@ -0,0 +1,111 @@ +--- +title: "Quickstart" +description: "Create your first cloud browser, drive it, and hand the rest to your coding agent" +--- + +Two paths. Do the first if you're writing the code; do the second if a coding agent is. + + +You'll need an API key from the [dashboard](https://dashboard.onkernel.com). Set it as `KERNEL_API_KEY` — every SDK, the CLI, and the MCP server read it from the environment. + + +## Path 1: write it yourself + + + + +```bash TypeScript +npm install @onkernel/sdk +``` + +```bash Python +pip install kernel +``` + +```bash Go +go get github.com/kernel/kernel-go-sdk +``` + + + + +This creates a browser, runs Playwright code inside the browser's VM, returns the result, and cleans up. No local Chromium, no CDP connection to manage. + + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const kernel = new Kernel(); + +const browser = await kernel.browsers.create({ timeout_seconds: 300 }); +console.log('live view:', browser.browser_live_view_url); + +try { + const { result } = await kernel.browsers.playwright.execute(browser.session_id, { + code: ` + await page.goto('https://news.ycombinator.com'); + return await page.$$eval('.titleline > a', (as) => as.slice(0, 5).map((a) => a.textContent)); + `, + }); + console.log(result); +} finally { + await kernel.browsers.deleteByID(browser.session_id); +} +``` + +```python Python +from kernel import Kernel + +kernel = Kernel() + +browser = kernel.browsers.create(timeout_seconds=300) +print("live view:", browser.browser_live_view_url) + +try: + response = kernel.browsers.playwright.execute( + browser.session_id, + code=""" + await page.goto('https://news.ycombinator.com'); + return await page.$$eval('.titleline > a', (as) => as.slice(0, 5).map((a) => a.textContent)); + """, + ) + print(response.result) +finally: + kernel.browsers.delete_by_id(browser.session_id) +``` + + +Open `browser_live_view_url` while it runs and you'll watch the page load. + + + +Two things determine the shape of everything after this: which control surface you use, and where your loop runs. [How you drive the browser](/introduction/control) covers both. + +From there: + +- Behind a login? [Authentication](/auth/overview). +- Getting blocked? [Bot anti-detection](/browsers/bot-detection/overview). +- Running it repeatedly? [Browser pools](/browsers/pools). +- Deploying the agent? [Code execution platform](/apps/develop). +- Worked examples: [cookbooks](/cookbooks). + + + +## Path 2: hand it to your coding agent + +Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the Kernel CLI and skills, authenticates you, and opens a live browser session that you or your agent can drive. + +import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; + + + +### Agent-readable surfaces + +| Surface | What it's for | +| --- | --- | +| [`kernel.sh/llms.txt`](https://www.kernel.sh/llms.txt) | Hand-written. What Kernel is, when to use it, every machine endpoint. Start here. | +| [`kernel.sh/docs/llms.txt`](https://www.kernel.sh/docs/llms.txt) | Index of every docs page, for fetching the ones a task needs. | +| [`kernel.sh/docs/llms-full.txt`](https://www.kernel.sh/docs/llms-full.txt) | The whole docs corpus in one file, for agents with room for it. | +| [Agent Skills](/skills/overview) | Kernel know-how installed into the agent, so it doesn't re-read docs every session. | +| [MCP server](/reference/mcp-server) | Kernel's API as tools, for agents that call tools instead of writing code. | +| [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | From d6f012dccfed3a0377a2dc1994dbbc4d5b19f302 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:38:51 +0000 Subject: [PATCH 02/78] List every Kernel skill and update the introduction page Show all published skills on Agent Skills, with the most-installed ones highlighted first. Point the introduction's start-here and how-it-works cards at the new navigation, and drop the app platform and scaling sections that now live under Control and Scale. Co-Authored-By: Claude Opus 5.5 --- index.mdx | 51 ++++++++++++++++++++++----------------------- skills/overview.mdx | 44 ++++++++++++++------------------------ 2 files changed, 41 insertions(+), 54 deletions(-) diff --git a/index.mdx b/index.mdx index 73b4a5cc..6ef991c4 100644 --- a/index.mdx +++ b/index.mdx @@ -25,19 +25,17 @@ We build crazy fast, open source infra for AI agents to access the internet. Tru ## start here - - Spin up a browser and pick the shape — headless, stealth, GPU, profiles. + + Create a browser, drive it, and clean up in a few lines of code. - - Drive it with computer use, playwright execution, CDP, or WebDriver BiDi. + + Every primitive and product, each linking to its docs. - - Watch it live, record replays, and capture screenshots. + + End-to-end recipes you can clone and run. -[Concepts](/info/concepts) covers Kernel's object model, and [browsers on unikernels](/info/unikernels) covers the architecture underneath it. - import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx';
@@ -58,23 +56,24 @@ import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx';
-## prod setup - -Our [app platform](/apps/develop) is a serverless compute service for running agent loops triggered on demand or by scheduled events without having to provision or manage sandboxes. Your agent runs co-located with its browser to minimize network latency. +## how it works -Scaffold a project from a template: - -```bash -kernel create --template computer-use -``` - -Deploy and invoke it on demand: - -```bash -kernel deploy agent.ts -kernel invoke my-agent my-task --payload '{"url": "https://example.com"}' -``` - -### scaling + + + Pick the shape of the browser — headless, stealth, proxies, profiles, and credentials. + + + Drive it with playwright execution, computer use, CDP, or WebDriver BiDi, and choose where your loop runs. + + + Keep browsers ready in pools and plan around concurrency limits. + + + Watch sessions live, record replays, and stream telemetry. + + + Organize work with projects, API keys, audit logs, and spending caps. + + -[browser pools](/browsers/pools) keep browsers ready to use and pre-configured, so you skip start-up latency on every task and idle browsers aren't billed. reach for them once you're running the same workload repeatedly, need low-latency acquisition, or are scaling steady, high-frequency traffic — on-demand `browsers.create()` stays the right call for occasional, bursty, or one-off work. +[Concepts](/info/concepts) covers Kernel's object model, and [browsers on unikernels](/info/unikernels) covers the architecture underneath it. diff --git a/skills/overview.mdx b/skills/overview.mdx index c7e2e2fc..18fb4d5f 100644 --- a/skills/overview.mdx +++ b/skills/overview.mdx @@ -5,65 +5,53 @@ description: "Kernel skills that teach your coding agent how to use cloud browse mode: "wide" --- -Skills give your coding agent Kernel know-how it keeps across sessions, so it doesn't have to re-read the docs every time. Install all of them into your project: +Skills give your coding agent Kernel know-how it keeps across sessions, so it doesn't have to re-read the docs every time. Install every Kernel skill into your project: ```bash npx skills add kernel/skills ``` -If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It gives your agent a direct path to Kernel's browser, proxy, profile, and authentication capabilities. +If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It covers browsers, browser pools, profiles, proxies, replays, extensions, file system operations, process execution, computer controls, managed auth, and app deployment. -## Get started +## Most installed + + Best practices for using agent-browser with Kernel cloud browsers. + - Manage browsers, apps, profiles, proxies, managed auth, API keys, and projects from the CLI. + Manage browsers, pools, profiles, proxies, replays, extensions, managed auth, and app deployment from the CLI. Build browser automation in TypeScript with playwright execution or CDP, profiles, and proxies. + + Profile a site's bot-detection vendors and find a browser configuration that gets through. + + + Use managed auth to log in to websites that require an authenticated session. + Build and debug Python browser automation with the Kernel SDK. -## Build reliable automations +## More skills Turn a verified browser workflow into a reusable skill for automating a specific site. - - Use managed auth to log in to websites that require an authenticated session. - - - Profile a site's bot-detection vendors and find a browser configuration that gets through. - - - Best practices for using agent-browser with Kernel cloud browsers. + + Debug VM issues, network errors, Chrome crashes, page-load failures, and live view problems. Best practices for using browser-use's browser-harness with Kernel over CDP. - - -## Debug - - - - Debug VM issues, network errors, Chrome crashes, page-load failures, and live view problems. - Compare two profile snapshots to find state differences that explain an issue. - - -## Create content - - Render smooth MP4 videos from a web page or animated visualization with headless Chromium. - -See every skill on [skills.sh](https://skills.sh/kernel/skills). From 1f40677433adee88f3a5a9efe88840c859605624 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:40:14 +0000 Subject: [PATCH 03/78] Split agent and browser automation frameworks on integrations Separate agent frameworks (the model loop) from browser automation frameworks (driving the page), add a Playwright card, and list computer use models by provider with Anthropic, OpenAI, and Gemini first. Co-Authored-By: Claude Opus 5.5 --- integrations/overview.mdx | 43 +++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 7c7710bd..adcafd44 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -9,7 +9,7 @@ Kernel browsers work with any tool that speaks the Chrome DevTools Protocol or W ## Agent frameworks -Build the agent in code and run its browser on Kernel. +Build the agent — the model loop that decides what to do — and give it a Kernel browser as a tool. @@ -18,39 +18,49 @@ Build the agent in code and run its browser on Kernel. Build Claude agents that drive Kernel browsers with playwright execution. + + Give AI SDK agents Kernel browser tools. + + + Run Hermes Agent browser tools on Kernel browsers. + + + +## Browser automation frameworks + +Drive the page itself — navigate, click, fill, extract — against a Kernel browser. + + Mix code and natural language browser automation on Kernel. - - Give AI SDK agents Kernel browser tools. + + Vercel's browser automation CLI for AI agents. Drive Kernel browsers with a WebDriver BiDi automation framework. - - Run Hermes Agent browser tools on Kernel browsers. + + Run Playwright code inside the browser's VM, or connect over CDP. ## Computer use models -Run a vision model's screenshot-and-act loop against a Kernel browser. +Run a vision model's screenshot-and-act loop against a Kernel browser. See the [computer use overview](/integrations/computer-use/overview) for how the loop works. - - How computer use agents run on Kernel browsers. - Claude computer use. - - Gemini computer use. + + OpenAI computer-using agent. - - Yutori Navigator pixels-to-actions model. + + Gemini 2.5 Computer Use. - - OpenAI computer use. + + Yutori Navigator n1.5 pixels-to-actions model. OpenAGI Lux computer use model. @@ -65,9 +75,6 @@ Run a vision model's screenshot-and-act loop against a Kernel browser. Give an agent you already use a Kernel browser. - - Vercel's browser automation CLI for AI agents. - Run Anthropic's hosted agent harness against Kernel browsers. From 4f4df667b3391764b939fa823c5d225bd9c5c25e Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:55:21 +0000 Subject: [PATCH 04/78] Restore wallets, Web Bot Auth, and Vercel template on integrations These were listed on the old integrations page and were left off the card grid. Co-Authored-By: Claude Opus 5.5 --- integrations/overview.mdx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/integrations/overview.mdx b/integrations/overview.mdx index adcafd44..71f6fb02 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -95,6 +95,22 @@ Give an agent you already use a Kernel browser. +## Wallets + +Connect a user's payment method so an agent can complete a checkout without seeing card data. See [payments](/browsers/payments) for how checkouts work end to end. + + + + Approve a one-use payment credential for a browser checkout. + + + Approve browser checkouts against an enrolled payment method. + + + How KERNEL's native wallet integrations work. + + + ## Platforms and infrastructure Provision and run Kernel from the platforms you deploy on. @@ -112,6 +128,9 @@ Provision and run Kernel from the platforms you deploy on. Run browser automations from Val Town's serverless runtime. + + Deploy browser automations to Vercel from a starter template. + ## Tools @@ -125,6 +144,9 @@ Connect Kernel to the rest of your stack. Trace and evaluate browser agents with Laminar. + + Give your agents a verifiable identity that sites can check. + ## By vendor From 2639ce6efb6232f471c30c6947edbf5c043cf21f Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:57:27 +0000 Subject: [PATCH 05/78] Lead the quickstart with the coding-agent path Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index e2e616b4..4519d579 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -1,16 +1,35 @@ --- title: "Quickstart" -description: "Create your first cloud browser, drive it, and hand the rest to your coding agent" +description: "Hand setup to your coding agent, or create your first cloud browser yourself" --- -Two paths. Do the first if you're writing the code; do the second if a coding agent is. +Two paths. Start with the first if a coding agent is writing the code; use the second if you are. + +## Path 1: hand it to your coding agent + +Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the Kernel CLI and skills, authenticates you, and opens a live browser session that you or your agent can drive. + +import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; + + + +### Agent-readable surfaces + +| Surface | What it's for | +| --- | --- | +| [`kernel.sh/llms.txt`](https://www.kernel.sh/llms.txt) | Hand-written. What Kernel is, when to use it, every machine endpoint. Start here. | +| [`kernel.sh/docs/llms.txt`](https://www.kernel.sh/docs/llms.txt) | Index of every docs page, for fetching the ones a task needs. | +| [`kernel.sh/docs/llms-full.txt`](https://www.kernel.sh/docs/llms-full.txt) | The whole docs corpus in one file, for agents with room for it. | +| [Agent Skills](/skills/overview) | Kernel know-how installed into the agent, so it doesn't re-read docs every session. | +| [MCP server](/reference/mcp-server) | Kernel's API as tools, for agents that call tools instead of writing code. | +| [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | + +## Path 2: write it yourself You'll need an API key from the [dashboard](https://dashboard.onkernel.com). Set it as `KERNEL_API_KEY` — every SDK, the CLI, and the MCP server read it from the environment. -## Path 1: write it yourself - @@ -90,22 +109,3 @@ From there: - Worked examples: [cookbooks](/cookbooks). - -## Path 2: hand it to your coding agent - -Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the Kernel CLI and skills, authenticates you, and opens a live browser session that you or your agent can drive. - -import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; - - - -### Agent-readable surfaces - -| Surface | What it's for | -| --- | --- | -| [`kernel.sh/llms.txt`](https://www.kernel.sh/llms.txt) | Hand-written. What Kernel is, when to use it, every machine endpoint. Start here. | -| [`kernel.sh/docs/llms.txt`](https://www.kernel.sh/docs/llms.txt) | Index of every docs page, for fetching the ones a task needs. | -| [`kernel.sh/docs/llms-full.txt`](https://www.kernel.sh/docs/llms-full.txt) | The whole docs corpus in one file, for agents with room for it. | -| [Agent Skills](/skills/overview) | Kernel know-how installed into the agent, so it doesn't re-read docs every session. | -| [MCP server](/reference/mcp-server) | Kernel's API as tools, for agents that call tools instead of writing code. | -| [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | From e96a02cf253f0b9044f5b958581bf2418019fd35 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 15:07:06 +0000 Subject: [PATCH 06/78] Explain the unikernel architecture on the introduction page Co-Authored-By: Claude Opus 5.5 --- index.mdx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index 6ef991c4..52803808 100644 --- a/index.mdx +++ b/index.mdx @@ -76,4 +76,15 @@ import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; -[Concepts](/info/concepts) covers Kernel's object model, and [browsers on unikernels](/info/unikernels) covers the architecture underneath it. +## under the hood + +Every Kernel browser runs Chromium on its own [Unikraft-based unikernel](/info/unikernels): a single-purpose VM that carries only what the browser needs, isolated at the hypervisor level instead of sharing a host kernel with other tenants. Browsers already sandbox untrusted web content across processes, which covers the internal isolation a unikernel leaves out. + +That architecture is what makes these possible: + +- **Fast starts.** Browsers are created in about 30ms at P50 — see [performance](/browsers/performance). +- **Standby without losing state.** After five seconds with no activity, a browser enters [standby](/browsers/standby): its state stays the same and it stops accruing usage cost. +- **Root access that's safe to give.** Each session is a single-tenant VM, so [SSH](/browsers/ssh), [process execution](/browsers/process-execution), and [file I/O](/browsers/file-io) stay contained to that session. +- **Code next to the browser.** [Playwright execution](/browsers/playwright-execution) and the [code execution platform](/apps/develop) run your code alongside the browser, which removes round-trip latency, unexpected disconnects, and screenshot bandwidth. + +The browser images are open source at [kernel/kernel-images](https://github.com/kernel/kernel-images). [Browsers on unikernels](/info/unikernels) goes deeper on the design, and [concepts](/info/concepts) defines the objects you'll work with. From 183fe9b42bbcc53eba18b041cb793b1bcec9ac96 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 15:30:46 +0000 Subject: [PATCH 07/78] Rewrite the introduction page Lead with what KERNEL provides, explain the unikernel design, point to the open-source browser image and VM runtime, then route readers to products, quickstart, cookbooks, how it works, and plans. Co-Authored-By: Claude Opus 5.5 --- index.mdx | 103 +++++++++++++++++++++++------------------------------- 1 file changed, 44 insertions(+), 59 deletions(-) diff --git a/index.mdx b/index.mdx index 52803808..0e81047a 100644 --- a/index.mdx +++ b/index.mdx @@ -5,86 +5,71 @@ description: "" mode: "wide" --- -We build crazy fast, open source infra for AI agents to access the internet. Trusted by Cash App, Framer, and 11,000 teams. +KERNEL gives your agents and automations sandboxed chromium browsers in the cloud. each browser runs in its own vm, starts in about 30ms, and can be driven with playwright, computer controls, cdp, or webdriver bidi. around the browser, we provide what agents need on real websites: stealth and proxies, authentication, payments, browser pools, and live view, replays, and telemetry for debugging. - - - We spin up cloud browsers in <30ms with GPU acceleration when needed. - - - choose Managed Auth or Fill from Vault for browser agents. - - - We solve CAPTCHAs and manage residential proxies to help you see fewer of them. +## why we built it this way + +most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. browsers already sandbox untrusted web content across processes, which covers the internal isolation a unikernel leaves out. + +that choice is why a browser starts in about 30ms ([performance](/browsers/performance)), why an idle browser can go into [standby](/browsers/standby) after five seconds and keep its state without accruing usage cost, and why [ssh](/browsers/ssh) and [process execution](/browsers/process-execution) are safe to hand an agent: every session is its own vm. [browsers on unikernels](/info/unikernels) goes deeper on the design. + +## open source + +our browser image and vm runtime are on github. + + + + the chromium images behind KERNEL browsers. - - You can view sessions live and record them as MP4s for debugging. + + the vm runtime for oci images, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework. ## start here - - Create a browser, drive it, and clean up in a few lines of code. + + every primitive and product, each linking to its docs. - - Every primitive and product, each linking to its docs. + + hand setup to your coding agent, or create your first browser yourself. - - End-to-end recipes you can clone and run. + + end-to-end recipes you can clone and run. -import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; - -
-

fast setup

-
-
- - -
-
-

- copy and paste this into your AI coding agent (Cursor, Claude, Windsurf, etc.). it installs the Kernel CLI and skills, authenticates you, and opens a live browser session that you or your agent can interact with. -

-
- -
-
-
-
- ## how it works - - Pick the shape of the browser — headless, stealth, proxies, profiles, and credentials. + + pick the shape of the browser: headless, stealth, proxies, profiles, and credentials. - - Drive it with playwright execution, computer use, CDP, or WebDriver BiDi, and choose where your loop runs. + + drive it with playwright execution, computer use, cdp, or webdriver bidi, and choose where your loop runs. - - Keep browsers ready in pools and plan around concurrency limits. + + keep browsers ready in pools and plan around concurrency limits. - - Watch sessions live, record replays, and stream telemetry. + + watch sessions live, record replays, and stream telemetry. - - Organize work with projects, API keys, audit logs, and spending caps. + + organize work with projects, api keys, audit logs, and spending caps. -## under the hood +## plans and enterprise -Every Kernel browser runs Chromium on its own [Unikraft-based unikernel](/info/unikernels): a single-purpose VM that carries only what the browser needs, isolated at the hypervisor level instead of sharing a host kernel with other tenants. Browsers already sandbox untrusted web content across processes, which covers the internal isolation a unikernel leaves out. - -That architecture is what makes these possible: - -- **Fast starts.** Browsers are created in about 30ms at P50 — see [performance](/browsers/performance). -- **Standby without losing state.** After five seconds with no activity, a browser enters [standby](/browsers/standby): its state stays the same and it stops accruing usage cost. -- **Root access that's safe to give.** Each session is a single-tenant VM, so [SSH](/browsers/ssh), [process execution](/browsers/process-execution), and [file I/O](/browsers/file-io) stay contained to that session. -- **Code next to the browser.** [Playwright execution](/browsers/playwright-execution) and the [code execution platform](/apps/develop) run your code alongside the browser, which removes round-trip latency, unexpected disconnects, and screenshot bandwidth. - -The browser images are open source at [kernel/kernel-images](https://github.com/kernel/kernel-images). [Browsers on unikernels](/info/unikernels) goes deeper on the design, and [concepts](/info/concepts) defines the objects you'll work with. + + + usage rates, plan limits, and what each plan includes. + + + security, hipaa, zero data retention, and custom limits. + + + talk to us about an enterprise plan, custom limits, or a pilot. + + From 1e815aeba89e0fa91c57c4af4edccb6f437269fe Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 16:25:18 +0000 Subject: [PATCH 08/78] Add concepts page and diagrams; reorder products, control, and integrations - Introduction: image cards pointing to products and quickstart, and a containers-vs-unikernel diagram; drop the how-it-works and plans sections - New important concepts page covering models, agent frameworks, system prompts, tools, skills, automation frameworks, and browser infrastructure - Products grid: one list of products in a fixed order, no primitives split - Quickstart next steps lead with stealth, authentication, and payments - Cookbooks: reorder common patterns - Integrations: sections follow the agent stack, by what the reader is doing - Sidebar: config registry at the top level of Configure; reorder Control Co-Authored-By: Claude Opus 5.5 --- browsers/curl.mdx | 1 + cookbooks.mdx | 8 +- docs.json | 21 ++-- images/overview/agent-stack.svg | 39 +++++++ images/overview/quickstart.svg | 15 +++ images/overview/unikernel-vs-containers.svg | 55 ++++++++++ index.mdx | 61 +++-------- integrations/overview.mdx | 115 +++++++++----------- overview/concepts.mdx | 71 ++++++++++++ overview/products.mdx | 31 ++---- start/quickstart.mdx | 5 +- 11 files changed, 274 insertions(+), 148 deletions(-) create mode 100644 images/overview/agent-stack.svg create mode 100644 images/overview/quickstart.svg create mode 100644 images/overview/unikernel-vs-containers.svg create mode 100644 overview/concepts.mdx diff --git a/browsers/curl.mdx b/browsers/curl.mdx index e7f372d0..7bc0e680 100644 --- a/browsers/curl.mdx +++ b/browsers/curl.mdx @@ -1,5 +1,6 @@ --- title: "Curl" +sidebarTitle: "Browser Curl" description: "Send HTTP requests through Kernel browsers" --- diff --git a/cookbooks.mdx b/cookbooks.mdx index 2b6f86ea..e616d5d1 100644 --- a/cookbooks.mdx +++ b/cookbooks.mdx @@ -14,6 +14,10 @@ import { CookbookSearch } from '/snippets/cookbook-search.jsx'; ## Common patterns + +
common patterns
+ Using Playwright with computer use fallback. +
common patterns
Collect credentials from a human, then let your agent fill the form. @@ -22,10 +26,6 @@ import { CookbookSearch } from '/snippets/cookbook-search.jsx';
common patterns
Enable Payments in a Browser Agent.
- -
common patterns
- Using Playwright with computer use fallback. -
common patterns
Hold an agent while Kernel's captcha solver works, and tell it what actually happened. diff --git a/docs.json b/docs.json index be641e16..c28b9163 100644 --- a/docs.json +++ b/docs.json @@ -116,7 +116,8 @@ "pages": [ "index", "overview/products", - "overview/why-kernel" + "overview/why-kernel", + "overview/concepts" ] }, { @@ -146,8 +147,7 @@ "browsers/gpu-acceleration", "browsers/extensions", "browsers/chrome-policies", - "browsers/private-networking", - "config-registry" + "browsers/private-networking" ] }, { @@ -212,7 +212,8 @@ "integrations/wallets/stripe-link", "integrations/wallets/agentcard" ] - } + }, + "config-registry" ] }, { @@ -221,13 +222,9 @@ "introduction/control", "browsers/playwright-execution", "browsers/computer-controls", - "browsers/repl", "browsers/webmcp", + "browsers/repl", "browsers/browser-loop", - "browsers/process-execution", - "browsers/file-io", - "browsers/curl", - "browsers/ssh", { "group": "Code Execution Platform", "pages": [ @@ -239,7 +236,11 @@ "apps/status", "apps/logs" ] - } + }, + "browsers/curl", + "browsers/file-io", + "browsers/process-execution", + "browsers/ssh" ] }, { diff --git a/images/overview/agent-stack.svg b/images/overview/agent-stack.svg new file mode 100644 index 00000000..214c5443 --- /dev/null +++ b/images/overview/agent-stack.svg @@ -0,0 +1,39 @@ + + + + +agent framework or harness +runs the loop: ask the model, run the tool it picks, repeat + +system prompt + +tools + +skills + +model +picks the next action +claude, gpt, gemini +claude agent sdk, vercel ai sdk, +browser use, mastra + +browser automation framework +turns a tool call into page actions +playwright, puppeteer, +stagehand, agent browser + +browser infrastructure: KERNEL +runs the browser: its vm, stealth, proxies, logins, payments + +the website + + +tool call + +cdp or webdriver bidi + +https + + +dashed: computer controls and mcp tools call KERNEL directly, with no automation framework in between + diff --git a/images/overview/quickstart.svg b/images/overview/quickstart.svg new file mode 100644 index 00000000..8b327157 --- /dev/null +++ b/images/overview/quickstart.svg @@ -0,0 +1,15 @@ + + + +give your agent the internet + +copy prompt + + + + +$ kernel login +$ npx skills add kernel/skills +$ kernel browsers create + + diff --git a/images/overview/unikernel-vs-containers.svg b/images/overview/unikernel-vs-containers.svg new file mode 100644 index 00000000..c9663376 --- /dev/null +++ b/images/overview/unikernel-vs-containers.svg @@ -0,0 +1,55 @@ + + + +containers on a shared host + + +container + +chromium + +container + +chromium + +container + +chromium + +shared host kernel +seconds to start, so warm pools stay running +every browser shares one host kernel +KERNEL: one vm per browser + + + + + +vm + +unikernel + +chromium + + + + +vm + +unikernel + +chromium + + + + +vm + +unikernel + +chromium + +hypervisor +about 30ms to start, standby after 5s idle +each browser isolated at the hypervisor + diff --git a/index.mdx b/index.mdx index 0e81047a..e82fa1d0 100644 --- a/index.mdx +++ b/index.mdx @@ -7,10 +7,23 @@ mode: "wide" KERNEL gives your agents and automations sandboxed chromium browsers in the cloud. each browser runs in its own vm, starts in about 30ms, and can be driven with playwright, computer controls, cdp, or webdriver bidi. around the browser, we provide what agents need on real websites: stealth and proxies, authentication, payments, browser pools, and live view, replays, and telemetry for debugging. + + + browsers, stealth, proxies, auth, payments, and everything else, each linking to its docs. + + + hand setup to your coding agent with one prompt, or create your first browser yourself. + + + ## why we built it this way most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. browsers already sandbox untrusted web content across processes, which covers the internal isolation a unikernel leaves out. + + on the left, three chromium containers share one host kernel. on the right, each chromium runs on its own unikernel vm above a hypervisor. + + that choice is why a browser starts in about 30ms ([performance](/browsers/performance)), why an idle browser can go into [standby](/browsers/standby) after five seconds and keep its state without accruing usage cost, and why [ssh](/browsers/ssh) and [process execution](/browsers/process-execution) are safe to hand an agent: every session is its own vm. [browsers on unikernels](/info/unikernels) goes deeper on the design. ## open source @@ -25,51 +38,3 @@ our browser image and vm runtime are on github. the vm runtime for oci images, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework.
- -## start here - - - - every primitive and product, each linking to its docs. - - - hand setup to your coding agent, or create your first browser yourself. - - - end-to-end recipes you can clone and run. - - - -## how it works - - - - pick the shape of the browser: headless, stealth, proxies, profiles, and credentials. - - - drive it with playwright execution, computer use, cdp, or webdriver bidi, and choose where your loop runs. - - - keep browsers ready in pools and plan around concurrency limits. - - - watch sessions live, record replays, and stream telemetry. - - - organize work with projects, api keys, audit logs, and spending caps. - - - -## plans and enterprise - - - - usage rates, plan limits, and what each plan includes. - - - security, hipaa, zero data retention, and custom limits. - - - talk to us about an enterprise plan, custom limits, or a pilot. - - diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 71f6fb02..89cdcd56 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -5,43 +5,51 @@ description: "Run Kernel browsers from the agent frameworks, models, and platfor mode: "wide" --- -Kernel browsers work with any tool that speaks the Chrome DevTools Protocol or WebDriver BiDi. The guides below cover the integrations with first-class support. For anything else, see [how you drive the browser](/introduction/control). +Kernel browsers work with any tool that speaks the Chrome DevTools Protocol or WebDriver BiDi. The guides below cover the integrations with first-class support. For anything else, see [how you drive the browser](/introduction/control). For every integration from one vendor on one page, see [Claude](/integrations/claude/overview) and [Vercel](/integrations/vercel/overview). -## Agent frameworks +Sections follow the pieces of a browser agent described in [important concepts](/overview/concepts). -Build the agent — the model loop that decides what to do — and give it a Kernel browser as a tool. +## Add a browser to an agent you already use + +Give a finished agent or coding tool a Kernel browser, usually through MCP, a plugin, or a config setting. You don't write the loop. - - Run Browser Use agents on Kernel browsers. + + Give Claude Code and Claude Desktop a Kernel browser. - - Build Claude agents that drive Kernel browsers with playwright execution. + + Run Anthropic's hosted agent harness against Kernel browsers. - - Give AI SDK agents Kernel browser tools. + + Give Replit Agent a Kernel browser. + + + Give your Vercel Eve agent a Kernel browser. + + + Give your Foreman agent a Kernel browser. + + + Give Vercel's fx coding agent a Kernel browser over MCP. Run Hermes Agent browser tools on Kernel browsers. -## Browser automation frameworks +## Build your own agent -Drive the page itself — navigate, click, fill, extract — against a Kernel browser. +Agent frameworks for writing the loop yourself, with a Kernel browser as one of its tools. - - Mix code and natural language browser automation on Kernel. - - - Vercel's browser automation CLI for AI agents. + + Run Browser Use agents on Kernel browsers. - - Drive Kernel browsers with a WebDriver BiDi automation framework. + + Build Claude agents that drive Kernel browsers with playwright execution. - - Run Playwright code inside the browser's VM, or connect over CDP. + + Give AI SDK agents Kernel browser tools. @@ -70,36 +78,36 @@ Run a vision model's screenshot-and-act loop against a Kernel browser. See the [
-## Agents and coding tools +## Browser automation frameworks -Give an agent you already use a Kernel browser. +Drive the page itself — navigate, click, fill, extract — against a Kernel browser. - - Run Anthropic's hosted agent harness against Kernel browsers. - - - Give your Vercel Eve agent a Kernel browser. - - - Give Claude Code and Claude Desktop a Kernel browser. + + Run Playwright code inside the browser's VM, or connect over CDP. - - Give Replit Agent a Kernel browser. + + Mix code and natural language browser automation on Kernel. - - Give your Foreman agent a Kernel browser. + + Vercel's browser automation CLI for AI agents. - - Give Vercel's fx coding agent a Kernel browser over MCP. + + Drive Kernel browsers with a WebDriver BiDi automation framework. -## Wallets +## Credentials, identity, and payments -Connect a user's payment method so an agent can complete a checkout without seeing card data. See [payments](/browsers/payments) for how checkouts work end to end. +Give the browser what it needs to log in, prove who it is, and check out, without handing secrets to your agent. See [authentication](/auth/overview) and [payments](/browsers/payments) for how these work end to end. + + Use credentials from your 1Password vaults. + + + Give your agents a verifiable identity that sites can check. + Approve a one-use payment credential for a browser checkout. @@ -111,7 +119,7 @@ Connect a user's payment method so an agent can complete a checkout without seei -## Platforms and infrastructure +## Deploy and provision Provision and run Kernel from the platforms you deploy on. @@ -119,6 +127,9 @@ Provision and run Kernel from the platforms you deploy on. Add Kernel to a Vercel project through the Marketplace. + + Deploy browser automations to Vercel from a starter template. + Provision Kernel browsers and plans with the Stripe Projects CLI. @@ -128,36 +139,14 @@ Provision and run Kernel from the platforms you deploy on. Run browser automations from Val Town's serverless runtime. - - Deploy browser automations to Vercel from a starter template. - -## Tools +## Observability -Connect Kernel to the rest of your stack. +Send traces and evaluations from browser agents to the tools you already monitor with. - - Use credentials from your 1Password vaults. - Trace and evaluate browser agents with Laminar. - - Give your agents a verifiable identity that sites can check. - - - -## By vendor - -Every Kernel integration from one vendor, on one page. - - - - Claude Code, Claude Desktop, the Agent SDK, and Managed Agents. - - - The AI SDK, Agent Browser, Eve, Foreman, fx, and the Marketplace. - diff --git a/overview/concepts.mdx b/overview/concepts.mdx new file mode 100644 index 00000000..2d0245b7 --- /dev/null +++ b/overview/concepts.mdx @@ -0,0 +1,71 @@ +--- +title: "Important Concepts" +description: "How models, agent frameworks, system prompts, tools, skills, browser automation frameworks, and browser infrastructure fit together" +mode: "wide" +--- + +A browser agent is built from several pieces, usually from different vendors. Knowing which piece does what tells you where a feature belongs and which piece to change when something goes wrong. + + + an agent framework holding a system prompt, tools, and skills sends requests to a model. its tool calls go to a browser automation framework, which drives a KERNEL browser over cdp or webdriver bidi, which loads the website. computer controls and mcp tools call KERNEL directly. + + +## Model + +The model decides the next action from what it's given: the system prompt, the conversation so far, tool results, and screenshots. Claude, GPT, and Gemini are general-purpose models. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes, so they can drive a page without selectors. + +The model never touches the browser. It returns text or a tool call, and something else carries it out. + +## Agent framework or harness + +The agent framework runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. "Harness" usually means the loop plus everything configured around it: the system prompt, the tools, and the skills. + +You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or you use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit), and give it a browser. + +## System prompt + +The system prompt is the instruction set the harness sends with every request to the model: its role, its rules, and the format its answers should take. Because it's sent on every turn, it's the place for guidance that applies to every task, such as "log out before you finish" or "never submit a payment without confirming the total". + +## Tools + +A tool is a function the model can ask the harness to call. Each tool has a name, a description, and an input schema. The model only chooses the tool and its arguments; the harness runs it and returns the result. + +For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this Playwright code". KERNEL provides several ready-made ones: + +- [Playwright execution](/browsers/playwright-execution) runs a snippet of Playwright code inside the browser's vm and returns the result. +- [Computer controls](/browsers/computer-controls) click, type, scroll, and take screenshots at the operating-system level. +- The [MCP server](/reference/mcp-server) exposes KERNEL's API as tools to any client that speaks the Model Context Protocol (MCP), such as Claude, Cursor, or Codex. + +## Skills + +A skill is a packaged set of instructions and reference files that an agent loads only when a task needs it. That's the difference from a system prompt, which is sent on every turn. Tools let an agent do something; skills teach it how and when to do it well. + +KERNEL publishes [Agent Skills](/skills/overview) that teach coding agents the KERNEL CLI, the SDKs, bot detection, and authentication, so they don't have to re-read the docs every session. + +## Browser automation framework + +A browser automation framework turns an action like "click the submit button" or "fill in this form" into browser protocol commands, and sends them to the browser over the Chrome DevTools Protocol (CDP) or WebDriver BiDi. + +- **Deterministic:** [Playwright](/browsers/playwright-execution) and Puppeteer do exactly what your code says, using selectors you write. +- **AI-assisted:** [Stagehand](/integrations/stagehand) and [Agent Browser](/integrations/vercel/agent-browser) add natural-language actions on top, so the model can describe what to do instead of naming a selector. + +An automation framework drives a browser but doesn't run one. It needs a browser to connect to. + +## Browser infrastructure + +Browser infrastructure is where the browser runs and what it carries. KERNEL creates each chromium browser in its own vm, and around it handles what agents need on real websites: [stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview), [profiles](/browsers/profiles), [logins](/auth/overview), [payments](/browsers/payments), and [live view, replays, and telemetry](/introduction/observe) for debugging. + +Everything above this layer is interchangeable. You can switch models, frameworks, or automation libraries and keep the same browsers, profiles, and credentials. + +## Which piece to change + +| What you see | Where to look | +| --- | --- | +| The agent picks the wrong action or ignores a rule | The model or the system prompt | +| The agent doesn't know how to use an API or a site | Skills | +| The agent can't do something at all | Tools | +| A selector breaks or a page action fails | The browser automation framework, or switch to [computer controls](/browsers/computer-controls) | +| The site blocks the browser, shows a CAPTCHA, or the login is lost | Browser infrastructure: [stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [authentication](/auth/overview) | +| The agent is slow between actions | Where the loop runs: see [how you drive the browser](/introduction/control) | + +For the objects you'll work with in KERNEL's API, such as browsers, browser pools, apps, and invocations, see [KERNEL objects](/info/concepts). diff --git a/overview/products.mdx b/overview/products.mdx index 064553f8..9baa63be 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -1,50 +1,41 @@ --- title: "See All Products" -description: "Kernel's primitives and the products built on them, each linking to its documentation" +description: "Every Kernel product, each linking to its documentation" mode: "wide" --- -Kernel is built from three primitives: a browser, the state it carries, and the secrets it can use. Products combine them to solve a specific problem, like logging in or checking out. - -## Primitives - Sandboxed Chromium in its own microVM, created in under 30ms, with GPU acceleration when you need it. - - Persisted browser state — cookies, storage, logins, history, open tabs — that you load into any browser. + + Anti-detection defaults on every browser, plus a managed CAPTCHA solver. + + + Datacenter, ISP, residential, mobile, or your own. Kernel-provided proxies aren't billed. Credentials and payment items a browser can fill into a page without your agent ever reading them. - - -## Products - - Fill logins from a vault, or let managed auth log in, handle MFA, and keep the session alive. Let agents complete checkouts through Link or AgentCard without exposing card data. - - Anti-detection defaults on every browser, plus a managed CAPTCHA solver. + + Persisted browser state — cookies, storage, logins, history, open tabs — that you load into any browser. - - Datacenter, ISP, residential, mobile, or your own. Kernel-provided proxies aren't billed. + + Give it a URL and get browser and proxy settings that have worked on that site. Pre-configured browsers kept ready, so acquiring one skips start-up latency. - - Give it a URL and get browser and proxy settings that have worked on that site. - Watch or take over a running session, and record any session as an MP4. - + Structured events for navigation, network, CDP, captcha, and proxy activity. diff --git a/start/quickstart.mdx b/start/quickstart.mdx index 4519d579..0271f9f3 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -102,10 +102,9 @@ Two things determine the shape of everything after this: which control surface y From there: +- Getting blocked? [Stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview). - Behind a login? [Authentication](/auth/overview). -- Getting blocked? [Bot anti-detection](/browsers/bot-detection/overview). -- Running it repeatedly? [Browser pools](/browsers/pools). -- Deploying the agent? [Code execution platform](/apps/develop). +- Need to check out? [Payments](/browsers/payments). - Worked examples: [cookbooks](/cookbooks). From 937b3742b3a0aebdb4069ebec81687205ab4709e Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Mon, 28 Sep 2026 16:52:30 +0000 Subject: [PATCH 09/78] Refine introduction and move plan limits into Scale - Introduction: product, quickstart, and cookbooks cards at the bottom; explain what the unikernel design does for lifecycle speed, standby, and safe root access; state the open-source commitment - Why KERNEL: describe authentication and payments as built on vaults and profiles; drop stale primitives wording - Sidebar: important concepts before Why KERNEL - Concurrency and limits now holds every per-plan limit and the API rate limits; pricing links to it, and links to the old pricing anchors point at the new sections Co-Authored-By: Claude Opus 5.5 --- auth/faq.mdx | 2 +- browsers/concurrency-and-limits.mdx | 31 ++++++++++++++---------- browsers/performance.mdx | 2 +- browsers/pools.mdx | 6 ++--- browsers/regions.mdx | 2 +- changelog.mdx | 2 +- docs.json | 4 ++-- images/overview/cookbooks.svg | 17 +++++++++++++ index.mdx | 33 +++++++++++++++---------- info/pricing.mdx | 37 ++++------------------------- info/spending-caps.mdx | 2 +- introduction/create.mdx | 4 ++-- introduction/scale.mdx | 2 +- overview/why-kernel.mdx | 4 ++-- start/quickstart.mdx | 2 +- 15 files changed, 77 insertions(+), 73 deletions(-) create mode 100644 images/overview/cookbooks.svg diff --git a/auth/faq.mdx b/auth/faq.mdx index d87db6ec..c1c726f2 100644 --- a/auth/faq.mdx +++ b/auth/faq.mdx @@ -61,4 +61,4 @@ See [Reuse one identity across sites](/browsers/profiles/agent-patterns#reuse-on Managed Auth is included on all plans with no per-connection fees. It uses browser sessions for login, health checks, and eligible reauthentication attempts. These count toward your browser usage like any other browser session. -Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session health and can automatically reauthenticate eligible credential-based flows when sessions expire. Most sessions stay valid for days. For example, monitoring 100 auth connections typically costs less than $5/month in browser usage. See [Pricing & Limits](/info/pricing#managed-auth) for details. +Auth sessions are fast (typically 5-30 seconds each). Kernel monitors session health and can automatically reauthenticate eligible credential-based flows when sessions expire. Most sessions stay valid for days. For example, monitoring 100 auth connections typically costs less than $5/month in browser usage. See [Pricing](/info/pricing#faq) for details. diff --git a/browsers/concurrency-and-limits.mdx b/browsers/concurrency-and-limits.mdx index 15b8c0ba..6719460d 100644 --- a/browsers/concurrency-and-limits.mdx +++ b/browsers/concurrency-and-limits.mdx @@ -9,23 +9,25 @@ Three separate limits shape a scaled workload, and they're easy to confuse. Conc One org-wide limit covers every browser you're running, whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools). The full limit is available to either API in any mix. -| Plan | Concurrent browsers | -| --- | --- | -| Developer | 5 | -| Hobbyist | 10 | -| Start-Up | 150 | -| Enterprise | Custom | +| Limit | Developer | Hobbyist | Start-Up | Enterprise | +| --- | --- | --- | --- | --- | +| Concurrent browsers | 5 | 10 | 150 | Custom | +| App invocations | 5 | 10 | 50 | Custom | +| App invocations (per app) | 5 | 10 | 20 | Custom | +| Managed auth health check interval | 6 hours minimum | 1 hour minimum | 20 minutes minimum | Custom | + +Limits are org-wide unless stated otherwise. -Two things count against it that people don't expect: +Two things count against the concurrent browser limit that people don't expect: - **Reserved pool capacity counts whether or not it's acquired.** A pool sized to 40 browsers uses 40 of your limit for as long as it exists. - **Browsers in [standby](/browsers/standby) count.** Standby stops usage charges, not the concurrency slot. Delete the browser to release it. Set per-project caps if you're splitting one org limit across teams or environments — see [project concurrency limits](/info/projects#concurrency-limits). -## Create rate +## Rate limits -Browser creation is rate limited separately from concurrency. The create rate caps how fast you can create browsers, not how many you may run. +Kernel enforces per-organization rate limits on API requests. Browser creation is rate limited separately from concurrency: the create rate caps how fast you can create browsers, not how many you may run. {/* TODO: add the per-plan browser-create rate table once the numbers are confirmed. */} @@ -33,7 +35,13 @@ Acquiring from a [browser pool](/browsers/pools) isn't subject to the create rat ### What happens at the limit -Exceeding the create rate returns `429 Too Many Requests` with a `Retry-After` header, and rate-limited responses carry `X-RateLimit-Limit` and `X-RateLimit-Remaining`. +Exceeding a rate limit returns `429 Too Many Requests`. Rate-limited endpoints include these headers on every response: + +| Header | Description | +| --- | --- | +| `X-RateLimit-Limit` | Maximum requests allowed per minute | +| `X-RateLimit-Remaining` | Requests remaining in the current window | +| `Retry-After` | Seconds to wait before retrying (only on `429` responses) | All Kernel SDKs retry a `429` up to 2 times, honoring `Retry-After`. If retries are exhausted, the SDK raises a typed `RateLimitError` carrying the response headers, so you can apply your own backoff. Queue on your side rather than tightening the retry loop: a `429` means the org is over budget for the minute, so retrying faster doesn't help. @@ -55,7 +63,6 @@ Memory is the practical ceiling on how many tabs and how heavy a page one browse | --- | --- | | Browser `timeout_seconds` (default 60, max 259200 / 72h) | [Termination](/browsers/termination) | | Pool `timeout_seconds` (default 600) and fill rate | [Browser pools](/browsers/pools) | -| App invocation concurrency, per plan and per app | [Pricing](/info/pricing#concurrency-limits) | -| Managed auth health check interval, per plan | [Connection lifecycle](/auth/connection-lifecycle) | +| How managed auth health checks run | [Connection lifecycle](/auth/connection-lifecycle) | | Replay retention, extensions, projects, per plan | [Pricing](/info/pricing#managed-infrastructure) | | Monthly spend | [Spending caps](/info/spending-caps) | diff --git a/browsers/performance.mdx b/browsers/performance.mdx index bc6583e0..7b6be4d3 100644 --- a/browsers/performance.mdx +++ b/browsers/performance.mdx @@ -19,7 +19,7 @@ Kernel browsers run in `us-east`. Use our [app platform](/apps/develop) to coloc 2. Create browser rate limit -Kernel enforces [rate limits](/info/pricing#rate-limiting) on browser creation based on your plan. Our SDKs automatically retry, respecting the `Retry-After` header for delay timing. If retries are exhausted, the SDK throws a typed `RateLimitError` with the response headers accessible for custom backoff logic. +Kernel enforces [rate limits](/browsers/concurrency-and-limits#rate-limits) on browser creation based on your plan. Our SDKs automatically retry, respecting the `Retry-After` header for delay timing. If retries are exhausted, the SDK throws a typed `RateLimitError` with the response headers accessible for custom backoff logic. 3. Non-default browser configurations diff --git a/browsers/pools.mdx b/browsers/pools.mdx index d83958ee..ceccaf35 100644 --- a/browsers/pools.mdx +++ b/browsers/pools.mdx @@ -5,9 +5,9 @@ description: "Configure a pool of ready-to-use browsers for instant acquisition" A browser pool is a fixed set of identical browsers that Kernel keeps running for you. Configure it once — stealth, proxies, [private networking](/browsers/private-networking), extensions, viewport, a [profile](#profiles-with-browser-pools) — then acquire a browser whenever a task needs one and release it when you're done. -Acquiring is faster than creating an on-demand browser because the browser is already running: you skip start-up, including the [Chromium restart](/browsers/performance#troubleshooting-latency) that some settings trigger, and you aren't subject to the [rate limit](/info/pricing#rate-limiting) on browser creation. +Acquiring is faster than creating an on-demand browser because the browser is already running: you skip start-up, including the [Chromium restart](/browsers/performance#troubleshooting-latency) that some settings trigger, and you aren't subject to the [rate limit](/browsers/concurrency-and-limits#rate-limits) on browser creation. -Idle browsers in a pool aren't billed, but the pool's capacity counts against your [concurrency limit](/info/pricing#concurrency-limits). See [Scale](/introduction/scale) for how browser pools fit into production architecture. +Idle browsers in a pool aren't billed, but the pool's capacity counts against your [concurrency limit](/browsers/concurrency-and-limits#concurrency). See [Scale](/introduction/scale) for how browser pools fit into production architecture. ## How browser pools work @@ -30,7 +30,7 @@ A few constraints to weigh before moving a workload onto a browser pool: - **No GPU browsers.** GPU-accelerated browsers are on-demand only. Use `browsers.create()` for WebGL, video, or canvas-heavy work. - **One fixed configuration per browser pool**, with `start_url` the only setting you can override per acquisition — see [Create a browser pool](#create-a-browser-pool). - **A profile set on the browser pool loads read-only**, and a browser pool holds one at a time — see [Per-user profiles with browser pools](#per-user-profiles-with-browser-pools) for how to persist state per user. -- **Browser pool capacity counts against your [concurrency limit](/info/pricing#concurrency-limits)** whether or not its browsers are acquired, though idle pooled browsers aren't billed. +- **Browser pool capacity counts against your [concurrency limit](/browsers/concurrency-and-limits#concurrency)** whether or not its browsers are acquired, though idle pooled browsers aren't billed. - **Plan-gated.** Browser pools are available on the Start-Up and Enterprise plans. ## Create a browser pool diff --git a/browsers/regions.mdx b/browsers/regions.mdx index db348d63..726753f3 100644 --- a/browsers/regions.mdx +++ b/browsers/regions.mdx @@ -175,7 +175,7 @@ Browser pool lists support the same filter. Omit it to list resources across all - **Profiles and extensions** aren't tied to a region. You can reuse your existing [profiles](/browsers/profiles) and [extensions](/browsers/extensions) with browsers in any region within the same project. - **Proxy configurations** can be reused across regions. Browser region chooses where the browser runs; [proxy location](/proxies/overview) controls the exit IP websites see. -- **Concurrency and rate limits** apply across all regions combined, not separately in each region. Browser pool capacity counts toward the same [concurrency limit](/info/pricing#concurrency-limits). +- **Concurrency and rate limits** apply across all regions combined, not separately in each region. Browser pool capacity counts toward the same [concurrency limit](/browsers/concurrency-and-limits#concurrency). Regional browsers reduce interaction latency; they don't provide a data residency guarantee. Profiles, replays, and session metadata aren't confined to the browser's selected region and may be stored or processed in the US. diff --git a/changelog.mdx b/changelog.mdx index 8ebdc835..4d24448f 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -466,7 +466,7 @@ For API library updates, see the [Node SDK](https://github.com/onkernel/kernel-n ## Documentation updates -- Added [API rate limiting](/info/pricing#rate-limiting) documentation. +- Added [API rate limiting](/browsers/concurrency-and-limits#rate-limits) documentation. - Documented the [`disable_default_proxy`](/browsers/bot-detection/stealth) option for stealth browsers. - Updated [live view embedding](/browsers/live-view) docs with iframe focus tips, clipboard sharing guidance, and CSP configuration. - Documented [managed auth re-authentication triggers](/auth/managed-auth). diff --git a/docs.json b/docs.json index c28b9163..d0186762 100644 --- a/docs.json +++ b/docs.json @@ -116,8 +116,8 @@ "pages": [ "index", "overview/products", - "overview/why-kernel", - "overview/concepts" + "overview/concepts", + "overview/why-kernel" ] }, { diff --git a/images/overview/cookbooks.svg b/images/overview/cookbooks.svg new file mode 100644 index 00000000..6cf6d1b9 --- /dev/null +++ b/images/overview/cookbooks.svg @@ -0,0 +1,17 @@ + + + +cookbooks + + +playwright + computer use + +human-in-the-loop credentials + +agentic payments + + + + +github.com/kernel/cookbooks + diff --git a/index.mdx b/index.mdx index e82fa1d0..000e415c 100644 --- a/index.mdx +++ b/index.mdx @@ -7,28 +7,23 @@ mode: "wide" KERNEL gives your agents and automations sandboxed chromium browsers in the cloud. each browser runs in its own vm, starts in about 30ms, and can be driven with playwright, computer controls, cdp, or webdriver bidi. around the browser, we provide what agents need on real websites: stealth and proxies, authentication, payments, browser pools, and live view, replays, and telemetry for debugging. - - - browsers, stealth, proxies, auth, payments, and everything else, each linking to its docs. - - - hand setup to your coding agent with one prompt, or create your first browser yourself. - - - ## why we built it this way -most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. browsers already sandbox untrusted web content across processes, which covers the internal isolation a unikernel leaves out. +most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. on the left, three chromium containers share one host kernel. on the right, each chromium runs on its own unikernel vm above a hypervisor. -that choice is why a browser starts in about 30ms ([performance](/browsers/performance)), why an idle browser can go into [standby](/browsers/standby) after five seconds and keep its state without accruing usage cost, and why [ssh](/browsers/ssh) and [process execution](/browsers/process-execution) are safe to hand an agent: every session is its own vm. [browsers on unikernels](/info/unikernels) goes deeper on the design. +a unikernel carries the browser and nothing else, so there's little to boot or keep running, and that changes what the browser lifecycle costs: + +- **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([performance](/browsers/performance)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. +- **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. +- **root access is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so [ssh](/browsers/ssh) and [process execution](/browsers/process-execution) stay contained to that session. ## open source -our browser image and vm runtime are on github. +we value open source and transparency, so we publish the chromium image behind KERNEL browsers and the vm runtime we built to run them on github. you can read exactly what your agent's browser runs on, run it yourself, or contribute. @@ -38,3 +33,17 @@ our browser image and vm runtime are on github. the vm runtime for oci images, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework. + +## get started + + + + browsers, stealth, proxies, auth, payments, and everything else, each linking to its docs. + + + hand setup to your coding agent with one prompt, or create your first browser yourself. + + + end-to-end recipes you can clone and run, from computer use fallbacks to agentic payments. + + diff --git a/info/pricing.mdx b/info/pricing.mdx index c0b68625..8f780225 100644 --- a/info/pricing.mdx +++ b/info/pricing.mdx @@ -1,5 +1,5 @@ --- -title: "Pricing & Limits" +title: "Pricing" sidebarTitle: "Plans and Pricing" --- @@ -56,38 +56,9 @@ import { PricingCalculator } from '/snippets/calculator.jsx'; | HIPAA compliance (BAA) | ❌ | ❌ | ❌ | ✅ | -## Concurrency limits +## Limits -Kernel enforces a single concurrency limit covering all browsers you run at once—whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools/overview). Your full limit is available to either API in any mix. - -| Feature | Developer | Hobbyist | Start-Up | Enterprise | -| --- | --- | --- | --- | --- | -| Concurrent browsers | 5 | 10 | 150 | Custom | -| App invocations | 5 | 10 | 50 | Custom | -| App invocations (per-app) | 5 | 10 | 20 | Custom | -| Managed auth health check interval | 6 hours minimum | 1 hour minimum | 20 minutes minimum | Custom | - -#### Notes -- Reserved capacity in a [browser pool](/browsers/pools/overview) counts toward your concurrency limit whether or not the browsers are currently acquired—a pool sized to 40 browsers uses 40 of your limit. -- Browsers in [Standby Mode](/browsers/standby) count against your concurrency limit. -- Limits are org-wide by default unless stated otherwise. - - -## Rate limiting - -Kernel enforces per-organization rate limits on API requests. When you exceed the rate limit, the API returns a `429 Too Many Requests` response with a `Retry-After` header indicating how many seconds to wait before retrying. - -Rate-limited endpoints include these headers on every response: - -| Header | Description | -| --- | --- | -| `X-RateLimit-Limit` | Maximum requests allowed per minute | -| `X-RateLimit-Remaining` | Requests remaining in the current window | -| `Retry-After` | Seconds to wait before retrying (only on `429` responses) | - -All Kernel SDKs automatically retry `429` responses up to 2 times, respecting the `Retry-After` header for delay timing. If retries are exhausted, the SDK throws a typed `RateLimitError` with the response headers accessible for custom backoff logic. - -If you need higher rate limits, [contact us](https://calendly.com/d/d3tn-5kp-5yt). +Concurrency, rate limits, and per-browser resources for each plan are on [concurrency and limits](/browsers/concurrency-and-limits). ## FAQ @@ -98,7 +69,7 @@ Billing starts when your code begins executing and stops when it finishes. You a Browsers created by an invocation are billed separately for their active runtime at the browser rates above. Services your code calls, such as an LLM API, also bill you independently. -The [app invocation limits](#concurrency-limits) are concurrency limits, not a number of invocations included with your plan. +The [app invocation limits](/browsers/concurrency-and-limits#concurrency) are concurrency limits, not a number of invocations included with your plan. see this guide on [spending controls](/info/spending-caps). diff --git a/info/spending-caps.mdx b/info/spending-caps.mdx index 89a35507..f7991f6c 100644 --- a/info/spending-caps.mdx +++ b/info/spending-caps.mdx @@ -168,5 +168,5 @@ If a project cap is higher than the organization cap plus monthly credits, the o - Spending caps bound monthly usage cost. [Concurrency limits](/info/pricing#concurrency-limits) bound simultaneous browser capacity. A spending cap doesn't reserve throughput, and a concurrency limit doesn't bound monthly spend. + Spending caps bound monthly usage cost. [Concurrency limits](/browsers/concurrency-and-limits#concurrency) bound simultaneous browser capacity. A spending cap doesn't reserve throughput, and a concurrency limit doesn't bound monthly spend. diff --git a/introduction/create.mdx b/introduction/create.mdx index 4ee4d5af..8629f658 100644 --- a/introduction/create.mdx +++ b/introduction/create.mdx @@ -91,7 +91,7 @@ Most of what you'll tune at creation time falls into four buckets: `browsers.create()` boots a browser for you on the spot. That's the right call while you're building, and for workloads that run occasionally. -Once you're running the same task repeatedly — or more than a handful at a time — create a [browser pool](/browsers/pools) instead. A browser pool holds browsers that are already booted with your configuration applied, so `acquire` hands you one that's ready to drive rather than starting one from scratch. Two things get faster: configurations that restart Chromium on creation (custom viewports, extensions, kiosk mode) are already applied, and acquiring from a browser pool sidesteps the [rate limit](/info/pricing#rate-limiting) on browser creation that you'll otherwise hit at volume. +Once you're running the same task repeatedly — or more than a handful at a time — create a [browser pool](/browsers/pools) instead. A browser pool holds browsers that are already booted with your configuration applied, so `acquire` hands you one that's ready to drive rather than starting one from scratch. Two things get faster: configurations that restart Chromium on creation (custom viewports, extensions, kiosk mode) are already applied, and acquiring from a browser pool sidesteps the [rate limit](/browsers/concurrency-and-limits#rate-limits) on browser creation that you'll otherwise hit at volume. ```typescript Typescript/Javascript @@ -133,7 +133,7 @@ kernel browser-pools acquire checkout-pool ``` -An acquired browser returns the same fields as one you created directly, so the rest of your code is identical. Idle browsers in a browser pool aren't billed — you pay only while a browser is acquired and running — though browser pool capacity does count against your [concurrency limit](/info/pricing#concurrency-limits). +An acquired browser returns the same fields as one you created directly, so the rest of your code is identical. Idle browsers in a browser pool aren't billed — you pay only while a browser is acquired and running — though browser pool capacity does count against your [concurrency limit](/browsers/concurrency-and-limits#concurrency). ## Lifecycle diff --git a/introduction/scale.mdx b/introduction/scale.mdx index aaa7b8f8..a0a266cc 100644 --- a/introduction/scale.mdx +++ b/introduction/scale.mdx @@ -13,7 +13,7 @@ A [browser pool](/browsers/pools) keeps a set of identically-configured browsers - **Low-latency acquisition** — the browser is already booted with your configuration applied (including settings like custom viewports, extensions, and kiosk-mode live view that otherwise [restart Chromium](/browsers/performance#troubleshooting-latency) on a fresh browser), so `acquire` hands you one that's ready to drive. - **Reserved, pre-configured capacity** — a fixed set of browsers on your exact configuration, ready before traffic arrives. -- **Higher creation throughput** — acquiring from a pool isn't subject to the [rate limit](/info/pricing#rate-limiting) on `browsers.create()` that high-volume workloads hit. +- **Higher creation throughput** — acquiring from a pool isn't subject to the [rate limit](/browsers/concurrency-and-limits#rate-limits) on `browsers.create()` that high-volume workloads hit. The tradeoff: a browser pool counts against your concurrency limit whether or not its browsers are currently acquired — a pool sized to 40 holds 40 of your limit. Idle pooled browsers aren't billed, but they hold the slot. diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 1e382291..6634ab07 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -25,12 +25,12 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r **Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. -**Auth is a product, not a cookie jar.** [Managed auth](/auth/overview) handles the login, MFA prompts, SSO redirects, and background reauthentication, then persists the result as a profile your agent attaches to any browser. +**Auth and payments are built on primitives.** [Vaults](/vaults/overview) hold credentials and payment items that a browser fills into a page without your agent ever reading them. [Profiles](/browsers/profiles) persist cookies, storage, and logins across sessions. [Authentication](/auth/overview) builds on both: fill a login from a vault, or let managed auth handle the login, MFA prompts, SSO redirects, and background reauthentication, then save the result as a profile your agent attaches to any browser. [Payments](/browsers/payments) use the same vaults, so an agent can complete a checkout through Link or AgentCard without seeing card data. ## When Kernel isn't the answer If the site you need has a real API, use the API. Browsers are the right tool when the work only exists behind a UI — a portal with no API, a checkout flow, a document you can only reach after logging in, or a task that a computer-use model has to see to do. - Every primitive and product, each linking to its documentation. + Every product, each linking to its documentation. diff --git a/start/quickstart.mdx b/start/quickstart.mdx index 0271f9f3..50b9b382 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -104,7 +104,7 @@ From there: - Getting blocked? [Stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview). - Behind a login? [Authentication](/auth/overview). -- Need to check out? [Payments](/browsers/payments). +- Need to pay? [Payments](/browsers/payments). - Worked examples: [cookbooks](/cookbooks). From b94370a386d6d944a614719feedc14d9a047e234 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:03:04 +0000 Subject: [PATCH 10/78] Revise the introduction's opening paragraph Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index 000e415c..ee4fd5c4 100644 --- a/index.mdx +++ b/index.mdx @@ -5,7 +5,7 @@ description: "" mode: "wide" --- -KERNEL gives your agents and automations sandboxed chromium browsers in the cloud. each browser runs in its own vm, starts in about 30ms, and can be driven with playwright, computer controls, cdp, or webdriver bidi. around the browser, we provide what agents need on real websites: stealth and proxies, authentication, payments, browser pools, and live view, replays, and telemetry for debugging. +KERNEL is the internet runtime for agents. we provide crazy fast, open source browser infra for your agents to access and act on the internet. each chromium browser is pre-configured with anti-detection defaults, runs in its own vm with isolated resources, and can be driven with browser automation frameworks, computer controls, or cdp and webdriver bidi directly. beyond browsers, KERNEL provides a platform of capabilities so your agents have what they need on real websites: stealth and proxies, authentication, payments, live view, replays, and more. ## why we built it this way From 93e05ffadac5539d17cf479f8d5219d9fd53cdab Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:09:29 +0000 Subject: [PATCH 11/78] Put KERNEL first in the architecture diagram and expand open source links Co-Authored-By: Claude Opus 5.5 --- images/overview/unikernel-vs-containers.svg | 71 ++++++++++----------- index.mdx | 32 ++++++++-- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/images/overview/unikernel-vs-containers.svg b/images/overview/unikernel-vs-containers.svg index c9663376..e513b913 100644 --- a/images/overview/unikernel-vs-containers.svg +++ b/images/overview/unikernel-vs-containers.svg @@ -1,55 +1,54 @@ - -containers on a shared host +KERNEL: one vm per browser - -container + + + + +vm + +unikernel chromium - -container + + + + +vm + +unikernel chromium - -container + + + + +vm + +unikernel chromium -shared host kernel -seconds to start, so warm pools stay running -every browser shares one host kernel -KERNEL: one vm per browser +hypervisor +about 30ms to start, standby after 5s idle +each browser isolated at the hypervisor +containers on a shared host - - - - -vm - -unikernel + +container chromium - - - - -vm - -unikernel + +container chromium - - - - -vm - -unikernel + +container chromium -hypervisor -about 30ms to start, standby after 5s idle -each browser isolated at the hypervisor +shared host kernel +seconds to start, so warm pools stay running +every browser shares one host kernel diff --git a/index.mdx b/index.mdx index ee4fd5c4..f5b3cecb 100644 --- a/index.mdx +++ b/index.mdx @@ -12,28 +12,48 @@ KERNEL is the internet runtime for agents. we provide crazy fast, open source br most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. - on the left, three chromium containers share one host kernel. on the right, each chromium runs on its own unikernel vm above a hypervisor. + on the left, each chromium runs on its own unikernel vm above a hypervisor. on the right, three chromium containers share one host kernel. -a unikernel carries the browser and nothing else, so there's little to boot or keep running, and that changes what the browser lifecycle costs: +a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has three benefits: - **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([performance](/browsers/performance)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. - **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. -- **root access is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so [ssh](/browsers/ssh) and [process execution](/browsers/process-execution) stay contained to that session. +- **code on the vm is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so the [browser repl](/browsers/repl), [process execution](/browsers/process-execution), and root access over [ssh](/browsers/ssh) stay contained to that session. ## open source -we value open source and transparency, so we publish the chromium image behind KERNEL browsers and the vm runtime we built to run them on github. you can read exactly what your agent's browser runs on, run it yourself, or contribute. +we value open source and transparency, so we publish the code that runs your agent's browser, the tools you use to drive it, and the recipes we build with it on github. you can read exactly what runs, run it yourself, or contribute. - + the chromium images behind KERNEL browsers. - the vm runtime for oci images, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework. + the vm runtime we built to run browsers, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework. + + + our fork of the cloud hypervisor virtual machine monitor. + + + the KERNEL cli for creating, driving, and debugging browsers from a terminal. + + + the mcp server that gives any compatible agent a cloud browser. + + + agent skills that teach coding agents the KERNEL cli, sdks, and auth. + + + framework-neutral browser tools for your agent, with bindings for popular frameworks. + + + end-to-end recipes for agents that use the internet. +the [typescript](https://github.com/kernel/kernel-node-sdk), [python](https://github.com/kernel/kernel-python-sdk), and [go](https://github.com/kernel/kernel-go-sdk) sdks are open source too. + ## get started From 9f208718aa62c81f9f111f239fa4fd8b2c3b1243 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:12:20 +0000 Subject: [PATCH 12/78] Reword the benefits lead-in on the introduction Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index f5b3cecb..04d66a79 100644 --- a/index.mdx +++ b/index.mdx @@ -15,7 +15,7 @@ most browser infrastructure runs chromium in containers orchestrated by kubernet on the left, each chromium runs on its own unikernel vm above a hypervisor. on the right, three chromium containers share one host kernel. -a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has three benefits: +a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has many benefits, including: - **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([performance](/browsers/performance)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. - **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. From 8250ea7abc4a069850b236dcbca38988cad993b5 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:13:12 +0000 Subject: [PATCH 13/78] Shorten the hypeman card on the introduction Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index 04d66a79..9260c37f 100644 --- a/index.mdx +++ b/index.mdx @@ -30,7 +30,7 @@ we value open source and transparency, so we publish the code that runs your age the chromium images behind KERNEL browsers. - the vm runtime we built to run browsers, supporting cloud hypervisor, firecracker, qemu, and apple virtualization.framework. + the vm runtime we built to run browsers. our fork of the cloud hypervisor virtual machine monitor. From 76806ef42968525e0bd4d6927e78b4dba274ca59 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:17:45 +0000 Subject: [PATCH 14/78] Clarify product cards and replace ways in with get started Co-Authored-By: Claude Opus 5.5 --- overview/products.mdx | 44 +++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/overview/products.mdx b/overview/products.mdx index d2269245..315c0350 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -6,13 +6,13 @@ mode: "wide" - Sandboxed Chromium in its own microVM, created in under 30ms, with GPU acceleration when you need it. + Sandboxed Chromium in its own VM, created in under 30ms. Headful by default, with headless and GPU-accelerated options. Anti-detection defaults on every browser, plus a managed CAPTCHA solver. - Datacenter, ISP, residential, mobile, or your own. Kernel-provided proxies aren't billed. + Datacenter, ISP, residential, mobile, or bring-your-own. Credentials and payment items a browser can fill into a page without your agent ever reading them. @@ -30,7 +30,7 @@ mode: "wide" Give it a URL and get browser and proxy settings that have worked on that site. - Pre-configured browsers kept ready, so acquiring one skips start-up latency. + Pre-configured browsers kept ready, so acquiring one skips start-up latency and the browser create rate limit. Watch or take over a running session, and record any session as an MP4. @@ -43,13 +43,33 @@ mode: "wide" -## Ways in +## Get started -| Surface | Where to start | -| --- | --- | -| SDKs (TypeScript, Python, Go) | [Quickstart](/start/quickstart) | -| [CLI](/reference/cli) | `brew install kernel/tap/kernel` | -| [MCP server](/reference/mcp-server) | Give any MCP client a cloud browser | -| [Agent Skills](/skills/overview) | Add Kernel know-how to your coding agent | -| [Integrations](/integrations/overview) | Framework- and vendor-specific guides | -| [MPP](/info/mpp) | Buy a browser with a Link payment, no account or API key | +Pick the way in that matches how you work. + + + + Copy one prompt into Cursor, Claude Code, or Codex and let it set up KERNEL. + + + Create and drive your first browser in TypeScript, Python, or Go. + + + Create, drive, and debug browsers from a terminal. + + + Give any MCP client, like Claude or Cursor, a cloud browser as a set of tools. + + + Teach your coding agent the KERNEL CLI, SDKs, and auth with one install. + + + Guides for the agent frameworks, models, and platforms you already use. + + + Clone an end-to-end recipe and adapt it to your task. + + + Pay for one browser with Link, with no account or API key. + + From 6eeff35fd4664dbf18efe55d05e06cad8aa9ff1f Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:18:03 +0000 Subject: [PATCH 15/78] Sharpen the See all products subheader Co-Authored-By: Claude Opus 5.5 --- overview/products.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/products.mdx b/overview/products.mdx index 315c0350..fa63c09e 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -1,6 +1,6 @@ --- title: "See All Products" -description: "Every Kernel product, each linking to its documentation" +description: "Cloud browsers, and everything your agents need to stay unblocked, log in, pay, and scale on real websites" mode: "wide" --- From 70c7a4e6b46d8c3480f9cfcf06380b090286ca2d Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:21:01 +0000 Subject: [PATCH 16/78] Shorten the browsers card on See all products Co-Authored-By: Claude Opus 5.5 --- overview/products.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/products.mdx b/overview/products.mdx index fa63c09e..e11f55e4 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -6,7 +6,7 @@ mode: "wide" - Sandboxed Chromium in its own VM, created in under 30ms. Headful by default, with headless and GPU-accelerated options. + Headful by default, with headless and GPU-accelerated options. Anti-detection defaults on every browser, plus a managed CAPTCHA solver. From 5e31924bd3bd2dc5fdce39a2e8668b0e296d0198 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:23:25 +0000 Subject: [PATCH 17/78] Simplify the important concepts diagram to three components Co-Authored-By: Claude Opus 5.5 --- images/overview/agent-stack.svg | 84 ++++++++++++++++++--------------- overview/concepts.mdx | 2 +- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/images/overview/agent-stack.svg b/images/overview/agent-stack.svg index 214c5443..7b678d73 100644 --- a/images/overview/agent-stack.svg +++ b/images/overview/agent-stack.svg @@ -1,39 +1,49 @@ - + - - -agent framework or harness -runs the loop: ask the model, run the tool it picks, repeat - -system prompt - -tools - -skills - -model -picks the next action -claude, gpt, gemini -claude agent sdk, vercel ai sdk, -browser use, mastra - -browser automation framework -turns a tool call into page actions -playwright, puppeteer, -stagehand, agent browser - -browser infrastructure: KERNEL -runs the browser: its vm, stealth, proxies, logins, payments - -the website - - -tool call - -cdp or webdriver bidi - -https - - -dashed: computer controls and mcp tools call KERNEL directly, with no automation framework in between + + +agent framework +runs the loop: ask the model, act, repeat + +model + +system prompt + +tools + +skills + +browser automation framework + +KERNEL +browser infrastructure + +chromium vm + +stealth + +proxies + +profiles + +auth + +payments + +the internet +real websites + + + + + + + + + + +drives + +https +your agent drives KERNEL browsers with playwright, computer controls, cdp, webdriver bidi, or mcp tools. diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 2d0245b7..0105432f 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -7,7 +7,7 @@ mode: "wide" A browser agent is built from several pieces, usually from different vendors. Knowing which piece does what tells you where a feature belongs and which piece to change when something goes wrong. an agent framework holding a system prompt, tools, and skills sends requests to a model. its tool calls go to a browser automation framework, which drives a KERNEL browser over cdp or webdriver bidi, which loads the website. computer controls and mcp tools call KERNEL directly. + an agent framework, holding the model, system prompt, tools, skills, and browser automation framework, drives KERNEL browser infrastructure, which carries the chromium vm, stealth, proxies, profiles, auth, and payments, and connects to the internet over https. ## Model From 88bc70a67ab1302343bb8c8664066dd8243badb6 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:36:41 +0000 Subject: [PATCH 18/78] Highlight KERNEL's automation tooling on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 44 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 0105432f..8597f16d 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -4,7 +4,7 @@ description: "How models, agent frameworks, system prompts, tools, skills, brows mode: "wide" --- -A browser agent is built from several pieces, usually from different vendors. Knowing which piece does what tells you where a feature belongs and which piece to change when something goes wrong. +A browser agent is built from a few pieces. Knowing which piece does what tells you where a feature belongs and which piece to change when something goes wrong. an agent framework, holding the model, system prompt, tools, skills, and browser automation framework, drives KERNEL browser infrastructure, which carries the chromium vm, stealth, proxies, profiles, auth, and payments, and connects to the internet over https. @@ -30,11 +30,7 @@ The system prompt is the instruction set the harness sends with every request to A tool is a function the model can ask the harness to call. Each tool has a name, a description, and an input schema. The model only chooses the tool and its arguments; the harness runs it and returns the result. -For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this Playwright code". KERNEL provides several ready-made ones: - -- [Playwright execution](/browsers/playwright-execution) runs a snippet of Playwright code inside the browser's vm and returns the result. -- [Computer controls](/browsers/computer-controls) click, type, scroll, and take screenshots at the operating-system level. -- The [MCP server](/reference/mcp-server) exposes KERNEL's API as tools to any client that speaks the Model Context Protocol (MCP), such as Claude, Cursor, or Codex. +For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this Playwright code". KERNEL provides ready-made ones; see [what KERNEL provides to run automations](#what-kernel-provides-to-run-automations). ## Skills @@ -57,6 +53,42 @@ Browser infrastructure is where the browser runs and what it carries. KERNEL cre Everything above this layer is interchangeable. You can switch models, frameworks, or automation libraries and keep the same browsers, profiles, and credentials. +## What KERNEL provides to run automations + +Beyond hosting the browser, KERNEL gives your agent faster and more reliable ways to act on it. Most of these run inside the browser's vm, so actions skip the network round trip between your code and the browser. + + + + Run a Playwright script inside the browser's vm and get the result back in one call. + + + A persistent JavaScript runtime next to the browser. Define helpers once and reuse them across turns. + + + Call the structured tools a site exposes instead of guessing which controls to click. + + + Open-source browser tools that give each model provider the declarations it expects and run every action on a KERNEL browser. + + + OS-level mouse, keyboard, and screenshots that match what computer use models emit. + + + Deploy the whole agent next to its browser, and invoke it on demand or on a schedule. + + + KERNEL's API as tools for any MCP client, including the REPL, WebMCP, and computer controls. + + + Teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. + + + Browser and proxy settings that have already worked on the site you're automating. + + + +To see several of these together, the [code mode with WebMCP](/browsers/code-mode-webmcp) cookbook uses WebMCP for the actions a site supports and Browser REPL helpers for everything else. + ## Which piece to change | What you see | Where to look | From 1caa72117a00342da1899e354ffb527fd49360d2 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:49:09 +0000 Subject: [PATCH 19/78] Organize important concepts around the three components Nest model, system prompt, tools, skills, and automation framework under the agent framework, explain combining DOM and screen-based automation, and replace the KERNEL tooling grid with per-concept notes. Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 89 +++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 55 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 8597f16d..fa124235 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -1,6 +1,6 @@ --- title: "Important Concepts" -description: "How models, agent frameworks, system prompts, tools, skills, browser automation frameworks, and browser infrastructure fit together" +description: "How the agent framework, browser infrastructure, and the internet fit together" mode: "wide" --- @@ -10,84 +10,63 @@ A browser agent is built from a few pieces. Knowing which piece does what tells an agent framework, holding the model, system prompt, tools, skills, and browser automation framework, drives KERNEL browser infrastructure, which carries the chromium vm, stealth, proxies, profiles, auth, and payments, and connects to the internet over https. -## Model +## Agent framework -The model decides the next action from what it's given: the system prompt, the conversation so far, tool results, and screenshots. Claude, GPT, and Gemini are general-purpose models. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes, so they can drive a page without selectors. +The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or you use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit). + +**On KERNEL:** the loop can run next to the browser. The [code execution platform](/apps/develop) deploys your agent alongside its browser, so actions don't cross the network. See [how you drive the browser](/introduction/control) for where the loop should run. -The model never touches the browser. It returns text or a tool call, and something else carries it out. +The harness is made of these pieces: -## Agent framework or harness +### Model -The agent framework runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. "Harness" usually means the loop plus everything configured around it: the system prompt, the tools, and the skills. +The model decides the next action from what it's given: the system prompt, the conversation so far, tool results, and screenshots. Claude, GPT, and Gemini are general-purpose models. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes, so they can drive a page without selectors. -You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or you use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit), and give it a browser. +The model never touches the browser. It returns text or a tool call, and the harness carries it out. -## System prompt +### System prompt The system prompt is the instruction set the harness sends with every request to the model: its role, its rules, and the format its answers should take. Because it's sent on every turn, it's the place for guidance that applies to every task, such as "log out before you finish" or "never submit a payment without confirming the total". -## Tools +### Tools -A tool is a function the model can ask the harness to call. Each tool has a name, a description, and an input schema. The model only chooses the tool and its arguments; the harness runs it and returns the result. +A tool is a function the model can ask the harness to call. Each tool has a name, a description, and an input schema. The model only chooses the tool and its arguments; the harness runs it and returns the result. For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this code in the page". -For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this Playwright code". KERNEL provides ready-made ones; see [what KERNEL provides to run automations](#what-kernel-provides-to-run-automations). +**On KERNEL:** the [MCP server](/reference/mcp-server) exposes KERNEL as tools to any MCP client. [WebMCP](/browsers/webmcp) goes a step further and lets your agent call the structured tools a site exposes, instead of guessing which controls to click. -## Skills +### Skills A skill is a packaged set of instructions and reference files that an agent loads only when a task needs it. That's the difference from a system prompt, which is sent on every turn. Tools let an agent do something; skills teach it how and when to do it well. -KERNEL publishes [Agent Skills](/skills/overview) that teach coding agents the KERNEL CLI, the SDKs, bot detection, and authentication, so they don't have to re-read the docs every session. +**On KERNEL:** [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, the SDKs, bot detection, and authentication, so they don't re-read the docs every session. + +### Browser automation framework -## Browser automation framework +A browser automation framework turns the model's tool calls into actions on the page. There are two ways to act on a page, and most production agents use both: -A browser automation framework turns an action like "click the submit button" or "fill in this form" into browser protocol commands, and sends them to the browser over the Chrome DevTools Protocol (CDP) or WebDriver BiDi. +- **Through the DOM.** [Playwright](/browsers/playwright-execution) and Puppeteer find elements with selectors and act on them. This is fast, cheap, and predictable, but it breaks when the page doesn't cooperate, such as canvas apps, drag-and-drop, or selectors that change. +- **Through the screen.** [Computer use](/browsers/computer-controls) takes a screenshot and clicks, types, or drags at coordinates, the way a person would. It works on any page, but each step is slower and costs a model call. -- **Deterministic:** [Playwright](/browsers/playwright-execution) and Puppeteer do exactly what your code says, using selectors you write. -- **AI-assisted:** [Stagehand](/integrations/stagehand) and [Agent Browser](/integrations/vercel/agent-browser) add natural-language actions on top, so the model can describe what to do instead of naming a selector. +The common pattern is DOM actions for most of the task, with computer use for the steps the DOM can't handle. -An automation framework drives a browser but doesn't run one. It needs a browser to connect to. +**On KERNEL:** you get both on the same browser, so an agent can switch between them without losing its tabs or page state: + +- [Playwright execution](/browsers/playwright-execution) runs Playwright code inside the browser's vm and returns the result in one call. +- [Computer controls](/browsers/computer-controls) give you OS-level mouse, keyboard, and screenshots that match what computer use models emit. +- The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. +- [Browser Loop](/browsers/browser-loop) packages these as tools for each model provider, including the handoff from Playwright to computer use. The [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) cookbook walks through it. + +If you'd rather not build this layer, start from a framework that already mixes the two, such as [Agent Browser](/integrations/vercel/agent-browser) or [Stagehand](/integrations/stagehand), and point it at a KERNEL browser. ## Browser infrastructure Browser infrastructure is where the browser runs and what it carries. KERNEL creates each chromium browser in its own vm, and around it handles what agents need on real websites: [stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview), [profiles](/browsers/profiles), [logins](/auth/overview), [payments](/browsers/payments), and [live view, replays, and telemetry](/introduction/observe) for debugging. -Everything above this layer is interchangeable. You can switch models, frameworks, or automation libraries and keep the same browsers, profiles, and credentials. - -## What KERNEL provides to run automations - -Beyond hosting the browser, KERNEL gives your agent faster and more reliable ways to act on it. Most of these run inside the browser's vm, so actions skip the network round trip between your code and the browser. - - - - Run a Playwright script inside the browser's vm and get the result back in one call. - - - A persistent JavaScript runtime next to the browser. Define helpers once and reuse them across turns. - - - Call the structured tools a site exposes instead of guessing which controls to click. - - - Open-source browser tools that give each model provider the declarations it expects and run every action on a KERNEL browser. - - - OS-level mouse, keyboard, and screenshots that match what computer use models emit. - - - Deploy the whole agent next to its browser, and invoke it on demand or on a schedule. - - - KERNEL's API as tools for any MCP client, including the REPL, WebMCP, and computer controls. - - - Teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. - - - Browser and proxy settings that have already worked on the site you're automating. - - - -To see several of these together, the [code mode with WebMCP](/browsers/code-mode-webmcp) cookbook uses WebMCP for the actions a site supports and Browser REPL helpers for everything else. +**On KERNEL:** [Config Registry](/config-registry) gives you browser and proxy settings that have already worked on the site you're automating. + +## The internet + +Real websites weren't built for agents. They check for bots, put the useful pages behind logins, and end in checkouts. The agent framework decides what to do; browser infrastructure is what lets it get through. ## Which piece to change From 67758679c0d7a1eeacb28c9942f32c15071c1c2a Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:51:53 +0000 Subject: [PATCH 20/78] Summarize agent framework pieces as bullets on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 50 +++++++------------------------------------ 1 file changed, 8 insertions(+), 42 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index fa124235..9de1861f 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -12,51 +12,17 @@ A browser agent is built from a few pieces. Knowing which piece does what tells ## Agent framework -The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or you use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit). +The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit). -**On KERNEL:** the loop can run next to the browser. The [code execution platform](/apps/develop) deploys your agent alongside its browser, so actions don't cross the network. See [how you drive the browser](/introduction/control) for where the loop should run. +A harness is made of five pieces: -The harness is made of these pieces: +- **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It never touches the browser; it returns a tool call and the harness carries it out. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes. +- **System prompt:** the instructions sent with every request to the model: its role, its rules, and the format of its answers. +- **Tools:** functions the model can ask the harness to call, like "navigate to this URL", "click here", or "run this code". The [MCP server](/reference/mcp-server) exposes KERNEL as tools, and [WebMCP](/browsers/webmcp) lets your agent call the tools a site exposes. +- **Skills:** instructions and reference files the agent loads only when a task needs them, unlike the system prompt, which is sent every turn. [Agent Skills](/skills/overview) teach coding agents how to use KERNEL. +- **Browser automation framework:** turns tool calls into actions on the page, through the DOM with selectors (Playwright, Puppeteer) or through the screen with clicks at coordinates (computer use). Most agents combine the two. KERNEL runs [Playwright execution](/browsers/playwright-execution), [computer controls](/browsers/computer-controls), and the [Browser REPL](/browsers/repl) on the same browser, and [Browser Loop](/browsers/browser-loop) handles the handoff. [Agent Browser](/integrations/vercel/agent-browser) and [Stagehand](/integrations/stagehand) are ready-made starting points. -### Model - -The model decides the next action from what it's given: the system prompt, the conversation so far, tool results, and screenshots. Claude, GPT, and Gemini are general-purpose models. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes, so they can drive a page without selectors. - -The model never touches the browser. It returns text or a tool call, and the harness carries it out. - -### System prompt - -The system prompt is the instruction set the harness sends with every request to the model: its role, its rules, and the format its answers should take. Because it's sent on every turn, it's the place for guidance that applies to every task, such as "log out before you finish" or "never submit a payment without confirming the total". - -### Tools - -A tool is a function the model can ask the harness to call. Each tool has a name, a description, and an input schema. The model only chooses the tool and its arguments; the harness runs it and returns the result. For a browser agent, tools look like "navigate to this URL", "click at these coordinates", "take a screenshot", or "run this code in the page". - -**On KERNEL:** the [MCP server](/reference/mcp-server) exposes KERNEL as tools to any MCP client. [WebMCP](/browsers/webmcp) goes a step further and lets your agent call the structured tools a site exposes, instead of guessing which controls to click. - -### Skills - -A skill is a packaged set of instructions and reference files that an agent loads only when a task needs it. That's the difference from a system prompt, which is sent on every turn. Tools let an agent do something; skills teach it how and when to do it well. - -**On KERNEL:** [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, the SDKs, bot detection, and authentication, so they don't re-read the docs every session. - -### Browser automation framework - -A browser automation framework turns the model's tool calls into actions on the page. There are two ways to act on a page, and most production agents use both: - -- **Through the DOM.** [Playwright](/browsers/playwright-execution) and Puppeteer find elements with selectors and act on them. This is fast, cheap, and predictable, but it breaks when the page doesn't cooperate, such as canvas apps, drag-and-drop, or selectors that change. -- **Through the screen.** [Computer use](/browsers/computer-controls) takes a screenshot and clicks, types, or drags at coordinates, the way a person would. It works on any page, but each step is slower and costs a model call. - -The common pattern is DOM actions for most of the task, with computer use for the steps the DOM can't handle. - -**On KERNEL:** you get both on the same browser, so an agent can switch between them without losing its tabs or page state: - -- [Playwright execution](/browsers/playwright-execution) runs Playwright code inside the browser's vm and returns the result in one call. -- [Computer controls](/browsers/computer-controls) give you OS-level mouse, keyboard, and screenshots that match what computer use models emit. -- The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. -- [Browser Loop](/browsers/browser-loop) packages these as tools for each model provider, including the handoff from Playwright to computer use. The [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) cookbook walks through it. - -If you'd rather not build this layer, start from a framework that already mixes the two, such as [Agent Browser](/integrations/vercel/agent-browser) or [Stagehand](/integrations/stagehand), and point it at a KERNEL browser. +**On KERNEL:** the loop can run next to the browser. The [code execution platform](/apps/develop) deploys your agent alongside its browser, so actions don't cross the network. See [how you drive the browser](/introduction/control) for where the loop should run, and the [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) cookbook for combining DOM and screen actions. ## Browser infrastructure From 141882d2ce5acf5eb5591e44f6a603938ed6d236 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:53:52 +0000 Subject: [PATCH 21/78] Link the introduction's architecture story to the scaling blog post Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index 9260c37f..a296be62 100644 --- a/index.mdx +++ b/index.mdx @@ -9,7 +9,7 @@ KERNEL is the internet runtime for agents. we provide crazy fast, open source br ## why we built it this way -most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://news.ycombinator.com/item?id=43705144) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. +most browser infrastructure runs chromium in containers orchestrated by kubernetes, with warm pools to hide slow starts. we [pioneered](https://www.kernel.sh/blog/scale) a different approach: running chromium on unikernels, single-purpose vms that carry only what the browser needs. on the left, each chromium runs on its own unikernel vm above a hypervisor. on the right, three chromium containers share one host kernel. From 41b043ca4b0a17bb5a85f5ffad373eb9974b314e Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:54:55 +0000 Subject: [PATCH 22/78] Link browser creation speed to the benchmarks page Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index a296be62..adf8c807 100644 --- a/index.mdx +++ b/index.mdx @@ -17,7 +17,7 @@ most browser infrastructure runs chromium in containers orchestrated by kubernet a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has many benefits, including: -- **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([performance](/browsers/performance)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. +- **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([benchmarks](https://www.kernel.sh/benchmarks)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. - **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. - **code on the vm is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so the [browser repl](/browsers/repl), [process execution](/browsers/process-execution), and root access over [ssh](/browsers/ssh) stay contained to that session. From 7cf65ec62115df6f075b5edc4e356d04ee958b7f Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:00:00 +0000 Subject: [PATCH 23/78] Move KERNEL resources on important concepts into one table Keep the concept descriptions neutral and list what KERNEL provides for each piece in a section after which piece to change. Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 9de1861f..9661de04 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -18,17 +18,13 @@ A harness is made of five pieces: - **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It never touches the browser; it returns a tool call and the harness carries it out. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes. - **System prompt:** the instructions sent with every request to the model: its role, its rules, and the format of its answers. -- **Tools:** functions the model can ask the harness to call, like "navigate to this URL", "click here", or "run this code". The [MCP server](/reference/mcp-server) exposes KERNEL as tools, and [WebMCP](/browsers/webmcp) lets your agent call the tools a site exposes. -- **Skills:** instructions and reference files the agent loads only when a task needs them, unlike the system prompt, which is sent every turn. [Agent Skills](/skills/overview) teach coding agents how to use KERNEL. -- **Browser automation framework:** turns tool calls into actions on the page, through the DOM with selectors (Playwright, Puppeteer) or through the screen with clicks at coordinates (computer use). Most agents combine the two. KERNEL runs [Playwright execution](/browsers/playwright-execution), [computer controls](/browsers/computer-controls), and the [Browser REPL](/browsers/repl) on the same browser, and [Browser Loop](/browsers/browser-loop) handles the handoff. [Agent Browser](/integrations/vercel/agent-browser) and [Stagehand](/integrations/stagehand) are ready-made starting points. - -**On KERNEL:** the loop can run next to the browser. The [code execution platform](/apps/develop) deploys your agent alongside its browser, so actions don't cross the network. See [how you drive the browser](/introduction/control) for where the loop should run, and the [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) cookbook for combining DOM and screen actions. +- **Tools:** functions the model can ask the harness to call, like "navigate to this URL", "click here", or "run this code". +- **Skills:** instructions and reference files the agent loads only when a task needs them, unlike the system prompt, which is sent every turn. +- **Browser automation framework:** turns tool calls into actions on the page, through the DOM with selectors (Playwright, Puppeteer) or through the screen with clicks at coordinates (computer use). Most agents combine the two: DOM actions for most steps, and computer use where the DOM doesn't cooperate. ## Browser infrastructure -Browser infrastructure is where the browser runs and what it carries. KERNEL creates each chromium browser in its own vm, and around it handles what agents need on real websites: [stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview), [profiles](/browsers/profiles), [logins](/auth/overview), [payments](/browsers/payments), and [live view, replays, and telemetry](/introduction/observe) for debugging. - -**On KERNEL:** [Config Registry](/config-registry) gives you browser and proxy settings that have already worked on the site you're automating. +Browser infrastructure is where the browser runs and what it carries: the browser itself, and what an agent needs to use it on real websites, such as stealth, proxies, saved logins, payment methods, and a way to see what happened. KERNEL is browser infrastructure. ## The internet @@ -45,4 +41,17 @@ Real websites weren't built for agents. They check for bots, put the useful page | The site blocks the browser, shows a CAPTCHA, or the login is lost | Browser infrastructure: [stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [authentication](/auth/overview) | | The agent is slow between actions | Where the loop runs: see [how you drive the browser](/introduction/control) | +## How KERNEL optimizes each piece + +| Piece | What KERNEL provides | +| --- | --- | +| Agent framework | [Code execution platform](/apps/develop) to run the whole loop next to its browser. [Browser Loop](/browsers/browser-loop) for browser tools your framework can drop in. [Integrations](/integrations/overview) for the frameworks you already use. | +| Model | [Computer controls](/browsers/computer-controls) that match what computer use models emit, and guides for each [computer use model](/integrations/computer-use/overview). | +| System prompt | [Cookbooks](/cookbooks) with working prompts for common browser tasks, such as the [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) agent. | +| Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | +| Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | +| Browser automation framework | [Playwright execution](/browsers/playwright-execution) runs Playwright inside the browser's vm in one call. The [Browser REPL](/browsers/repl) keeps helpers alive across turns. Both run on the same browser as computer controls, so an agent can switch between DOM and screen actions. [Agent Browser](/integrations/vercel/agent-browser) and [Stagehand](/integrations/stagehand) work as ready-made starting points. | +| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments). [Config Registry](/config-registry) for settings that have worked on a site. [Live view, replays, and telemetry](/introduction/observe) for debugging. | +| The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | + For the objects you'll work with in KERNEL's API, such as browsers, browser pools, apps, and invocations, see [KERNEL objects](/info/concepts). From 3a4bf22a200ae030f3ccdddbb934ac28132ed0e5 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:13:23 +0000 Subject: [PATCH 24/78] Refine framework examples, infrastructure framing, and KERNEL table on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 9661de04..acce0856 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -12,7 +12,7 @@ A browser agent is built from a few pieces. Knowing which piece does what tells ## Agent framework -The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [Vercel AI SDK](/integrations/vercel/ai-sdk), or [Browser Use](/integrations/browser-use), or use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop) or [Replit](/integrations/replit). +The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build your own with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/), or the [Vercel AI SDK](/integrations/vercel/ai-sdk), or use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop), [Codex](https://developers.openai.com/codex), or [Replit](/integrations/replit). A harness is made of five pieces: @@ -24,11 +24,11 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the browser runs and what it carries: the browser itself, and what an agent needs to use it on real websites, such as stealth, proxies, saved logins, payment methods, and a way to see what happened. KERNEL is browser infrastructure. +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. KERNEL is browser infrastructure. ## The internet -Real websites weren't built for agents. They check for bots, put the useful pages behind logins, and end in checkouts. The agent framework decides what to do; browser infrastructure is what lets it get through. +Real websites weren't built for agents. They check for bots, and the useful pages often sit behind logins that need passwords, MFA codes, or payment details. Those credentials have to be used without exposing them to the model or leaking them into logs. The agent framework decides what to do; browser infrastructure is what gets it through, securely. ## Which piece to change @@ -45,13 +45,11 @@ Real websites weren't built for agents. They check for bots, put the useful page | Piece | What KERNEL provides | | --- | --- | -| Agent framework | [Code execution platform](/apps/develop) to run the whole loop next to its browser. [Browser Loop](/browsers/browser-loop) for browser tools your framework can drop in. [Integrations](/integrations/overview) for the frameworks you already use. | -| Model | [Computer controls](/browsers/computer-controls) that match what computer use models emit, and guides for each [computer use model](/integrations/computer-use/overview). | -| System prompt | [Cookbooks](/cookbooks) with working prompts for common browser tasks, such as the [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) agent. | +| Agent framework | [Integrations](/integrations/overview) for the frameworks and agents you already use. The [code execution platform](/apps/develop) colocates your agent with its browser, so every action skips the network round trip. | +| Model | [Browser Loop](/browsers/browser-loop) gives each model provider the browser tool declarations it expects. [Computer controls](/browsers/computer-controls) match what computer use models emit, with a guide for each [computer use model](/integrations/computer-use/overview). | +| System prompt | [Cookbooks](/cookbooks) with working prompts for common browser tasks. | | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | -| Browser automation framework | [Playwright execution](/browsers/playwright-execution) runs Playwright inside the browser's vm in one call. The [Browser REPL](/browsers/repl) keeps helpers alive across turns. Both run on the same browser as computer controls, so an agent can switch between DOM and screen actions. [Agent Browser](/integrations/vercel/agent-browser) and [Stagehand](/integrations/stagehand) work as ready-made starting points. | -| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments). [Config Registry](/config-registry) for settings that have worked on a site. [Live view, replays, and telemetry](/introduction/observe) for debugging. | +| Browser automation framework | [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) shows how to use DOM actions for most steps and computer use where the DOM doesn't cooperate, on the same browser. The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. | +| Browser infrastructure | [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. | | The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | - -For the objects you'll work with in KERNEL's API, such as browsers, browser pools, apps, and invocations, see [KERNEL objects](/info/concepts). From 2c029f00a1a8394c2eb058607c6ecd402a6f54cd Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:15:25 +0000 Subject: [PATCH 25/78] Drop redundant line from browser infrastructure on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index acce0856..84846abd 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -24,7 +24,7 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. KERNEL is browser infrastructure. +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. ## The internet From 49c1a661efd49c2d15232ac99f14b6b8eb98b8d3 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:17:18 +0000 Subject: [PATCH 26/78] Move Config Registry to the end of the browser infrastructure row Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 84846abd..4f41dfa9 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -51,5 +51,5 @@ Real websites weren't built for agents. They check for bots, and the useful page | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | | Browser automation framework | [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) shows how to use DOM actions for most steps and computer use where the DOM doesn't cooperate, on the same browser. The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. | -| Browser infrastructure | [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. | +| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | | The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | From fe27b63057999fe0543f055033ad13537aa34f4e Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:17:44 +0000 Subject: [PATCH 27/78] Note how browser infrastructure affects scaling on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 4f41dfa9..6a2d797d 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -24,7 +24,7 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. It also sets how far the agent can scale: how many browsers run at once, how fast new ones start, and whether they're ready when a burst of work arrives. ## The internet @@ -51,5 +51,5 @@ Real websites weren't built for agents. They check for bots, and the useful page | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | | Browser automation framework | [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) shows how to use DOM actions for most steps and computer use where the DOM doesn't cooperate, on the same browser. The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. | -| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | +| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Browser pools](/browsers/pools) keep configured browsers ready for bursts of work, and [concurrency and limits](/browsers/concurrency-and-limits) covers how many can run at once. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | | The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | From 4f953c5dcf61bbf60c30be20f12bde93e175a0e2 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:20:50 +0000 Subject: [PATCH 28/78] Call out scaling on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 6a2d797d..2c5f22ea 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -24,7 +24,7 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. It also sets how far the agent can scale: how many browsers run at once, how fast new ones start, and whether they're ready when a burst of work arrives. +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. It also has to scale with the agent: running many browsers concurrently, and absorbing bursts when an agent creates a large number of browsers at once. ## The internet @@ -51,5 +51,6 @@ Real websites weren't built for agents. They check for bots, and the useful page | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | | Browser automation framework | [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) shows how to use DOM actions for most steps and computer use where the DOM doesn't cooperate, on the same browser. The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. | -| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Browser pools](/browsers/pools) keep configured browsers ready for bursts of work, and [concurrency and limits](/browsers/concurrency-and-limits) covers how many can run at once. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | +| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | +| Scaling | Each plan has a set [concurrency limit and browser create rate](/browsers/concurrency-and-limits), and both go up when you [upgrade your plan](/info/pricing). [Browser pools](/browsers/pools) keep pre-configured browsers running, so acquiring one is instant and doesn't count against the create rate. | | The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | From 989acea4cfb45760da709c1a67488f50d909e279 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:56:24 +0000 Subject: [PATCH 29/78] Move computer use models into the KERNEL table and clarify the model's role Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 2c5f22ea..2ca47b11 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -16,7 +16,7 @@ The agent framework, or harness, runs the loop: it sends context to the model, r A harness is made of five pieces: -- **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It never touches the browser; it returns a tool call and the harness carries it out. [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes. +- **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It doesn't drive the browser itself: it returns a tool call, such as "click at (420, 280)", and the harness carries it out. - **System prompt:** the instructions sent with every request to the model: its role, its rules, and the format of its answers. - **Tools:** functions the model can ask the harness to call, like "navigate to this URL", "click here", or "run this code". - **Skills:** instructions and reference files the agent loads only when a task needs them, unlike the system prompt, which is sent every turn. @@ -46,7 +46,7 @@ Real websites weren't built for agents. They check for bots, and the useful page | Piece | What KERNEL provides | | --- | --- | | Agent framework | [Integrations](/integrations/overview) for the frameworks and agents you already use. The [code execution platform](/apps/develop) colocates your agent with its browser, so every action skips the network round trip. | -| Model | [Browser Loop](/browsers/browser-loop) gives each model provider the browser tool declarations it expects. [Computer controls](/browsers/computer-controls) match what computer use models emit, with a guide for each [computer use model](/integrations/computer-use/overview). | +| Model | [Computer use models](/integrations/computer-use/overview) are trained to act on screenshots with clicks and keystrokes, and KERNEL has a guide for each. [Computer controls](/browsers/computer-controls) execute exactly the actions those models emit. [Browser Loop](/browsers/browser-loop) gives each model provider the browser tool declarations it expects. | | System prompt | [Cookbooks](/cookbooks) with working prompts for common browser tasks. | | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | From 34c129cc42a3da4e93c8fc73f342582bdbbe4477 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:56:47 +0000 Subject: [PATCH 30/78] Split browser infrastructure into bullets on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 2ca47b11..1f06f569 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -24,7 +24,13 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It includes the browser itself and what an agent needs to use it on real websites: stealth and proxies so it isn't blocked, saved logins and credentials, payment methods, and a way to see what happened when something goes wrong. It also has to scale with the agent: running many browsers concurrently, and absorbing bursts when an agent creates a large number of browsers at once. +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It's made of five pieces: + +- **Browser:** the Chromium instance the agent drives, isolated from every other session. +- **Stealth and proxies:** anti-detection, CAPTCHA handling, and an IP address that fits the site, so the browser isn't blocked. +- **Credentials and state:** saved logins, credentials, and payment methods the browser can use without exposing them to the model. +- **Observability:** live view, replays, and telemetry, so you can see what happened when something goes wrong. +- **Scale:** running many browsers concurrently, and absorbing bursts when an agent creates a large number of browsers at once. ## The internet From 6286bff4d2f1b734187300fda8967d6ea6d50cde Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:59:04 +0000 Subject: [PATCH 31/78] Loosen piece counts on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 1f06f569..88ab2267 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -14,7 +14,7 @@ A browser agent is built from a few pieces. Knowing which piece does what tells The agent framework, or harness, runs the loop: it sends context to the model, runs the tool call the model returns, feeds the result back, and repeats until the task is done. You either build your own with a framework, such as the [Claude Agent SDK](/integrations/claude/claude-agent-sdk), the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/), or the [Vercel AI SDK](/integrations/vercel/ai-sdk), or use a finished agent that already has one, such as [Claude Code](/integrations/claude/claude-code-and-desktop), [Codex](https://developers.openai.com/codex), or [Replit](/integrations/replit). -A harness is made of five pieces: +A harness's key pieces include: - **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It doesn't drive the browser itself: it returns a tool call, such as "click at (420, 280)", and the harness carries it out. - **System prompt:** the instructions sent with every request to the model: its role, its rules, and the format of its answers. @@ -24,7 +24,7 @@ A harness is made of five pieces: ## Browser infrastructure -Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. It's made of five pieces: +Browser infrastructure is where the agent's decisions actually get carried out. The agent framework decides to open a page, fill a form, or click a button; browser infrastructure runs the browser that does it, and determines whether the action lands. Its key pieces include: - **Browser:** the Chromium instance the agent drives, isolated from every other session. - **Stealth and proxies:** anti-detection, CAPTCHA handling, and an IP address that fits the site, so the browser isn't blocked. From 79537f28f7081597c90ea453a1597d65923134a3 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:23:57 +0000 Subject: [PATCH 32/78] Drop example tool call from the model bullet Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 88ab2267..62d4c6f5 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -16,7 +16,7 @@ The agent framework, or harness, runs the loop: it sends context to the model, r A harness's key pieces include: -- **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It doesn't drive the browser itself: it returns a tool call, such as "click at (420, 280)", and the harness carries it out. +- **Model:** decides the next action from the system prompt, the conversation, tool results, and screenshots. It doesn't drive the browser itself: it returns a tool call and the harness carries it out. - **System prompt:** the instructions sent with every request to the model: its role, its rules, and the format of its answers. - **Tools:** functions the model can ask the harness to call, like "navigate to this URL", "click here", or "run this code". - **Skills:** instructions and reference files the agent loads only when a task needs them, unlike the system prompt, which is sent every turn. From aeb8c60d6f15f1a6088213460efe1637ac426152 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:33:08 +0000 Subject: [PATCH 33/78] Lead Why KERNEL with performance and framework pairing Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 6634ab07..585eebbb 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -1,9 +1,17 @@ --- title: "Why KERNEL?" -description: "What Kernel gives you that a Chrome process doesn't" +description: "Fast, secure browser infrastructure for agents, paired with the agent framework you already use" --- -Kernel runs Chromium as infrastructure: an isolated, GPU-capable browser you create in milliseconds, drive over four protocols, watch live, record, authenticate, and throw away. If your agent or automation needs a real browser and you'd rather not operate a browser fleet, this is what Kernel replaces. +KERNEL is built to be the fastest browser infrastructure for agents. Browsers are created in about 30ms at P50, your code can run inside the browser's VM instead of across the network, and on [ComputeSDK's independent throughput benchmark](https://www.computesdk.com/benchmarks/browsers/browser-throughput/), KERNEL completes more actions per second inside a running session than any other browser provider tested. + +Pair it with the agent framework you like best. Your framework runs the loop and KERNEL runs the browser, so you can pick the best of each instead of settling for a browser bundled with a framework, or a framework bundled with a browser. See [integrations](/integrations/overview) for the frameworks and agents KERNEL works with, and [important concepts](/overview/concepts) for how the pieces fit. + +## What sets KERNEL apart + +- **Each browser is its own VM.** Every browser gets its own kernel via [unikernel-based virtualization](/info/unikernels). That's what makes both the isolation story and the 30ms start possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are available inside a session at all. +- **Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. +- **Auth and payments are built on primitives.** [Vaults](/vaults/overview) hold credentials and payment items that a browser fills into a page without your agent ever reading them. [Profiles](/browsers/profiles) persist cookies, storage, and logins across sessions. [Authentication](/auth/overview) builds on both: fill a login from a vault, or let managed auth handle the login, MFA prompts, SSO redirects, and background reauthentication, then save the result as a profile your agent attaches to any browser. [Payments](/browsers/payments) use the same vaults, so an agent can complete a checkout through Link or AgentCard without seeing card data. ## Why not just run Chrome yourself? @@ -14,22 +22,14 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r | Start-up latency | Cold container pull plus Chromium launch — seconds per task | P50 30ms browser creation ([performance](/browsers/performance)), or zero-wait acquisition from a [browser pool](/browsers/pools) | | Isolation | One compromised page shares a kernel with everything else on the box | Each browser is a [microVM](/info/unikernels) with its own kernel and filesystem | | Idle cost | You pay for the container while the agent thinks | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | -| Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview) that aren't metered | +| Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview), including bring-your-own | | Logins | Credentials end up in your agent's context or in a secret store you now own | [Managed auth](/auth/overview) logs in, keeps sessions warm, and hands your agent a [profile](/browsers/profiles) — no credentials in the loop | | Debugging a failure | Reproduce it locally and hope | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | | Scaling | Autoscaling group, image pipeline, cleanup jobs, orphan reaper | `browsers.create()`, or a pool with a fill rate | -## What's structural about Kernel - -**MicroVM isolation, not containers.** Every browser gets its own kernel via [unikernel-based virtualization](/info/unikernels). That's what makes both the isolation story and the 30ms start possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are available inside a session at all. - -**Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. - -**Auth and payments are built on primitives.** [Vaults](/vaults/overview) hold credentials and payment items that a browser fills into a page without your agent ever reading them. [Profiles](/browsers/profiles) persist cookies, storage, and logins across sessions. [Authentication](/auth/overview) builds on both: fill a login from a vault, or let managed auth handle the login, MFA prompts, SSO redirects, and background reauthentication, then save the result as a profile your agent attaches to any browser. [Payments](/browsers/payments) use the same vaults, so an agent can complete a checkout through Link or AgentCard without seeing card data. - -## When Kernel isn't the answer +## When KERNEL isn't the answer -If the site you need has a real API, use the API. Browsers are the right tool when the work only exists behind a UI — a portal with no API, a checkout flow, a document you can only reach after logging in, or a task that a computer-use model has to see to do. +If the site you need has a real API or an MCP server, use that instead. They're faster and more reliable than driving a page. Browsers are the right tool when the work only exists behind a UI: a portal with no API, a flow that needs a login, or a task that a computer use model has to see to do. Every product, each linking to its documentation. From 86025d223109f7ab8dbfdc3e355f61480c55a9e4 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:37:46 +0000 Subject: [PATCH 34/78] Reference benchmarks on Why KERNEL and cover lifecycle and throughput Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 585eebbb..93cd066d 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -3,7 +3,7 @@ title: "Why KERNEL?" description: "Fast, secure browser infrastructure for agents, paired with the agent framework you already use" --- -KERNEL is built to be the fastest browser infrastructure for agents. Browsers are created in about 30ms at P50, your code can run inside the browser's VM instead of across the network, and on [ComputeSDK's independent throughput benchmark](https://www.computesdk.com/benchmarks/browsers/browser-throughput/), KERNEL completes more actions per second inside a running session than any other browser provider tested. +KERNEL is built to be the fastest browser infrastructure for agents, across the browser lifecycle and inside a running session. A browser is created in about 30ms at P50, goes into [standby](/browsers/standby) when idle, and picks up where it left off when your agent reconnects. Inside the session, your code can run in the browser's VM instead of across the network, so each action skips the round trip. On [ComputeSDK's independent browser benchmarks](https://www.computesdk.com/benchmarks/browsers/), KERNEL completes more actions per second than any other provider tested, and its create and connect times are among the fastest measured. See [benchmarks](https://www.kernel.sh/benchmarks) for how KERNEL compares. Pair it with the agent framework you like best. Your framework runs the loop and KERNEL runs the browser, so you can pick the best of each instead of settling for a browser bundled with a framework, or a framework bundled with a browser. See [integrations](/integrations/overview) for the frameworks and agents KERNEL works with, and [important concepts](/overview/concepts) for how the pieces fit. From 8d26a1729951575b638369d2f3c70d574206741a Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:39:11 +0000 Subject: [PATCH 35/78] Expand what sets KERNEL apart on Why KERNEL Add headful-by-default, idle billing, and open source and compliance points alongside the existing VM, colocation, and auth points. Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 93cd066d..57e8573c 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -9,9 +9,12 @@ Pair it with the agent framework you like best. Your framework runs the loop and ## What sets KERNEL apart +- **Headful by default.** Every browser has a real display and runs the full rendering pipeline. Sites that check for signs of a headless browser don't find them, computer use models see the page as it actually rendered, WebGL, canvas, and video work, and [live view](/browsers/live-view) and [replays](/browsers/replays) show the real session. Switch to [headless](/browsers/headless) per session when a job doesn't need it, or add [GPU acceleration](/browsers/gpu-acceleration) for graphics-heavy sites. - **Each browser is its own VM.** Every browser gets its own kernel via [unikernel-based virtualization](/info/unikernels). That's what makes both the isolation story and the 30ms start possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are available inside a session at all. - **Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. +- **You pay for work, not idle time.** Usage is billed per second, and a browser stops billing 5 seconds after its last activity by going into [standby](/browsers/standby). Browsers waiting in a [pool](/browsers/pools) aren't billed until acquired. A browser can stay open for up to [72 hours](/browsers/termination), so a human-in-the-loop flow can pause overnight and pick up where it left off. - **Auth and payments are built on primitives.** [Vaults](/vaults/overview) hold credentials and payment items that a browser fills into a page without your agent ever reading them. [Profiles](/browsers/profiles) persist cookies, storage, and logins across sessions. [Authentication](/auth/overview) builds on both: fill a login from a vault, or let managed auth handle the login, MFA prompts, SSO redirects, and background reauthentication, then save the result as a profile your agent attaches to any browser. [Payments](/browsers/payments) use the same vaults, so an agent can complete a checkout through Link or AgentCard without seeing card data. +- **Open source and audited.** The [browser image](https://github.com/kernel/kernel-images) and [VM runtime](https://github.com/kernel/hypeman) are open source, so you can read exactly what runs your agent's browser. KERNEL is SOC 2 Type II and ISO 27001 certified on every plan, with HIPAA and zero data retention available on Enterprise. See [security](/security). ## Why not just run Chrome yourself? From 9b288b98f7cc6739f8442c26a4578aa7aafba35c Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:41:03 +0000 Subject: [PATCH 36/78] Focus what sets KERNEL apart on headful, VM isolation, and platform primitives Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 57e8573c..008515fc 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -10,11 +10,11 @@ Pair it with the agent framework you like best. Your framework runs the loop and ## What sets KERNEL apart - **Headful by default.** Every browser has a real display and runs the full rendering pipeline. Sites that check for signs of a headless browser don't find them, computer use models see the page as it actually rendered, WebGL, canvas, and video work, and [live view](/browsers/live-view) and [replays](/browsers/replays) show the real session. Switch to [headless](/browsers/headless) per session when a job doesn't need it, or add [GPU acceleration](/browsers/gpu-acceleration) for graphics-heavy sites. -- **Each browser is its own VM.** Every browser gets its own kernel via [unikernel-based virtualization](/info/unikernels). That's what makes both the isolation story and the 30ms start possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are available inside a session at all. -- **Your loop can run next to the browser.** The [Playwright execution API](/browsers/playwright-execution) runs your code inside the browser's VM, and the [code execution platform](/apps/develop) deploys your whole agent there. No round trip per action, no CDP connection to babysit, and no CDP fingerprint on the wire. See [how you drive the browser](/introduction/control) for how to choose. -- **You pay for work, not idle time.** Usage is billed per second, and a browser stops billing 5 seconds after its last activity by going into [standby](/browsers/standby). Browsers waiting in a [pool](/browsers/pools) aren't billed until acquired. A browser can stay open for up to [72 hours](/browsers/termination), so a human-in-the-loop flow can pause overnight and pick up where it left off. -- **Auth and payments are built on primitives.** [Vaults](/vaults/overview) hold credentials and payment items that a browser fills into a page without your agent ever reading them. [Profiles](/browsers/profiles) persist cookies, storage, and logins across sessions. [Authentication](/auth/overview) builds on both: fill a login from a vault, or let managed auth handle the login, MFA prompts, SSO redirects, and background reauthentication, then save the result as a profile your agent attaches to any browser. [Payments](/browsers/payments) use the same vaults, so an agent can complete a checkout through Link or AgentCard without seeing card data. -- **Open source and audited.** The [browser image](https://github.com/kernel/kernel-images) and [VM runtime](https://github.com/kernel/hypeman) are open source, so you can read exactly what runs your agent's browser. KERNEL is SOC 2 Type II and ISO 27001 certified on every plan, with HIPAA and zero data retention available on Enterprise. See [security](/security). +- **Each browser is its own VM.** Every browser runs isolated at the hypervisor, with its own kernel and filesystem, instead of sharing a host with other tenants. That's what makes a 30ms start and strong isolation possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are safe to use inside a session. +- **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them, so you can tune how your agent runs: + - **Control:** drive the same browser with [Playwright execution](/browsers/playwright-execution), [computer controls](/browsers/computer-controls), the [Browser REPL](/browsers/repl), or [WebMCP](/browsers/webmcp), and switch between them mid-task. + - **Performance:** run your code or your whole agent inside the browser's VM, and acquire pre-configured browsers from a pool instead of creating them. + - **Security:** logins and card details are filled from a vault or handled by managed auth, so they never enter your agent's context or your logs. ## Why not just run Chrome yourself? From 18446d9c3c2ce93e9774bde066af70ebde36cc02 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:45:20 +0000 Subject: [PATCH 37/78] Reorder the run-it-yourself table and add sensitive credentials row Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 008515fc..06567ffa 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -24,9 +24,9 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r | --- | --- | --- | | Start-up latency | Cold container pull plus Chromium launch — seconds per task | P50 30ms browser creation ([performance](/browsers/performance)), or zero-wait acquisition from a [browser pool](/browsers/pools) | | Isolation | One compromised page shares a kernel with everything else on the box | Each browser is a [microVM](/info/unikernels) with its own kernel and filesystem | -| Idle cost | You pay for the container while the agent thinks | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | | Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview), including bring-your-own | -| Logins | Credentials end up in your agent's context or in a secret store you now own | [Managed auth](/auth/overview) logs in, keeps sessions warm, and hands your agent a [profile](/browsers/profiles) — no credentials in the loop | +| Sensitive credentials | Credentials end up in your agent's context or in a secret store you now own | [Vaults](/vaults/overview) store sensitive information and fill it into the page without your agent reading it, [managed auth](/auth/overview) handles logins end to end, and [profiles](/browsers/profiles) persist state across sessions | +| Idle cost | You pay for the container while the agent thinks or while you wait for end-user input | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | | Debugging a failure | Reproduce it locally and hope | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | | Scaling | Autoscaling group, image pipeline, cleanup jobs, orphan reaper | `browsers.create()`, or a pool with a fill rate | From 7f29ae5ba21be1a2c246e1e85279ef14409f4144 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:46:23 +0000 Subject: [PATCH 38/78] Tone down the debugging row and focus scaling on plan limits Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 06567ffa..197ae3fe 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -27,8 +27,8 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r | Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview), including bring-your-own | | Sensitive credentials | Credentials end up in your agent's context or in a secret store you now own | [Vaults](/vaults/overview) store sensitive information and fill it into the page without your agent reading it, [managed auth](/auth/overview) handles logins end to end, and [profiles](/browsers/profiles) persist state across sessions | | Idle cost | You pay for the container while the agent thinks or while you wait for end-user input | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | -| Debugging a failure | Reproduce it locally and hope | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | -| Scaling | Autoscaling group, image pipeline, cleanup jobs, orphan reaper | `browsers.create()`, or a pool with a fill rate | +| Debugging a failure | Add your own logging and screen recording, then try to reproduce the failure | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | +| Scaling | Provision more hosts, then build the autoscaling, image pipeline, and cleanup jobs around them | [Upgrade your plan](/info/pricing) to raise your [concurrency limit and browser create rate](/browsers/concurrency-and-limits), with custom limits on Enterprise. [Browser pools](/browsers/pools) absorb bursts. | ## When KERNEL isn't the answer From 2f7f078c24e35033ec613bfeeb0348608ca80edb Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:46:49 +0000 Subject: [PATCH 39/78] Clarify the computer use example on Why KERNEL Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 197ae3fe..bc5307d8 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -32,7 +32,7 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r ## When KERNEL isn't the answer -If the site you need has a real API or an MCP server, use that instead. They're faster and more reliable than driving a page. Browsers are the right tool when the work only exists behind a UI: a portal with no API, a flow that needs a login, or a task that a computer use model has to see to do. +If the site you need has a real API or an MCP server, use that instead. They're faster and more reliable than driving a page. Browsers are the right tool when the work only exists behind a UI: a portal with no API, a flow that needs a login, or a task where a computer use model has to see the page to take actions. Every product, each linking to its documentation. From 23056990baafcd00adf60f5e39e98ecf0794cc38 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:49:07 +0000 Subject: [PATCH 40/78] Reference only the KERNEL benchmarks page on Why KERNEL Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index bc5307d8..eb6b5020 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -3,7 +3,7 @@ title: "Why KERNEL?" description: "Fast, secure browser infrastructure for agents, paired with the agent framework you already use" --- -KERNEL is built to be the fastest browser infrastructure for agents, across the browser lifecycle and inside a running session. A browser is created in about 30ms at P50, goes into [standby](/browsers/standby) when idle, and picks up where it left off when your agent reconnects. Inside the session, your code can run in the browser's VM instead of across the network, so each action skips the round trip. On [ComputeSDK's independent browser benchmarks](https://www.computesdk.com/benchmarks/browsers/), KERNEL completes more actions per second than any other provider tested, and its create and connect times are among the fastest measured. See [benchmarks](https://www.kernel.sh/benchmarks) for how KERNEL compares. +KERNEL is built to be the fastest browser infrastructure for agents, across the browser lifecycle and inside a running session. A browser is created in about 30ms at P50, goes into [standby](/browsers/standby) when idle, and picks up where it left off when your agent reconnects. Inside the session, your code can run in the browser's VM instead of across the network, so each action skips the round trip. On independent benchmarks, KERNEL completes more actions per second than any other provider tested, and its create and connect times are among the fastest measured. See [benchmarks](https://www.kernel.sh/benchmarks) for how KERNEL compares. Pair it with the agent framework you like best. Your framework runs the loop and KERNEL runs the browser, so you can pick the best of each instead of settling for a browser bundled with a framework, or a framework bundled with a browser. See [integrations](/integrations/overview) for the frameworks and agents KERNEL works with, and [important concepts](/overview/concepts) for how the pieces fit. From 4f7a9b48b1a3717d45e30c4eafec179bc2ea11ba Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:50:18 +0000 Subject: [PATCH 41/78] Reorder architecture benefits on the introduction Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.mdx b/index.mdx index adf8c807..10a2a83d 100644 --- a/index.mdx +++ b/index.mdx @@ -18,8 +18,8 @@ most browser infrastructure runs chromium in containers orchestrated by kubernet a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has many benefits, including: - **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([benchmarks](https://www.kernel.sh/benchmarks)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. -- **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. - **code on the vm is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so the [browser repl](/browsers/repl), [process execution](/browsers/process-execution), and root access over [ssh](/browsers/ssh) stay contained to that session. +- **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. ## open source From ff39a8b5e7836d3f8dda9c935d8a0a198267efcf Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:51:58 +0000 Subject: [PATCH 42/78] Reorder open source cards on the introduction Co-Authored-By: Claude Opus 5.5 --- index.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.mdx b/index.mdx index 10a2a83d..ef58e3b1 100644 --- a/index.mdx +++ b/index.mdx @@ -35,7 +35,10 @@ we value open source and transparency, so we publish the code that runs your age our fork of the cloud hypervisor virtual machine monitor. - + + framework-neutral browser tools for your agent, with bindings for popular frameworks. + + the KERNEL cli for creating, driving, and debugging browsers from a terminal. @@ -44,9 +47,6 @@ we value open source and transparency, so we publish the code that runs your age agent skills that teach coding agents the KERNEL cli, sdks, and auth. - - framework-neutral browser tools for your agent, with bindings for popular frameworks. - end-to-end recipes for agents that use the internet. From 9db832a7e9cfb68c048103fd3cffcde6659067bd Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:58:21 +0000 Subject: [PATCH 43/78] Point Why KERNEL to how it works, add P99 creation latency, fix pool wording Co-Authored-By: Claude Opus 5.5 --- index.mdx | 2 +- overview/why-kernel.mdx | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/index.mdx b/index.mdx index ef58e3b1..64b90161 100644 --- a/index.mdx +++ b/index.mdx @@ -17,7 +17,7 @@ most browser infrastructure runs chromium in containers orchestrated by kubernet a unikernel carries the browser and nothing else, so there's little to boot or keep running. running every browser this way has many benefits, including: -- **lifecycle actions are fast.** a browser is created in about 30ms at p50 ([benchmarks](https://www.kernel.sh/benchmarks)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. +- **lifecycle actions are fast.** a browser is created in about 30ms at p50 and 105ms at p99 ([benchmarks](https://www.kernel.sh/benchmarks)), so you can create one per task instead of keeping a warm pool alive to hide start-up time. - **code on the vm is safe to hand an agent.** every browser is its own vm, isolated at the hypervisor rather than sharing a host kernel with other tenants, so the [browser repl](/browsers/repl), [process execution](/browsers/process-execution), and root access over [ssh](/browsers/ssh) stay contained to that session. - **idle browsers go into standby.** after five seconds with no activity, a browser enters [standby](/browsers/standby): it keeps its state and stops accruing usage cost until your code or agent reconnects. diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index eb6b5020..b68ffa98 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -3,7 +3,7 @@ title: "Why KERNEL?" description: "Fast, secure browser infrastructure for agents, paired with the agent framework you already use" --- -KERNEL is built to be the fastest browser infrastructure for agents, across the browser lifecycle and inside a running session. A browser is created in about 30ms at P50, goes into [standby](/browsers/standby) when idle, and picks up where it left off when your agent reconnects. Inside the session, your code can run in the browser's VM instead of across the network, so each action skips the round trip. On independent benchmarks, KERNEL completes more actions per second than any other provider tested, and its create and connect times are among the fastest measured. See [benchmarks](https://www.kernel.sh/benchmarks) for how KERNEL compares. +KERNEL is built to be the fastest browser infrastructure for agents, across the browser lifecycle and inside a running session. A browser is created in about 30ms at P50 and 105ms at P99, goes into [standby](/browsers/standby) when idle, and picks up where it left off when your agent reconnects. Inside the session, your code can run in the browser's VM instead of across the network, so each action skips the round trip. On independent benchmarks, KERNEL completes more actions per second than any other provider tested, and its create and connect times are among the fastest measured. See [benchmarks](https://www.kernel.sh/benchmarks) for how KERNEL compares. Pair it with the agent framework you like best. Your framework runs the loop and KERNEL runs the browser, so you can pick the best of each instead of settling for a browser bundled with a framework, or a framework bundled with a browser. See [integrations](/integrations/overview) for the frameworks and agents KERNEL works with, and [important concepts](/overview/concepts) for how the pieces fit. @@ -11,10 +11,7 @@ Pair it with the agent framework you like best. Your framework runs the loop and - **Headful by default.** Every browser has a real display and runs the full rendering pipeline. Sites that check for signs of a headless browser don't find them, computer use models see the page as it actually rendered, WebGL, canvas, and video work, and [live view](/browsers/live-view) and [replays](/browsers/replays) show the real session. Switch to [headless](/browsers/headless) per session when a job doesn't need it, or add [GPU acceleration](/browsers/gpu-acceleration) for graphics-heavy sites. - **Each browser is its own VM.** Every browser runs isolated at the hypervisor, with its own kernel and filesystem, instead of sharing a host with other tenants. That's what makes a 30ms start and strong isolation possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are safe to use inside a session. -- **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them, so you can tune how your agent runs: - - **Control:** drive the same browser with [Playwright execution](/browsers/playwright-execution), [computer controls](/browsers/computer-controls), the [Browser REPL](/browsers/repl), or [WebMCP](/browsers/webmcp), and switch between them mid-task. - - **Performance:** run your code or your whole agent inside the browser's VM, and acquire pre-configured browsers from a pool instead of creating them. - - **Security:** logins and card details are filled from a vault or handled by managed auth, so they never enter your agent's context or your logs. +- **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them. The how it works sections, [configure](/introduction/create), [control](/introduction/control), [scale](/introduction/scale), [observe](/introduction/observe), and [manage](/info/projects), show how to use them to tune control, performance, and security. ## Why not just run Chrome yourself? @@ -22,13 +19,13 @@ You can. Running one Chrome locally is easy, and it's the right call while you'r | What you hit | Running it yourself | On Kernel | | --- | --- | --- | -| Start-up latency | Cold container pull plus Chromium launch — seconds per task | P50 30ms browser creation ([performance](/browsers/performance)), or zero-wait acquisition from a [browser pool](/browsers/pools) | +| Start-up latency | Cold container pull plus Chromium launch — seconds per task | Browser creation in 30ms at P50 and 105ms at P99 ([performance](/browsers/performance)), or pre-configured browsers in a [browser pool](/browsers/pools) for instant acquisition | | Isolation | One compromised page shares a kernel with everything else on the box | Each browser is a [microVM](/info/unikernels) with its own kernel and filesystem | | Bot detection | You maintain the patches, the fingerprints, and a proxy contract | [Anti-detection](/browsers/bot-detection/overview) on every browser, plus a managed solver and [proxies](/proxies/overview), including bring-your-own | | Sensitive credentials | Credentials end up in your agent's context or in a secret store you now own | [Vaults](/vaults/overview) store sensitive information and fill it into the page without your agent reading it, [managed auth](/auth/overview) handles logins end to end, and [profiles](/browsers/profiles) persist state across sessions | | Idle cost | You pay for the container while the agent thinks or while you wait for end-user input | [Standby mode](/browsers/standby) suspends the browser and stops usage charges 5 seconds after the last activity | | Debugging a failure | Add your own logging and screen recording, then try to reproduce the failure | [Live view](/browsers/live-view), [replays](/browsers/replays), and [telemetry](/browsers/telemetry/overview) for the session that actually failed | -| Scaling | Provision more hosts, then build the autoscaling, image pipeline, and cleanup jobs around them | [Upgrade your plan](/info/pricing) to raise your [concurrency limit and browser create rate](/browsers/concurrency-and-limits), with custom limits on Enterprise. [Browser pools](/browsers/pools) absorb bursts. | +| Scaling | Provision more hosts, then build the autoscaling, image pipeline, and cleanup jobs around them | [Upgrade your plan](/info/pricing) to raise your [concurrency limit and browser create rate](/browsers/concurrency-and-limits), with custom limits on Enterprise. | ## When KERNEL isn't the answer From cdd32c149809450ac72963376be97c6a67cb574b Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:00:16 +0000 Subject: [PATCH 44/78] Move the how it works pointer on Why KERNEL into its own summary line Co-Authored-By: Claude Opus 5.5 --- overview/why-kernel.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index b68ffa98..58e58a3e 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -11,7 +11,9 @@ Pair it with the agent framework you like best. Your framework runs the loop and - **Headful by default.** Every browser has a real display and runs the full rendering pipeline. Sites that check for signs of a headless browser don't find them, computer use models see the page as it actually rendered, WebGL, canvas, and video work, and [live view](/browsers/live-view) and [replays](/browsers/replays) show the real session. Switch to [headless](/browsers/headless) per session when a job doesn't need it, or add [GPU acceleration](/browsers/gpu-acceleration) for graphics-heavy sites. - **Each browser is its own VM.** Every browser runs isolated at the hypervisor, with its own kernel and filesystem, instead of sharing a host with other tenants. That's what makes a 30ms start and strong isolation possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are safe to use inside a session. -- **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them. The how it works sections, [configure](/introduction/create), [control](/introduction/control), [scale](/introduction/scale), [observe](/introduction/observe), and [manage](/info/projects), show how to use them to tune control, performance, and security. +- **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them. + +To put these to work, the how it works guides walk through each stage of a browser's life: [configure](/introduction/create) it, [control](/introduction/control) it, [scale](/introduction/scale) it, [observe](/introduction/observe) it, and [manage](/info/projects) it across your team. ## Why not just run Chrome yourself? From 6890bf24515c872f8f2b7e9a6f185c4c38a6ccf2 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:02:52 +0000 Subject: [PATCH 45/78] Move the get started grid from See all products to the quickstart Co-Authored-By: Claude Opus 5.5 --- overview/products.mdx | 31 ------------------------------- start/quickstart.mdx | 30 +++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/overview/products.mdx b/overview/products.mdx index e11f55e4..39a94268 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -42,34 +42,3 @@ mode: "wide" Deploy your agent next to its browser and invoke it on demand or on a schedule. - -## Get started - -Pick the way in that matches how you work. - - - - Copy one prompt into Cursor, Claude Code, or Codex and let it set up KERNEL. - - - Create and drive your first browser in TypeScript, Python, or Go. - - - Create, drive, and debug browsers from a terminal. - - - Give any MCP client, like Claude or Cursor, a cloud browser as a set of tools. - - - Teach your coding agent the KERNEL CLI, SDKs, and auth with one install. - - - Guides for the agent frameworks, models, and platforms you already use. - - - Clone an end-to-end recipe and adapt it to your task. - - - Pay for one browser with Link, with no account or API key. - - diff --git a/start/quickstart.mdx b/start/quickstart.mdx index 50b9b382..a61e362b 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -1,9 +1,37 @@ --- title: "Quickstart" description: "Hand setup to your coding agent, or create your first cloud browser yourself" +mode: "wide" --- -Two paths. Start with the first if a coding agent is writing the code; use the second if you are. +Pick the way in that matches how you work. The first two are walked through on this page; the rest open their own guides. + + + + Copy one prompt into Cursor, Claude Code, or Codex and let it set up KERNEL. + + + Create and drive your first browser in TypeScript, Python, or Go. + + + Create, drive, and debug browsers from a terminal. + + + Give any MCP client, like Claude or Cursor, a cloud browser as a set of tools. + + + Teach your coding agent the KERNEL CLI, SDKs, and auth with one install. + + + Guides for the agent frameworks, models, and platforms you already use. + + + Clone an end-to-end recipe and adapt it to your task. + + + Pay for one browser with Link, with no account or API key. + + ## Path 1: hand it to your coding agent From 4f68261e289631010a797dd4899481b48f425ba5 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:03:10 +0000 Subject: [PATCH 46/78] Move Config Registry to the internet row on important concepts Co-Authored-By: Claude Opus 5.5 --- overview/concepts.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overview/concepts.mdx b/overview/concepts.mdx index 62d4c6f5..351ddf4a 100644 --- a/overview/concepts.mdx +++ b/overview/concepts.mdx @@ -57,6 +57,6 @@ Real websites weren't built for agents. They check for bots, and the useful page | Tools | The [MCP server](/reference/mcp-server) exposes KERNEL as tools. [WebMCP](/browsers/webmcp) lets your agent call the structured tools a site exposes instead of guessing which controls to click. | | Skills | [Agent Skills](/skills/overview) teach coding agents the KERNEL CLI, SDKs, bot detection, and auth. [Create site skills](/skills/create-site-skills) turns a working flow on one site into a reusable skill. | | Browser automation framework | [Playwright with computer use fallback](/browsers/playwright-computer-use-fallback) shows how to use DOM actions for most steps and computer use where the DOM doesn't cooperate, on the same browser. The [Browser REPL](/browsers/repl) keeps a JavaScript runtime next to the browser, so an agent can define helpers once and reuse them across turns. | -| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | +| Browser infrastructure | [Stealth](/browsers/bot-detection/overview), [proxies](/proxies/overview), [profiles](/browsers/profiles), [vaults](/vaults/overview), [authentication](/auth/overview), and [payments](/browsers/payments) handle what the site asks for, and [live view, replays, and telemetry](/introduction/observe) show what happened. | | Scaling | Each plan has a set [concurrency limit and browser create rate](/browsers/concurrency-and-limits), and both go up when you [upgrade your plan](/info/pricing). [Browser pools](/browsers/pools) keep pre-configured browsers running, so acquiring one is instant and doesn't count against the create rate. | -| The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. | +| The internet | [Web Bot Auth](/browsers/bot-detection/web-bot-auth) gives your agent a verifiable identity that sites can check, instead of looking like a bot. [Config Registry](/config-registry) recommends browser and proxy configurations that have worked on the site you're automating. | From 2bb0436a61f6537db4f0046150d7aca5f29a9375 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:06:50 +0000 Subject: [PATCH 47/78] Replace the MPP card on the quickstart with the REST API Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index a61e362b..aacdbbe8 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -28,8 +28,8 @@ Pick the way in that matches how you work. The first two are walked through on t Clone an end-to-end recipe and adapt it to your task. - - Pay for one browser with Link, with no account or API key. + + Call KERNEL over HTTP from any language, starting with creating a browser. From bcd108a11854ceb720c2a708fa96a98a5eb0c30e Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:11:08 +0000 Subject: [PATCH 48/78] Tighten the quickstart - Describe what the setup prompt actually does, show its steps, and say what done looks like - Collapse agent-readable surfaces into an accordion - Add an API key step and a Go example to match the Go install tab - Turn next decisions into cards and use KERNEL in prose Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 90 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index aacdbbe8..7300d614 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -35,30 +35,44 @@ Pick the way in that matches how you work. The first two are walked through on t ## Path 1: hand it to your coding agent -Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the Kernel CLI and skills, authenticates you, and opens a live browser session that you or your agent can drive. +Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the KERNEL CLI, signs you in, and opens a live view of a KERNEL browser that you or your agent can drive. import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; -### Agent-readable surfaces + +1. Checks for the KERNEL CLI and installs or upgrades it with Homebrew. +2. Checks whether you're signed in, and if not, runs `kernel login` and waits for you to finish signing in. +3. Creates a browser and opens its live view so you can watch it. +It stops and asks you for help if any step fails. + + +You're done when your agent opens a live view of a KERNEL browser. From there, ask it to do a task on a site you care about. + + | Surface | What it's for | | --- | --- | -| [`kernel.sh/llms.txt`](https://www.kernel.sh/llms.txt) | Hand-written. What Kernel is, when to use it, every machine endpoint. Start here. | +| [`kernel.sh/llms.txt`](https://www.kernel.sh/llms.txt) | Hand-written. What KERNEL is, when to use it, every machine endpoint. Start here. | | [`kernel.sh/docs/llms.txt`](https://www.kernel.sh/docs/llms.txt) | Index of every docs page, for fetching the ones a task needs. | | [`kernel.sh/docs/llms-full.txt`](https://www.kernel.sh/docs/llms-full.txt) | The whole docs corpus in one file, for agents with room for it. | -| [Agent Skills](/skills/overview) | Kernel know-how installed into the agent, so it doesn't re-read docs every session. | -| [MCP server](/reference/mcp-server) | Kernel's API as tools, for agents that call tools instead of writing code. | +| [Agent Skills](/skills/overview) | KERNEL know-how installed into the agent, so it doesn't re-read docs every session. | +| [MCP server](/reference/mcp-server) | KERNEL's API as tools, for agents that call tools instead of writing code. | | [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | + ## Path 2: write it yourself - -You'll need an API key from the [dashboard](https://dashboard.onkernel.com). Set it as `KERNEL_API_KEY` — every SDK, the CLI, and the MCP server read it from the environment. - - + +Create an API key in the [dashboard](https://dashboard.onkernel.com) and set it as `KERNEL_API_KEY`. Every SDK, the CLI, and the MCP server read it from the environment. + +```bash +export KERNEL_API_KEY= +``` + + ```bash TypeScript @@ -79,7 +93,7 @@ go get github.com/kernel/kernel-go-sdk This creates a browser, runs Playwright code inside the browser's VM, returns the result, and cleans up. No local Chromium, no CDP connection to manage. -```typescript Typescript/Javascript +```typescript TypeScript import Kernel from '@onkernel/sdk'; const kernel = new Kernel(); @@ -120,6 +134,42 @@ try: finally: kernel.browsers.delete_by_id(browser.session_id) ``` + +```go Go +package main + +import ( + "context" + "fmt" + + "github.com/kernel/kernel-go-sdk" +) + +func main() { + ctx := context.Background() + client := kernel.NewClient() + + browser, err := client.Browsers.New(ctx, kernel.BrowserNewParams{ + TimeoutSeconds: kernel.Int(300), + }) + if err != nil { + panic(err) + } + defer client.Browsers.DeleteByID(ctx, browser.SessionID) + fmt.Println("live view:", browser.BrowserLiveViewURL) + + res, err := client.Browsers.Playwright.Execute(ctx, browser.SessionID, kernel.BrowserPlaywrightExecuteParams{ + Code: ` + await page.goto('https://news.ycombinator.com'); + return await page.$$eval('.titleline > a', (as) => as.slice(0, 5).map((a) => a.textContent)); + `, + }) + if err != nil { + panic(err) + } + fmt.Println(res.Result) +} +``` Open `browser_live_view_url` while it runs and you'll watch the page load. @@ -128,11 +178,19 @@ Open `browser_live_view_url` while it runs and you'll watch the page load. Two things determine the shape of everything after this: which control surface you use, and where your loop runs. [How you drive the browser](/introduction/control) covers both. -From there: - -- Getting blocked? [Stealth](/browsers/bot-detection/overview) and [proxies](/proxies/overview). -- Behind a login? [Authentication](/auth/overview). -- Need to pay? [Payments](/browsers/payments). -- Worked examples: [cookbooks](/cookbooks). + + + Stealth and proxies to get past bot detection. + + + Fill credentials from a vault, or let managed auth log in. + + + Complete checkouts without exposing card data to your agent. + + + End-to-end recipes you can clone and run. + + From 1ed6ccb977e24cd69f120f5ee2480e39bd066cba Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:19:36 +0000 Subject: [PATCH 49/78] Reorder quickstart options and give both paths matching steps Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index 7300d614..f35f17c1 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -4,13 +4,15 @@ description: "Hand setup to your coding agent, or create your first cloud browse mode: "wide" --- +import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; + Pick the way in that matches how you work. The first two are walked through on this page; the rest open their own guides. Copy one prompt into Cursor, Claude Code, or Codex and let it set up KERNEL. - + Create and drive your first browser in TypeScript, Python, or Go. @@ -19,6 +21,9 @@ Pick the way in that matches how you work. The first two are walked through on t Give any MCP client, like Claude or Cursor, a cloud browser as a set of tools. + + Call KERNEL over HTTP from any language, starting with creating a browser. + Teach your coding agent the KERNEL CLI, SDKs, and auth with one install. @@ -28,18 +33,15 @@ Pick the way in that matches how you work. The first two are walked through on t Clone an end-to-end recipe and adapt it to your task. - - Call KERNEL over HTTP from any language, starting with creating a browser. - ## Path 1: hand it to your coding agent -Copy this prompt into Cursor, Claude Code, Codex, or whatever you use. It installs the KERNEL CLI, signs you in, and opens a live view of a KERNEL browser that you or your agent can drive. - -import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; - - + + +
+ +
1. Checks for the KERNEL CLI and installs or upgrades it with Homebrew. @@ -48,8 +50,18 @@ import { CopyPromptButton } from '/snippets/copy-prompt-button.jsx'; It stops and asks you for help if any step fails. +
+ +Use Cursor, Claude Code, Codex, or any agent that can run terminal commands. Sign in when it opens the KERNEL login page. + + + You're done when your agent opens a live view of a KERNEL browser. From there, ask it to do a task on a site you care about. + +
+ +If your agent reads documentation on its own, point it at these: | Surface | What it's for | @@ -62,7 +74,7 @@ You're done when your agent opens a live view of a KERNEL browser. From there, a | [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | -## Path 2: write it yourself +## Path 2: write it yourself with an SDK From d5f8553abf6ecb88de4b91686c08f717e4a377dd Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:21:19 +0000 Subject: [PATCH 50/78] Reorder quickstart options Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index f35f17c1..b6c957a9 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -15,15 +15,15 @@ Pick the way in that matches how you work. The first two are walked through on t Create and drive your first browser in TypeScript, Python, or Go. + + Call KERNEL over HTTP from any language, starting with creating a browser. + Create, drive, and debug browsers from a terminal. Give any MCP client, like Claude or Cursor, a cloud browser as a set of tools. - - Call KERNEL over HTTP from any language, starting with creating a browser. - Teach your coding agent the KERNEL CLI, SDKs, and auth with one install. From 8cd6db53fbd14d68616a0737ca680b9549b4ab51 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:21:55 +0000 Subject: [PATCH 51/78] Return quickstart path 1 to a description, button, and stacked accordions Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index b6c957a9..f4b8f83b 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -37,12 +37,13 @@ Pick the way in that matches how you work. The first two are walked through on t ## Path 1: hand it to your coding agent - - -
+Copy this prompt into Cursor, Claude Code, Codex, or any agent that can run terminal commands. It installs the KERNEL CLI, signs you in, and opens a live view of a KERNEL browser that you or your agent can drive. From there, ask your agent to do a task on a site you care about. + +
+ 1. Checks for the KERNEL CLI and installs or upgrades it with Homebrew. 2. Checks whether you're signed in, and if not, runs `kernel login` and waits for you to finish signing in. @@ -50,19 +51,6 @@ Pick the way in that matches how you work. The first two are walked through on t It stops and asks you for help if any step fails. - - - -Use Cursor, Claude Code, Codex, or any agent that can run terminal commands. Sign in when it opens the KERNEL login page. - - - -You're done when your agent opens a live view of a KERNEL browser. From there, ask it to do a task on a site you care about. - - - -If your agent reads documentation on its own, point it at these: - | Surface | What it's for | | --- | --- | @@ -73,6 +61,7 @@ If your agent reads documentation on its own, point it at these: | [MCP server](/reference/mcp-server) | KERNEL's API as tools, for agents that call tools instead of writing code. | | [OpenAPI 3.1](https://www.kernel.sh/openapi.json) | For generating a client or calling the REST API directly. | + ## Path 2: write it yourself with an SDK From 41157ddba723c98904dd525fd81fb2e2634eec21 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:24:03 +0000 Subject: [PATCH 52/78] Move quickstart next steps out of path 2 to the end of the page Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index f4b8f83b..be547f37 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -175,8 +175,10 @@ func main() { Open `browser_live_view_url` while it runs and you'll watch the page load. + + +## Next steps - Two things determine the shape of everything after this: which control surface you use, and where your loop runs. [How you drive the browser](/introduction/control) covers both. @@ -193,5 +195,3 @@ Two things determine the shape of everything after this: which control surface y End-to-end recipes you can clone and run. - - From afbc1259145a2cf42051cb8a7f57bc342b223e10 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:24:56 +0000 Subject: [PATCH 53/78] Widen the quickstart copy prompt button and reorder agent names Co-Authored-By: Claude Opus 5.5 --- start/quickstart.mdx | 4 ++-- style.css | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/start/quickstart.mdx b/start/quickstart.mdx index be547f37..4571501a 100644 --- a/start/quickstart.mdx +++ b/start/quickstart.mdx @@ -37,9 +37,9 @@ Pick the way in that matches how you work. The first two are walked through on t ## Path 1: hand it to your coding agent -Copy this prompt into Cursor, Claude Code, Codex, or any agent that can run terminal commands. It installs the KERNEL CLI, signs you in, and opens a live view of a KERNEL browser that you or your agent can drive. From there, ask your agent to do a task on a site you care about. +Copy this prompt into Claude Code, Codex, Cursor, or any agent that can run terminal commands. It installs the KERNEL CLI, signs you in, and opens a live view of a KERNEL browser that you or your agent can drive. From there, ask your agent to do a task on a site you care about. -
+
diff --git a/style.css b/style.css index 9b8af45f..19f5385a 100644 --- a/style.css +++ b/style.css @@ -347,3 +347,8 @@ html.dark #navigation-items img[src*="/images/integration-icons/"] { html.dark .cookbook-tag { color: rgba(237, 238, 240, 0.7); } + +.copy-prompt-full button { + width: 100% !important; + max-width: 100% !important; +} From 6bf324f0441fd7cfb6bd8150c726deb11c36e476 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:28:12 +0000 Subject: [PATCH 54/78] Reorder cookbook common patterns and group harness recipes by type Co-Authored-By: Claude Opus 5.5 --- cookbooks.mdx | 117 ++++++++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 51 deletions(-) diff --git a/cookbooks.mdx b/cookbooks.mdx index 6d0aaf33..a98e76d4 100644 --- a/cookbooks.mdx +++ b/cookbooks.mdx @@ -22,6 +22,10 @@ import { CookbookSearch } from '/snippets/cookbook-search.jsx';
common patterns
Collect credentials from a human, then let your agent fill the form. + +
common patterns
+ Use WebMCP for supported page actions and Browser REPL helpers for everything else. +
common patterns
Enable Payments in a Browser Agent. @@ -30,85 +34,96 @@ import { CookbookSearch } from '/snippets/cookbook-search.jsx';
common patterns
Hold an agent while Kernel's captcha solver works, and tell it what actually happened.
- -
common patterns
- Use WebMCP for supported page actions and Browser REPL helpers for everything else. -
-## Harnesses & models +## Computer use models + +
computer use models
+ Minimal implementation of Anthropic's computer use loop. +
+ +
computer use models
+ Computer use agent with Google's Gemini 2.5 and Stagehand. +
+ +
computer use models
+ Run the Browser Use bu-1.0 model on KERNEL browser infrastructure. +
-
harnesses & models
+
computer use models
Run a browser use loop with Jev System One.
- -
harnesses & models
- Browser automation with the Vercel AI SDK and KERNEL's Playwright execution API. -
-
harnesses & models
+
computer use models
RL training for computer use agents, using Tinker.
+
+ +## Agent and automation frameworks + + + +
frameworks
+ Browser automation with the Vercel AI SDK and KERNEL's Playwright execution API. +
-
harnesses & models
+
frameworks
Human-in-the-loop web task assistant with memory, built on Mastra.
- -
harnesses & models
- Host a Jev browser use agent on Val Town. + +
frameworks
+ Run agentic and deterministic end-to-end checks in a KERNEL browser with e2e. +
+ +
frameworks
+ Vibium browser automation over WebDriver BiDi.
+
+ +## Hosted agents + + -
harnesses & models
+
hosted agents
Run parallel computer-use agent swarms, with API keys secured via Vaults.
- -
harnesses & models
- QA your PR previews with Claude computer use on Modal, recorded with Replays. -
- -
harnesses & models
- Run the Browser Use bu-1.0 model on KERNEL browser infrastructure. -
-
harnesses & models
+
hosted agents
Build a browser agent with eve and KERNEL managed auth.
- -
harnesses & models
- Computer use agent with Google's Gemini 2.5 and Stagehand. + +
hosted agents
+ Build a Link and Eve agent that browses with KERNEL and uses a Link wallet for approved purchases.
- -
harnesses & models
- Minimal implementation of Anthropic's computer use loop. + +
hosted agents
+ Give Vercel foreman access to a KERNEL browser for QA.
- -
harnesses & models
- Vibium browser automation over WebDriver BiDi. + +
hosted agents
+ Run Vercel's fx agent inside a KERNEL browser VM, co-located with the browser it drives. +
+
+ +## Sandboxes and platforms + + + +
sandboxes & platforms
+ QA your PR previews with Claude computer use on Modal, recorded with Replays.
-
harnesses & models
+
sandboxes & platforms
Scrape JS-rendered pages behind a login, on Modal with a KERNEL browser.
- -
harnesses & models
- Give Vercel foreman access to a KERNEL browser for QA. -
-
harnesses & models
+
sandboxes & platforms
Connect e2b sandboxes with KERNEL browsers.
- -
harnesses & models
- Run Vercel's fx agent inside a KERNEL browser VM, co-located with the browser it drives. -
- -
harnesses & models
- Run agentic and deterministic end-to-end checks in a KERNEL browser with e2e. -
- -
harnesses & models
- Build a Link and Eve agent that browses with KERNEL and uses a Link wallet for approved purchases. + +
sandboxes & platforms
+ Host a Jev browser use agent on Val Town.
From 18abd8367810d4e9999b40fd5bd529a7f53fd2a6 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:33:21 +0000 Subject: [PATCH 55/78] Rename the profile comparison skill card and add a generic plugin install note Co-Authored-By: Claude Opus 5.5 --- skills/overview.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/skills/overview.mdx b/skills/overview.mdx index 18fb4d5f..4cd8828f 100644 --- a/skills/overview.mdx +++ b/skills/overview.mdx @@ -11,6 +11,8 @@ Skills give your coding agent Kernel know-how it keeps across sessions, so it do npx skills add kernel/skills ``` +This works with any coding agent. To install KERNEL as your agent's native plugin instead, ask your agent to follow the install steps for itself in [kernel/skills](https://github.com/kernel/skills). + If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It covers browsers, browser pools, profiles, proxies, replays, extensions, file system operations, process execution, computer controls, managed auth, and app deployment. ## Most installed @@ -48,7 +50,7 @@ If you're building an agent that needs to access the internet, start with the Ke Best practices for using browser-use's browser-harness with Kernel over CDP. - + Compare two profile snapshots to find state differences that explain an issue. From 13c09f2a523154eb57f3ad0fad6ee41b3251d978 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:35:20 +0000 Subject: [PATCH 56/78] Order Kernel CLI skill topics by relevance Co-Authored-By: Claude Opus 5.5 --- skills/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/overview.mdx b/skills/overview.mdx index 4cd8828f..3d3f25ce 100644 --- a/skills/overview.mdx +++ b/skills/overview.mdx @@ -13,7 +13,7 @@ npx skills add kernel/skills This works with any coding agent. To install KERNEL as your agent's native plugin instead, ask your agent to follow the install steps for itself in [kernel/skills](https://github.com/kernel/skills). -If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It covers browsers, browser pools, profiles, proxies, replays, extensions, file system operations, process execution, computer controls, managed auth, and app deployment. +If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It covers browsers, Playwright execution and the Browser REPL, computer controls, profiles, proxies, managed auth, browser pools, replays, extensions, process execution, file system operations, and app deployment. ## Most installed From caf343ee0699dc7cc5d03be69292c9f3bb17ce5d Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:36:48 +0000 Subject: [PATCH 57/78] Remove the Kernel CLI skill pointer from Agent Skills Co-Authored-By: Claude Opus 5.5 --- skills/overview.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/skills/overview.mdx b/skills/overview.mdx index 3d3f25ce..97b89c24 100644 --- a/skills/overview.mdx +++ b/skills/overview.mdx @@ -13,8 +13,6 @@ npx skills add kernel/skills This works with any coding agent. To install KERNEL as your agent's native plugin instead, ask your agent to follow the install steps for itself in [kernel/skills](https://github.com/kernel/skills). -If you're building an agent that needs to access the internet, start with the Kernel CLI skill. It covers browsers, Playwright execution and the Browser REPL, computer controls, profiles, proxies, managed auth, browser pools, replays, extensions, process execution, file system operations, and app deployment. - ## Most installed From efa9be3f5eacfad0101399c5d53de29531df610c Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:40:43 +0000 Subject: [PATCH 58/78] Add starter Codex and OpenAI Agents SDK integration pages Add Codex to agents you already use and the OpenAI Agents SDK to build your own agent, with the Claude Agent SDK listed first. Co-Authored-By: Claude Opus 5.5 --- integrations/openai/agents-sdk.mdx | 50 ++++++++++++++++++++++++++++++ integrations/openai/codex.mdx | 35 +++++++++++++++++++++ integrations/overview.mdx | 12 +++++-- 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 integrations/openai/agents-sdk.mdx create mode 100644 integrations/openai/codex.mdx diff --git a/integrations/openai/agents-sdk.mdx b/integrations/openai/agents-sdk.mdx new file mode 100644 index 00000000..0e2351ee --- /dev/null +++ b/integrations/openai/agents-sdk.mdx @@ -0,0 +1,50 @@ +--- +title: "OpenAI Agents SDK" +description: "Give agents built with the OpenAI Agents SDK a KERNEL browser" +--- + + +This is a starter guide. A full walkthrough is coming. + + +The [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/) is OpenAI's framework for building agents. The quickest way to give an agent a KERNEL browser is to connect it to the [KERNEL MCP server](/reference/mcp-server), which exposes browser creation, Playwright execution, screenshots, and computer controls as tools. + +## Install + +```bash +pip install openai-agents +``` + +Set `OPENAI_API_KEY` and `KERNEL_API_KEY` in your environment. + +## Connect an agent to KERNEL + +```python Python +import asyncio +import os + +from agents import Agent, Runner +from agents.mcp import MCPServerStreamableHttp + + +async def main(): + async with MCPServerStreamableHttp( + name="kernel", + params={ + "url": "https://mcp.onkernel.com/mcp", + "headers": {"Authorization": f"Bearer {os.environ['KERNEL_API_KEY']}"}, + }, + ) as kernel: + agent = Agent( + name="Browser agent", + instructions="Use the KERNEL tools to create a browser, do the task, then delete the browser.", + mcp_servers=[kernel], + ) + result = await Runner.run(agent, "Go to news.ycombinator.com and list the top 5 story titles.") + print(result.final_output) + + +asyncio.run(main()) +``` + +The MCP server accepts your KERNEL API key as a bearer token. See [MCP authentication](/reference/mcp-server/authentication). diff --git a/integrations/openai/codex.mdx b/integrations/openai/codex.mdx new file mode 100644 index 00000000..18bdcc51 --- /dev/null +++ b/integrations/openai/codex.mdx @@ -0,0 +1,35 @@ +--- +title: "Codex" +description: "Give OpenAI's Codex a KERNEL browser" +--- + + +This is a starter guide. A full walkthrough is coming. + + +[Codex](https://developers.openai.com/codex) is OpenAI's coding agent. You can give it KERNEL know-how with the KERNEL plugin, and KERNEL browsers as tools with the KERNEL MCP server. Use either or both. + +## Install the KERNEL plugin + +The plugin adds [Agent Skills](/skills/overview) for the KERNEL CLI and SDKs, so Codex knows how to create and drive browsers. + +```bash +codex plugin marketplace add kernel/skills +codex plugin add kernel-cli@kernel +codex plugin add kernel-sdks@kernel +``` + +You can also find the KERNEL plugins under **Plugins** in the ChatGPT desktop app after adding the marketplace. + +## Connect the MCP server + +The [KERNEL MCP server](/reference/mcp-server) gives Codex tools to create browsers, run Playwright code, take screenshots, and more. + +```bash +codex mcp add kernel --url https://mcp.onkernel.com/mcp +codex mcp login kernel +``` + +`codex mcp login` opens your browser so you can authorize access to your KERNEL account. To use an API key instead, see [MCP authentication](/reference/mcp-server/authentication). + +Start a Codex session and run `/mcp` to confirm the KERNEL tools are available. diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 46011bd5..a187777d 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -17,6 +17,9 @@ Give a finished agent or coding tool a Kernel browser, usually through MCP, a pl Give Claude Code and Claude Desktop a Kernel browser. + + Give OpenAI's Codex a Kernel browser with the Kernel plugin and MCP server. + Run Anthropic's hosted agent harness against Kernel browsers. @@ -42,15 +45,18 @@ Give a finished agent or coding tool a Kernel browser, usually through MCP, a pl Agent frameworks for writing the loop yourself, with a Kernel browser as one of its tools. - - Run Browser Use agents on Kernel browsers. - Build Claude agents that drive Kernel browsers with playwright execution. + + Connect agents built with the OpenAI Agents SDK to Kernel browsers over MCP. + Give AI SDK agents Kernel browser tools. + + Run Browser Use agents on Kernel browsers. + ## Computer use models From acf05561f3f8a9195f4ba6bf1153a12783c7bc03 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:43:05 +0000 Subject: [PATCH 59/78] Reorder integration cards and credit Web Bot Auth to Cloudflare Co-Authored-By: Claude Opus 5.5 --- integrations/overview.mdx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/integrations/overview.mdx b/integrations/overview.mdx index a187777d..78e0f404 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -29,12 +29,12 @@ Give a finished agent or coding tool a Kernel browser, usually through MCP, a pl Give your Vercel Eve agent a Kernel browser. - - Give your Foreman agent a Kernel browser. - Give Vercel's fx coding agent a Kernel browser over MCP. + + Give your Foreman agent a Kernel browser. + Run Hermes Agent browser tools on Kernel browsers. @@ -92,12 +92,12 @@ Drive the page itself — navigate, click, fill, extract — against a Kernel br Run Playwright code inside the browser's VM, or connect over CDP. - - Mix code and natural language browser automation on Kernel. - Vercel's browser automation CLI for AI agents. + + Mix code and natural language browser automation on Kernel. + Drive Kernel browsers with a WebDriver BiDi automation framework. @@ -111,17 +111,14 @@ Give the browser what it needs to log in, prove who it is, and check out, withou Use credentials from your 1Password vaults. - - Give your agents a verifiable identity that sites can check. - Approve a one-use payment credential for a browser checkout. Approve browser checkouts against an enrolled payment method. - - How KERNEL's native wallet integrations work. + + Sign your agent's requests with Cloudflare's Web Bot Auth, so participating sites can verify its identity. From 0a727389b80d2c8ab01bd6a84bdfd38cd76e13aa Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:45:56 +0000 Subject: [PATCH 60/78] Move Codex after Claude Managed Agents on integrations Co-Authored-By: Claude Opus 5.5 --- integrations/overview.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 78e0f404..9d34274f 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -17,12 +17,12 @@ Give a finished agent or coding tool a Kernel browser, usually through MCP, a pl Give Claude Code and Claude Desktop a Kernel browser. - - Give OpenAI's Codex a Kernel browser with the Kernel plugin and MCP server. - Run Anthropic's hosted agent harness against Kernel browsers. + + Give OpenAI's Codex a Kernel browser with the Kernel plugin and MCP server. + Give Replit Agent a Kernel browser. From 03a6889998bc5571addc517045d0e7db0aca9c40 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:47:41 +0000 Subject: [PATCH 61/78] Add overview pages for Configure and Manage Every how it works group now opens with an overview. Why KERNEL links to the new pages. Co-Authored-By: Claude Opus 5.5 --- docs.json | 2 ++ introduction/configure.mdx | 35 +++++++++++++++++++++++++++++++++++ introduction/manage.mdx | 26 ++++++++++++++++++++++++++ overview/why-kernel.mdx | 2 +- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 introduction/configure.mdx create mode 100644 introduction/manage.mdx diff --git a/docs.json b/docs.json index 546bd768..52c7a9a7 100644 --- a/docs.json +++ b/docs.json @@ -135,6 +135,7 @@ { "group": "Configure", "pages": [ + "introduction/configure", { "group": "Browser Settings", "pages": [ @@ -268,6 +269,7 @@ { "group": "Manage", "pages": [ + "introduction/manage", "info/projects", "info/api-keys", "info/audit-logs", diff --git a/introduction/configure.mdx b/introduction/configure.mdx new file mode 100644 index 00000000..c4cbdcb5 --- /dev/null +++ b/introduction/configure.mdx @@ -0,0 +1,35 @@ +--- +title: "Configure" +sidebarTitle: "Overview" +description: "Set up the browser your agent runs in, and what it carries onto a site" +mode: "wide" +--- + +Configuration decides what your agent starts with: how the browser looks to a site, which network it comes from, what state and credentials it carries, and how it pays. Most settings are passed when you create a browser. Profiles, proxies, vaults, and managed auth connections are created once and reused across browsers. + + + + Create a browser and pick its shape: headful or headless, viewport, region, GPU, extensions, timeouts, and policies. + + + Anti-detection defaults, stealth mode, CAPTCHA handling, and Web Bot Auth. + + + Route traffic through datacenter, ISP, residential, or mobile IPs, or bring your own. + + + Save cookies, storage, and logins from one session and load them into the next. + + + Store credentials and payment items that a browser fills into a page without your agent reading them. + + + Fill logins from a vault, or let managed auth handle the login and keep the session alive. + + + Let agents complete checkouts through a wallet without handling raw card details. + + + Get browser and proxy settings that have already worked on the site you're automating. + + diff --git a/introduction/manage.mdx b/introduction/manage.mdx new file mode 100644 index 00000000..e155d467 --- /dev/null +++ b/introduction/manage.mdx @@ -0,0 +1,26 @@ +--- +title: "Manage" +sidebarTitle: "Overview" +description: "Organize, secure, and govern how your team uses KERNEL" +mode: "wide" +--- + +Management settings apply across your organization rather than to a single browser: how resources are split between teams and environments, who and what can call the API, what happened and when, and how much you spend. + + + + Separate environments, teams, or customers, each with its own browsers, profiles, credentials, and limits. + + + Create, scope, rotate, and delete the keys your code and agents use. + + + A year of API request history across your organization, searchable and exportable on Start-Up and Enterprise. + + + The domains and ports to allow if your network restricts outbound traffic. + + + Set a monthly spending guardrail for your organization, a project, or both. + + diff --git a/overview/why-kernel.mdx b/overview/why-kernel.mdx index 58e58a3e..ebb0da1c 100644 --- a/overview/why-kernel.mdx +++ b/overview/why-kernel.mdx @@ -13,7 +13,7 @@ Pair it with the agent framework you like best. Your framework runs the loop and - **Each browser is its own VM.** Every browser runs isolated at the hypervisor, with its own kernel and filesystem, instead of sharing a host with other tenants. That's what makes a 30ms start and strong isolation possible at the same time, and it's why [file I/O](/browsers/file-io), [shell access](/browsers/ssh), and GPU access are safe to use inside a session. - **Platform primitives, with managed services built on them.** [Profiles](/browsers/profiles) keep browser state between sessions, [vaults](/vaults/overview) hold credentials and payment items, and [browser pools](/browsers/pools) keep configured browsers ready. Managed services such as [managed auth](/auth/overview), [payments](/browsers/payments), [stealth](/browsers/bot-detection/overview), and the [code execution platform](/apps/develop) build on them. -To put these to work, the how it works guides walk through each stage of a browser's life: [configure](/introduction/create) it, [control](/introduction/control) it, [scale](/introduction/scale) it, [observe](/introduction/observe) it, and [manage](/info/projects) it across your team. +To put these to work, the how it works guides walk through each stage of a browser's life: [configure](/introduction/configure) it, [control](/introduction/control) it, [scale](/introduction/scale) it, [observe](/introduction/observe) it, and [manage](/introduction/manage) it across your team. ## Why not just run Chrome yourself? From cb21c5021d69e98ac0a7ffe35ed4ac1756a85c73 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:48:07 +0000 Subject: [PATCH 62/78] Move Agent Skills and Integrations above Cookbooks in the sidebar Co-Authored-By: Claude Opus 5.5 --- docs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs.json b/docs.json index 52c7a9a7..fd8f7fef 100644 --- a/docs.json +++ b/docs.json @@ -124,9 +124,9 @@ "group": "Start building", "pages": [ "start/quickstart", - "cookbooks", "skills/overview", - "integrations/overview" + "integrations/overview", + "cookbooks" ] }, { From bcbd67483f53672f202aa705be3d23a3459f70f2 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:55:32 +0000 Subject: [PATCH 63/78] Fold browser settings into the Configure overview The overview now covers creating a browser, browser types, viewport, standby, and timeouts, and links the less common settings. The browser settings pages leave the sidebar so Configure lists the features that matter most. Co-Authored-By: Claude Opus 5.5 --- docs.json | 15 ------ introduction/configure.mdx | 98 ++++++++++++++++++++++++++++++++++++-- overview/products.mdx | 2 +- 3 files changed, 94 insertions(+), 21 deletions(-) diff --git a/docs.json b/docs.json index fd8f7fef..b3e08715 100644 --- a/docs.json +++ b/docs.json @@ -136,21 +136,6 @@ "group": "Configure", "pages": [ "introduction/configure", - { - "group": "Browser Settings", - "pages": [ - "introduction/create", - "browsers/termination", - "browsers/standby", - "browsers/headless", - "browsers/viewport", - "browsers/regions", - "browsers/gpu-acceleration", - "browsers/extensions", - "browsers/chrome-policies", - "browsers/private-networking" - ] - }, { "group": "Stealth", "pages": [ diff --git a/introduction/configure.mdx b/introduction/configure.mdx index c4cbdcb5..05138234 100644 --- a/introduction/configure.mdx +++ b/introduction/configure.mdx @@ -1,16 +1,104 @@ --- title: "Configure" sidebarTitle: "Overview" -description: "Set up the browser your agent runs in, and what it carries onto a site" +description: "Create a browser, pick its shape, and choose what it carries onto a site" mode: "wide" --- -Configuration decides what your agent starts with: how the browser looks to a site, which network it comes from, what state and credentials it carries, and how it pays. Most settings are passed when you create a browser. Profiles, proxies, vaults, and managed auth connections are created once and reused across browsers. +A KERNEL browser works with no configuration: create one and drive it. This page covers the settings most agents touch at creation time. The rest of Configure covers the features that decide whether an agent gets through a real site: stealth, proxies, profiles, vaults, authentication, and payments. + +## Create a browser + + +```typescript TypeScript +import Kernel from '@onkernel/sdk'; + +const kernel = new Kernel(); + +const browser = await kernel.browsers.create(); +console.log(browser.session_id, browser.browser_live_view_url); +``` + +```python Python +from kernel import Kernel + +kernel = Kernel() + +browser = kernel.browsers.create() +print(browser.session_id, browser.browser_live_view_url) +``` + +```go Go +package main + +import ( + "context" + "fmt" + + "github.com/kernel/kernel-go-sdk" +) + +func main() { + ctx := context.Background() + client := kernel.NewClient() + + browser, err := client.Browsers.New(ctx, kernel.BrowserNewParams{}) + if err != nil { + panic(err) + } + fmt.Println(browser.SessionID, browser.BrowserLiveViewURL) +} +``` + +```bash CLI +kernel browsers create +``` + + +The response includes everything you need to drive the browser: `session_id`, `cdp_ws_url`, `webdriver_ws_url`, and `browser_live_view_url`. See [create a browser](/introduction/create) for the full walkthrough, including creating from a [browser pool](/browsers/pools). + +## Pick a browser type + +| Type | When to use it | How to set it | +| --- | --- | --- | +| **Headful** (default) | Agents on real sites. It has a real display, so [live view](/browsers/live-view) and [replays](/browsers/replays) work and bot detectors see a normal browser. 8 GB of memory by default. | Nothing to set | +| **[Headless](/browsers/headless)** | Short-lived or highly concurrent jobs that don't need to be watched. Lighter, at 1 GB by default, but some bot detectors notice it. | `headless: true` | +| **[GPU-accelerated](/browsers/gpu-acceleration)** | WebGL, video, and canvas-heavy sites. Headful only, doesn't support standby, and has its own usage rate. | `gpu: true` | + +## Set common options + + +```typescript TypeScript +const browser = await kernel.browsers.create({ + viewport: { width: 1280, height: 800 }, + timeout_seconds: 300, +}); +``` + +```python Python +browser = kernel.browsers.create( + viewport={"width": 1280, "height": 800}, + timeout_seconds=300, +) +``` + + +- **[Viewport](/browsers/viewport):** defaults to 1920x1080 at 25Hz. A custom viewport restarts Chromium on creation, so use a [browser pool](/browsers/pools) if you need it to be instant. +- **[Standby](/browsers/standby):** after 5 seconds with no CDP, WebDriver, live view, or computer controls activity, a browser goes into standby. It keeps its state and stops accruing usage cost until something reconnects. +- **[Termination and timeouts](/browsers/termination):** `timeout_seconds` sets how long a browser can sit in standby before KERNEL deletes it. It defaults to 60 seconds and can be up to 72 hours. Delete browsers explicitly when you're done; Playwright's `browser.close()` doesn't delete them. + +## More browser settings + +Most agents never need these, but they're there when you do: + +- **[Regions](/browsers/regions):** run browsers in `us-east`, `eu-west`, or `ap-southeast`, closer to your code and your users. +- **[Extensions](/browsers/extensions):** load unpacked Chrome extensions into a browser. +- **[Chrome policies](/browsers/chrome-policies):** apply Chrome enterprise policies, such as startup pages and bookmarks. +- **[Private networking](/browsers/private-networking):** reach services behind a VPN or tunnel from inside the browser session. + +## What to configure next - - Create a browser and pick its shape: headful or headless, viewport, region, GPU, extensions, timeouts, and policies. - Anti-detection defaults, stealth mode, CAPTCHA handling, and Web Bot Auth. diff --git a/overview/products.mdx b/overview/products.mdx index 39a94268..9ff34915 100644 --- a/overview/products.mdx +++ b/overview/products.mdx @@ -5,7 +5,7 @@ mode: "wide" --- - + Headful by default, with headless and GPU-accelerated options. From 17dc197918109ab428e1de8842570b8572ea654d Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:11:28 +0000 Subject: [PATCH 64/78] Clarify Configure feature sections - Give the stealth, proxies, and vaults overviews real page titles - Use sentence case for headings across Configure - Fold the hCaptcha beta into stealth mode and redirect the old page - Move Bots and agents under Enterprise - Compare credential sources at the top of the vaults overview - Fix Link by Stripe and AgentCard page titles Co-Authored-By: Claude Opus 5.5 --- auth/configuration.mdx | 14 +++++++------- auth/credentials.mdx | 2 +- auth/hosted-ui.mdx | 12 ++++++------ auth/react.mdx | 4 ++-- browsers/bot-detection/hcaptcha.mdx | 17 ----------------- browsers/bot-detection/overview.mdx | 25 +++++++++++++------------ browsers/bot-detection/stealth.mdx | 10 +++++++--- changelog.mdx | 2 +- docs.json | 6 +++--- integrations/wallets/agentcard.mdx | 2 +- integrations/wallets/stripe-link.mdx | 2 +- proxies/custom.mdx | 2 +- proxies/datacenter.mdx | 4 ++-- proxies/isp.mdx | 2 +- proxies/overview.mdx | 5 +++-- proxies/residential.mdx | 8 ++++---- vaults/overview.mdx | 16 ++++++++++++++-- 17 files changed, 67 insertions(+), 66 deletions(-) delete mode 100644 browsers/bot-detection/hcaptcha.mdx diff --git a/auth/configuration.mdx b/auth/configuration.mdx index 2ce788d9..efb64fc1 100644 --- a/auth/configuration.mdx +++ b/auth/configuration.mdx @@ -6,7 +6,7 @@ description: "Shared options for managed auth connections, regardless of integra Managed Auth connections use the same configuration whether you collect credentials through the [Hosted UI](/auth/hosted-ui), the [React component](/auth/react), or the [programmatic flow](/auth/programmatic). These options apply to the initial login, every background health check, and each automatic reauthentication attempt. -## Credentials and Auto-Reauth +## Credentials and auto-reauth by default, KERNEL saves durable credential fields after a successful login. these can support eligible automatic reauthentication attempts, including totp codes generated from an available secret. submitted one-time codes aren't saved and don't provide access to future codes. if a later login requires user input, your application must start a new interactive login. @@ -60,7 +60,7 @@ Automatic reauthentication requires a previously successful login and saved cred If Kernel can't complete an automatic attempt, the connection transitions to `NEEDS_AUTH` so you can start a new login. -## Custom Login URL +## Custom login URL If the site's login page isn't at the default location, specify it when creating the connection: @@ -96,7 +96,7 @@ _ = auth ``` -## Browser Region +## Browser region Set `browser.region` to choose where Managed Auth runs the connection's initial login, health checks, and automatic reauthentication. Choose from `us-east`, `eu-west`, and `ap-southeast`. Region selection is available on [Start-Up and Enterprise plans](/info/pricing); omitted values default to `us-east`. @@ -167,7 +167,7 @@ _ = login Browser placement and proxy location are independent. `browser.region` chooses where the browser runs; the connection's [proxy](/proxies/overview) controls the exit IP that websites see. Regional browsers don't provide a data residency guarantee. See [Regional Browsers](/browsers/regions) for storage and processing details. -## SSO/OAuth Support +## SSO/OAuth support Managed Auth supports common "Sign in with Google/GitHub/Microsoft" flows. The user completes the OAuth flow with the provider, and Kernel saves the authenticated session to the profile. Automatic reauthentication depends on the provider's login requirements. See [Can this connection auto-reauth?](/auth/connection-lifecycle#can-this-connection-auto-reauth) for how Kernel determines eligibility. @@ -207,7 +207,7 @@ _ = auth ``` -## Custom Proxy +## Custom proxy Pin the auth flow to a specific [proxy](/proxies/overview) so logins, health checks, and automatic re-authentications all egress through that proxy. This is useful for sites that allowlist IPs, geo-pin sessions, or treat IP changes as a fraud signal. @@ -327,7 +327,7 @@ _ = login ``` -## Record Sessions for Debugging +## Record sessions for debugging Set `record_session: true` to capture a [replay](/browsers/replays) of every browser session tied to the connection — initial logins, background health checks, and automatic re-authentications. The entire browser session is recorded. @@ -432,7 +432,7 @@ if managedAuth.PostLoginURL != "" { ``` -## Updating a Connection +## Updating a connection After creating a connection, you can update its configuration with `auth.connections.update`: diff --git a/auth/credentials.mdx b/auth/credentials.mdx index 2f253f3a..e5e0a933 100644 --- a/auth/credentials.mdx +++ b/auth/credentials.mdx @@ -304,7 +304,7 @@ _ = auth ``` -## Partial Credentials +## Partial credentials Credentials don't need to contain every field required by the login form. You can store what you have and collect the necessary fields from the user. `auth.connections.login()` pauses for missing values. diff --git a/auth/hosted-ui.mdx b/auth/hosted-ui.mdx index 5b510123..bcb0e6f8 100644 --- a/auth/hosted-ui.mdx +++ b/auth/hosted-ui.mdx @@ -12,7 +12,7 @@ Use the Hosted UI when: ## Getting started -### 1. Create a Connection +### 1. Create a connection A Managed Auth connection saves a domain's authentication state to a [profile](/browsers/profiles) so future browsers can reuse it. You can attach multiple auth connections to the same profile, one per domain. @@ -45,7 +45,7 @@ _ = auth ``` -### 2. Start a Login Session +### 2. Start a login session Start a Managed Auth Session to get the hosted login URL. @@ -67,7 +67,7 @@ _ = login ``` -### 3. Collect Credentials +### 3. Collect credentials Send the user to the hosted login page: @@ -152,7 +152,7 @@ if authenticated { The SSE stream closes automatically when the flow succeeds, fails, expires, or is canceled. The session expires after 20 minutes if not completed, and the flow times out after 10 minutes of waiting for user input. -### 5. Use the Profile +### 5. Use the profile Create browsers with the profile and navigate to the site. The browser loads the authentication state saved during login: @@ -203,7 +203,7 @@ Managed Auth Connections are generated using Kernel's [stealth](/browsers/bot-de -## Complete Example +## Complete example ```typescript TypeScript @@ -420,6 +420,6 @@ func main() { The hosted page redirects to whatever URL you pass. Only set these from your own trusted backend — never let an end user supply them directly. -## Connection Configuration +## Connection configuration Connection-level options — custom login URL, SSO/OAuth, custom proxy, session recording, post-login URL, and updates — apply equally to all integration flows and are documented in [Connection Configuration](/auth/configuration). diff --git a/auth/react.mdx b/auth/react.mdx index 6beaee7f..beecc847 100644 --- a/auth/react.mdx +++ b/auth/react.mdx @@ -19,7 +19,7 @@ bun add @onkernel/managed-auth-react ## Getting started -### 1. Start a Login Session on your backend +### 1. Start a login session on your backend Same as the Hosted UI flow — create a connection and start a login. The login response returns the connection `id` and a one-time `handoff_code`; those are the two values you'll hand to the component on the frontend. @@ -270,7 +270,7 @@ import { Wrap them in `` and `` to inherit the same styling/localization plumbing as the all-in-one component. -## Connection Configuration +## Connection configuration Connection-level options — custom login URL, SSO/OAuth, custom proxy, session recording, post-login URL, and updates — are set on `auth.connections.create` (or later via `auth.connections.update`) and apply equally regardless of which integration flow you use. See [Connection Configuration](/auth/configuration). diff --git a/browsers/bot-detection/hcaptcha.mdx b/browsers/bot-detection/hcaptcha.mdx deleted file mode 100644 index f1763b96..00000000 --- a/browsers/bot-detection/hcaptcha.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "hCaptcha" ---- - -Kernel's hCaptcha solver is a beta feature for teams that need help handling hCaptcha challenges in browser automations. - -When enabled for your organization, Kernel can attempt to solve supported hCaptcha challenges automatically from Kernel browsers. This is useful for permitted automation where hCaptcha appears as part of a normal browser workflow, such as QA, account operations, or user-authorized agent tasks. - - -The hCaptcha solver is in beta and isn't enabled for all organizations by default. - - -## Get access - -To use the hCaptcha solver, [contact Kernel support](https://www.kernel.sh/docs/info/support) and ask to have the hCaptcha beta enabled for your organization. - -Include the website or workflow you're testing, your expected volume, and whether you're already using [stealth mode](/browsers/bot-detection/stealth), [profiles](/browsers/profiles), or custom [proxies](/proxies/overview). This helps us confirm the right setup for your use case. diff --git a/browsers/bot-detection/overview.mdx b/browsers/bot-detection/overview.mdx index b55c1c98..52389080 100644 --- a/browsers/bot-detection/overview.mdx +++ b/browsers/bot-detection/overview.mdx @@ -1,5 +1,6 @@ --- -title: "Overview" +title: "Stealth" +sidebarTitle: "Overview" description: "Help your browser agents access websites with anti-detection defaults, stealth mode, proxies, and opt-in Web Bot Auth (WBA)." --- @@ -12,7 +13,7 @@ Under the hood, our browsers are optimized for realistic environments. **Everyth This guide explains how bot detection works at a high level, common pitfalls to avoid, and how Kernel's features can help your automations run reliably. -## How Bot Detection Works +## How bot detection works Most detection systems look for inconsistencies between how a real user's browser behaves and how an automated one does. Common giveaways include: - **IP addresses**: IPs from data centers (AWS, GCP, Azure) @@ -24,11 +25,11 @@ Most detection systems look for inconsistencies between how a real user's browse These systems are heuristic and probabilistic — small mismatches can still trigger blocks. The goal isn't to “beat” detection but rather emulate the real-world conditions of a normal browser session. -## Kernel Features That Help +## KERNEL features that help ### Anti-detection defaults Every Kernel browser launches with anti-detection chrome configuration applied. No setup required. -### [Stealth Mode](/browsers/bot-detection/stealth) +### [Stealth mode](/browsers/bot-detection/stealth) On top of the defaults, stealth mode adds a default ISP proxy and an automatic CAPTCHA solver. Both are opt-out so you can BYO proxy and/or CAPTCHA tooling. ### [Web Bot Auth (WBA)](/browsers/bot-detection/web-bot-auth) @@ -39,27 +40,27 @@ WBA lets your agent sign requests with a verifiable identity. Participating webs ### [Config Registry](/config-registry) Kernel recommended browser and proxy configurations for websites. -### [Configurable Proxies](/proxies/overview) +### [Configurable proxies](/proxies/overview) Bring your own proxy network or use Kernel's managed proxy pool (selectable down to ZIP-code level). If needed, use the same IP to reduce detection and allow for regional testing or QA. ### [Profiles](/browsers/profiles) Profiles persist cookies, local storage, and session data between runs. Combined with a fixed proxy, this mimics a returning user. We recommend using them to persist authenticated states and reduce CAPTCHAs. -### [Browser Pools](/browsers/pools) +### [Browser pools](/browsers/pools) Browser pools let you reuse browsers across multiple visits to the same website, which introduces consistency with respect to the IP address. Since IP addresses are one of the main components of fingerprinting used by modern bot detection systems, browser pools drastically increase your chances of avoiding detection. -### [Playwright Execution API](/browsers/playwright-execution) +### [Playwright execution API](/browsers/playwright-execution) Executes Playwright scripts in the same VM as the browser, ensuring headers, user-agent strings, and environment match. Kernel automatically applies Patchright to remove automation fingerprints, including headless indicators. -### [Computer Controls API](/browsers/computer-controls) +### [Computer controls API](/browsers/computer-controls) Controls the browser without using the Chrome DevTools Protocol (CDP), which can reduce bot detection signals. Emulates native keyboard and mouse input directly at the OS level and includes human-like [bezier curves](/browsers/computer-controls#move-the-mouse) by default. -### [GPU Acceleration](/browsers/gpu-acceleration) +### [GPU acceleration](/browsers/gpu-acceleration) Many detection systems fingerprint canvas and WebGL rendering output and cross-check it against the claimed GPU. Software-rendered browsers produce pixel hashes that don't match any real consumer GPU, which is a strong bot signal on sites with rendering-based fingerprinting. GPU-enabled Kernel browsers render through real hardware, producing output consistent with a normal user's device. -## Getting Started +## Getting started Before you start automating your workflow, we recommend that you manually test your website to understand how it behaves with Kernel's browsers. Here's how to do that: @@ -73,7 +74,7 @@ Before you start automating your workflow, we recommend that you manually test y Once you have a stable baseline, replicate those conditions in your automations. -## Recommended Practices +## Recommended practices | Category | Recommendation | |-----------|----------------| @@ -88,7 +89,7 @@ Once you have a stable baseline, replicate those conditions in your automations. | **Network Identity** | Use stable IP addresses, especially if logging in. See [Choosing a proxy type](#choosing-a-proxy-type) below. | | **Extensions** | Use the [Extensions API](/browsers/extensions) carefully — each adds its own fingerprint, which can be detected. | -## Choosing a Proxy Type +## Choosing a proxy type IP address is one of the strongest signals bot detection systems use. Kernel offers several [proxy types](/proxies/overview), each with different trade-offs for detection avoidance. diff --git a/browsers/bot-detection/stealth.mdx b/browsers/bot-detection/stealth.mdx index 23fefebf..2da6e143 100644 --- a/browsers/bot-detection/stealth.mdx +++ b/browsers/bot-detection/stealth.mdx @@ -108,20 +108,24 @@ _ = kernelBrowser If you're looking for proxy-level configuration with Kernel browsers, see [Proxies](/proxies/overview). -## CAPTCHA Handling Behavior +## CAPTCHA handling behavior Below are tips for working with Kernel's Stealth Mode auto-CAPTCHA solver across different challenge types and automation frameworks. -### Anthropic Computer Use +### Anthropic computer use Anthropic Computer Use stops when it encounters a CAPTCHA. Use Kernel's auto-CAPTCHA solver by adding this to your prompt: `"If you see a CAPTCHA or similar test, just wait for it to get solved automatically by the browser."` -### Cloudflare Challenge +### Cloudflare challenge When encountering a Cloudflare challenge, our auto-CAPTCHA solver will attempt to handle it. Once the "Ready" message appears on the screen, continue with your intended browser actions (e.g., entering credentials and submitting a login attempt). After the "Ready" message appears, don't click the Cloudflare CAPTCHA checkbox — this can interfere with the solver. + +### hCaptcha (beta) + +KERNEL can also attempt to solve supported hCaptcha challenges automatically. The hCaptcha solver is in beta and isn't enabled for every organization by default. To turn it on, [contact support](/info/support) with the website or workflow you're testing, your expected volume, and whether you already use stealth mode, [profiles](/browsers/profiles), or custom [proxies](/proxies/overview). diff --git a/changelog.mdx b/changelog.mdx index 7aa6bd40..5eea8fc5 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -396,7 +396,7 @@ For API library updates, see the [Node SDK](https://github.com/onkernel/kernel-n ## Documentation updates -- Added a new [hCaptcha](/browsers/bot-detection/hcaptcha) page documenting beta support for hCaptcha solving. +- Added a new [hCaptcha](/browsers/bot-detection/stealth#hcaptcha-beta) page documenting beta support for hCaptcha solving. - Refreshed [managed auth](/auth/managed-auth) documentation for May 2026: new dedicated [connection lifecycle](/auth/connection-lifecycle) page covering health checks and re-authentication, a shared [connection configuration](/auth/configuration) reference, documented `success_url` / `error_url` query parameters for the [hosted UI](/auth/hosted-ui), [`start_url`](/browsers/create-a-browser) references across browser and pool docs, a reorganized sidebar, and new FAQ entries for short-session reauth and multi-step login forms. - Clarified that managed residential proxy IPs are stable within a session but are not guaranteed to persist across sessions. - Updated the [Yutori integration guide](/integrations/computer-use/yutori) to Navigator n1.5. diff --git a/docs.json b/docs.json index b3e08715..0376014e 100644 --- a/docs.json +++ b/docs.json @@ -6,6 +6,7 @@ { "source": "/careers/backend-engineer", "destination": "https://jobs.ashbyhq.com/usekernel" }, { "source": "/careers/engineer-new-grad", "destination": "https://jobs.ashbyhq.com/usekernel" }, { "source": "/careers/customer-engineer", "destination": "https://jobs.ashbyhq.com/usekernel" }, + { "source": "/browsers/bot-detection/hcaptcha", "destination": "/browsers/bot-detection/stealth#hcaptcha-beta" }, { "source": "/auth/agent/overview", "destination": "/auth/managed-auth" }, { "source": "/auth/agent/hosted-ui", "destination": "/auth/hosted-ui" }, { "source": "/auth/agent/programmatic", "destination": "/auth/programmatic" }, @@ -141,9 +142,7 @@ "pages": [ "browsers/bot-detection/overview", "browsers/bot-detection/stealth", - "browsers/bot-detection/hcaptcha", - "browsers/bot-detection/web-bot-auth", - "bots" + "browsers/bot-detection/web-bot-auth" ] }, { @@ -277,6 +276,7 @@ "shared-responsibility-model", "info/zero-data-retention", "security-vulnerability-reporting", + "bots", "info/trust-center", "info/contact-sales" ] diff --git a/integrations/wallets/agentcard.mdx b/integrations/wallets/agentcard.mdx index 9c50e37a..b390875c 100644 --- a/integrations/wallets/agentcard.mdx +++ b/integrations/wallets/agentcard.mdx @@ -1,5 +1,5 @@ --- -title: "Agentcard" +title: "AgentCard" description: "Use Agentcard to approve browser checkouts against an enrolled payment method" --- diff --git a/integrations/wallets/stripe-link.mdx b/integrations/wallets/stripe-link.mdx index 187332c1..69f7347c 100644 --- a/integrations/wallets/stripe-link.mdx +++ b/integrations/wallets/stripe-link.mdx @@ -1,5 +1,5 @@ --- -title: "link by stripe" +title: "Link by Stripe" description: "use link by stripe to approve a one-use payment credential for a browser checkout" --- diff --git a/proxies/custom.mdx b/proxies/custom.mdx index eeeec487..d5ceb320 100644 --- a/proxies/custom.mdx +++ b/proxies/custom.mdx @@ -107,7 +107,7 @@ func main() { ``` -## Configuration Parameters +## Configuration parameters - **`host`** (required) - Proxy server hostname or IP address - **`port`** (required) - Proxy server port (1-65535) diff --git a/proxies/datacenter.mdx b/proxies/datacenter.mdx index 46e623a3..27b54085 100644 --- a/proxies/datacenter.mdx +++ b/proxies/datacenter.mdx @@ -4,7 +4,7 @@ title: "Datacenter Proxies" Datacenter proxies use IP addresses assigned from datacenter servers to route your traffic and access locations around the world. With a shorter journey and simplified architecture, datacenter proxies are both the fastest and most cost-effective proxy option. -## IP Rotation Behavior +## IP rotation behavior Datacenter proxies use **rotating exit IPs** — a new exit IP is assigned per request, so different requests within the same browser session can exit through different IPs. @@ -86,7 +86,7 @@ func main() { ``` -## Configuration Parameters +## Configuration parameters - **`country`** (optional) - ISO 3166 country code (e.g., `US`, `GB`, `FR`) or `EU` for European Union exit nodes - **`bypass_hosts`** (optional) - Array of hostnames that bypass the proxy and connect directly (max 100 entries) diff --git a/proxies/isp.mdx b/proxies/isp.mdx index e0fd6c00..173204a5 100644 --- a/proxies/isp.mdx +++ b/proxies/isp.mdx @@ -4,7 +4,7 @@ title: "ISP Proxies" ISP (Internet Service Provider) proxies are hosted on datacenter infrastructure but use IP addresses assigned by real residential ISPs. Because the ASN belongs to a residential ISP, target sites see them as residential IPs — while the underlying datacenter hosting gives you the speed and stability you'd expect from a datacenter proxy. -## IP Rotation Behavior +## IP rotation behavior ISP proxies provide a **static exit IP that persists across sessions** — every tab, request, reconnection, and future browser session attached to this proxy exits through the same IP. The IP only changes in rare ISP-initiated replacement events. diff --git a/proxies/overview.mdx b/proxies/overview.mdx index f01762bd..faafaa78 100644 --- a/proxies/overview.mdx +++ b/proxies/overview.mdx @@ -1,10 +1,11 @@ --- -title: "Overview" +title: "Proxies" +sidebarTitle: "Overview" --- Kernel proxies enable you to route browser traffic through different types of proxy servers, providing enhanced privacy, flexibility, and bot detection avoidance. Proxies can be created once and reused across multiple browser sessions. -## Proxy Types +## Proxy types Kernel supports five types of proxies: diff --git a/proxies/residential.mdx b/proxies/residential.mdx index d139e0d2..0fa660ce 100644 --- a/proxies/residential.mdx +++ b/proxies/residential.mdx @@ -94,7 +94,7 @@ func main() { ``` -## Configuration Parameters +## Configuration parameters - **`country`** - ISO 3166 country code. Must be provided when providing other targeting options. - **`state`** - Two-letter state code. Only supported for US. @@ -103,11 +103,11 @@ func main() { - **`asn`** - Autonomous System Number. Conflicts with city and state. - **`bypass_hosts`** (optional) - Array of hostnames that bypass the proxy and connect directly (max 100 entries) -## Advanced Targeting Examples +## Advanced targeting examples Kernel recommends using the least-specific targeting configuration that works for your use case. The more specific a configuration, the less available IPs there are, increasing the chance of a slow connection or no available connection (`no_peer` connection error). -### Target by City +### Target by city Route traffic through a specific city: @@ -161,7 +161,7 @@ _ = proxy If the city name is not matched, the API will return the best 10 city names from the state to help you find the correct city identifier. -### Target by State +### Target by state Route traffic through a specific state: diff --git a/vaults/overview.mdx b/vaults/overview.mdx index 68dab206..1071c22b 100644 --- a/vaults/overview.mdx +++ b/vaults/overview.mdx @@ -1,5 +1,6 @@ --- -title: "Overview" +title: "Vaults" +sidebarTitle: "Overview" description: "Group credentials and payment items, collect values, and control their use by attached browsers" --- @@ -27,6 +28,17 @@ navigation and submission, start with [Fill from Vault](/auth/fill-from-vault). see [wallet integrations](/integrations/wallets/overview). +## Choose where credentials come from + +a `credential` item can get its values from three places. all three end with the browser filling the login without your agent reading the values. + +| | [KERNEL-hosted collection](/vaults/credentials) | [an existing vault](/vaults/existing-credential-vault) | [1Password](/vaults/1password) | +| --- | --- | --- | --- | +| where the secret lives | encrypted in a KERNEL `credential` item | an encrypted copy in a KERNEL `credential` item | in the user's 1Password account | +| how it gets there | the user enters it in a KERNEL-hosted form, or your backend writes it | your backend copies it from the vault you already use and keeps it in sync | the user links their 1Password account once | +| who approves each use | your application or agent, when it calls `fill` | your application or agent, when it calls `fill` | the user, in the 1Password app | +| pick it when | you're collecting credentials from users for the first time | your credentials already live in another secrets manager | your users keep logins in a private 1Password vault | + ## How vaults work ### Sensitive values do not come back through the api @@ -72,7 +84,7 @@ availability. -### Inject values with KERNEL's fill api +### Inject values with KERNEL's fill API retrieve the item and require `fill` in `available_operations`. your controller authorizes the destination and supplies field names and selectors, not the stored values. KERNEL checks the browser attachment and item lifecycle, validates the target inputs, and writes values into the attached browser. From f6e8ba17435bd8ed0612bcdb5f4b39cfe2cf71aa Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:18:52 +0000 Subject: [PATCH 65/78] Group managed auth pages and merge credentials into configuration - Nest the managed auth pages in their own group under Authentication - Fold Managed Auth Credentials into the configuration page's credentials section and redirect the old URL - Add a connection options summary to the managed auth overview Co-Authored-By: Claude Opus 5.5 --- auth/configuration.mdx | 476 ++++++++++++++++++++++++++++++++- auth/connection-lifecycle.mdx | 4 +- auth/credentials.mdx | 474 -------------------------------- auth/managed-auth.mdx | 18 +- docs.json | 23 +- reference/cli/managed-auth.mdx | 2 +- 6 files changed, 508 insertions(+), 489 deletions(-) delete mode 100644 auth/credentials.mdx diff --git a/auth/configuration.mdx b/auth/configuration.mdx index efb64fc1..e3e915ae 100644 --- a/auth/configuration.mdx +++ b/auth/configuration.mdx @@ -10,7 +10,479 @@ Managed Auth connections use the same configuration whether you collect credenti by default, KERNEL saves durable credential fields after a successful login. these can support eligible automatic reauthentication attempts, including totp codes generated from an available secret. submitted one-time codes aren't saved and don't provide access to future codes. if a later login requires user input, your application must start a new interactive login. -To opt out of credential saving, set `save_credentials: false` when creating the connection. See [Credentials](/auth/credentials) for configuration examples. +To opt out of credential saving, set `save_credentials: false` when creating the connection. + +credentials let you store login information securely. KERNEL can attempt automatic reauthentication for eligible flows using stored credentials, including totp codes generated from an available secret. saving credentials or completing an interactive login doesn't guarantee unattended reauthentication. supplying a one-time code doesn't give KERNEL the ability to obtain future codes. if a site requires user input, start a new [interactive login](/auth/connection-lifecycle#flows-that-need-input-a-choice-or-approval). + +There are three ways to provide credentials: +- **Automatically save during login** — Capture credentials directly from the user when they log in via [Hosted UI](/auth/hosted-ui) or [Programmatic](/auth/programmatic) +- **Pre-store in Kernel** — Create credentials before login for supported headless authentication flows +- **Connect 1Password** — Use credentials from your existing 1Password vaults + + + Connect your 1Password vaults to automatically use existing credentials with Managed Auth. Credentials are automatically matched by domain. + + +### Save credentials during login + +By default, Kernel saves durable credential fields entered during login so they can be used for eligible reauthentication attempts. No extra parameters are needed: + + +```typescript TypeScript +const login = await kernel.auth.connections.login(auth.id); +``` + +```python Python +login = await kernel.auth.connections.login(auth.id) +``` + +```go Go +login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) +if err != nil { + panic(err) +} +_ = login +``` + + +Once saved, the browser profile reuses its authenticated session until the site expires it. For supported credential-based flows, Kernel can then reauthenticate with the stored values. Credentials are updated after every successful login. Submitted one-time codes aren't saved; Kernel generates TOTP codes from a stored `totp_secret`. + +To opt out of credential saving, set `save_credentials: false` when creating the connection: + + +```typescript TypeScript +const auth = await kernel.auth.connections.create({ + domain: 'example.com', + profile_name: 'my-profile', + save_credentials: false, +}); +``` + +```python Python +auth = await kernel.auth.connections.create( + domain="example.com", + profile_name="my-profile", + save_credentials=False, +) +``` + +```go Go +auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ + ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ + Domain: "example.com", + ProfileName: "my-profile", + SaveCredentials: kernel.Bool(false), + }, +}) +if err != nil { + panic(err) +} +_ = auth +``` + + +### Pre-store credentials + +For credential-based flows that you want to run without user input, create credentials upfront: + + +```typescript TypeScript +const credential = await kernel.credentials.create({ + name: 'my-netflix-login', + domain: 'netflix.com', + values: { + email: 'user@netflix.com', + password: 'secretpassword123', + }, +}); +``` + +```python Python +credential = await kernel.credentials.create( + name="my-netflix-login", + domain="netflix.com", + values={ + "email": "user@netflix.com", + "password": "secretpassword123", + }, +) +``` + +```go Go +credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ + CreateCredentialRequest: kernel.CreateCredentialRequestParam{ + Name: "my-netflix-login", + Domain: "netflix.com", + Values: map[string]string{ + "email": "user@netflix.com", + "password": "secretpassword123", + }, + }, +}) +if err != nil { + panic(err) +} +_ = credential +``` + + +Then link the credential when creating a connection: + + +```typescript TypeScript +const auth = await kernel.auth.connections.create({ + domain: 'netflix.com', + profile_name: 'my-profile', + credential: { name: credential.name }, +}); + +// Start login with stored credentials +const login = await kernel.auth.connections.login(auth.id); +``` + +```python Python +auth = await kernel.auth.connections.create( + domain="netflix.com", + profile_name="my-profile", + credential={"name": credential.name}, +) + +# Start login with stored credentials +login = await kernel.auth.connections.login(auth.id) +``` + +```go Go +auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ + ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ + Domain: "netflix.com", + ProfileName: "my-profile", + Credential: kernel.ManagedAuthCreateRequestCredentialParam{ + Name: kernel.String(credential.Name), + }, + }, +}) +if err != nil { + panic(err) +} + +// Start login with stored credentials +login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) +if err != nil { + panic(err) +} +_ = login +``` + + +#### 2FA with TOTP + +For sites with authenticator app 2FA, include `totp_secret` so KERNEL can generate a fresh code during automatic login and reauthentication. Supply a base32 secret of 16–128 characters or an `otpauth://totp/` provisioning URI. The default is SHA1, 6 digits, and a 30-second period. If the authenticator uses different settings, provide `totp_algorithm` (`SHA1`, `SHA256`, or `SHA512`), `totp_digits` (6–9), and `totp_period` (15–300 seconds): + + +```typescript TypeScript +const credential = await kernel.credentials.create({ + name: 'my-login', + domain: 'github.com', + values: { + username: 'my-username', + password: 'my-password', + }, + totp_secret: 'JBSWY3DPEHPK3PXP', + totp_algorithm: 'SHA512', + totp_digits: 8, + totp_period: 60, +}); +``` + +```python Python +credential = await kernel.credentials.create( + name="my-login", + domain="github.com", + values={ + "username": "my-username", + "password": "my-password", + }, + totp_secret="JBSWY3DPEHPK3PXP", + totp_algorithm="SHA512", + totp_digits=8, + totp_period=60, +) +``` + +```go Go +credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ + CreateCredentialRequest: kernel.CreateCredentialRequestParam{ + Name: "my-login", + Domain: "github.com", + Values: map[string]string{ + "username": "my-username", + "password": "my-password", + }, + TotpSecret: kernel.String("JBSWY3DPEHPK3PXP"), + TotpAlgorithm: kernel.CreateCredentialRequestTotpAlgorithmSha512, + TotpDigits: kernel.Int(8), + TotpPeriod: kernel.Int(60), + }, +}) +if err != nil { + panic(err) +} +_ = credential +``` + + +The examples use typed fields available in TypeScript, Python, and Go SDK v0.116.0 or later. You can also pass an `otpauth://totp/` provisioning URI as `totp_secret`. + +- URI parameters override explicit settings. If a parameter is missing, the API uses its explicit field, then the default. +- Replacing a URI resets omitted settings to defaults. Rotating a raw secret preserves stored settings unless you send new values. +- The API stores only the normalized seed, never the URI label or issuer. +- A code's length follows `totp_digits`; don't assume six digits when reading `totp_code` or calling `totpCode()`. + +#### SSO / OAuth + +For sites with "Sign in with Google/GitHub/Microsoft", set `sso_provider` so Kernel can select the matching SSO route. Automatic completion depends on the provider's login requirements. + +Common SSO provider domains (Google, Microsoft, Okta, Auth0, GitHub, etc.) are allowed by default, so you don't need to add them to `allowed_domains`: + + +```typescript TypeScript +const credential = await kernel.credentials.create({ + name: 'my-google-login', + domain: 'accounts.google.com', + sso_provider: 'google', + values: { + email: 'user@gmail.com', + password: 'password', + }, +}); + +const auth = await kernel.auth.connections.create({ + domain: 'target-site.com', + profile_name: 'my-profile', + credential: { name: credential.name }, +}); +``` + +```python Python +credential = await kernel.credentials.create( + name="my-google-login", + domain="accounts.google.com", + sso_provider="google", + values={ + "email": "user@gmail.com", + "password": "password", + }, +) + +auth = await kernel.auth.connections.create( + domain="target-site.com", + profile_name="my-profile", + credential={"name": credential.name}, +) +``` + +```go Go +credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ + CreateCredentialRequest: kernel.CreateCredentialRequestParam{ + Name: "my-google-login", + Domain: "accounts.google.com", + SSOProvider: kernel.String("google"), + Values: map[string]string{ + "email": "user@gmail.com", + "password": "password", + }, + }, +}) +if err != nil { + panic(err) +} + +auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ + ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ + Domain: "target-site.com", + ProfileName: "my-profile", + Credential: kernel.ManagedAuthCreateRequestCredentialParam{ + Name: kernel.String(credential.Name), + }, + }, +}) +if err != nil { + panic(err) +} +_ = auth +``` + + +### Partial credentials + +Credentials don't need to contain every field required by the login form. You can store what you have and collect the necessary fields from the user. `auth.connections.login()` pauses for missing values. + +As an example, the below credential has email + TOTP secret stored (and automatically handled), but no password. The password is dynamically collected from the user using Kernel's Hosted UI or your Programmatic flow: + + +```typescript TypeScript +const credential = await kernel.credentials.create({ + name: 'my-login', + domain: 'example.com', + values: { email: 'user@example.com' }, // No password + totp_secret: 'JBSWY3DPEHPK3PXP', +}); + +const auth = await kernel.auth.connections.create({ + domain: 'example.com', + profile_name: 'my-profile', + credential: { name: credential.name }, +}); + +const login = await kernel.auth.connections.login(auth.id); + +// Stream state changes and submit the missing password +const authEvents = await kernel.auth.connections.follow(auth.id); +for await (const event of authEvents) { + const passwordField = event.fields?.find(field => field.ref === 'password'); + if ( + event.event === 'managed_auth_state' && + event.flow_step === 'AWAITING_INPUT' && + event.interaction_id && + passwordField + ) { + // Only password is pending; email is filled from the stored credential. + await kernel.auth.connections.submit(auth.id, { + interaction_id: event.interaction_id, + field_values: { [passwordField.id]: 'user-provided-password' }, + }); + } +} +// TOTP auto-submitted from credential → SUCCESS +``` + +```python Python +credential = await kernel.credentials.create( + name="my-login", + domain="example.com", + values={"email": "user@example.com"}, # No password + totp_secret="JBSWY3DPEHPK3PXP", +) + +auth = await kernel.auth.connections.create( + domain="example.com", + profile_name="my-profile", + credential={"name": credential.name}, +) + +login = await kernel.auth.connections.login(auth.id) + +# Stream state changes and submit the missing password +auth_events = await kernel.auth.connections.follow(auth.id) +async for event in auth_events: + password_field = next( + (field for field in (event.fields or []) if field.ref == "password"), + None, + ) + if ( + event.event == "managed_auth_state" + and event.flow_step == "AWAITING_INPUT" + and event.interaction_id + and password_field + ): + # Only password is pending; email is filled from the stored credential. + await kernel.auth.connections.submit( + auth.id, + interaction_id=event.interaction_id, + field_values={password_field.id: "user-provided-password"}, + ) +# TOTP auto-submitted from credential → SUCCESS +``` + +```go Go +credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ + CreateCredentialRequest: kernel.CreateCredentialRequestParam{ + Name: "my-login", + Domain: "example.com", + Values: map[string]string{ + "email": "user@example.com", // No password + }, + TotpSecret: kernel.String("JBSWY3DPEHPK3PXP"), + }, +}) +if err != nil { + panic(err) +} + +auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ + ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ + Domain: "example.com", + ProfileName: "my-profile", + Credential: kernel.ManagedAuthCreateRequestCredentialParam{ + Name: kernel.String(credential.Name), + }, + }, +}) +if err != nil { + panic(err) +} + +login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) +if err != nil { + panic(err) +} +_ = login + +// Stream state changes and submit the missing password +authEvents := client.Auth.Connections.FollowStreaming(ctx, auth.ID) +for authEvents.Next() { + event := authEvents.Current() + if event.Event != "managed_auth_state" || event.FlowStep != "AWAITING_INPUT" || event.InteractionID == "" { + continue + } + for _, field := range event.Fields { + if field.Ref != "password" { + continue + } + // Only password is pending; email is filled from the stored credential. + _, err := client.Auth.Connections.Submit(ctx, auth.ID, kernel.AuthConnectionSubmitParams{ + SubmitFieldsRequest: kernel.SubmitFieldsRequestParam{ + InteractionID: kernel.String(event.InteractionID), + FieldValues: map[string]string{ + field.ID: "user-provided-password", + }, + }, + }) + if err != nil { + panic(err) + } + break + } +} +if err := authEvents.Err(); err != nil { + panic(err) +} +// TOTP auto-submitted from credential → SUCCESS +``` + + +This is useful when you want to: +- Store TOTP secrets but have users enter their password each time +- Pre-fill username/email but collect password at runtime +- Merge user-provided values into an existing credential automatically on successful login + +### Credential security + +| Feature | Description | +|---------|-------------| +| **Encrypted at rest** | Values encrypted using per-organization keys | +| **Write-only** | Values cannot be retrieved via API after creation | +| **Never logged** | Values are never written to logs | +| **Never shared** | Values are never passed to LLMs | +| **Isolated execution** | Authentication runs in isolated browser environments | + +### Credential notes + +- The `values` object is flexible and can be used to store whatever fields the login form needs (`email`, `username`, `company_id`, etc.) +- Deleting a credential unlinks it from associated connections so they can no longer auto-authenticate +- Use one credential per account. We recommend creating separate credentials for different user accounts + +### Automatic reauthentication Automatic re-authentication is gated by two boolean flags that both default to `true`: @@ -392,7 +864,7 @@ _ = login Managed auth recordings are subject to the same retention rules as other session replay recordings. Each managed auth session row stores its own `replay_id` for the recording captured during that session. -## Post-Login URL +## Post-login URL After successful authentication, `post_login_url` will be set to the page where the login landed. Use this to start your automation from the right place: diff --git a/auth/connection-lifecycle.mdx b/auth/connection-lifecycle.mdx index efddede2..aa49582d 100644 --- a/auth/connection-lifecycle.mdx +++ b/auth/connection-lifecycle.mdx @@ -161,7 +161,7 @@ See the [API reference](https://kernel.sh/docs/api-reference/managed-auth/start- ### Recovering -- **`credentials_invalid`** — Update the linked [credential](/auth/credentials) and call `.login()` to re-run the flow. When the site identifies which field it rejected during an interactive login, Kernel asks for a corrected value in place — see [replacing a rejected credential](/auth/programmatic#replacing-a-rejected-credential). +- **`credentials_invalid`** — Update the linked [credential](/auth/configuration#credentials-and-auto-reauth) and call `.login()` to re-run the flow. When the site identifies which field it rejected during an interactive login, Kernel asks for a corrected value in place — see [replacing a rejected credential](/auth/programmatic#replacing-a-rejected-credential). - **`totp_code_rejected`** — Retry with a code from a new TOTP window. If independently generated codes keep failing, reconnect the account and update its TOTP secret. One rejected code does not prove that the saved secret is stale. - **`totp_required` / `sms_code_required` / `email_code_required`** — Start an interactive login and provide the requested code. Add a TOTP secret to the linked credential to make future authenticator-code challenges automatic. - **`account_choice_required` / `customer_input_required` / `external_action_required`** — Start an interactive login and complete the choice, field, or external approval. Kernel does not guess an identity or trigger notification-producing steps during unattended reauth. @@ -209,5 +209,5 @@ To record every auth session on the connection (logins, health checks, and reaut ## See also - [Connection Configuration](/auth/configuration) — `health_check_interval`, `proxy`, `record_session`, and other shared options -- [Credentials](/auth/credentials) — what gets stored and how it powers auto-reauth +- [Credentials](/auth/configuration#credentials-and-auto-reauth) — what gets stored and how it powers auto-reauth - [FAQ](/auth/faq) — quick answers to common questions diff --git a/auth/credentials.mdx b/auth/credentials.mdx deleted file mode 100644 index e5e0a933..00000000 --- a/auth/credentials.mdx +++ /dev/null @@ -1,474 +0,0 @@ ---- -title: "Managed Auth Credentials" -description: "Use stored credentials for login and eligible automatic reauthentication attempts" ---- - -credentials let you store login information securely. KERNEL can attempt automatic reauthentication for eligible flows using stored credentials, including totp codes generated from an available secret. saving credentials or completing an interactive login doesn't guarantee unattended reauthentication. supplying a one-time code doesn't give KERNEL the ability to obtain future codes. if a site requires user input, start a new [interactive login](/auth/connection-lifecycle#flows-that-need-input-a-choice-or-approval). - -**There are three ways to provide credentials:** -- **Automatically save during login** — Capture credentials directly from the user when they log in via [Hosted UI](/auth/hosted-ui) or [Programmatic](/auth/programmatic) -- **Pre-store in Kernel** — Create credentials before login for supported headless authentication flows -- **Connect 1Password** — Use credentials from your existing 1Password vaults - - - Connect your 1Password vaults to automatically use existing credentials with Managed Auth. Credentials are automatically matched by domain. - - -## Save credentials during login - -By default, Kernel saves durable credential fields entered during login so they can be used for eligible reauthentication attempts. No extra parameters are needed: - - -```typescript TypeScript -const login = await kernel.auth.connections.login(auth.id); -``` - -```python Python -login = await kernel.auth.connections.login(auth.id) -``` - -```go Go -login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) -if err != nil { - panic(err) -} -_ = login -``` - - -Once saved, the browser profile reuses its authenticated session until the site expires it. For supported credential-based flows, Kernel can then reauthenticate with the stored values. Credentials are updated after every successful login. Submitted one-time codes aren't saved; Kernel generates TOTP codes from a stored `totp_secret`. - -To opt out of credential saving, set `save_credentials: false` when creating the connection: - - -```typescript TypeScript -const auth = await kernel.auth.connections.create({ - domain: 'example.com', - profile_name: 'my-profile', - save_credentials: false, -}); -``` - -```python Python -auth = await kernel.auth.connections.create( - domain="example.com", - profile_name="my-profile", - save_credentials=False, -) -``` - -```go Go -auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ - ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ - Domain: "example.com", - ProfileName: "my-profile", - SaveCredentials: kernel.Bool(false), - }, -}) -if err != nil { - panic(err) -} -_ = auth -``` - - -## Pre-store credentials - -For credential-based flows that you want to run without user input, create credentials upfront: - - -```typescript TypeScript -const credential = await kernel.credentials.create({ - name: 'my-netflix-login', - domain: 'netflix.com', - values: { - email: 'user@netflix.com', - password: 'secretpassword123', - }, -}); -``` - -```python Python -credential = await kernel.credentials.create( - name="my-netflix-login", - domain="netflix.com", - values={ - "email": "user@netflix.com", - "password": "secretpassword123", - }, -) -``` - -```go Go -credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ - CreateCredentialRequest: kernel.CreateCredentialRequestParam{ - Name: "my-netflix-login", - Domain: "netflix.com", - Values: map[string]string{ - "email": "user@netflix.com", - "password": "secretpassword123", - }, - }, -}) -if err != nil { - panic(err) -} -_ = credential -``` - - -Then link the credential when creating a connection: - - -```typescript TypeScript -const auth = await kernel.auth.connections.create({ - domain: 'netflix.com', - profile_name: 'my-profile', - credential: { name: credential.name }, -}); - -// Start login with stored credentials -const login = await kernel.auth.connections.login(auth.id); -``` - -```python Python -auth = await kernel.auth.connections.create( - domain="netflix.com", - profile_name="my-profile", - credential={"name": credential.name}, -) - -# Start login with stored credentials -login = await kernel.auth.connections.login(auth.id) -``` - -```go Go -auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ - ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ - Domain: "netflix.com", - ProfileName: "my-profile", - Credential: kernel.ManagedAuthCreateRequestCredentialParam{ - Name: kernel.String(credential.Name), - }, - }, -}) -if err != nil { - panic(err) -} - -// Start login with stored credentials -login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) -if err != nil { - panic(err) -} -_ = login -``` - - -### 2FA with TOTP - -For sites with authenticator app 2FA, include `totp_secret` so KERNEL can generate a fresh code during automatic login and reauthentication. Supply a base32 secret of 16–128 characters or an `otpauth://totp/` provisioning URI. The default is SHA1, 6 digits, and a 30-second period. If the authenticator uses different settings, provide `totp_algorithm` (`SHA1`, `SHA256`, or `SHA512`), `totp_digits` (6–9), and `totp_period` (15–300 seconds): - - -```typescript TypeScript -const credential = await kernel.credentials.create({ - name: 'my-login', - domain: 'github.com', - values: { - username: 'my-username', - password: 'my-password', - }, - totp_secret: 'JBSWY3DPEHPK3PXP', - totp_algorithm: 'SHA512', - totp_digits: 8, - totp_period: 60, -}); -``` - -```python Python -credential = await kernel.credentials.create( - name="my-login", - domain="github.com", - values={ - "username": "my-username", - "password": "my-password", - }, - totp_secret="JBSWY3DPEHPK3PXP", - totp_algorithm="SHA512", - totp_digits=8, - totp_period=60, -) -``` - -```go Go -credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ - CreateCredentialRequest: kernel.CreateCredentialRequestParam{ - Name: "my-login", - Domain: "github.com", - Values: map[string]string{ - "username": "my-username", - "password": "my-password", - }, - TotpSecret: kernel.String("JBSWY3DPEHPK3PXP"), - TotpAlgorithm: kernel.CreateCredentialRequestTotpAlgorithmSha512, - TotpDigits: kernel.Int(8), - TotpPeriod: kernel.Int(60), - }, -}) -if err != nil { - panic(err) -} -_ = credential -``` - - -The examples use typed fields available in TypeScript, Python, and Go SDK v0.116.0 or later. You can also pass an `otpauth://totp/` provisioning URI as `totp_secret`. - -- URI parameters override explicit settings. If a parameter is missing, the API uses its explicit field, then the default. -- Replacing a URI resets omitted settings to defaults. Rotating a raw secret preserves stored settings unless you send new values. -- The API stores only the normalized seed, never the URI label or issuer. -- A code's length follows `totp_digits`; don't assume six digits when reading `totp_code` or calling `totpCode()`. - -### SSO / OAuth - -For sites with "Sign in with Google/GitHub/Microsoft", set `sso_provider` so Kernel can select the matching SSO route. Automatic completion depends on the provider's login requirements. - -Common SSO provider domains (Google, Microsoft, Okta, Auth0, GitHub, etc.) are allowed by default, so you don't need to add them to `allowed_domains`: - - -```typescript TypeScript -const credential = await kernel.credentials.create({ - name: 'my-google-login', - domain: 'accounts.google.com', - sso_provider: 'google', - values: { - email: 'user@gmail.com', - password: 'password', - }, -}); - -const auth = await kernel.auth.connections.create({ - domain: 'target-site.com', - profile_name: 'my-profile', - credential: { name: credential.name }, -}); -``` - -```python Python -credential = await kernel.credentials.create( - name="my-google-login", - domain="accounts.google.com", - sso_provider="google", - values={ - "email": "user@gmail.com", - "password": "password", - }, -) - -auth = await kernel.auth.connections.create( - domain="target-site.com", - profile_name="my-profile", - credential={"name": credential.name}, -) -``` - -```go Go -credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ - CreateCredentialRequest: kernel.CreateCredentialRequestParam{ - Name: "my-google-login", - Domain: "accounts.google.com", - SSOProvider: kernel.String("google"), - Values: map[string]string{ - "email": "user@gmail.com", - "password": "password", - }, - }, -}) -if err != nil { - panic(err) -} - -auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ - ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ - Domain: "target-site.com", - ProfileName: "my-profile", - Credential: kernel.ManagedAuthCreateRequestCredentialParam{ - Name: kernel.String(credential.Name), - }, - }, -}) -if err != nil { - panic(err) -} -_ = auth -``` - - -## Partial credentials - -Credentials don't need to contain every field required by the login form. You can store what you have and collect the necessary fields from the user. `auth.connections.login()` pauses for missing values. - -As an example, the below credential has email + TOTP secret stored (and automatically handled), but no password. The password is dynamically collected from the user using Kernel's Hosted UI or your Programmatic flow: - - -```typescript TypeScript -const credential = await kernel.credentials.create({ - name: 'my-login', - domain: 'example.com', - values: { email: 'user@example.com' }, // No password - totp_secret: 'JBSWY3DPEHPK3PXP', -}); - -const auth = await kernel.auth.connections.create({ - domain: 'example.com', - profile_name: 'my-profile', - credential: { name: credential.name }, -}); - -const login = await kernel.auth.connections.login(auth.id); - -// Stream state changes and submit the missing password -const authEvents = await kernel.auth.connections.follow(auth.id); -for await (const event of authEvents) { - const passwordField = event.fields?.find(field => field.ref === 'password'); - if ( - event.event === 'managed_auth_state' && - event.flow_step === 'AWAITING_INPUT' && - event.interaction_id && - passwordField - ) { - // Only password is pending; email is filled from the stored credential. - await kernel.auth.connections.submit(auth.id, { - interaction_id: event.interaction_id, - field_values: { [passwordField.id]: 'user-provided-password' }, - }); - } -} -// TOTP auto-submitted from credential → SUCCESS -``` - -```python Python -credential = await kernel.credentials.create( - name="my-login", - domain="example.com", - values={"email": "user@example.com"}, # No password - totp_secret="JBSWY3DPEHPK3PXP", -) - -auth = await kernel.auth.connections.create( - domain="example.com", - profile_name="my-profile", - credential={"name": credential.name}, -) - -login = await kernel.auth.connections.login(auth.id) - -# Stream state changes and submit the missing password -auth_events = await kernel.auth.connections.follow(auth.id) -async for event in auth_events: - password_field = next( - (field for field in (event.fields or []) if field.ref == "password"), - None, - ) - if ( - event.event == "managed_auth_state" - and event.flow_step == "AWAITING_INPUT" - and event.interaction_id - and password_field - ): - # Only password is pending; email is filled from the stored credential. - await kernel.auth.connections.submit( - auth.id, - interaction_id=event.interaction_id, - field_values={password_field.id: "user-provided-password"}, - ) -# TOTP auto-submitted from credential → SUCCESS -``` - -```go Go -credential, err := client.Credentials.New(ctx, kernel.CredentialNewParams{ - CreateCredentialRequest: kernel.CreateCredentialRequestParam{ - Name: "my-login", - Domain: "example.com", - Values: map[string]string{ - "email": "user@example.com", // No password - }, - TotpSecret: kernel.String("JBSWY3DPEHPK3PXP"), - }, -}) -if err != nil { - panic(err) -} - -auth, err := client.Auth.Connections.New(ctx, kernel.AuthConnectionNewParams{ - ManagedAuthCreateRequest: kernel.ManagedAuthCreateRequestParam{ - Domain: "example.com", - ProfileName: "my-profile", - Credential: kernel.ManagedAuthCreateRequestCredentialParam{ - Name: kernel.String(credential.Name), - }, - }, -}) -if err != nil { - panic(err) -} - -login, err := client.Auth.Connections.Login(ctx, auth.ID, kernel.AuthConnectionLoginParams{}) -if err != nil { - panic(err) -} -_ = login - -// Stream state changes and submit the missing password -authEvents := client.Auth.Connections.FollowStreaming(ctx, auth.ID) -for authEvents.Next() { - event := authEvents.Current() - if event.Event != "managed_auth_state" || event.FlowStep != "AWAITING_INPUT" || event.InteractionID == "" { - continue - } - for _, field := range event.Fields { - if field.Ref != "password" { - continue - } - // Only password is pending; email is filled from the stored credential. - _, err := client.Auth.Connections.Submit(ctx, auth.ID, kernel.AuthConnectionSubmitParams{ - SubmitFieldsRequest: kernel.SubmitFieldsRequestParam{ - InteractionID: kernel.String(event.InteractionID), - FieldValues: map[string]string{ - field.ID: "user-provided-password", - }, - }, - }) - if err != nil { - panic(err) - } - break - } -} -if err := authEvents.Err(); err != nil { - panic(err) -} -// TOTP auto-submitted from credential → SUCCESS -``` - - -This is useful when you want to: -- Store TOTP secrets but have users enter their password each time -- Pre-fill username/email but collect password at runtime -- Merge user-provided values into an existing credential automatically on successful login - -## Security - -| Feature | Description | -|---------|-------------| -| **Encrypted at rest** | Values encrypted using per-organization keys | -| **Write-only** | Values cannot be retrieved via API after creation | -| **Never logged** | Values are never written to logs | -| **Never shared** | Values are never passed to LLMs | -| **Isolated execution** | Authentication runs in isolated browser environments | - -## Notes - -- The `values` object is flexible and can be used to store whatever fields the login form needs (`email`, `username`, `company_id`, etc.) -- Deleting a credential unlinks it from associated connections so they can no longer auto-authenticate -- Use one credential per account. We recommend creating separate credentials for different user accounts diff --git a/auth/managed-auth.mdx b/auth/managed-auth.mdx index 4c3bfd55..2e0bcda7 100644 --- a/auth/managed-auth.mdx +++ b/auth/managed-auth.mdx @@ -1,5 +1,6 @@ --- title: "Managed Auth" +sidebarTitle: "Overview" description: "Handle website login, reuse session state, and recover eligible connections automatically" --- @@ -51,7 +52,7 @@ _ = auth A **Managed Auth Session** is the corresponding login flow for the specified connection. Users provide credentials via a KERNEL-hosted page or your own UI. - link a [credential](/auth/credentials) so KERNEL can attempt reauthentication when the connection is eligible. stored credentials alone don't make every flow eligible. + link a [credential](/auth/configuration#credentials-and-auto-reauth) so KERNEL can attempt reauthentication when the connection is eligible. stored credentials alone don't make every flow eligible. ```typescript TypeScript @@ -195,6 +196,21 @@ these steps establish the initial connection. your integration must also handle +## Connection options + +Every connection uses the same options, whichever integration you choose. See [configuration](/auth/configuration) for examples of each. + +| Option | What it does | +| --- | --- | +| [Credentials](/auth/configuration#credentials-and-auto-reauth) | Save login values during the first login, or store them ahead of time, so KERNEL can attempt eligible reauthentication. | +| [Automatic reauthentication](/auth/configuration#automatic-reauthentication) | Run health checks and reauthenticate when a session expires, controlled by `health_checks` and `auto_reauth`. | +| [Custom login URL](/auth/configuration#custom-login-url) | Start the login from a specific page instead of the domain's default. | +| [Browser region](/auth/configuration#browser-region) | Run the login and health checks in the region your browsers use. | +| [SSO and OAuth](/auth/configuration#ssooauth-support) | Support "Sign in with Google, GitHub, or Microsoft" flows. Common identity providers are allowed by default. | +| [Custom proxy](/auth/configuration#custom-proxy) | Send login traffic through a proxy you choose. | +| [Session recording](/auth/configuration#record-sessions-for-debugging) | Record login attempts as replays for debugging. | +| [Post-login URL](/auth/configuration#post-login-url) | Read the page the login landed on, so your automation starts from the right place. | + ## Why Managed Auth? Managed Auth runs **login flows** by navigating login pages, filling credentials, following SSO redirects, and guiding users through additional authentication steps. It saves the resulting session state to a reusable profile. diff --git a/docs.json b/docs.json index 0376014e..f82eedf8 100644 --- a/docs.json +++ b/docs.json @@ -20,8 +20,9 @@ { "source": "/profiles.md", "destination": "/browsers/profiles.md" }, { "source": "/profiles/overview", "destination": "/browsers/profiles" }, { "source": "/profiles/overview.md", "destination": "/browsers/profiles.md" }, - { "source": "/profiles/credentials", "destination": "/auth/credentials" }, - { "source": "/profiles/credentials.md", "destination": "/auth/credentials.md" }, + { "source": "/profiles/credentials", "destination": "/auth/configuration#credentials-and-auto-reauth" }, + { "source": "/profiles/credentials.md", "destination": "/auth/configuration.md" }, + { "source": "/auth/credentials", "destination": "/auth/configuration#credentials-and-auto-reauth" }, { "source": "/profiles/managed-auth", "destination": "/auth/managed-auth" }, { "source": "/profiles/managed-auth.md", "destination": "/auth/managed-auth.md" }, { "source": "/profiles/managed-auth/overview", "destination": "/auth/managed-auth" }, @@ -181,13 +182,17 @@ "pages": [ "auth/overview", "auth/fill-from-vault", - "auth/managed-auth", - "auth/hosted-ui", - "auth/react", - "auth/programmatic", - "auth/configuration", - "auth/connection-lifecycle", - "auth/credentials" + { + "group": "Managed Auth", + "pages": [ + "auth/managed-auth", + "auth/hosted-ui", + "auth/react", + "auth/programmatic", + "auth/configuration", + "auth/connection-lifecycle" + ] + } ] }, { diff --git a/reference/cli/managed-auth.mdx b/reference/cli/managed-auth.mdx index 01407e9a..dc230865 100644 --- a/reference/cli/managed-auth.mdx +++ b/reference/cli/managed-auth.mdx @@ -132,7 +132,7 @@ Delete a managed auth connection. | `--yes`, `-y` | Skip the confirmation prompt. | ## Credentials -Store login field values, TOTP secrets, and SSO settings that managed auth connections use to authenticate. See [Credentials](/auth/credentials) for concepts. +Store login field values, TOTP secrets, and SSO settings that managed auth connections use to authenticate. See [Credentials](/auth/configuration#credentials-and-auto-reauth) for concepts. ### `kernel credentials create` Create a new credential. From a627d85425faa3bbd528f7ac7a5858e6d9210b6c Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:19:07 +0000 Subject: [PATCH 66/78] Repoint changelog links to the merged credentials section Co-Authored-By: Claude Opus 5.5 --- changelog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.mdx b/changelog.mdx index 5eea8fc5..c5e1b712 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -446,7 +446,7 @@ For API library updates, see the [Node SDK](https://github.com/onkernel/kernel-n - Anti-detection features are now on by default for all Kernel browsers. [Stealth mode](/browsers/bot-detection/stealth) now specifically adds the managed ISP proxy and CAPTCHA solver (both opt-out), and non-stealth browsers fully support [custom proxies](/proxies/custom). - Revamped the [managed auth hosted login page](/auth/hosted-ui): all available sign-in options (password fields, SSO providers, MFA, alternate sign-in methods) now render together on a single page, so end users can pick the path they want, instead of being funneled through one at a time. - Managed auth input fields now display contextual helper text when the site surfaces hints, reducing user confusion on multi-step logins. -- The "Save credentials after login" option is now automatically disabled when [1Password](/integrations/1password) is selected as the [credential source](/auth/credentials), since those credentials are already managed externally. +- The "Save credentials after login" option is now automatically disabled when [1Password](/integrations/1password) is selected as the [credential source](/auth/configuration#credentials-and-auto-reauth), since those credentials are already managed externally. - Kernel now supports WebSocket connections through its API, enabling `process attach` and other long-lived streaming workflows. - Exceeding invocation concurrency limits now returns a 429 response immediately, for faster and more actionable feedback. From e7b16683172dddbf6a3145ba3cf0f0e3d62bb3f6 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:27:41 +0000 Subject: [PATCH 67/78] Restructure Control around the ways to drive the browser - Sidebar lists the control surfaces, process execution, file I/O, and the code execution platform; curl, SSH, and Browser Loop move to links - Overview adds WebMCP and the REPL to the surface table and moves the why-computer-use and why-playwright-execution sections into their pages - Fold secrets into deploy and stopping into invoke, with redirects, and give the code execution platform pages task titles - Add Browser Loop to the integrations grid Co-Authored-By: Claude Opus 5.5 --- apps/deploy.mdx | 85 +++++++++++++++++++++++- apps/develop.mdx | 4 +- apps/invoke.mdx | 67 ++++++++++++++++++- apps/logs.mdx | 4 +- apps/secrets.mdx | 104 ------------------------------ apps/status.mdx | 4 +- apps/stop.mdx | 63 ------------------ browsers/computer-controls.mdx | 10 +++ browsers/playwright-execution.mdx | 13 ++-- changelog.mdx | 2 +- docs.json | 13 ++-- integrations/overview.mdx | 3 + introduction/control.mdx | 79 +++-------------------- 13 files changed, 195 insertions(+), 256 deletions(-) delete mode 100644 apps/secrets.mdx delete mode 100644 apps/stop.mdx diff --git a/apps/deploy.mdx b/apps/deploy.mdx index 1e411963..e574db30 100644 --- a/apps/deploy.mdx +++ b/apps/deploy.mdx @@ -1,5 +1,7 @@ --- -title: "Deploying" +title: "Deploy an App" +sidebarTitle: "Deploy" +description: "Deploy your app to KERNEL, set environment variables, and pass secrets" --- Kernel's app deployment process is as simple as it is fast. There are no configuration files to manage or complex CI/CD pipelines. @@ -94,6 +96,87 @@ const client = new Kernel({ apiKey: process.env.MY_KERNEL_API_KEY }); Now the API calls your app makes go out as your key. The deployment key stays in place for Kernel's own use — running the invocation and reporting its result — so your key only needs permissions for the calls you actually make. +## Secrets + +Pass API keys and other secrets as [environment variables](#environment-variables) when you deploy, with `--env` or `--env-file`. Then read them in your app: + + +```typescript TypeScript +import Anthropic from "@anthropic-ai/sdk"; +import OpenAI from "openai"; + +app.action('ai-action', async (ctx: KernelContext) => { + // Access API keys from environment variables + const anthropic = new Anthropic({ + apiKey: process.env.ANTHROPIC_API_KEY, + }); + + const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + }); + + // Use the clients... +}); +``` + +```python Python +import os +from anthropic import Anthropic +from openai import OpenAI + +@app.action("ai-action") +async def ai_action(ctx: KernelContext): + # Access API keys from environment variables + anthropic = Anthropic( + api_key=os.environ.get("ANTHROPIC_API_KEY"), + ) + + openai = OpenAI( + api_key=os.environ.get("OPENAI_API_KEY"), + ) + + # Use the clients... +``` + + +### Per-invocation secrets + +For use cases where different API keys are needed per invocation (such as platforms using end-user keys), pass the secrets at runtime using the [payload parameter](/apps/invoke#payload-parameter). + +Use encryption standards in your app to protect sensitive data. + + +```typescript TypeScript +import OpenAI from "openai"; + +app.action('ai-action', async (ctx: KernelContext, payload) => { + // Decrypt the API key passed at runtime + const apiKey = decrypt(payload.encryptedApiKey); + + const openai = new OpenAI({ + apiKey: apiKey, + }); + + // Use the client with the user's API key... +}); +``` + +```python Python +from openai import OpenAI + +@app.action("ai-action") +async def ai_action(ctx: KernelContext, payload): + # Decrypt the API key passed at runtime + api_key = decrypt(payload["encryptedApiKey"]) + + openai = OpenAI( + api_key=api_key, + ) + + # Use the client with the user's API key... +``` + + ## Deployment notes - **The dependency manifest (`package.json` for JS/TS, `pyproject.toml` for Python) must be present in the root directory of your project.** diff --git a/apps/develop.mdx b/apps/develop.mdx index f572fac1..fb7c8e54 100644 --- a/apps/develop.mdx +++ b/apps/develop.mdx @@ -1,5 +1,7 @@ --- -title: "Developing" +title: "Develop an App" +sidebarTitle: "Develop" +description: "Build an app with actions that run next to KERNEL browsers" --- In addition to our browser API, Kernel provides a code execution platform for deploying and invoking code. Typically, Kernel's code execution platform is used for deploying and invoking browser automations or web agents. diff --git a/apps/invoke.mdx b/apps/invoke.mdx index 6be6b018..424740ba 100644 --- a/apps/invoke.mdx +++ b/apps/invoke.mdx @@ -1,5 +1,7 @@ --- -title: "Invoking" +title: "Invoke an App" +sidebarTitle: "Invoke" +description: "Run an app action from the API or CLI, pass a payload, and stop a running invocation" --- ## Via API @@ -154,4 +156,67 @@ See [here](/apps/develop#parameters) to learn how to access the payload in your If your action specifies a [return value](/apps/develop#return-values), the invocation returns its value once it completes. (The Kernel CLI uses asynchronous invocations under the hood) + +## Stop an invocation + +You can terminate an invocation that's running. This is useful for stopping automations or agents stuck in an infinite loop. + + +Terminating an invocation also destroys any browsers associated with it. + + +### Via API +You can stop an invocation by setting its status to `failed`. This will cancel the invocation and mark it as terminated. + + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const kernel = new Kernel(); + +const invocation = await kernel.invocations.update('invocation_id', { + status: 'failed', + output: JSON.stringify({ error: 'Invocation cancelled by user' }), +}); +``` + +```python Python +from kernel import Kernel + +kernel = Kernel() +invocation = kernel.invocations.update( + id="invocation_id", + status="failed", + output='{"error":"Invocation cancelled by user"}', +) +``` + +```go Go +package main + +import ( + "context" + + "github.com/kernel/kernel-go-sdk" +) + +func main() { + ctx := context.Background() + client := kernel.NewClient() + + invocation, err := client.Invocations.Update(ctx, "invocation_id", kernel.InvocationUpdateParams{ + Status: kernel.InvocationUpdateParamsStatusFailed, + Output: kernel.String(`{"error":"Invocation cancelled by user"}`), + }) + if err != nil { + panic(err) + } + _ = invocation +} +``` + + +### Via CLI +Use `ctrl-c` in the terminal tab where you launched the invocation. + App invocations accrue compute usage separately from any browsers they create. See the [pricing FAQ](/info/pricing#faq) for how app invocations are charged. diff --git a/apps/logs.mdx b/apps/logs.mdx index 13454391..4995db06 100644 --- a/apps/logs.mdx +++ b/apps/logs.mdx @@ -1,5 +1,7 @@ --- -title: "Logs" +title: "Invocation Logs" +sidebarTitle: "Logs" +description: "Stream an invocation's logs from the API or CLI" --- ## Via API diff --git a/apps/secrets.mdx b/apps/secrets.mdx deleted file mode 100644 index 6b20afbf..00000000 --- a/apps/secrets.mdx +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: "Secrets" ---- - -There are multiple ways to pass secrets and API keys to your Kernel app: - -## 1. Deployment environment variables - -Deploy your app with secrets as [environment variables](/apps/deploy#environment-variables). Your app can then access them at runtime. - -You can set environment variables in two ways: - -- **`--env` flag**: Pass individual key-value pairs directly in the command -- **`--env-file` flag**: Load variables from a `.env` file - -```bash -# Using --env flag for individual variables -kernel deploy my_app.ts --env OPENAI_API_KEY=sk-... --env ANTHROPIC_API_KEY=sk-ant-... - -# Using --env-file to load from a file -kernel deploy my_app.ts --env-file .env - -# Combine both approaches -kernel deploy my_app.ts --env-file .env --env OPENAI_API_KEY=sk-... -``` - -Then access the variables in your app: - - -```typescript TypeScript -import Anthropic from "@anthropic-ai/sdk"; -import OpenAI from "openai"; - -app.action('ai-action', async (ctx: KernelContext) => { - // Access API keys from environment variables - const anthropic = new Anthropic({ - apiKey: process.env.ANTHROPIC_API_KEY, - }); - - const openai = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, - }); - - // Use the clients... -}); -``` - -```python Python -import os -from anthropic import Anthropic -from openai import OpenAI - -@app.action("ai-action") -async def ai_action(ctx: KernelContext): - # Access API keys from environment variables - anthropic = Anthropic( - api_key=os.environ.get("ANTHROPIC_API_KEY"), - ) - - openai = OpenAI( - api_key=os.environ.get("OPENAI_API_KEY"), - ) - - # Use the clients... -``` - - -## 2. Runtime variables - -For use cases where different API keys are needed per invocation (such as platforms using end-user keys), pass the secrets at runtime using the [payload parameter](/apps/invoke#payload-parameter). - -Use encryption standards in your app to protect sensitive data. - - -```typescript TypeScript -import OpenAI from "openai"; - -app.action('ai-action', async (ctx: KernelContext, payload) => { - // Decrypt the API key passed at runtime - const apiKey = decrypt(payload.encryptedApiKey); - - const openai = new OpenAI({ - apiKey: apiKey, - }); - - // Use the client with the user's API key... -}); -``` - -```python Python -from openai import OpenAI - -@app.action("ai-action") -async def ai_action(ctx: KernelContext, payload): - # Decrypt the API key passed at runtime - api_key = decrypt(payload["encryptedApiKey"]) - - openai = OpenAI( - api_key=api_key, - ) - - # Use the client with the user's API key... -``` - \ No newline at end of file diff --git a/apps/status.mdx b/apps/status.mdx index 21a81988..658bfb10 100644 --- a/apps/status.mdx +++ b/apps/status.mdx @@ -1,5 +1,7 @@ --- -title: "Status" +title: "Invocation Status" +sidebarTitle: "Status" +description: "Follow an invocation's status by streaming or polling" --- Once you've [deployed](/apps/deploy) an app and invoked it, you can monitor its status using streaming for real-time updates or polling for periodic checks. diff --git a/apps/stop.mdx b/apps/stop.mdx deleted file mode 100644 index da53a560..00000000 --- a/apps/stop.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Stopping" ---- - -You can terminate an invocation that's running. This is useful for stopping automations or agents stuck in an infinite loop. - - -Terminating an invocation also destroys any browsers associated with it. - - -## Via API -You can stop an invocation by setting its status to `failed`. This will cancel the invocation and mark it as terminated. - - -```typescript Typescript/Javascript -import Kernel from '@onkernel/sdk'; - -const kernel = new Kernel(); - -const invocation = await kernel.invocations.update('invocation_id', { - status: 'failed', - output: JSON.stringify({ error: 'Invocation cancelled by user' }), -}); -``` - -```python Python -from kernel import Kernel - -kernel = Kernel() -invocation = kernel.invocations.update( - id="invocation_id", - status="failed", - output='{"error":"Invocation cancelled by user"}', -) -``` - -```go Go -package main - -import ( - "context" - - "github.com/kernel/kernel-go-sdk" -) - -func main() { - ctx := context.Background() - client := kernel.NewClient() - - invocation, err := client.Invocations.Update(ctx, "invocation_id", kernel.InvocationUpdateParams{ - Status: kernel.InvocationUpdateParamsStatusFailed, - Output: kernel.String(`{"error":"Invocation cancelled by user"}`), - }) - if err != nil { - panic(err) - } - _ = invocation -} -``` - - -## Via CLI -Use `ctrl-c` in the terminal tab where you launched the invocation. diff --git a/browsers/computer-controls.mdx b/browsers/computer-controls.mdx index 98471df0..07b6d994 100644 --- a/browsers/computer-controls.mdx +++ b/browsers/computer-controls.mdx @@ -5,6 +5,16 @@ description: "Control the computer's mouse, keyboard, and screen" Use OS-level controls to move and click the mouse, type and press keys, scroll, drag, and capture screenshots from a running browser session. Both `moveMouse` and `dragMouse` use human-like [Bézier curves](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) by default. +## Why computer use for agents + +Kernel's computer controls are built to match how computer-use models were trained — the same primitives the model emits (screenshot, click at coords, type, key, scroll, drag) map 1:1 onto the API. There's no harness translating model output into framework calls. + +- **Native fit.** Screenshot, click, type, key, scroll, drag — the primitives the model already speaks. +- **Faster screenshots.** Captures bypass CDP, which removes the largest source of latency in a vision loop. +- **Better against bot detection.** No CDP connection means no CDP fingerprint to leak. Pairs naturally with [stealth mode](/browsers/bot-detection/stealth) and [residential proxies](/proxies/residential). +- **Human-like input.** OS-level events with Bézier-curve mouse paths, variable typing speed, and configurable mistype rate. +- **Not DOM-limited.** Screenshots capture the full VM, so the agent can see and interact with native dialogs, canvas elements, iframes, and PDFs — not just things you can address with a selector. + ## Click the mouse Simulate mouse clicks at specific coordinates. You can select the button, click type (down, up, click), number of clicks, and optional modifier keys to hold. diff --git a/browsers/playwright-execution.mdx b/browsers/playwright-execution.mdx index 92991154..70afed40 100644 --- a/browsers/playwright-execution.mdx +++ b/browsers/playwright-execution.mdx @@ -416,14 +416,15 @@ fs.writeFileSync('screenshot.png', buffer); For OS-level screenshots using coordinates and regions, see [Computer Controls](/browsers/computer-controls#take-screenshots). -## Performance benefits +## Why playwright execution over a direct CDP connection -Compared to connecting over CDP: -- **Lower latency** - Code runs in the same VM as the browser -- **Higher throughput** - No websocket overhead for commands -- **Simpler code** - No need to manage CDP connections +If you're reaching for Playwright, prefer the execution API over `connectOverCDP`. Same Playwright API you already know, none of the setup. -This makes it ideal for one-off operations where you need maximum speed. +- **Run from anywhere.** No `playwright` package to version-pin, no Chromium download, no CDP connection to manage. Send the code, get the result. +- **Co-located with the browser.** Code runs in the same VM as the browser — no network hop between your script and the page, fewer flakes. +- **Patchright by default.** Hardened against bot detection out of the box. +- **Full Playwright API.** `page`, `context`, and `browser` are all in scope. Anything Playwright can do — DOM queries, file uploads, full-page screenshots — works here. +- **Returns values.** `return` from your code and the result comes back in the response. Easy to use as an agent tool. ## MCP server integration diff --git a/changelog.mdx b/changelog.mdx index c5e1b712..36363a93 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -610,7 +610,7 @@ For API library updates, see the [Node SDK](https://github.com/onkernel/kernel-n - Fixed screen resize accuracy by removing unnecessary rounding in `ChangeScreenSize` to ensure pixel-perfect display dimensions. ## Documentation updates -- Enhanced [secrets](/apps/secrets) documentation with practical examples for LLM-powered applications and detailed guidance for deploying apps with environment file configurations. +- Enhanced [secrets](/apps/deploy#secrets) documentation with practical examples for LLM-powered applications and detailed guidance for deploying apps with environment file configurations. diff --git a/docs.json b/docs.json index f82eedf8..84968358 100644 --- a/docs.json +++ b/docs.json @@ -7,6 +7,8 @@ { "source": "/careers/engineer-new-grad", "destination": "https://jobs.ashbyhq.com/usekernel" }, { "source": "/careers/customer-engineer", "destination": "https://jobs.ashbyhq.com/usekernel" }, { "source": "/browsers/bot-detection/hcaptcha", "destination": "/browsers/bot-detection/stealth#hcaptcha-beta" }, + { "source": "/apps/secrets", "destination": "/apps/deploy#secrets" }, + { "source": "/apps/stop", "destination": "/apps/invoke#stop-an-invocation" }, { "source": "/auth/agent/overview", "destination": "/auth/managed-auth" }, { "source": "/auth/agent/hosted-ui", "destination": "/auth/hosted-ui" }, { "source": "/auth/agent/programmatic", "destination": "/auth/programmatic" }, @@ -215,23 +217,18 @@ "browsers/computer-controls", "browsers/webmcp", "browsers/repl", - "browsers/browser-loop", + "browsers/process-execution", + "browsers/file-io", { "group": "Code Execution Platform", "pages": [ "apps/develop", "apps/deploy", "apps/invoke", - "apps/stop", - "apps/secrets", "apps/status", "apps/logs" ] - }, - "browsers/curl", - "browsers/file-io", - "browsers/process-execution", - "browsers/ssh" + } ] }, { diff --git a/integrations/overview.mdx b/integrations/overview.mdx index 9d34274f..b44e776d 100644 --- a/integrations/overview.mdx +++ b/integrations/overview.mdx @@ -57,6 +57,9 @@ Agent frameworks for writing the loop yourself, with a Kernel browser as one of Run Browser Use agents on Kernel browsers. + + KERNEL's framework-neutral browser tools for any agent framework, with the declarations each model provider expects. + ## Computer use models diff --git a/introduction/control.mdx b/introduction/control.mdx index d0016a28..83dd06d8 100644 --- a/introduction/control.mdx +++ b/introduction/control.mdx @@ -11,12 +11,14 @@ You make two choices before you write any automation. They're independent, but t ## 1. How you drive the browser -Kernel browsers accept four control surfaces. Pick by what's driving the page, not by what you already know. +KERNEL browsers accept several control surfaces. Pick by what's driving the page, not by what you already know. | Surface | Use it when | Trade-off | | --- | --- | --- | | [Playwright execution](/browsers/playwright-execution) | **Default.** You know what to do on the page — navigate, fill, extract, upload. | Needs a selector or DOM path that exists. | | [Computer controls](/browsers/computer-controls) | **Recommended fallback.** A model is looking at pixels, or the page can't be driven programmatically. | Slower per step, and the model has to see the state to act. | +| [WebMCP](/browsers/webmcp) | The site exposes structured tools for the action you need. | Only works on sites that register tools. | +| [Browser REPL](/browsers/repl) | An agent writes its own helpers and reuses them across turns. | JavaScript only, and state lives until the REPL resets. | | CDP | You have an existing Playwright, Puppeteer, or CDP codebase to point at Kernel. | Adds a protocol fingerprint and a network hop. | | WebDriver BiDi | You need the W3C standard protocol. | Smaller client ecosystem. | @@ -266,81 +268,20 @@ A computer use agent answers the first question, not the second — it still has | Agent on a site with aggressive detection | Computer controls | Code execution platform | | Existing Playwright suite you're migrating | CDP | Your own CI, then move hot paths to playwright execution | -## Why computer use for agents - -Kernel's computer controls are built to match how computer-use models were trained — the same primitives the model emits (screenshot, click at coords, type, key, scroll, drag) map 1:1 onto the API. There's no harness translating model output into framework calls. - -- **Native fit.** Screenshot, click, type, key, scroll, drag — the primitives the model already speaks. -- **Faster screenshots.** Captures bypass CDP, which removes the largest source of latency in a vision loop. -- **Better against bot detection.** No CDP connection means no CDP fingerprint to leak. Pairs naturally with [stealth mode](/browsers/bot-detection/stealth) and [residential proxies](/proxies/residential). -- **Human-like input.** OS-level events with Bézier-curve mouse paths, variable typing speed, and configurable mistype rate. -- **Not DOM-limited.** Screenshots capture the full VM, so the agent can see and interact with native dialogs, canvas elements, iframes, and PDFs — not just things you can address with a selector. - -## Why playwright execution over a direct CDP connection - -If you're reaching for Playwright, prefer the execution API over `connectOverCDP`. Same Playwright API you already know, none of the setup. - -- **Run from anywhere.** No `playwright` package to version-pin, no Chromium download, no CDP connection to manage. Send the code, get the result. -- **Co-located with the browser.** Code runs in the same VM as the browser — no network hop between your script and the page, fewer flakes. -- **Patchright by default.** Hardened against bot detection out of the box. -- **Full Playwright API.** `page`, `context`, and `browser` are all in scope. Anything Playwright can do — DOM queries, file uploads, full-page screenshots — works here. -- **Returns values.** `return` from your code and the result comes back in the response. Easy to use as an agent tool. - ## Computer use + playwright execution Computer controls drive the browser the way a person would — they don't speak the programmatic API surface. Anything you'd reach for the DOM or Playwright client for (reading text and attributes, `page.goto`, file uploads, cookie or storage access, switching tabs) belongs on the [playwright execution](/browsers/playwright-execution) side. When computer use is driving, expose playwright execution to the agent as a tool it can call for structured data or a programmatic action. For the full pattern in the other direction — playwright execution first, computer use when a step doesn't respond to a selector — see [playwright with computer use fallback](/browsers/playwright-computer-use-fallback). - -```typescript Typescript/Javascript -const response = await kernel.browsers.playwright.execute( - kernelBrowser.session_id, - { - code: ` - const rows = await page.$$eval('table tr', (trs) => - trs.map((tr) => Array.from(tr.querySelectorAll('td')).map((td) => td.textContent)) - ); - return rows; - `, - }, -); - -console.log(response.result); -``` - -```python Python -response = kernel.browsers.playwright.execute( - id=kernel_browser.session_id, - code=""" - const rows = await page.$$eval('table tr', (trs) => - trs.map((tr) => Array.from(tr.querySelectorAll('td')).map((td) => td.textContent)) - ); - return rows; - """, -) +## Lower-level access -print(response.result) -``` +For work that isn't driving the page, you can also reach the browser's VM directly: -```go Go -response, err := client.Browsers.Playwright.Execute( - ctx, - kernelBrowser.SessionID, - kernel.BrowserPlaywrightExecuteParams{ - Code: ` - const rows = await page.$$eval('table tr', (trs) => - trs.map((tr) => Array.from(tr.querySelectorAll('td')).map((td) => td.textContent)) - ); - return rows; - `, - }, -) -if err != nil { - panic(err) -} +- **[Browser curl](/browsers/curl):** send HTTP requests through the browser's network stack, with its cookies and proxy. +- **[SSH](/browsers/ssh):** open a shell in the browser's VM, or forward a local port into it. -fmt.Println(response.Result) -``` - +## Give a model these surfaces as tools + +If you're building your own agent, [Browser Loop](/browsers/browser-loop) packages these surfaces as tools for each model provider and runs every action against a KERNEL browser, so you don't write the translation layer yourself. ## Going deeper From 0e1bcefaa1a8df5ccba63ecaeba9df253f483251 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:29:44 +0000 Subject: [PATCH 68/78] Order Scale as concurrency and limits, performance, then browser pools Co-Authored-By: Claude Opus 5.5 --- docs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs.json b/docs.json index 84968358..8bf94429 100644 --- a/docs.json +++ b/docs.json @@ -235,9 +235,9 @@ "group": "Scale", "pages": [ "introduction/scale", - "browsers/pools", "browsers/concurrency-and-limits", - "browsers/performance" + "browsers/performance", + "browsers/pools" ] }, { From f7ad11f8bb27bc290321d236202d02613423ee2a Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:31:14 +0000 Subject: [PATCH 69/78] Lead the Scale overview with limits and performance Order the page as limits, performance, then the on-demand versus pool decision, keeping on-demand as the default. Builds on the browser pool guidance in the open pool clarification PR. Co-Authored-By: Claude Opus 5.5 --- introduction/scale.mdx | 76 ++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/introduction/scale.mdx b/introduction/scale.mdx index a0a266cc..6672b3a4 100644 --- a/introduction/scale.mdx +++ b/introduction/scale.mdx @@ -1,53 +1,70 @@ --- title: "Scale" sidebarTitle: "Overview" -description: "Recommended practices for scaling in production" +description: "Plan around your limits, keep browsers fast, and decide whether a browser pool fits" --- -## Overview -This guide covers how to run Kernel in production at scale — which architecture to build around browser creation, and when to reach for a browser pool. It assumes you're comfortable [creating](/introduction/create) and [controlling](/introduction/control) browsers; for the mechanics of standing up a pool and acquiring from it, see [Browser Pools](/browsers/pools). +Scaling an agent on KERNEL comes down to three questions, in this order: how many browsers you can run and create, how fast each one starts, and whether your workload needs a browser pool. Most workloads scale on on-demand browsers alone. This guide assumes you're comfortable [creating](/introduction/configure) and [controlling](/introduction/control) browsers. -## Why a browser pool +## 1. Know your limits -A [browser pool](/browsers/pools) keeps a set of identically-configured browsers ready for immediate use. Compared to creating browsers on demand, it gives you: +Three limits shape a workload at scale, and each is covered in [concurrency and limits](/browsers/concurrency-and-limits): -- **Low-latency acquisition** — the browser is already booted with your configuration applied (including settings like custom viewports, extensions, and kiosk-mode live view that otherwise [restart Chromium](/browsers/performance#troubleshooting-latency) on a fresh browser), so `acquire` hands you one that's ready to drive. -- **Reserved, pre-configured capacity** — a fixed set of browsers on your exact configuration, ready before traffic arrives. -- **Higher creation throughput** — acquiring from a pool isn't subject to the [rate limit](/browsers/concurrency-and-limits#rate-limits) on `browsers.create()` that high-volume workloads hit. +- **Concurrency:** how many browsers can exist at once across your organization. Browsers in [standby](/browsers/standby) still count, so delete browsers when a task finishes to free the slot. +- **Create rate:** how fast you can create new browsers. Exceeding it returns `429 Too Many Requests`, which the SDKs retry automatically. +- **Per-browser resources:** how much memory each browser has, which caps how many tabs and how heavy a page one browser can handle. -The tradeoff: a browser pool counts against your concurrency limit whether or not its browsers are currently acquired — a pool sized to 40 holds 40 of your limit. Idle pooled browsers aren't billed, but they hold the slot. +Each plan has set limits, and they go up when you [upgrade your plan](/info/pricing). Enterprise limits are custom. Use [project concurrency limits](/info/projects#concurrency-limits) to split one organization's limit across teams or environments. -## When to use a pool vs on-demand +## 2. Keep browsers fast -Reach for a **browser pool** when: +A browser is created in about 30ms at P50 and 105ms at P99 ([performance](/browsers/performance)). Most slow starts come from configuration rather than load: custom viewports, extensions, and kiosk mode restart Chromium on creation and add seconds. Check [troubleshooting latency](/browsers/performance#troubleshooting-latency) before reaching for anything else, and run your code next to the browser with [Playwright execution](/browsers/playwright-execution) or the [code execution platform](/apps/develop) to cut the time each action takes. -- you're running the same workload repeatedly, in production -- acquisition latency matters — a cold start is unacceptable (for example, a synchronous, user-facing action) -- traffic is steady or high-frequency enough to keep the browser pool utilized -- you're hitting the `browsers.create()` rate limit at volume +## 3. Decide between on-demand browsers and a browser pool + +We recommend defaulting to on-demand browsers, both when you're getting started and as you scale. Browser pools fit a specific type of workload, described below. Stick with **on-demand `browsers.create()`** when: -- volume is low, bursty, one-off, or you're still developing -- each session needs a different configuration (a pool is one fixed config) +- you're still building +- your configuration changes per user (a pool is one fixed config) - you need a GPU browser (not available in pools) -Concurrency and request patterns are how you *size* a pool once you've decided to use one — not a threshold that gates whether pools are worth it. Even a small pool pays off when acquisition latency matters and demand is steady. +Reach for a **browser pool** when: + +- you've built and scaled your workload, and every run uses the same workload attributes +- you're hitting the `browsers.create()` rate limit at volume +- you need the lowest possible acquisition latency (for example, a heavily customized browser config) +- traffic is steady or high-frequency enough to keep the browser pool utilized + + + If you're on an Enterprise plan, speak with your account manager about applicable rate limits for `browsers.create()` and what's best for your workloads. + + +### What a browser pool gives you -## Sizing +A [browser pool](/browsers/pools) keeps a set of identically-configured browsers ready for immediate use. Compared to creating browsers on demand, it gives you: + +- **Lowest-latency acquisition** — the browser is already booted with your configuration applied (including settings like custom viewports, extensions, and kiosk-mode live view that otherwise [restart Chromium](/browsers/performance#troubleshooting-latency) on a fresh browser), so `acquire` hands you one that's ready to drive. +- **Reserved, pre-configured capacity** — a fixed set of browsers on your exact configuration, ready before traffic arrives. +- **Higher creation throughput** — acquiring from a pool isn't subject to the [rate limit](/browsers/concurrency-and-limits#rate-limits) on `browsers.create()` that high-volume workloads hit. + +The tradeoff: a browser pool counts against your concurrency limit whether or not its browsers are currently acquired — a pool sized to 40 holds 40 of your limit. Idle pooled browsers aren't billed, but they hold the slot. + +### Sizing a pool Watch `available_count` and target 10–20% available under normal load, resizing before traffic peaks rather than during them. See [Sizing a browser pool](/browsers/pools#sizing-a-browser-pool) for the full guidance. ## Architecture patterns -### Direct browser creation (POC) +### On-demand creation -For proof-of-concept work and early production systems with modest concurrency needs, creating browsers on-demand is the simplest approach. +Creating a browser per task is the simplest approach. It's the right fit while you're building and when each task needs its own configuration. **When to use:** -- Low or unpredictable volume -- Infrequent or one-off workloads - Early development and testing +- Configuration that changes per user or per task +- GPU browsers @@ -85,9 +102,9 @@ async function processTask(taskData: any) { ``` -### Single browser pool (scaling) +### Single browser pool -For production systems with consistent, high-frequency workloads, a browser pool allows you to access higher concurrency plus predictable performance. +For production workloads that run on the same configuration every time, a browser pool hands you ready-to-drive browsers, and acquiring from it isn't subject to the `browsers.create()` rate limit. **When to use:** - Consistent, high-frequency workloads on a fixed configuration @@ -152,12 +169,12 @@ async function processTask(taskData: any) { - Always release browsers in a `finally` block to prevent browser pool exhaustion - Set `acquire_timeout_seconds` based on your SLA requirements -### Queue-based processing (high scale) +### Queue-based processing -For systems exceeding browser pool capacity or with unpredictable bursts, implement a task queue to manage workloads gracefully. +When request volume exceeds your concurrency or traffic arrives in unpredictable bursts, put a task queue in front of your browsers. The example below acquires from a browser pool; the same pattern works on demand, with `browsers.create()` in place of `acquire` and `deleteByID` in place of `release`. **When to use:** -- Request volume exceeds a single browser pool's capacity +- Request volume exceeds your available concurrency - Highly variable traffic patterns - Need to prioritize certain tasks - Want to decouple request ingestion from processing @@ -165,8 +182,9 @@ For systems exceeding browser pool capacity or with unpredictable bursts, implem ```typescript -import { Queue } from 'bullmq'; // or any queue system +import { Queue, Worker } from 'bullmq'; // or any queue system import Kernel from '@onkernel/sdk'; +import { chromium } from 'playwright'; const kernel = new Kernel(); const POOL_NAME = 'production-pool'; From 2f04b3c6b5a8fa1a49fcde61bb5c38d7162cd586 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:32:10 +0000 Subject: [PATCH 70/78] Group browser telemetry pages under Observe Co-Authored-By: Claude Opus 5.5 --- browsers/telemetry/categories.mdx | 1 + browsers/telemetry/export.mdx | 1 + browsers/telemetry/overview.mdx | 3 ++- browsers/telemetry/streaming.mdx | 1 + docs.json | 13 +++++++++---- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/browsers/telemetry/categories.mdx b/browsers/telemetry/categories.mdx index fede1c6a..0a20b1cf 100644 --- a/browsers/telemetry/categories.mdx +++ b/browsers/telemetry/categories.mdx @@ -1,5 +1,6 @@ --- title: "Telemetry Categories" +sidebarTitle: "Categories" description: "The categories a browser session can capture, what each contains, and their cost" --- diff --git a/browsers/telemetry/export.mdx b/browsers/telemetry/export.mdx index 6cc11018..39c11bf2 100644 --- a/browsers/telemetry/export.mdx +++ b/browsers/telemetry/export.mdx @@ -1,5 +1,6 @@ --- title: "Export Telemetry" +sidebarTitle: "Export" description: "Send a session's captured events to your own observability backend over OTLP" --- diff --git a/browsers/telemetry/overview.mdx b/browsers/telemetry/overview.mdx index f98f5b3c..f129baf8 100644 --- a/browsers/telemetry/overview.mdx +++ b/browsers/telemetry/overview.mdx @@ -1,5 +1,6 @@ --- -title: "Telemetry Overview" +title: "Browser Telemetry" +sidebarTitle: "Overview" description: "Capture what happens inside a browser session" --- diff --git a/browsers/telemetry/streaming.mdx b/browsers/telemetry/streaming.mdx index 5f064ade..f096f856 100644 --- a/browsers/telemetry/streaming.mdx +++ b/browsers/telemetry/streaming.mdx @@ -1,5 +1,6 @@ --- title: "Stream Telemetry" +sidebarTitle: "Streaming" description: "Consume a session's live telemetry stream from the SDK or CLI" --- diff --git a/docs.json b/docs.json index 8bf94429..56f1a63a 100644 --- a/docs.json +++ b/docs.json @@ -246,10 +246,15 @@ "introduction/observe", "browsers/live-view", "browsers/replays", - "browsers/telemetry/overview", - "browsers/telemetry/categories", - "browsers/telemetry/streaming", - "browsers/telemetry/export" + { + "group": "Browser Telemetry", + "pages": [ + "browsers/telemetry/overview", + "browsers/telemetry/categories", + "browsers/telemetry/streaming", + "browsers/telemetry/export" + ] + } ] }, { From 5b3ca7f5934a8d5f259d3bb41683fd4b4b4abf17 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:35:00 +0000 Subject: [PATCH 71/78] Name each section overview in the sidebar Co-Authored-By: Claude Opus 5.5 --- auth/managed-auth.mdx | 2 +- auth/overview.mdx | 3 ++- browsers/bot-detection/overview.mdx | 2 +- browsers/payments.mdx | 2 +- browsers/profiles.mdx | 2 +- browsers/telemetry/overview.mdx | 2 +- info/enterprise.mdx | 2 +- introduction/configure.mdx | 2 +- introduction/control.mdx | 2 +- introduction/manage.mdx | 2 +- introduction/observe.mdx | 2 +- introduction/scale.mdx | 2 +- proxies/overview.mdx | 2 +- vaults/overview.mdx | 2 +- 14 files changed, 15 insertions(+), 14 deletions(-) diff --git a/auth/managed-auth.mdx b/auth/managed-auth.mdx index 2e0bcda7..660fcd65 100644 --- a/auth/managed-auth.mdx +++ b/auth/managed-auth.mdx @@ -1,6 +1,6 @@ --- title: "Managed Auth" -sidebarTitle: "Overview" +sidebarTitle: "Managed Auth Overview" description: "Handle website login, reuse session state, and recover eligible connections automatically" --- diff --git a/auth/overview.mdx b/auth/overview.mdx index 99893cd2..4447fcfd 100644 --- a/auth/overview.mdx +++ b/auth/overview.mdx @@ -1,5 +1,6 @@ --- -title: "Overview" +title: "Authentication" +sidebarTitle: "Authentication Overview" description: "Choose how your browser agents authenticate and reuse signed-in sessions" --- diff --git a/browsers/bot-detection/overview.mdx b/browsers/bot-detection/overview.mdx index 52389080..18091859 100644 --- a/browsers/bot-detection/overview.mdx +++ b/browsers/bot-detection/overview.mdx @@ -1,6 +1,6 @@ --- title: "Stealth" -sidebarTitle: "Overview" +sidebarTitle: "Stealth Overview" description: "Help your browser agents access websites with anti-detection defaults, stealth mode, proxies, and opt-in Web Bot Auth (WBA)." --- diff --git a/browsers/payments.mdx b/browsers/payments.mdx index 3003d03b..3f2164d4 100644 --- a/browsers/payments.mdx +++ b/browsers/payments.mdx @@ -1,6 +1,6 @@ --- title: "Payments" -sidebarTitle: "Overview" +sidebarTitle: "Payments Overview" description: "Let browser agents complete purchases without handling raw payment details" --- diff --git a/browsers/profiles.mdx b/browsers/profiles.mdx index de1198be..404386da 100644 --- a/browsers/profiles.mdx +++ b/browsers/profiles.mdx @@ -1,6 +1,6 @@ --- title: "Browser Profiles" -sidebarTitle: "Overview" +sidebarTitle: "Profiles Overview" description: "Persist and reuse browser state across browser sessions" --- diff --git a/browsers/telemetry/overview.mdx b/browsers/telemetry/overview.mdx index f129baf8..9562ba0d 100644 --- a/browsers/telemetry/overview.mdx +++ b/browsers/telemetry/overview.mdx @@ -1,6 +1,6 @@ --- title: "Browser Telemetry" -sidebarTitle: "Overview" +sidebarTitle: "Telemetry Overview" description: "Capture what happens inside a browser session" --- diff --git a/info/enterprise.mdx b/info/enterprise.mdx index 87e04d55..e088bd10 100644 --- a/info/enterprise.mdx +++ b/info/enterprise.mdx @@ -1,6 +1,6 @@ --- title: "Enterprise" -sidebarTitle: "Overview" +sidebarTitle: "Enterprise Overview" description: "Security, compliance, HIPAA, and zero data retention on Kernel's Enterprise plan" --- diff --git a/introduction/configure.mdx b/introduction/configure.mdx index 05138234..b43ae427 100644 --- a/introduction/configure.mdx +++ b/introduction/configure.mdx @@ -1,6 +1,6 @@ --- title: "Configure" -sidebarTitle: "Overview" +sidebarTitle: "Configure Overview" description: "Create a browser, pick its shape, and choose what it carries onto a site" mode: "wide" --- diff --git a/introduction/control.mdx b/introduction/control.mdx index 83dd06d8..32d4f823 100644 --- a/introduction/control.mdx +++ b/introduction/control.mdx @@ -1,6 +1,6 @@ --- title: "How You Drive the Browser" -sidebarTitle: "Overview" +sidebarTitle: "Control Overview" description: "Choose a control surface and where your agent loop runs" --- diff --git a/introduction/manage.mdx b/introduction/manage.mdx index e155d467..b0270dca 100644 --- a/introduction/manage.mdx +++ b/introduction/manage.mdx @@ -1,6 +1,6 @@ --- title: "Manage" -sidebarTitle: "Overview" +sidebarTitle: "Manage Overview" description: "Organize, secure, and govern how your team uses KERNEL" mode: "wide" --- diff --git a/introduction/observe.mdx b/introduction/observe.mdx index b94194e0..c81381b8 100644 --- a/introduction/observe.mdx +++ b/introduction/observe.mdx @@ -1,6 +1,6 @@ --- title: "Observe" -sidebarTitle: "Overview" +sidebarTitle: "Observe Overview" description: "Watch your agent work, debug what went wrong" --- diff --git a/introduction/scale.mdx b/introduction/scale.mdx index 6672b3a4..ad4e2aed 100644 --- a/introduction/scale.mdx +++ b/introduction/scale.mdx @@ -1,6 +1,6 @@ --- title: "Scale" -sidebarTitle: "Overview" +sidebarTitle: "Scale Overview" description: "Plan around your limits, keep browsers fast, and decide whether a browser pool fits" --- diff --git a/proxies/overview.mdx b/proxies/overview.mdx index faafaa78..bfdb32eb 100644 --- a/proxies/overview.mdx +++ b/proxies/overview.mdx @@ -1,6 +1,6 @@ --- title: "Proxies" -sidebarTitle: "Overview" +sidebarTitle: "Proxies Overview" --- Kernel proxies enable you to route browser traffic through different types of proxy servers, providing enhanced privacy, flexibility, and bot detection avoidance. Proxies can be created once and reused across multiple browser sessions. diff --git a/vaults/overview.mdx b/vaults/overview.mdx index 1071c22b..ad46839b 100644 --- a/vaults/overview.mdx +++ b/vaults/overview.mdx @@ -1,6 +1,6 @@ --- title: "Vaults" -sidebarTitle: "Overview" +sidebarTitle: "Vaults Overview" description: "Group credentials and payment items, collect values, and control their use by attached browsers" --- From 49c9855ed22951ea71ae7502f968c488e01624c0 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:35:18 +0000 Subject: [PATCH 72/78] Give integration overview pages specific titles Co-Authored-By: Claude Opus 5.5 --- integrations/claude/overview.mdx | 2 +- integrations/computer-use/overview.mdx | 2 +- integrations/stripe-projects.mdx | 2 +- integrations/vercel/overview.mdx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/claude/overview.mdx b/integrations/claude/overview.mdx index a24d6a60..e1f4b7ea 100644 --- a/integrations/claude/overview.mdx +++ b/integrations/claude/overview.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Claude Overview" description: "Give Claude a Kernel cloud browser — across Claude Code, Claude Desktop, the Agent SDK, and Managed Agents" --- diff --git a/integrations/computer-use/overview.mdx b/integrations/computer-use/overview.mdx index 0e1e9f8b..7b603833 100644 --- a/integrations/computer-use/overview.mdx +++ b/integrations/computer-use/overview.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Computer Use Overview" description: "Run computer use agents on Kernel cloud browsers" --- diff --git a/integrations/stripe-projects.mdx b/integrations/stripe-projects.mdx index 2adc066e..e01c16d5 100644 --- a/integrations/stripe-projects.mdx +++ b/integrations/stripe-projects.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Stripe Projects Overview" description: "Provision Kernel cloud browsers and plans through the Stripe Projects CLI" --- diff --git a/integrations/vercel/overview.mdx b/integrations/vercel/overview.mdx index b42b31a9..823409b9 100644 --- a/integrations/vercel/overview.mdx +++ b/integrations/vercel/overview.mdx @@ -1,5 +1,5 @@ --- -title: "Overview" +title: "Vercel Overview" description: "Integrate Kernel with Vercel for seamless browser automation in your web applications" --- From 9bfb7019be194bc56b243cbc4335b5493caed40a Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:36:23 +0000 Subject: [PATCH 73/78] Put the section name in overview page titles, keep Overview in the sidebar Co-Authored-By: Claude Opus 5.5 --- auth/managed-auth.mdx | 4 ++-- auth/overview.mdx | 4 ++-- browsers/bot-detection/overview.mdx | 4 ++-- browsers/payments.mdx | 4 ++-- browsers/profiles.mdx | 4 ++-- browsers/telemetry/overview.mdx | 4 ++-- info/enterprise.mdx | 4 ++-- introduction/configure.mdx | 4 ++-- introduction/control.mdx | 4 ++-- introduction/manage.mdx | 4 ++-- introduction/observe.mdx | 4 ++-- introduction/scale.mdx | 4 ++-- proxies/overview.mdx | 4 ++-- vaults/overview.mdx | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/auth/managed-auth.mdx b/auth/managed-auth.mdx index 660fcd65..10a23c10 100644 --- a/auth/managed-auth.mdx +++ b/auth/managed-auth.mdx @@ -1,6 +1,6 @@ --- -title: "Managed Auth" -sidebarTitle: "Managed Auth Overview" +title: "Managed Auth Overview" +sidebarTitle: "Overview" description: "Handle website login, reuse session state, and recover eligible connections automatically" --- diff --git a/auth/overview.mdx b/auth/overview.mdx index 4447fcfd..177a9f78 100644 --- a/auth/overview.mdx +++ b/auth/overview.mdx @@ -1,6 +1,6 @@ --- -title: "Authentication" -sidebarTitle: "Authentication Overview" +title: "Authentication Overview" +sidebarTitle: "Overview" description: "Choose how your browser agents authenticate and reuse signed-in sessions" --- diff --git a/browsers/bot-detection/overview.mdx b/browsers/bot-detection/overview.mdx index 18091859..4f17bf7d 100644 --- a/browsers/bot-detection/overview.mdx +++ b/browsers/bot-detection/overview.mdx @@ -1,6 +1,6 @@ --- -title: "Stealth" -sidebarTitle: "Stealth Overview" +title: "Stealth Overview" +sidebarTitle: "Overview" description: "Help your browser agents access websites with anti-detection defaults, stealth mode, proxies, and opt-in Web Bot Auth (WBA)." --- diff --git a/browsers/payments.mdx b/browsers/payments.mdx index 3f2164d4..b5cdcee2 100644 --- a/browsers/payments.mdx +++ b/browsers/payments.mdx @@ -1,6 +1,6 @@ --- -title: "Payments" -sidebarTitle: "Payments Overview" +title: "Payments Overview" +sidebarTitle: "Overview" description: "Let browser agents complete purchases without handling raw payment details" --- diff --git a/browsers/profiles.mdx b/browsers/profiles.mdx index 404386da..71e4137b 100644 --- a/browsers/profiles.mdx +++ b/browsers/profiles.mdx @@ -1,6 +1,6 @@ --- -title: "Browser Profiles" -sidebarTitle: "Profiles Overview" +title: "Profiles Overview" +sidebarTitle: "Overview" description: "Persist and reuse browser state across browser sessions" --- diff --git a/browsers/telemetry/overview.mdx b/browsers/telemetry/overview.mdx index 9562ba0d..94ba1a04 100644 --- a/browsers/telemetry/overview.mdx +++ b/browsers/telemetry/overview.mdx @@ -1,6 +1,6 @@ --- -title: "Browser Telemetry" -sidebarTitle: "Telemetry Overview" +title: "Telemetry Overview" +sidebarTitle: "Overview" description: "Capture what happens inside a browser session" --- diff --git a/info/enterprise.mdx b/info/enterprise.mdx index e088bd10..1d5cce95 100644 --- a/info/enterprise.mdx +++ b/info/enterprise.mdx @@ -1,6 +1,6 @@ --- -title: "Enterprise" -sidebarTitle: "Enterprise Overview" +title: "Enterprise Overview" +sidebarTitle: "Overview" description: "Security, compliance, HIPAA, and zero data retention on Kernel's Enterprise plan" --- diff --git a/introduction/configure.mdx b/introduction/configure.mdx index b43ae427..a7fb46f1 100644 --- a/introduction/configure.mdx +++ b/introduction/configure.mdx @@ -1,6 +1,6 @@ --- -title: "Configure" -sidebarTitle: "Configure Overview" +title: "Configure Overview" +sidebarTitle: "Overview" description: "Create a browser, pick its shape, and choose what it carries onto a site" mode: "wide" --- diff --git a/introduction/control.mdx b/introduction/control.mdx index 32d4f823..d47b089d 100644 --- a/introduction/control.mdx +++ b/introduction/control.mdx @@ -1,6 +1,6 @@ --- -title: "How You Drive the Browser" -sidebarTitle: "Control Overview" +title: "Control Overview" +sidebarTitle: "Overview" description: "Choose a control surface and where your agent loop runs" --- diff --git a/introduction/manage.mdx b/introduction/manage.mdx index b0270dca..a3bceb8a 100644 --- a/introduction/manage.mdx +++ b/introduction/manage.mdx @@ -1,6 +1,6 @@ --- -title: "Manage" -sidebarTitle: "Manage Overview" +title: "Manage Overview" +sidebarTitle: "Overview" description: "Organize, secure, and govern how your team uses KERNEL" mode: "wide" --- diff --git a/introduction/observe.mdx b/introduction/observe.mdx index c81381b8..97613025 100644 --- a/introduction/observe.mdx +++ b/introduction/observe.mdx @@ -1,6 +1,6 @@ --- -title: "Observe" -sidebarTitle: "Observe Overview" +title: "Observe Overview" +sidebarTitle: "Overview" description: "Watch your agent work, debug what went wrong" --- diff --git a/introduction/scale.mdx b/introduction/scale.mdx index ad4e2aed..8567bccf 100644 --- a/introduction/scale.mdx +++ b/introduction/scale.mdx @@ -1,6 +1,6 @@ --- -title: "Scale" -sidebarTitle: "Scale Overview" +title: "Scale Overview" +sidebarTitle: "Overview" description: "Plan around your limits, keep browsers fast, and decide whether a browser pool fits" --- diff --git a/proxies/overview.mdx b/proxies/overview.mdx index bfdb32eb..c220a1fd 100644 --- a/proxies/overview.mdx +++ b/proxies/overview.mdx @@ -1,6 +1,6 @@ --- -title: "Proxies" -sidebarTitle: "Proxies Overview" +title: "Proxies Overview" +sidebarTitle: "Overview" --- Kernel proxies enable you to route browser traffic through different types of proxy servers, providing enhanced privacy, flexibility, and bot detection avoidance. Proxies can be created once and reused across multiple browser sessions. diff --git a/vaults/overview.mdx b/vaults/overview.mdx index ad46839b..a44bc138 100644 --- a/vaults/overview.mdx +++ b/vaults/overview.mdx @@ -1,6 +1,6 @@ --- -title: "Vaults" -sidebarTitle: "Vaults Overview" +title: "Vaults Overview" +sidebarTitle: "Overview" description: "Group credentials and payment items, collect values, and control their use by attached browsers" --- From 72ce807ae52e84bb379f4208699027af36aabe60 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:41:14 +0000 Subject: [PATCH 74/78] Reorder Manage, add multi-tenant guidance, and clarify the firewall allowlist - Order Manage as projects, API keys, spending caps, audit logs, then the firewall allowlist - Retitle Network Access so it reads as an allowlist of KERNEL domains - Add a multi-tenant setups section to the Manage overview - Use sentence case on the Projects page and link plan limits Co-Authored-By: Claude Opus 5.5 --- browsers/live-view.mdx | 2 +- docs.json | 4 ++-- info/network-access.mdx | 3 ++- info/projects.mdx | 16 ++++++++-------- introduction/control.mdx | 2 +- introduction/manage.mdx | 19 ++++++++++++++----- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/browsers/live-view.mdx b/browsers/live-view.mdx index 62862928..2682dff7 100644 --- a/browsers/live-view.mdx +++ b/browsers/live-view.mdx @@ -76,7 +76,7 @@ If your environment restricts outbound traffic, allow the [Live View domains and To enable clipboard sharing, add `allow="autoplay; clipboard-read; clipboard-write"` to the iframe element. -If your application uses a **Content Security Policy (CSP)**, you must add the following directives to allow the live view iframe and its WebSocket connection. See [Network access](/info/network-access#content-security-policy) for the complete firewall and CSP requirements. +If your application uses a **Content Security Policy (CSP)**, you must add the following directives to allow the live view iframe and its WebSocket connection. See [firewall allowlist](/info/network-access#content-security-policy) for the complete firewall and CSP requirements. ``` frame-src https://*.onkernel.com:8443 diff --git a/docs.json b/docs.json index 56f1a63a..03c6a493 100644 --- a/docs.json +++ b/docs.json @@ -263,9 +263,9 @@ "introduction/manage", "info/projects", "info/api-keys", + "info/spending-caps", "info/audit-logs", - "info/network-access", - "info/spending-caps" + "info/network-access" ] } ] diff --git a/info/network-access.mdx b/info/network-access.mdx index 64fe89cf..44ea7259 100644 --- a/info/network-access.mdx +++ b/info/network-access.mdx @@ -1,5 +1,6 @@ --- -title: "Network Access" +title: "Allowlist KERNEL Domains" +sidebarTitle: "Firewall Allowlist" description: "Domain and port allowlist for connecting to Kernel" --- diff --git a/info/projects.mdx b/info/projects.mdx index b9f37a88..9757b052 100644 --- a/info/projects.mdx +++ b/info/projects.mdx @@ -5,13 +5,13 @@ description: "Organize resources and isolate access within your Kernel organizat A **Project** is a named container for Kernel resources inside an organization. Use projects to separate environments (like `production` and `staging`), split resources between teams, or isolate customer workloads — each project has its own browsers, profiles, credentials, proxies, extensions, deployments, and browser pools. -## Why Projects? +## Why projects? - **Isolate environments** — keep `production` resources apart from `staging` or experiments. - **Scope access** — issue API keys that can only see resources in one project. - **Concurrency limits** — set an org-wide default cap for every project, or override it per project, so one team or environment can't exhaust your org quota. -## The Default Project +## The default project Every organization has at least one project. Resources that existed before projects were introduced have been moved into a project named **Default**, so your existing browsers, apps, profiles, and other resources continue to work without any changes on your end. @@ -23,7 +23,7 @@ Your organization must always have **at least one active project**. The API retu A project must also be empty before it can be deleted. If active resources remain, the API returns `409 Conflict` with code `project_not_empty`; delete or otherwise remove those resources and retry. Organizations without Projects enabled receive `404 Not Found` with code `projects_disabled` from project-management endpoints. -## Scoping Requests to a Project +## Scoping requests to a project Pass the `X-Kernel-Project-Id` header with a project ID on any API request to scope it to a specific project. Project names are not accepted in this header. Without the header (and without a project-scoped API key), requests act on your organization's **default project**: reads return the default project's resources, and writes create resources in it. @@ -98,7 +98,7 @@ func main() { ``` -## Authentication and Project Scope +## Authentication and project scope ### API keys @@ -112,7 +112,7 @@ API keys can be **org-wide** or **project-scoped**. OAuth tokens (used by the Kernel CLI and MCP server) are **always org-wide**. You cannot bind an OAuth session to a single project. To scope OAuth-authenticated requests, send the `X-Kernel-Project-Id` header with each request — or use the CLI's `--project` flag (see below). -## Using Projects from the CLI +## Using projects from the CLI The Kernel [CLI](/reference/cli/projects) has first-class project support: @@ -136,7 +136,7 @@ kernel projects limits set staging --max-concurrent-sessions 5 Under the hood, `--project` (or the env var) adds the `X-Kernel-Project-Id` header to every authenticated request. It's the recommended way to target a specific project when you're logged in with OAuth (`kernel login`), since OAuth itself is always org-wide. -## Managing Projects +## Managing projects Use the `/org/projects` REST endpoints (or the SDKs' `projects` resource) to manage projects. @@ -297,11 +297,11 @@ if err := client.Projects.Delete(ctx, "proj_abc123"); err != nil { Project deletion is a soft delete. A project that still owns active resources returns `project_not_empty`; the final active project returns `last_active_project`. -## Concurrency Limits +## Concurrency limits Kernel caps how many browsers can run at once, at two levels. A single limit covers both on-demand browsers (`browsers.create()`) and [browser pools](/browsers/pools) — standalone sessions and pool capacity count against the same cap. -- **Organization limit** — the total concurrent browsers allowed across your whole organization, determined by your plan. Every browser session and every browser in a browser pool counts against it. +- **Organization limit** — the total concurrent browsers allowed across your whole organization, determined by your plan. See [concurrency and limits](/browsers/concurrency-and-limits#concurrency) for each plan's limit. Every browser session and every browser in a browser pool counts against it. - **Per-project limits** — optional caps on individual projects, so one team or environment can't consume the entire org limit. Per-project caps come from two places: diff --git a/introduction/control.mdx b/introduction/control.mdx index d47b089d..76fe84ed 100644 --- a/introduction/control.mdx +++ b/introduction/control.mdx @@ -288,4 +288,4 @@ If you're building your own agent, [Browser Loop](/browsers/browser-loop) packag - [Computer Controls reference](/browsers/computer-controls) — every mouse, keyboard, and screen primitive. - [Playwright Execution reference](/browsers/playwright-execution) — the full execution surface, return values, and timeouts. - [Computer use integrations](/integrations/computer-use/anthropic) — drop-in examples for Anthropic, Gemini, OpenAI, and more. -- [Network access](/info/network-access) lists the domains and ports to allow for API, CDP, and WebDriver BiDi connections. +- [Firewall allowlist](/info/network-access) lists the domains and ports to allow for API, CDP, and WebDriver BiDi connections. diff --git a/introduction/manage.mdx b/introduction/manage.mdx index a3bceb8a..3f567dbb 100644 --- a/introduction/manage.mdx +++ b/introduction/manage.mdx @@ -14,13 +14,22 @@ Management settings apply across your organization rather than to a single brows Create, scope, rotate, and delete the keys your code and agents use. + + Set a monthly spending guardrail for your organization, a project, or both. + A year of API request history across your organization, searchable and exportable on Start-Up and Enterprise. - - The domains and ports to allow if your network restricts outbound traffic. - - - Set a monthly spending guardrail for your organization, a project, or both. + + The KERNEL domains and ports to allow if your firewall restricts outbound traffic. + +## Multi-tenant setups + +If you run KERNEL on behalf of your own customers, combine these pieces so each customer is isolated and capped: + +- **One [project](/info/projects) per customer.** Each project has its own browsers, profiles, credentials, proxies, and deployments. +- **A [project-scoped API key](/info/api-keys) per customer workload.** A project-scoped key can only reach resources in its project. +- **A [spending cap](/info/spending-caps) and a [concurrency limit](/info/projects#concurrency-limits) per project.** One customer's usage can't exhaust your budget or your organization's browser limit. +- **One [profile](/browsers/profiles) per end user.** Each user's logins and browser state stay separate, inside their customer's project. From e8325ebc8b3f74a59f34784228fcc03aaabde507 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:47:59 +0000 Subject: [PATCH 75/78] Add Enterprise to the pricing calculator and reorder the pricing FAQ - Calculator plan names match the plan table, and Enterprise points to the KERNEL team for a quote - FAQ leads with lifecycle billing, spending caps, and pools Co-Authored-By: Claude Opus 5.5 --- info/pricing.mdx | 30 +++++++++++++++--------------- snippets/calculator.jsx | 33 +++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/info/pricing.mdx b/info/pricing.mdx index 8f780225..040dde07 100644 --- a/info/pricing.mdx +++ b/info/pricing.mdx @@ -62,34 +62,34 @@ Concurrency, rate limits, and per-browser resources for each plan are on [concur ## FAQ - -App invocations are billed for active compute time, not per API call. The invocation rate in [Usage Rates](#usage-rates) is based on the current 4 GB memory allocation at $0.0000166667 per GB-second. - -Billing starts when your code begins executing and stops when it finishes. You aren't charged for queued time, deploying an app, or leaving a deployed app idle. Failed and canceled invocations still accrue charges for the time they ran. - -Browsers created by an invocation are billed separately for their active runtime at the browser rates above. Services your code calls, such as an LLM API, also bill you independently. - -The [app invocation limits](/browsers/concurrency-and-limits#concurrency) are concurrency limits, not a number of invocations included with your plan. - - - see this guide on [spending controls](/info/spending-caps). - Only for active runtime. `timeout_seconds` sets an idle auto-delete ceiling, not a billing window. Once a browser goes idle — 5 seconds after the last CDP or Live View activity — it enters Standby Mode and stops accruing usage cost, even if it stays alive until the timeout is reached. Deleting a browser early doesn't lower cost any further (idle time is already free), but it does free up your concurrency slot sooner. + + Set an organization or project [spending cap](/info/spending-caps). + you pay the standard usage-based price per GB-second while browsers are running. Idle browsers in a pool incur no disk charges—you only pay when a browser is actively in use. - Note: A browser pool counts toward your concurrency limit whether or not its browsers are currently acquired — a browser pool sized to 40 browsers uses 40 of your limit. Browser pools are available on Start-Up and Enterprise plans. + Note: A browser pool counts toward your concurrency limit whether or not its browsers are currently acquired — a browser pool sized to 40 browsers uses 40 of your limit. Managed Auth is included on all plans with no per-connection fees. It uses browser sessions for login, health checks, and eligible automatic reauthentication. These count toward your browser usage and concurrency like any other browser session. Auth sessions are fast, typically 5-30 seconds each, and most website sessions remain valid for days. For example, monitoring 100 auth connections typically costs less than $5/month in browser usage. + +Free users can create up to three vaults. Unlimited vaults are included in paid plans. There are no surcharges to use Kernel's agentic payments products. + Regional browsers are charged at the same usage rates as our default, US-based browsers. - -Free users can create up to three vaults. Unlimited vaults are included in paid plans. There are no surcharges to use Kernel's agentic payments products. + +App invocations are billed for active compute time, not per API call. The invocation rate in [Usage Rates](#usage-rates) is based on the current 4 GB memory allocation at $0.0000166667 per GB-second. + +Billing starts when your code begins executing and stops when it finishes. You aren't charged for queued time, deploying an app, or leaving a deployed app idle. Failed and canceled invocations still accrue charges for the time they ran. + +Browsers created by an invocation are billed separately for their active runtime at the browser rates above. Services your code calls, such as an LLM API, also bill you independently. + +The [app invocation limits](/browsers/concurrency-and-limits#concurrency) are concurrency limits, not a number of invocations included with your plan. diff --git a/snippets/calculator.jsx b/snippets/calculator.jsx index bbeed295..1e1ccbca 100644 --- a/snippets/calculator.jsx +++ b/snippets/calculator.jsx @@ -29,20 +29,21 @@ export const PricingCalculator = () => { const handleBrowserTypeChange = (type) => { hasInteracted.current = true; setBrowserType(type); - if (type === 'gpu' && plan !== 'startup') { + if (type === 'gpu' && plan !== 'startup' && plan !== 'enterprise') { setPlan('startup'); } }; const handlePlanChange = (newPlan) => { hasInteracted.current = true; - if (browserType === 'gpu' && newPlan !== 'startup') { + if (browserType === 'gpu' && newPlan !== 'startup' && newPlan !== 'enterprise') { return; } setPlan(newPlan); }; - var price = planPrices[plan]; + var isEnterprise = plan === 'enterprise'; + var price = isEnterprise ? 0 : planPrices[plan]; var multiplier = browserMultipliers[browserType]; var usageCost = usagePrices * multiplier * numSessions * avgSessionLength; @@ -89,9 +90,10 @@ export const PricingCalculator = () => {
@@ -110,16 +112,23 @@ export const PricingCalculator = () => {
${(usagePrices * multiplier).toFixed(8)}/second - {browserType === 'gpu' && (Startup tier required)} + {browserType === 'gpu' && (Start-Up or Enterprise plan required)}
- -
Base plan: ${planPrices[plan].toFixed(2)}
-
Usage: +${usageCost.toFixed(2)}
-
Free credits: -${includedUsageCredits.toFixed(2)}
-
Total cost: ${price.toFixed(2)}
-
+ {isEnterprise ? ( + +

Enterprise pricing is custom, with custom concurrency, rate limits, support, and compliance terms.

+

Contact the KERNEL team for a quote.

+ + ) : ( + +
Base plan: ${planPrices[plan].toFixed(2)}
+
Usage: +${usageCost.toFixed(2)}
+
Free credits: -${includedUsageCredits.toFixed(2)}
+
Total cost: ${price.toFixed(2)}
+
+ )} ); }; From 13e60f075ca4b2cef2a90a8d214f7034b42cc448 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:52:05 +0000 Subject: [PATCH 76/78] Reorganize Partnering with KERNEL - Enterprise lists the overview, HIPAA, zero data retention, and contact sales; the overview covers the other Enterprise-only features - Add a HIPAA page - Move security and trust pages into their own group - Fold MPP into an other ways to pay section on pricing Co-Authored-By: Claude Opus 5.5 --- bots.mdx | 2 +- docs.json | 15 ++++++++++----- info/enterprise.mdx | 18 ++++++++---------- info/hipaa.mdx | 16 ++++++++++++++++ info/pricing.mdx | 4 ++++ security-vulnerability-reporting.mdx | 1 + 6 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 info/hipaa.mdx diff --git a/bots.mdx b/bots.mdx index 49b03d98..081ee81a 100644 --- a/bots.mdx +++ b/bots.mdx @@ -1,5 +1,5 @@ --- -title: "Bots and agents" +title: "Bots and Agents" description: "Kernel's bots and agents, their purposes, and how to verify them with Web Bot Auth" --- diff --git a/docs.json b/docs.json index 03c6a493..261af5bc 100644 --- a/docs.json +++ b/docs.json @@ -274,18 +274,23 @@ "group": "Partnering with KERNEL", "pages": [ "info/pricing", - "info/mpp", { "group": "Enterprise", "pages": [ "info/enterprise", + "info/hipaa", + "info/zero-data-retention", + "info/contact-sales" + ] + }, + { + "group": "Security and Trust", + "pages": [ "security", "shared-responsibility-model", - "info/zero-data-retention", - "security-vulnerability-reporting", - "bots", "info/trust-center", - "info/contact-sales" + "security-vulnerability-reporting", + "bots" ] }, "info/support", diff --git a/info/enterprise.mdx b/info/enterprise.mdx index 1d5cce95..7cd3be14 100644 --- a/info/enterprise.mdx +++ b/info/enterprise.mdx @@ -1,18 +1,14 @@ --- title: "Enterprise Overview" sidebarTitle: "Overview" -description: "Security, compliance, HIPAA, and zero data retention on Kernel's Enterprise plan" +description: "HIPAA, zero data retention, custom limits, and support on KERNEL's Enterprise plan" --- -What changes on the Enterprise plan, and where the security and compliance artifacts live. - -## Security and compliance - -The [security practices](/security) page covers Kernel's information security program, product and infrastructure security, and current compliance status. The [shared responsibility model](/shared-responsibility-model) covers what Kernel secures and what you do. Reports and security artifacts are available through the [trust center](/info/trust-center). +What changes on the Enterprise plan. ## HIPAA -Kernel signs a BAA on the Enterprise plan. Each browser runs in its own [microVM](/info/unikernels) with its own kernel and filesystem. Pair it with [zero data retention](/info/zero-data-retention) if PHI must not persist after a session ends. +KERNEL signs a BAA on the Enterprise plan. See [HIPAA](/info/hipaa) for what KERNEL provides and what you're responsible for. ## Zero data retention @@ -22,11 +18,13 @@ Kernel signs a BAA on the Enterprise plan. Each browser runs in its own [microVM | | Enterprise | | --- | --- | -| Concurrency | Custom — see [concurrency and limits](/browsers/concurrency-and-limits) | -| [Support](/info/support) | Tiered support with defined response times and dedicated channels | +| Concurrency and rate limits | Custom limits for concurrency and browser creation. See [concurrency and limits](/browsers/concurrency-and-limits). | +| Audit logs | [Continuous export to S3](/info/audit-logs#continuous-s3-export), in addition to search and download | +| Replay retention | Custom [replay](/browsers/replays) retention | +| [Support](/info/support) | A shared Slack channel, with tiered response times | | Data processing | [DPA](/dpa) | -The full plan comparison is on [pricing](/info/pricing). +The full plan comparison is on [pricing](/info/pricing). For KERNEL's security program, compliance reports, and the shared responsibility model, see [security practices](/security) and the [trust center](/info/trust-center). ## Legal diff --git a/info/hipaa.mdx b/info/hipaa.mdx new file mode 100644 index 00000000..0656bf21 --- /dev/null +++ b/info/hipaa.mdx @@ -0,0 +1,16 @@ +--- +title: "HIPAA" +description: "Run browser workflows that handle protected health information on KERNEL's Enterprise plan" +--- + +KERNEL supports HIPAA compliance for workflows that handle protected health information (PHI), and signs a business associate agreement (BAA) on the Enterprise plan. + +## What KERNEL provides + +- **A BAA.** KERNEL signs a BAA with Enterprise customers. [Contact sales](/info/contact-sales) to start one. +- **Isolation per browser.** Each browser runs in its own VM with its own kernel and filesystem, isolated from other sessions at the hypervisor. +- **Zero data retention.** With [zero data retention](/info/zero-data-retention), session recordings, live view streams, and telemetry aren't retained after a browser terminates. Turn it on if PHI must not persist after a session ends. + +## What you're responsible for + +HIPAA compliance is shared. KERNEL secures the platform; you're responsible for how your agents use it, such as which sites they access, what data they extract, and where that data goes. See the [shared responsibility model](/shared-responsibility-model) for the full split, and [security practices](/security) for KERNEL's program and current compliance status. diff --git a/info/pricing.mdx b/info/pricing.mdx index 040dde07..3a3c1544 100644 --- a/info/pricing.mdx +++ b/info/pricing.mdx @@ -60,6 +60,10 @@ import { PricingCalculator } from '/snippets/calculator.jsx'; Concurrency, rate limits, and per-browser resources for each plan are on [concurrency and limits](/browsers/concurrency-and-limits). +## Other ways to pay + +Agents can buy a single browser without a KERNEL account or API key through the [machine payments protocol (MPP)](/info/mpp). One stealth, headful browser for 30 minutes costs $0.50, paid with a Link payment. See [buy a browser with MPP](/info/mpp) for the payment flow. + ## FAQ diff --git a/security-vulnerability-reporting.mdx b/security-vulnerability-reporting.mdx index 13101b79..94a30a54 100644 --- a/security-vulnerability-reporting.mdx +++ b/security-vulnerability-reporting.mdx @@ -1,5 +1,6 @@ --- title: "Bug Bounty Program: Scope and Policy" +sidebarTitle: "Vulnerability Reporting" description: "Kernel's bug bounty scope, rewards, severity assessment, safe harbor, and rules of engagement" --- From 186298707a6d41e543104ebecf685fc4b295bb26 Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:54:25 +0000 Subject: [PATCH 77/78] Add a Billing group and reorder Partnering with KERNEL Co-Authored-By: Claude Opus 5.5 --- docs.json | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs.json b/docs.json index 261af5bc..9b3a5bce 100644 --- a/docs.json +++ b/docs.json @@ -273,14 +273,11 @@ { "group": "Partnering with KERNEL", "pages": [ - "info/pricing", { - "group": "Enterprise", + "group": "Billing", "pages": [ - "info/enterprise", - "info/hipaa", - "info/zero-data-retention", - "info/contact-sales" + "info/pricing", + "info/mpp" ] }, { @@ -293,6 +290,15 @@ "bots" ] }, + { + "group": "Enterprise", + "pages": [ + "info/enterprise", + "info/hipaa", + "info/zero-data-retention", + "info/contact-sales" + ] + }, "info/support", { "group": "Community", From 7cda2652407df2d13897476a5f50c223bd828efd Mon Sep 17 00:00:00 2001 From: andrewleesteele <8799863+andrewleesteele@users.noreply.github.com> Date: Fri, 2 Oct 2026 19:56:15 +0000 Subject: [PATCH 78/78] Make plans and pricing top level and move spending caps into Billing The Manage overview keeps a spending caps card that links to the page. Co-Authored-By: Claude Opus 5.5 --- docs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs.json b/docs.json index 9b3a5bce..2e7f8677 100644 --- a/docs.json +++ b/docs.json @@ -263,7 +263,6 @@ "introduction/manage", "info/projects", "info/api-keys", - "info/spending-caps", "info/audit-logs", "info/network-access" ] @@ -273,10 +272,11 @@ { "group": "Partnering with KERNEL", "pages": [ + "info/pricing", { "group": "Billing", "pages": [ - "info/pricing", + "info/spending-caps", "info/mpp" ] },