Cloudflare open-sourced Kitesurf on November 13, 2026, delivering on a promise repeated since the engine debuted in August: an agent-first browser that runs on Cloudflare Workers, exposes Chrome DevTools Protocol (CDP), and ships under the Apache 2.0 license. If your coding agent browses the web through Puppeteer, Playwright, or chrome-devtools-mcp, you can now read the Rust and WASM stack, run pnpm run dev on 127.0.0.1:8787, and pnpm run deploy into your own account instead of relying only on managed Browser Run endpoints.
The release matters for security teams because browser tools are full session drivers: they fetch untrusted HTML, execute page JavaScript, and often inherit API tokens you paste into MCP config. Cloudflare’s earlier Kitesurf introduction framed a different threat model than desktop Chrome—prompt injection and tool safety over pixel-perfect rendering—and described network isolation through a single SandboxOutbound worker. Open source does not remove that risk; it moves the review burden to whoever forks, deploys, or wires a harness to CDP.
For background on how Browser Run fits the broader agentic attack surface, see Cloudflare’s same-day Modern Security Model post. explainx.ai documents Chrome DevTools MCP setup patterns that teams often reuse when they add a wsEndpoint to an MCP server.
TL;DR
| Question | Answer |
|---|---|
| Am I affected? | Yes if you operate Browser Run, plan to self-host Kitesurf, or configure CDP / MCP browser tools for Claude Code, Codex, or similar harnesses |
| Is there a fix? | Not a vulnerability—this is a release. Patch discipline shifts to your fork: pin commits, review upgrades, and rotate Browser Run API tokens |
| Does data leave my machine? | Browsing is inherently remote on Workers; page content and screenshots flow through Cloudflare’s network unless you run locally via wrangler dev |
| What changed on Nov 13? | GitHub publication, local dev flow, deploy instructions, and upstream Rust packages (Blitz, Stylo, Boa, Linebender/Krilla) documented in the repo |
| What should I do today? | Read NOTICE and licenses, test targets in the playground, scan MCP JSON before enabling CDP, and separate prod tokens from agent configs |
What Cloudflare published
The November 13 blog post states that Kitesurf is stateless, runs without a browser container, parses HTML, applies CSS, executes JavaScript, renders screenshots, and supports CDP so clients like Puppeteer can connect. Cloudflare positions it as lighter than Chromium for agent workloads while scaling on Dynamic Workers.
The repository layout, per Cloudflare:
- Engine — manages browser sessions and client connections.
- PageScript — runs the page and its JavaScript.
- PageRenderer — draws the result.
Supporting crates include Blitz (DOM/layout), Stylo (CSS), Boa (JavaScript in WASM when Dynamic Workers cannot run JS), and Linebender/Krilla for text, 2D graphics, and PDF output. Third-party licenses live in NOTICE.
Local development and CDP wiring
Cloudflare documents this bootstrap sequence:
git clone https://github.com/cloudflare/kitesurf.git
cd kitesurf
pnpm install --frozen-lockfile
pnpm run dev
The first build compiles Rust dependencies; later builds reuse cache. Wrangler serves http://127.0.0.1:8787, and Puppeteer can connect with:
import puppeteer from "puppeteer-core";
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://127.0.0.1:8787/devtools/browser",
});
Cloudflare’s post explicitly notes you can point your AI harness at the local CDP port. That is the same integration path chrome-devtools-mcp uses on managed Browser Run, documented with browser=kitesurf on the WebSocket URL and Bearer authorization headers in Browser Run docs.
Deploying to your account
pnpm run deploy from the repository root pushes the engine to your Cloudflare account. The post requires a Workers Paid plan because Kitesurf spins isolated Dynamic Workers per page. Managed Browser Run remains available with per-account beta limits if you prefer not to operate the engine yourself.
Image: Cloudflare
Architecture and standards coverage
Cloudflare introduced Kitesurf on August 6, 2026 as a browser for agents, not humans—de-emphasizing tabs, extensions, and pixel-perfect scrolling in favor of token cost, burst scale, and CPU/memory efficiency. The changelog quotes 3–7× lower CPU and memory than Chromium for screenshots and HTML extraction on a fixed URL corpus, with slower wall time because a warm Chromium pool beats a cold software renderer.
As of the November 13 documentation refresh, Kitesurf reports 235,000+ Web Platform Tests passing, with high coverage called out for DOM, HTML, Selection, SVG, CORS, and XHR. Docs also list hard limits: no video/WebGL, no bot-challenge TLS fingerprint negotiation, and no long-lived authenticated sessions that need persistent state—cases where Browser Run’s default Chromium remains appropriate.
Security mechanism: SandboxOutbound
The August deep dive is still the authoritative attack-surface description. Cloudflare writes that rendering untrusted pages requires fetching arbitrary assets—one of the most dangerous browser operations. Kitesurf routes that through SandboxOutbound:
- Only SandboxOutbound may use the network; Dynamic Workers enforce the boundary.
- The Engine bootstraps the main document and scripts through SandboxOutbound.
- PageScript fetches stylesheets, images, fonts, and page
fetch()calls through the same gate. - Cloudflare applies CORS, browser-shaped headers, response filtering, and per-page cookie jars; policy violations return 403.
That design parallels themes in Google Agent Compute Engine—keep credentials and egress policy outside the execution sandbox—except Kitesurf’s sandbox is a page worker, not a microVM on your laptop. Neither model stops prompt injection inside page content from misleading the model that reads screenshots or DOM text.
September updates mentioned WebMCP support in Cloudflare’s product posts; if you expose typed page tools to agents, the same lesson as Token Rehearsal applies: the server cannot distinguish human from agent unless you add delegation, step-up auth, and narrow scopes.
What this means if you run AI coding agents
Inventory CDP and Browser Run entries in MCP config. Any wsEndpoint with a Cloudflare API token in headers is a secret-bearing integration. Run beam scan --mcp on the file (see MCP security guide) and pin the chrome-devtools-mcp version you reviewed—do not float @latest in production.
Treat browsed origins as untrusted instructions. Agents that page.goto() attacker-controlled URLs inherit classic prompt injection: hidden text in HTML, slow exfiltration via fetch, and deceptive forms. Kitesurf’s SandboxOutbound limits raw network sprawl, but the harness still forwards page content to the model. Pair browsing tools with human approval for consequential actions and keep Recorded Future’s coding-tool incident patterns in mind when you automate retries.
Separate managed Cloudflare from self-hosted forks. Open source means supply-chain review on every git pull: CI that builds WASM, third-party crates in NOTICE, and whatever API tokens your deploy pipeline stores. The Cloudflare security-audit skill is a useful pattern—six-phase audit with OS sandbox—if you audit forks before agents execute build scripts from the repo.
Know when to stay on Chromium. Docs are explicit: bot challenges, streaming media, and sticky logins belong on default Browser Run. Forcing Kitesurf where Chromium is required produces fragile automations that fail open into operator workarounds (paste cookies, disable MFA), which is worse than using the heavier browser deliberately.
Log locally when browsing hands off to the shell. Many workflows screenshot a dashboard, then ask Claude Code to curl an internal API. Beam can watch terminal tools on supported harnesses; it does not see cloud CDP unless those commands run on the paired machine. See how Beam watches agents.
How Beam handles this
Beam overlaps where local coding agents meet browser MCP: it provides on-device observability for Claude Code and Codex, heuristic scans of skills and MCP JSON (11 patterns plus MCP version-pin checks), optional PreToolUse deny under enforce policy, and redaction before storage. That helps you catch a config that embeds a Browser Run Bearer token or a skill that tells the model to pipe curl into bash after a browsing step.
Beam is not a replacement for SandboxOutbound, not a CDP proxy, and not semantic malware analysis of WASM inside Kitesurf. Remote browsing on Cloudflare stays outside Beam’s default path unless the same laptop runs the terminal tools that follow. Limits: hook-based deny (not kernel isolation), heuristic scanning, and fail-open behavior when cached policy is missing—documented in Beam agent CLI policy behavior.
Self-host checklist for agent harness owners
If you plan to fork Kitesurf or deploy upstream unchanged, treat the repo like any other agent infrastructure dependency rather than a passive library:
- Pin the commit your CI builds and record it beside the MCP config your harness loads. Cloudflare warns the project is under heavy development; floating
mainis closer to tracking a browser nightly than a semver patch stream. - Separate accounts: development Cloudflare accounts and API tokens should not share Browser Run permissions with production mail or billing automations. Agents that browse and then run shell commands can bridge those worlds on a laptop even when the browser itself runs in Workers.
- Exercise the CONTRIBUTING path Cloudflare describes—minimal reproduction pages, failing automation workflows, and documentation fixes are explicitly welcome, but large drive-by refactors need maintainer vouching. That governance matters when your security team asks who approved a rendering change that suddenly accepts a new MIME type.
- Compare outcomes on your own targets using the public playground before you disable Chromium. Docs caution that WPT pass rates do not guarantee compatibility with every SPAs, dashboards, or SSO flows your agents hit.
Operational comparison: managed API vs your Worker
| Dimension | Browser Run API (browser=kitesurf) | Self-hosted repo (pnpm run deploy) |
|---|---|---|
| Who patches the engine | Cloudflare rollouts on their schedule | Your team on every merge |
| Credential storage | API tokens in MCP headers on developer laptops | Same, plus deploy tokens in CI |
| Isolation story | Cloudflare operates Dynamic Workers | You inherit SandboxOutbound rules but own misconfig risk |
| Best fit | Bursty screenshots on known-good sites | Custom rendering tweaks, air-gapped review, or regulated deploy gates |
Neither column removes prompt injection from page content; they only change who operates the browser binary and where audit logs land.
What developers are saying
The Hacker News thread on the open-source announcement was still thin at fetch time. Commenter toomuchtodo linked the GitHub repository without additional reproduction notes—use the primary posts above rather than forum guesses for version or license details.
Frequently asked questions
The front matter FAQ lists release contents, Chromium comparison, MCP wiring, SandboxOutbound rules, plan requirements, and Beam’s scope. Re-read Cloudflare’s docs before changing production MCP configs because beta limits and WPT counts change frequently.
Related reading
- Cloudflare Modern Security Model after ARTEX-scale scans
- Cloudflare security-audit skill: run audits with a real OS sandbox
- Google Agent Compute Engine: credentials outside the sandbox
- Token Rehearsal: browser agents inherit SSO sessions
- MCP security practical guide
- Chrome Modern Web Guidance for agent-exposed surfaces
- Beam: local-first data posture
Primary sources: Cloudflare open-source announcement (November 13, 2026), Kitesurf introduction (August 6, 2026), Browser Run Kitesurf documentation, Kitesurf GitHub repository.
Repository layout, commands, and beta limits reflect Cloudflare’s November 13, 2026 posts and documentation. Re-verify licenses in NOTICE and your account’s Browser Run limits before production deploy.

