Last updated: November 14, 2026
Cloudflare Kitesurf, the company’s lightweight browser engine for AI agents, became open source under Apache 2.0 on November 12 and 13, 2026. You can now run it locally, connect Puppeteer or an MCP-based agent over the Chrome DevTools Protocol, and deploy your own copy to Cloudflare Workers.
This guide is based on Cloudflare’s open source announcement, the developer changelog entry, the Kitesurf GitHub repository and the Browser Run Kitesurf documentation.
Contents
- What changed
- How Kitesurf works
- How to run Kitesurf locally
- Deploying your own instance safely
- Using Kitesurf on Browser Run
- Kitesurf vs. Chromium
- Limits and things to watch
- Frequently asked questions
What changed
Cloudflare introduced Kitesurf in August as a stateless browser for AI agents on its Browser Run service, and added WebMCP support and new APIs in September. Until now, you could only use the hosted version.
The changelog entry dated November 12, 2026 says Kitesurf is now open source on GitHub under the Apache 2.0 license. You can inspect the source, run it locally and deploy an instance to your own Cloudflare account. The blog post followed on November 13.
Cloudflare is clear that the project is still experimental and under heavy development. Its current focus is web standards compatibility, reliability and efficiency.
How Kitesurf works
Kitesurf runs entirely on Cloudflare Workers. It parses HTML, applies CSS, runs page JavaScript and renders screenshots without Chrome or a browser container. Because it speaks the Chrome DevTools Protocol (CDP), existing tools such as Puppeteer can drive it.
The announcement describes three main parts: the Engine manages browser sessions and client connections, PageScript runs the page and its JavaScript, and PageRenderer draws the result. It builds on open source Rust projects compiled to WebAssembly:
- Blitz for HTML parsing, the DOM, layout and painting
- Stylo for CSS parsing and computed styles
- Boa for JavaScript inside WebAssembly, used only as a last resort when JavaScript cannot run in Dynamic Workers
- Linebender libraries for text layout and 2D graphics, and Krilla for PDF output
The repository also includes a terminal client, kitesurf-cli. The Kitesurf site says it can be installed with Homebrew and shows pages with kitty graphics where supported.
How to run Kitesurf locally
The README lists these requirements: Bazelisk installed as bazel, Node.js 22 or newer, pnpm 9.15.4, and GNU tar on macOS. Rust through rustup is needed only if you edit the vendored crate patches.
- Install pnpm if needed:
npm install --global pnpm@9.15.4. - Clone the repository:
git clone https://github.com/cloudflare/kitesurf.git, thencd kitesurf. - Install dependencies:
pnpm install --frozen-lockfile. - Build and start the engine:
pnpm run dev. The first build compiles the Rust core and takes a while; later builds reuse the Bazel cache. - Check that it is running: open
http://127.0.0.1:8787/health. SetKITESURF_PORT=8799before the command if port 8787 is taken. - Inspect a page: open
http://127.0.0.1:8787/?url=https://example.comin Chrome to load the page in DevTools. - Connect Puppeteer: install
puppeteer-coreand callpuppeteer.connect()withbrowserWSEndpoint: "ws://127.0.0.1:8787/devtools/browser". HTTP discovery is at/json/version.
Cloudflare’s blog also suggests pointing an AI coding agent at the local CDP port. If you already use agent tools such as Browser Use 1.0, a local Kitesurf endpoint is a low-cost target to test against.
Deploying your own instance safely
Run pnpm run deploy from the repository root to build with Bazel and upload with Wrangler. A Workers Paid plan is required, because Kitesurf uses Dynamic Workers to start an isolated Worker for each page and renderer.
The README carries a strong warning: the engine has no authentication of its own. Anyone with the URL can browse through your engine, connect CDP clients, send requests from your account and use CPU time you pay for. The default workers.dev address is public and follows a predictable pattern.
- Turn on Cloudflare Access for all Workers in the account before deploying, so there is no public gap.
- For Puppeteer behind Access, create an Access service token, allow it with a Service Auth policy, and send
CF-Access-Client-IdandCF-Access-Client-Secretheaders. - Use
pnpm run deploy --dry-runto build without uploading, orpnpm run deploy:previewto upload a version without sending traffic. Version URLs are public too, so protect them as well.
Using Kitesurf on Browser Run
If you do not need to self-host, the Browser Run documentation (updated November 13, 2026) says the managed Kitesurf is in beta and free, behind per-account limits. You opt in per request:
| Method | How to select Kitesurf |
|---|---|
| Quick Actions (screenshot, content, PDF) | Add ?browser=kitesurf to the endpoint |
| Workers browser binding | Pass browser: "kitesurf" to quickAction(); set "remote": true for local development |
| CDP (Puppeteer, Playwright) | Add browser=kitesurf to the /browser-run/devtools/browser WebSocket URL |
| MCP clients | Run chrome-devtools-mcp with that WebSocket URL and a Browser Run API token |
| WebMCP | Use the same CDP URL; no lab session needed, and keep_alive is not accepted |
The WebMCP documentation adds that Kitesurf supports declarative form tools. The same MCP setup pattern works in harnesses such as OpenCode and Claude Code, whose new scripted tool calls are covered in our Claude Code Code Mode guide.
Kitesurf vs. Chromium
Cloudflare compared Kitesurf with a warm Chromium pool using medians of five Quick Action runs across 14 URLs. These are Cloudflare’s own figures:
| Metric | Kitesurf | Chromium (warm pool) |
|---|---|---|
| CPU, screenshot | 380 ms | 1,173 ms |
| CPU, HTML extraction | 229 ms | 877 ms |
| Memory, screenshot | 57.8 MiB | 271.0 MiB |
| Memory, HTML extraction | 39.4 MiB | 273.7 MiB |
| Wall time, screenshot | 1,148 ms | 637 ms |
| Wall time, HTML extraction | 820 ms | 472 ms |
In short, Kitesurf uses 3 to 7 times less CPU and memory but is slower in wall time. Cloudflare also reports that Kitesurf passes over 235,000 Web Platform Tests subtests, with 97% coverage for DOM and 96% for HTML, while noting that standards tests do not prove every real site will work.
Limits and things to watch
- Not a full Chrome. No video or WebGL, no bot-challenge handshakes with real TLS fingerprints, and no long-running authenticated sessions with persistent state.
- Partial DevTools support. Kitesurf provides a CDP endpoint, and some DevTools features do not work yet.
- WebMCP gaps. No
toolspermissions policy or origin-based filtering, no tools from iframes or popups, and no live view for confirming tools that wait for a person. - Security is your job. A self-hosted engine is open to anyone with the URL until you add Access.
For another approach to agent automation, see our Antigravity Dynamic Workflows guide.
Frequently asked questions
Is Cloudflare Kitesurf open source?
Yes. Cloudflare published Kitesurf on GitHub under the Apache 2.0 license, announced in its changelog on November 12, 2026 and on its blog on November 13. You can read the code, run it locally, change it and deploy your own instance. Bundled fonts, data and dependencies keep their own licenses.
Is Kitesurf free to use?
The managed version on Cloudflare Browser Run is in beta and free, behind per-account limits. Running the open source engine locally with wrangler dev costs nothing, but deploying it to Cloudflare requires a Workers Paid plan because it uses Dynamic Workers.
Does Kitesurf work with Puppeteer and Playwright?
Kitesurf speaks the Chrome DevTools Protocol, so Puppeteer can connect to a local engine at ws://127.0.0.1:8787/devtools/browser. Cloudflare’s Browser Run documentation says existing Puppeteer, Playwright and chrome-remote-interface setups work with the managed endpoint when you add browser=kitesurf.
What can Kitesurf not do yet?
Cloudflare says Kitesurf cannot yet play video or render WebGL, pass bot challenges that check real TLS fingerprints, or keep long-running authenticated sessions with persistent state. For those cases, use Browser Run’s default Chromium browser.
Is Kitesurf faster than Chromium?
Not in wall time. In Cloudflare’s own Quick Action tests, Kitesurf used 3.1 to 7 times less CPU and memory than a warm Chromium pool, but took about 1.7 to 1.8 times longer to finish screenshots and HTML extraction.
Sources
- Kitesurf is now open source, Cloudflare Blog
- Kitesurf is now open source, Cloudflare changelog
- cloudflare/kitesurf, GitHub repository and README
- Kitesurf, Cloudflare Browser Run documentation
- WebMCP, Cloudflare Browser Run documentation