build-kernel-ts-sdk
Skill13 starsChanged 13 days agoMITView on GitHub
Use if building browser-automation apps on the Kernel TS SDK (@onkernel/sdk), CLI, or MCP server — browsers, pools.
- Reads credentials
- Installs packages
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 7 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Use this skill if the task involves any of:
- Distinctive: line 30
Do NOT use this skill for:
- Very specific: line 62
KERNEL_API_KEYfrom env: Never hardcode. The env var is only the default: an explicit apiKey: option overrides it (client.ts: apiKey = … - Distinctive: line 77
Headful: when you need live view, replays, or GPU.
- Very specific: line 78
Prefer kernel.browsers.playwright.execute(id, { code }) for hot paths (runs in the browser VM with no CDP roundtrip).
- Distinctive: line 80
Use Kernel profiles for any flow that needs login state across sessions.
- Very specific: line 81
Only one parallel browser should write the same profile with save_changes: true.
- Distinctive: line 115
Before running code, name every operation that may create paid or quota-bound resources:
- Distinctive: line 133
Wire profiles, browser pools, or Managed Auth / Vaults: if the agent needs persistent state or credentials.
- Very specific: line 134
Handle lifecycle: Always pair browsers.create with browsers.deleteByID, even on error paths.
- Distinctive: line 222
When finishing a Kernel task, report only fields that apply:
- Very specific: line 241
Every browsers.create is paired with a deleteByID in a finally (grep the diff).
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Build Kernel TS SDK
Build with the Kernel TypeScript SDK (@onkernel/sdk@0.123.0, generated from Kernel's OpenAPI spec by Stainless), @onkernel/cli@0.47.0, and the React helpers @onkernel/managed-auth-react@0.5.5 and @onkernel/vault-react@0.2.0. Kernel runs each browser as a unikernel-isolated VM and co-locates your code with the browser to remove CDP latency. The SDK and CLI surface the same API.
When to use this skill
Use this skill if the task involves any of:
- building or extending TypeScript code that imports
@onkernel/sdkor constructsnew Kernel(...) - driving a Kernel browser via
kernel.browsers.create,cdp_ws_url,kernel.browsers.playwright.execute,kernel.browsers.computer.*,kernel.browsers.repl,kernel.browsers.webmcp.*, orkernel.browsers.process.* - deploying a Kernel App with
kernel deployand invoking it viakernel.invocations.create(sync or async withinvocations.follow) - wiring Playwright, Stagehand, Browser Use, Claude Agent SDK, Vibium, Notte, Magnitude, Laminar, or Val Town to a Kernel browser
- configuring proxies (
proxies.*), per-host proxy routing (network.proxy_routes), or ISP/Residential/Mobile/Custom tiers - performing multi-provider web search and content extraction via
kernel.search.*orkernel search - using in-VM Browser REPL (
kernel.browsers.repl), Code Mode, or WebMCP page tool discovery (kernel.browsers.webmcp.*) - using profiles (
profiles.*), browser pools (browserPools.*), vaults/credentials (vaults.*,credentials.*), or replays/file I/O (browsers.fs.*,browsers.replays.*) - implementing Managed Auth with
auth.connections.*and the React<KernelManagedAuth />component - scoping
KERNEL_API_KEYor CLI requests per project viaprojectIDclient option or CLI--project/KERNEL_PROJECT - finding recommended browser/proxy settings for a bot-protected site (
kernel.configRegistry.*), Web Bot Auth signing, or SSH into a browser VM - audit logs, spending caps, projects, API keys, org limits/entitlements
- connecting an agent or IDE to the hosted Kernel MCP server (
kernel mcp install) - debugging Kernel-specific failures:
browser.close()not cleaning up, sync-invocation 100 s timeout, default-context confusion, 409 profile conflicts
Do NOT use this skill for:
- Terminal-driving the
agent-browserCLI (agent-browser -p kernel,@refsnapshots,snapshot -i --json) — out of scope. This skill owns Kernel-SDK code; follow the CLI's own docs for the CLI. - Python Kernel SDK (
kernel-python-sdk), or Browser Use's Python framework — no native TS package. - LangChain.js / LangGraph agents that may incidentally call browser tools but are not Kernel-specific.
Cross-skill disambiguation
| Situation | Use |
TypeScript code importing @onkernel/sdk or deploying a Kernel App | build-kernel-ts-sdk |
agent-browser CLI loops, including agent-browser -p kernel | Out of scope: follow the CLI's own docs |
| LangChain.js/LangGraph agent where browser tools are optional | Out of scope: follow LangChain's own docs |
Two operating modes — decide first
| Mode | When | Code lives | Invocation |
| A. Embed | Drive Kernel from your own service (Next.js route, worker, CLI tool) | Your repo | new Kernel() → browsers.create → CDP / playwright.execute / computer.* / repl / webmcp.* / process.* |
| B. Deploy | Long-running, browser-co-located actions; want zero CDP latency or per-invocation isolation | A Kernel App (your repo, deployed via kernel deploy) | Register actions → kernel deploy → kernel.invocations.create({ app_name, action_name, version, payload }) |
Mixing is fine — most production setups deploy long-running browser work as a Kernel App and invoke it from an embedding service. Don't try to make a single function do both.
Deploy vs invoke glossary
- App: named deployed codebase containing one or more actions.
- Action: named function registered inside an app.
- Deployment: build/version event that creates or updates an app version; track
deployment.id, app name, and version. - Invocation: one execution of one action;
invocations.createrequiresapp_name,action_name, andversion(all three are non-optional;versionis a deployed label orlatest). Trackinvocation.id, sync/async mode, status, logs/events, and output handling.
Hard rules — load-bearing
KERNEL_API_KEYfrom env. Never hardcode. The env var is only the default: an explicitapiKey:option overrides it (client.ts:apiKey = readEnv('KERNEL_API_KEY')).- Pin the SDK.
@onkernel/sdkis auto-generated by Stainless and rev's frequently. Pin@onkernel/sdk@0.123.0and@onkernel/cli@0.47.0; verify method names against the installed type declarations —node_modules/@onkernel/sdk/client.d.tsfor the top-level resource list,node_modules/@onkernel/sdk/resources/**/*.d.tsfor method signatures and params. The npm package ships noapi.md. - Never use
browser.close()as cleanup. Playwright/Puppeteerclose()only severs the local CDP connection. Always callkernel.browsers.deleteByID(session_id)(or rely ontimeout_seconds). - Sync invocation: ~100 s server cap, but the default SDK client gives up at 60 s and retries twice. A 60–100 s sync run is aborted client-side and re-sent. Anything longer than ~50 s must use
async: truewithasync_timeout_seconds(10–3600) andinvocations.follow(id)for SSE; if you must stay sync pass{ timeout: 110_000, maxRetries: 0 }. Sync vs async is chosen per request — no re-deploy. - Default browser context only. Kernel browsers ship with one default context and one open page. Use
browser.contexts()[0]andpages()[0]— do not callbrowser.newContext()/context.newPage()to make a "fresh" one. - Project scoping is supported in SDK and CLI. With an org-wide API key, scope to a project with
new Kernel({ projectID: 'proj_…' })(sendsX-Kernel-Project-Id, ID only) ornew Kernel({ project: '<id-or-exact-name>' })(sendsX-Kernel-Project). Both default tonull,withOptions()carries them, and the SDK reads no project env var, so pass it yourself (e.g.projectID: process.env.KERNEL_PROJECT). Hand-wiringdefaultHeadersis the escape hatch, not the idiom. In the CLI, the global--projectflag andKERNEL_PROJECTsendX-Kernel-Projectand accept a project ID or an exact project name (CLI v0.47.0 source and tests; the docs pagereference/cli/projectsstill says ID only). Project-scoped API keys:kernel api-keys create --name <name> --project-id <project_id>; a scoped key plus a mismatching project header is rejected with 403. - Runtime requirements. TypeScript ≥ 4.9. Supported runtimes: up-to-date browsers, Node 20 LTS+, Deno 1.28+, Bun 1.0+, Cloudflare Workers, Vercel Edge Runtime, Jest 28+ (
"node"env), Nitro v2.6+. React Native is unsupported. - Payload size: the docs disagree and nothing enforces it client-side.
apps/developand the CLI--payloadrow say 64 KB;apps/invokesays stringified JSON up to 4.5 MB. SDK types and CLI source carry no limit. Treat 64 KB as the safe limit; send larger data throughbrowsers.fs.*or object storage and pass a pointer. Log lines over 64 KiB are truncated. - Retries re-run side effects. The client retries timeouts, 408, 409, 429 and ≥ 500. Pass
{ maxRetries: 0 }forwebmcp.invokeTool,invocations.create,deployments.createandsearch.create(a retry starts a second run); forplaywright.execute/replwithtimeout_secabove ~50 pass{ timeout: (timeout_sec + 15) * 1000, maxRetries: 0 }. See references/guides/client-and-config.md. - A 403 on create/acquire/invoke can be a spending cap, not a code bug (80% email, 100% pause). See references/guides/org-audit-and-limits.md.
Default stance
stealth: truefor any non-trivial site — bot detection is the rule, not the exception.timeout_seconds: 300as your floor for real automation — the 60 s default reaps too aggressively. The API range is10–259200(72 h) and inactivity is polled every 5 s, so short-lived headless scrapes may legitimately go lower.- Headful when you need live view, replays, or GPU. Headless for fast scripted scrapes (~8× cheaper, faster boot, but more detectable).
- Prefer
kernel.browsers.playwright.execute(id, { code })for hot paths (runs in the browser VM with no CDP roundtrip). Reserve raw CDP for long-lived interactive sessions. - For a bot-protected target, check
kernel.configRegistry.lookup({ url })first (see references/guides/stealth-and-config-registry.md). - Use Kernel profiles for any flow that needs login state across sessions; create named profiles explicitly. Reach for Managed Auth when those credentials belong to your end-users.
- Only one parallel browser should write the same profile with
save_changes: true; other parallel browsers should load it read-only. - A browser is "active" while a CDP client, a WebDriver/BiDi client, or a live-view client is connected, or a
computer.*request is in flight. After 5 s with none of those it enters standby (zero compute cost) and only THEN does itstimeout_secondscountdown to deletion start. GPU browsers do not support standby — they bill for their entire lifetime at ~48× the headless rate, so keeptimeout_secondstight and delete explicitly. Standby stops charges, not the concurrency slot: delete browsers to free it.
Quick start
For a new scratch project, use the scaffold script so package pins come from npm at generation time:
bash scripts/scaffold-kernel-app.sh --mode embed --dir ./kernel-embed-demo
cd ./kernel-embed-demo
npm install
export KERNEL_API_KEY=... # never commit; use .env.example only as template
npm run check
npm run startFor an existing repo, install explicitly and keep a pinned range:
npm install @onkernel/sdk@^$(npm view @onkernel/sdk version) playwright-core # or `playwright` if you also launch local browsers
npm install -D tsx typescript @types/nodeFirst browser creation must print the session_id, do the work, then call kernel.browsers.deleteByID(session_id) in finally. If a browser, pool lease, auth session, deployment, or invocation is intentionally left alive, report the ID, timeout, and reason.
Current-doc/version check
- Existing repo: run
scripts/check-kernel-sdk-version.shbefore changing Kernel code. Readscripts/check-kernel-sdk-version.sh.mdfor output interpretation. - New repo: run
npm view @onkernel/sdk version dist-tags --jsonbefore pinning; prefer a minor range for scaffolds, notlatest. - Installed SDK: the npm package does not ship
api.md. Read the shipped declarations —node_modules/@onkernel/sdk/client.d.tsfor the resource list,node_modules/@onkernel/sdk/resources/**/*.d.tsfor methods and params (e.g.grep -nE '^ [a-zA-Z]+\(' node_modules/@onkernel/sdk/resources/browsers/browsers.d.ts). Stainless regenerates frequently and method names move. The generatedapi.mdindex lives only in the source repo (https://github.com/kernel/kernel-node-sdk/blob/main/api.md), tracksmainrather than your pin, and omits lib-only helpers such asbrowsers.fetch(streams a response; works only for a session this client created, retrieved or listed) — the local.d.tsfiles win on any disagreement. - Live docs: for pricing, billing, Managed Auth, profiles, browser pools, deployment/invocation, or payload-size claims, check
https://www.kernel.sh/docs/llms.txtand the linked page before changing code.
Cost-facing preflight
Before running code, name every operation that may create paid or quota-bound resources:
browsers.create, especially headful, GPU, high-resolution viewport, longtimeout_seconds, proxy, extension, or profile-backed sessions- browser pool
create,acquire, and unreleased acquired browsers - Kernel App
deployments.create,kernel deploy, andinvocations.create - Managed Auth connections/login sessions and credential providers
- proxies and file/replay artifacts that require a live browser to read back
- App invocations: billed per second of execution in addition to the browsers they create; failed and cancelled runs still bill
For each resource, decide the cleanup path before running: deleteByID, pool release, invocation/browser cleanup by invocation_id, deployment terminal state, or explicit timeout with reason. Report anything left alive.
Read the real caps instead of guessing at plan tiers: await kernel.organization.limits.retrieve() returns max_concurrent_sessions, default_project_max_concurrent_sessions, concurrent_sessions_used, concurrent_sessions_available, max_auth_connections vs auth_connections_used, vaults_used, max_vaults, and min_health_check_interval_seconds. Per-project overrides live at kernel.projects.limits.retrieve(idOrName). concurrent_sessions_used/available, max_auth_connections and max_vaults can be null; project limits also carry max_concurrent_invocations, and exceeding invocation concurrency throws RateLimitError (429) immediately. Gate features on (await kernel.organization.entitlements.retrieve()).features.<name>.enabled. Discover project ids with kernel.projects.list() or kernel.projects.retrieve('<id-or-name>').
Workflow
- Classify the operating mode (A vs B). If mixed, name which surface each piece is on.
- Construct the client.
import Kernel from '@onkernel/sdk'. Verify env (KERNEL_API_KEYis the only required one;KERNEL_LOG,KERNEL_BASE_URL,KERNEL_CUSTOM_HEADERS,KERNEL_SUPPRESS_BUN_WARNING, andKERNEL_BROWSER_ROUTING_SUBRESOURCES— comma-separated path prefixes routed direct-to-VM, defaultcurl,telemetry/stream,computer,playwright,process,fs,logs/stream, empty string disables direct routing — are optional). For local dev hittinghttps://localhost:3001/, passenvironment: 'development', baseURL: null. For project-scoped work with an org-wide key, passprojectIDto the constructor. See references/guides/client-and-config.md. - Pick the browser-control surface — raw CDP / Playwright-inside-VM / computer-controls / browser-curl / browser REPL / WebMCP / process execution. See references/patterns/browser-control-surfaces.md.
- Wire profiles, browser pools, or Managed Auth / Vaults if the agent needs persistent state or credentials. See references/patterns/profiles-pools-credentials.md and references/guides/managed-auth.md.
- Handle lifecycle. Always pair
browsers.createwithbrowsers.deleteByID, even on error paths. Usetry/finally. See references/guides/browsers-lifecycle.md. - Deploy or run. For Mode B,
kernel deployand consume invocations; for Mode A, run inside your service. See references/guides/apps-deploy-invoke.md and references/examples/deploy-and-invoke-app.md.
Do this, not that
| Do this | Not that |
await kernel.browsers.deleteByID(session.session_id) in a finally | await browser.close() and assume the browser is gone |
chromium.connectOverCDP(session.cdp_ws_url) then browser.contexts()[0] | browser.newContext() to "isolate" the test |
kernel.browsers.playwright.execute(id, { code: '…' }) for hot paths | round-trip every call over CDP from your service |
version, async: true, async_timeout_seconds: 1800 + invocations.follow | omit the required version, or depend on the sync invocation cap holding for a multi-minute scrape |
JSON.stringify(payload) and JSON.parse(invocation.output ?? 'null') | pass non-JSON-serializable objects to payload |
try { ... } catch (e) { if (e instanceof Kernel.APIError) … } | swallow errors or catch (e: any) without checking subclasses |
browsers.create({ profile: { name } }) after Managed Auth completes | re-prompt the user every session |
Pin @onkernel/sdk to a minor range and bump deliberately | track latest (Stainless regenerates frequently) |
kernel.browsers.curl(id, { url }) for HTTP from inside the browser's TLS fingerprint | spin up a separate Playwright request context and lose the fingerprint |
Pass projectID: '…' to the Kernel constructor to scope an org-wide key | hand-roll defaultHeaders for project scoping, or rely on key scope and get cross-project lists |
Steering callouts
browser.close()is not cleanup. Closing the PlaywrightBrowseronly disconnects CDP. The Kernel browser keeps running untiltimeout_secondselapses or you callkernel.browsers.deleteByID(session_id). Always paircreatewithdeleteByIDin afinallyblock.
There is already a default context and page. Calling
browser.newContext()makes a second context; cookies, storage, and profile state live on the default one. Usebrowser.contexts()[0].pages()[0].
Sync invocations time out at ~100 s. If your action does any non-trivial browser work, set
async: trueandinvocations.follow(id)instead. The default SDK client gives up at 60 s, so for sync calls pass{ timeout: 110_000, maxRetries: 0 }. The CLI mirrors this:kernel invokeis async and follows the stream;--syncis one POST that times out after 60 s.
Stagehand v4 attaches over CDP;
new Stagehand(...)is gone. The constructor is private — useStagehand.create(), and pass abrowser(it is required). Upload the extension first withbrowsers.fs.uploadZip(id, { dest_path, zip_file }), wheredest_pathis the same absolute path Stagehand reads locally (<@browserbasehq/stagehand dist>/extension, zip atassets/stagehand-extension.zip), thenconst browser = await localBrowser.connect({ cdpUrl: session.cdp_ws_url })andawait Stagehand.create({ browser, model: { modelName: 'openai/gpt-4o', apiKey: process.env.MODEL_API_KEY } }).env: 'LOCAL'andlocalBrowserLaunchOptionsare v3-only and do not exist in v4;modelNamemust be namespaced (openai/…,anthropic/…), never bare'gpt-4o'. Top-levelapiKeyis the Stagehand key — model credentials belong inmodel.apiKey.projectIdis not aStagehand.createoption at all; Browserbase credentials live onbrowserbase.connect(...).stagehand.pagewas removed —act/extract/observeare on the instance;extractreturns{ data }; get the page withawait browser.context.activePage(); clean upstagehand.close()→browser.close()→deleteByID.
proxy_idis deprecated onbrowsers.create. Deprecated in@onkernel/sdk@0.88.0(2026-08-10). Pass the typedproxyobject instead —proxy: { id },proxy: { name }, orproxy: { mode: 'direct' | 'default' }.proxyandproxy_idcannot be combined, andproxy_idis@deprecatedon every browser response shape too.disable_default_proxyis deprecated in favor ofproxy: { mode: 'direct' }. For per-host routing, usenetwork.proxy_routes(e.g.hosts: ['example.com', '*.example.com'], proxy: { name }), which fails closed on route failure. Thedatacenterproxy type was dropped from the SDK types in 0.121.0 (the API deprecated it); useisp. Pools takeproxy_id, notproxy. See references/guides/proxies.md.
Multi-Provider Search API:
kernel.search.createroutes across 10 providers (Brave, Exa, Perplexity, Tavily, …) withstrategy{ type: 'auto' },{ type: 'pinned', provider: { provider: 'exa' } }or{ type: 'fallback', providers: [{ provider: 'exa' }, …] }; results are retained 24 h. The API is entitlement-gated (features.search.enabled), billed, and must be called with{ maxRetries: 0 }. See references/guides/search.md.
Browser REPL & WebMCP: The in-VM REPL (
kernel.browsers.repl) provides stateful Node.js execution with pre-injected page helpers (gotoUrl,pageInfo,click,fillInput,js) and dynamic module imports (patchright), enabling single-turn Code Mode agents. WebMCP discovers and invokes native page tools (kernel.browsers.webmcp.*). A REPL call that exceedstimeout_secdestroys all REPL state (checkrepl_terminated). WebMCP does not retry the tool server-side, but the SDK client retries 5xx, so pass{ maxRetries: 0 }toinvokeTool; HTTP 504outcome_unknownmeans the action may have run. See references/patterns/browser-repl.md and references/patterns/webmcp.md.
Supported Regions: Kernel supports four browser and browser-pool regions:
'us-east' | 'us-west' | 'eu-west' | 'ap-southeast'(requires Start-Up or Enterprise plan, defaults tous-east). The docs regions page lists only us-east, eu-west and ap-southeast;us-westis in the SDK types (added in@onkernel/sdk0.120.0) and the CLI flags. Regions do not provide data residency. App deployments support'aws.us-east-1a'with multi-host routing.
Audio: Headful browsers play audio by default. Replays support
record_audio: boolean(defaults to false).
GPU & Video Memory: GPU headful sessions (Start-Up/Enterprise,
us-eastonly, not in pools) takevideo_memory'2GiB'(default; 4 vCPU, 6 GiB memory) or'4GiB'(8 vCPU, 12 GiB memory). GPU browsers do not support standby.
Unified Concurrency Limits: On-demand and browser-pool concurrency limits are unified in
max_concurrent_sessions. The API and CLI reportconcurrent_sessions_usedandconcurrent_sessions_available;max_pooled_sessionsis@deprecated.
Browser Pools: Pools can be created or updated with
memory: '16GiB'(headful only; defaults to'8GiB'; updates apply to newly created browsers).browserPools.acquiresupports dynamic profile binding (profile: { name }). Idle pooled browsers suspend automatically (there is noauto_standbyparameter); pool capacity still counts againstmax_concurrent_sessions. Default to on-demandbrowsers.create; use a pool only for steady or bursty demand. Pools also take egress allowlists (network.allowed_hosts) andnetwork.proxy_routes.
Persistent Browsers EOL: Kernel has end-of-lifed persistent VMs (
persistent: true). Usetimeout_seconds+ Profiles (save_changes: true) for state persistence.
Vaults, 1Password Autofill & MPP Purchases: Pass
vaults: [{ id }]to bind project-scoped credential or payment vaults at session creation. Vault links are immutable after session boot.fillwrites real values into the page and never submits; page scripts, extensions and an unrestricted agent can read them, so authorize the destination yourself. 1Password1pw_fillrequirespage_urlon the approved login's origin and locks CDP/WebDriver/API (423) during the fill; live view is not locked. AgentCard uses Luhn-valid alias egress interception (not DOM fill). MPP allows autonomous agents without a Kernel account to buy temporary 30-min browser sessions via HTTP 402 with Stripe Link (link-cli mpp pay). A Managed Authlogin()cancels a flow in progress — verify withensureAuthenticated, do not call it twice. See references/patterns/vaults-and-payments.md.
Kernel MCP server: hosted at
https://mcp.onkernel.com/mcp(OAuth 2.1, orAuthorization: Bearer <KERNEL_API_KEY>; stdio vianpx -y mcp-remote). Configure withkernel mcp install --target cursor|claude|claude-code|antigravity|windsurf|vscode|goose|zed|fx. The source registry lists 34 tool names; a plain connection sees 25, vault tools need the vaults entitlement,web_searchneeds the Search entitlement,open_auth_loginneeds an MCP-Apps client. Browser tools accept a live session's name or ID (deleted sessions and poolreleaseneed the ID). Do not hard-code a tool count. See references/guides/mcp-server.md.
Bundled scripts
| Script | Use |
scripts/check-kernel-sdk-version.sh | Preflight Node/npm, installed Kernel package versions, npm latest versions, the installed SDK type declarations, and KERNEL_API_KEY presence. See scripts/check-kernel-sdk-version.sh.md. |
scripts/scaffold-kernel-app.sh | Generate a minimal embedded SDK example or deployable Kernel App in an empty directory. See scripts/scaffold-kernel-app.sh.md. |
Reference routing
| Document | What it contains | Load when |
| references/guides/client-and-config.md | Env vars, environments, retries, idempotency, pagination, error taxonomy, request options | Constructing the client, debugging auth/network errors, handling pagination |
| references/guides/cli-reference.md | Every @onkernel/cli@0.47.0 command group and flag (26 top-level commands), global flags, non-interactive rules, docs-vs-CLI differences | Running CLI commands, debugging shell automation, checking CLI equivalents |
| references/guides/browsers-lifecycle.md | browsers.create params, BrowserCreateResponse, standby, termination, viewport, timeout semantics | Creating, configuring, or terminating browsers |
| references/guides/proxies.md | Nested proxy config, per-host proxy_routes, tiers (ISP/Res/Mobile/Custom), CA bundles, health checks | Configuring proxies, routing by host, avoiding bot-detection IP blocks |
| references/guides/search.md | Multi-provider Search API (10 engines), routing strategies (auto/pinned/fallback), entitlement and billing notes, inline and deferred content extraction | Web discovery, agent search, extracting clean page markdown without browser overhead |
| references/guides/apps-deploy-invoke.md | deployments.* (create/retrieve/list/delete/follow), deploy prerequisites, invocations.* sync vs async, follow SSE, reserved env vars, logs | Deploying a Kernel App or invoking it from another service |
| references/guides/managed-auth.md | 3-piece architecture, auth.connections.*, <KernelManagedAuth /> props, profile interop | Authenticating an agent on a user's behalf into a SaaS |
| references/guides/telemetry.md | Categories (default operational set vs opt-in), SSE stream with type filter and Last-Event-ID resume, historical events, OTLP destinations | Streaming live session events or exporting to OpenTelemetry |
| references/guides/stealth-and-config-registry.md | Anti-detection defaults and stealth mode, configRegistry.lookup/resolve/analyses, Web Bot Auth, SSH into the browser VM | Automating a bot-protected site, picking browser/proxy settings that work for a URL, signing requests, shelling into a session |
| references/guides/org-audit-and-limits.md | Entitlements and limits, audit logs (search, download, S3 export), spending caps, projects, API keys, network allowlist | Checking plan gates, exporting audit logs, handling a 403 from a spending cap, scoping projects or rotating keys |
| references/guides/mcp-server.md | Kernel MCP server: URL, OAuth/API-key auth, transports, kernel mcp install targets, tool list and entitlement gating, conventions | Connecting an agent/IDE to Kernel over MCP, or choosing between MCP and the SDK |
| references/patterns/browser-control-surfaces.md | Decision tree across CDP, playwright.execute, computer.*, repl, webmcp.*, process.* | Picking the right control surface for a task |
| references/patterns/browser-repl.md | In-VM persistent Node.js REPL, Code Mode, pre-injected page helpers (gotoUrl, click, js), dynamic imports | High-throughput in-VM scripting, single-turn agent Code Mode programs |
| references/patterns/webmcp.md | In-browser WebMCP tool discovery, navigator.modelContext polyfill, page tool invocation | Discovering and invoking tools declared natively by web applications |
| references/patterns/vaults-and-payments.md | Vaults, credentials, 1Password Agentic Autofill, Link, AgentCard, MPP browser purchases | Managing credentials, cards, paced autofill, or agent payments |
| references/patterns/playwright-stagehand-integration.md | connectOverCDP idiom, default-context warning, Stagehand connect/launch options, kernel create --template | Wiring Playwright or Stagehand to a Kernel browser |
| references/patterns/profiles-pools-credentials.md | profiles.*, browserPools.*, credentials.*, credentialProviders.* (1Password) | Persistent login state, pool warm-starts, credential providers |
| references/patterns/integrations-matrix.md | Hookup snippets per integration (Stagehand v4, Vercel AI SDK, Browser Use, Claude Agent SDK, Vibium, Terraform, MCP-hosted agents, etc.) | Connecting a third-party agent framework to a Kernel browser |
| references/examples/browser-screenshot.md | Minimal end-to-end TS example | Sanity-check first run; copy as a starting scaffold |
| references/examples/deploy-and-invoke-app.md | kernel deploy + invocations.create + invocations.follow walkthrough | Building or invoking a Kernel App |
| references/examples/managed-auth-flow.md | Full Next.js page + backend route + browser launch | Implementing the Managed Auth handoff end-to-end |
| references/troubleshooting/pitfalls.md | The 24 production gotchas in priority order | Debugging unexpected behavior or before shipping |
| references/troubleshooting/files-and-replays.md | browsers.fs.*, browsers.replays.*, download timing, multipart | File I/O or replay download is failing or slow |
| references/troubleshooting/auth-and-profile-errors.md | 409 conflict, profile not found, hosted-page handoff failures, failure error_code fixes, login cancel caveat | Managed Auth or profile errors |
Output contract
When finishing a Kernel task, report only fields that apply:
- operating mode: embed, deploy, or mixed
- package versions checked and package range pinned
- created browser
session_idvalues and whether each was deleted, pool-released, intentionally timed out, or left running with reason - live view URL or replay/artifact path when relevant
- profile name/id and whether
save_changeswas used - Managed Auth connection id, final
flow_status/status, and profile name - deployment id, app name, version, and action name
- invocation id, sync/async mode, terminal status, and how logs/events were consumed
- payload/output size strategy for large artifacts
- verification rung actually reached: typecheck, script run, live browser run, deployment/invocation observed
Verification
End-to-end checks for any Kernel-TS task:
- The SDK is installed at a pinned version, and every method you call appears in the installed declarations (
node_modules/@onkernel/sdk/client.d.tsfor resources,node_modules/@onkernel/sdk/resources/**/*.d.tsfor signatures) —npx tsc --noEmitpasses. The package ships noapi.md; do not gate on one. KERNEL_API_KEYresolves at runtime; if the key is org-wide,projectIDis passed to the constructor. Confirm withawait kernel.auth.context.retrieve()—authorization.credential_scope.project_id === nullmeans the key is org-wide, andauthorization.effective_scope.project_idmust equal the project you intended.- Every
browsers.createis paired with adeleteByIDin afinally(grep the diff). - Long-running invocations use
async: trueand consumeinvocations.follow(id)events (log,invocation_state,error,sse_heartbeat). - Stagehand/Playwright wiring uses
browser.contexts()[0]notnewContext(). - Stealth is on (
stealth: true) for anything user-facing or against a real SaaS. - For Managed Auth:
<KernelManagedAuth />is a client component ("use client"), the backend route callsauth.connections.createandauth.connections.login, and downstreambrowsers.createuses the sameprofile.name.
Cost cleanup check
- List open browsers when SDK/CLI is available; created
session_idvalues must be deleted, released back to a pool, intentionally timed out, or left running with a reason. - For browser pools, release every acquired browser or explain why it was destroyed/rebuilt.
- For deployments/invocations, report deployment/invocation ids, app/action/version, terminal status, and how logs/events were consumed.
- For large artifacts, report whether they moved through
browsers.fs.*, replay download, or object storage before browser cleanup.
Final checks
KERNEL_API_KEYis read from env, not hardcoded.@onkernel/sdkversion is pinned.- Every
browsers.createis paired withdeleteByID(or wrapped by an invocation that will reap). - Sync vs async invocation chosen deliberately; the right
*_timeout_secondsis set. - Default-context-only: no
browser.newContext()against a Kernel browser. - Errors are caught with
instanceof Kernel.APIError(or specific subclass). - If Managed Auth is used: backend creates the connection, the React component is
"use client", the success handler launches a browser with the matchingprofile.name. - If Mode B:
package.jsonhas"type": "module"for TS apps;kernel deploysucceeded; the action is registered. - No leftover
browser.close()as the only cleanup. - Stealth + timeout defaults match the Default stance above unless the task justifies otherwise.
Scope boundaries
This skill covers @onkernel/sdk, @onkernel/managed-auth-react, and the corresponding @onkernel/cli workflows in TypeScript. It does not cover:
- The Python SDK (
kernel-python-sdk) - Terminal-driving the
agent-browserCLI (out of scope: follow the CLI's own docs) - Browser Use's Python framework — there is no native TS package
In this repository31 other files it gives its agents.
- AGENTS.mdAGENTS.md
- audit-agentic-cliSkill
- audit-agentic-mcpSkill
- audit-completionSkill
- audit-skill-by-derailmentSkill
- audit-ui-uxSkill
- build-chrome-extensionSkill
- build-cloudflare-access-ssoSkill
- build-cloudflare-email-sendingSkill
- build-licenseseat-swiftSkill
- build-mcp-use-serverSkill
- build-raycast-script-commandSkill
- build-skillSkill
- ci-cd-optimizeSkill
- convert-to-natural-writingSkill
- convert-url-to-nextjsSkill
- init-agent-configSkill
- init-makefilesSkill
- mobilerun-controlSkill
- optimize-nextjs-fluiditySkill
- publish-npm-packageSkill
- run-astro-auditSkill
- run-railwaySkill
- run-repo-cleanupSkill
- run-ts-cleanupSkill
- test-by-maestroSkill
- test-by-mcpc-cliSkill
- update-agent-configSkill
- use-chatgpt-by-applescriptSkill
- use-cloudflare-tunnelSkill
- use-linear-cliSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

