Product launch · XiaoHu take

Cloudflare built a browser for AI agents, Kitesurf — and cut CPU and memory use by 3–7x

Chromium is built for humans — tabs, themes, extensions, and smooth 60fps scrolling that agents never use. Kitesurf's team spent 12 weeks stripping all of that out and rebuilding from scratch.
The TL;DR
  • Cloudflare built a browser from scratch that runs entirely on its own Workers platform, tailored for AI agents. It's in free public beta as of today.
  • The trade-off is deliberate: tabs, themes, extensions, and pixel-perfect rendering are gone, in exchange for 3–4x lower CPU usage and 5–7x lower memory usage.
  • Built in 12 weeks, with the first version ported by an AI. They also shared how they kept a complex AI-written project from spiraling out of control.
⚑ All figures below come from Cloudflare's launch blog post and the benchmarks and test reports published alongside it. These are vendor-reported numbers, not yet independently reproduced. Every figure traces to a source at the end of this article.
Opening

What exactly is Kitesurf?

In short, Cloudflare built a lightweight browser purpose-made for AI agents, and it runs directly inside the V8 isolateHow Cloudflare Workers executes code: instead of spinning up a VM per script, it runs many small isolated compartments inside a single V8 engine process. Fast to start, low overhead. architecture of Cloudflare Workers — a much lighter-weight way to run code than a virtual machine.

It's free for public beta today inside Browser Run. Migration cost is close to zero: add one parameter to your API call and you're switched over. Your existing Puppeteer or Playwright code doesn't need a single line changed.

Motivation

Why build a browser at all: Chromium was made for people

For years at Cloudflare, the question "should we build our own browser?" resurfaced every few months. Each time it was shelved — the technical difficulty and the question of what unique problem it would solve never quite aligned.

This time the answer flipped to "yes" because two things hit a tipping point at once. The platform side matured: WebAssembly on Workers is solid now, and once Dynamic Workers, SQLite-backed Durable Objects, and direct Worker-to-Worker calls were all in place, complex applications that weren't possible before became feasible. The demand side pushed hard: Browser Run, Cloudflare's headless browser automation product, grew fast alongside the AI boom — and agents simply can't do much of their work without a browser.

The catch was this: traditional browsers are designed for humans, with polished UI, tabs, rich extensions, and smooth 60fps scrolling. All of that makes them so memory- and CPU-hungry that giving every agent its own instance becomes prohibitively expensive. The result: most of the web stays out of reach for all but the priciest, most capable models, keeping many agent applications locked out.

But AI agents don't care about any of those frills. They laid out what each side actually needs, side by side. That table is the conceptual core of the whole piece:

What humans want — agents don't

The half you can cut

  • Tabs
  • Themes & skins
  • Browser extensions
  • Cross-device sync
  • Pixel-perfect rendering
  • Silky 60fps scrolling
What agents actually need

The half that stays

  • Token count
  • Context window
  • Scalability
  • Performance
  • Cost
  • Structured, machine-readable content
This site rearranged the three comparisons from the original post. The original put it bluntly: "a slightly worse CSS parser, or slightly less precise rendering — the agent doesn't care."

There's another line that's easy to miss: the threat model is different. A human opens a browser to visit sites they know; an AI drives a browser wherever the task points it. New problems like prompt injection and tool security become the top priority in this scenario.

So 12 weeks ago, they asked the old question once more. This time it passed unanimously: build it. Strip everything only a human would want visually or functionally, and keep only the core capabilities an AI can use.

Core advantages

What makes it worth it: massive cost savings, fully stateless, drop-in compatible

1. Extremely cheap on resources (the core value)

This is the most direct comparison against standard Chromium. The benchmark opponent here is a warm Chromium — one that's pre-heated and ready to take work immediately.

Kitesurf vs. warm-pool Chromium, three bottom lines
CPU savings3.1 – 3.8x

3.1x for screenshots, 3.8x for content extraction

Memory savings4.7 – 7.0x

4.7x for screenshots, 7.0x for content extraction

Wall time overhead1.7 – 1.8x

1.7x slower for content extraction, 1.8x for screenshots

Bars are drawn proportionally to the multiplier. Blue is what you save; clay is what you spend. You save on the CPU and memory line items of your bill, and you pay in wait time.

Data from the official benchmark table: a 14-URL corpus, each test run five times with the median taken. Diagram drawn by this site.

The raw numbers, in full:

MetricKitesurfChromium (warm)Delta
CPU · screenshot380 ms1,173 ms3.1x less
CPU · HTML extraction229 ms877 ms3.8x less
Memory · screenshot57.8 MiB271.0 MiB4.7x less
Memory · HTML extraction39.4 MiB273.7 MiB7.0x less
Wall time · screenshot1,148 ms637 ms1.8x slower
Wall time · HTML extraction820 ms472 ms1.7x slower
Source: the comparison table in Cloudflare's blog post. Note that the benchmark opponent is a warm Chromium — what cold-start Chromium would look like, they didn't say.

The point: memory and CPU are the bill. Cutting them by 3 to 7 times means the same spend now runs several times more agents at once. That's the entire reason this browser exists.

The trade-off / the small catch: wall time per page render is 1.7 to 1.8 times slower than Chromium. The official explanation: a JIT that has already seen a page is always going to be faster than a cold-start software renderer. The gap is mostly in rasterization and JPEG/PNG encoding, and they're still optimizing it. Trading a little wait time for 3 to 7 times the resources is a good deal for AI automation workloads.

Data and explanation from the Kitesurf launch post

2. Fully stateless and strongly isolated

The whole thing runs on Workers, treating every page load as untrusted input and starting every session from scratch. Of the three components, only the engine holds any state; everything else is stateless. With nothing to rebuild, recovering from a crash is just starting a new one and replaying the request.

The benefits are tangible: a page crashing doesn't take down the whole system, a stuck render can be killed and restarted on the spot, and you can run a thousand sessions at once without having to keep them all alive.

3. Drop-in compatible: switch with one parameter

It speaks standard CDPChrome DevTools Protocol — the protocol Chrome's devtools use to talk to the browser. Puppeteer, Playwright, and similar automation tools all drive the browser through it. (Chrome DevTools Protocol). That means whatever you're already using — Puppeteer, Playwright, chrome-remote-interface, or any AI framework that speaks MCP and CDP — switches over seamlessly by changing a single URL parameter. Not one line of code changes.

On spec conformance, it has already passed 215,000+ tests in the WPTWeb Platform Tests — a large public test suite that checks how well a browser implements web standards. (Web Platform Tests), with a few hundred more added each week.

A chart showing Kitesurf's passing Web Platform Tests subtest count over time, starting near zero in early May, jumping sharply in mid- and late June, and approaching 220,000 by the end of July
Passing test count over time. It started near zero in early May, the two big jumps around June 14 and June 21 contributed most of the growth, followed by a slow steady climb. Source: Cloudflare blog.

Breaking it down by area is more revealing: the parts agents actually use are covered well, but the same table shows some notably low numbers:

Test areaSubtest pass rateTest areaSubtest pass rate
encodingCharacter encoding99.5%streamsStreams76.4%
selectionText selection98.8%fetchNetwork requests58.6%
domDocument Object Model97.0%wasmWebAssembly51.1%
svgVector graphics96.9%domparsingDOM parsing45.1%
xhrLegacy async requests94.7%webidlInterface definitions43.5%
htmlHTML spec94.1%webmessagingCross-window messaging26.0%
cssStyling84.0%close-watcherClose gesture0.0%
Data from the official WPT coverage report. The official write-up only mentioned streams as an example ("even things less critical to agents are now supported well") and didn't mention fetch at 58.6% or wasm at 51.1% — both of which matter to agent workloads. Here we're just putting the numbers side by side. The reasons are unspecified; we won't speculate.

And then the classic test: it runs Doom. Their words: no matter how many tests you have, a project isn't truly done until it runs Doom.

Kitesurf running Doom. Source: Cloudflare blog.
Architecture

Technical architecture: three modules plus one network exit

The one thing to remember from this whole diagram: who holds state, who doesn't, and who can touch the network.

CDP clients (Puppeteer / Playwright) point here Engine 1. Only external entry · only one with state (sessions) PageScript Isolated env per page PageRenderer Pixels · kill & restart if stuck 2. Both stateless — use and discard Images / fonts / CSS / scripts SandboxOutbound 3. Only one with network · CORS policy · per-page cookies · 403 on violation Internet (untrusted)
Composite diagram drawn by this site; the official post has these pieces spread across four different figures. Here they're merged around one rule: what holds state, what doesn't, and what can reach the network.

Engine: the only externally facing component. It handles CDP WebSocket and HTTP interfaces and stores the state for each session. The name sounds the most intimidating, but it's actually the simplest of the three.

PageScript (scripting and parsing): every time a new page or cross-process iframe opens, it spins up a long-lived isolated environment via Dynamic Workers, with a clean global object and DOM document. HTML and CSS parsing use parts of Blitz (a modular rendering engine) and Stylo (Firefox's high-performance CSS parser) — both written in Rust.

There's a detail worth pausing on: what about eval in web pages? Workers still doesn't natively support eval for security reasons. You can't spawn a separate isolated environment to handle it either, because then it wouldn't have access to the page's global object. Their solution: use Boa JS (a JavaScript engine written in Rust) compiled to run on Workers. That's one runtime running on top of another — they admit it's not elegant, and it isn't, but it's good enough for the occasional eval that appears in real code. The moment Workers supports eval natively, Boa gets swapped out.

Internal structure of PageScript: Engine starts an isolated environment per navigation. Inside it, initialization runs, then page scripts execute in sequence, a JS engine (V8 or Boa) runs them, and the results read and write a live DOM. CSS, images, fonts, and fetch requests all point to SandboxOutbound
Inside PageScript: it initializes window and document first, then runs the page's scripts in order. Scripts execute on a JS engine — regular code runs on V8, eval runs on Boa — and the results read and write a live DOM. Note that the DOM itself runs in WebAssembly. The two arrows at the bottom right are this isolated environment's only external paths, both pointing to SandboxOutbound. Source: Cloudflare blog.

PageRenderer: takes the page object (they call it a "scene") produced by PageScript, pulls in fonts and images, rasterizes it into an image buffer, and returns JPEG / PNG / PDF as the client requested. It holds no page state — only a disposable cache — so if a render call fails or hangs, the engine can just kill and restart it. Every render request is self-contained and retryable.

SandboxOutbound (network exit): rendering an untrusted webpage means going out to the internet to fetch arbitrary resources — images, fonts, CSS, JavaScript, Wasm files. That's one of the most dangerous things a browser can do. Kitesurf narrows it all down to one component; nothing else can touch the network, and Dynamic Workers enforces this. It executes CORS policies, injects browser-shaped request headers, filters responses, keeps each page's cookies in a separate jar, and returns 403 for anything that violates policy.

A sequence diagram of one Kitesurf request: a CDP client initiates navigation, Engine starts an isolated environment, PageScript parses HTML, builds DOM, and runs scripts. In a loop, Engine calls PageRenderer for each frame and sends the frame back to the client
The official sequence diagram, tracing one request through the whole system: the client starts navigation → Engine spins up a new isolated environment → PageScript parses HTML, builds the DOM, and runs scripts → then it enters a loop where Engine calls PageRenderer for each frame and sends the rendered pixels back to the client. Source: Cloudflare blog.
Method

How it was built in 12 weeks

This is the most takeaway-friendly part of the whole post: how to hand an AI a job that's complex and easy to lose control of.

The starting point was an open source project called obscura — a headless engine written in Rust, with "no Chrome, no Node.js, no dependencies" as its pitch.

A screenshot of the obscura project page, described as a headless engine written in Rust for AI automation
obscura, the open source project that gave them the initial spark. Source: Cloudflare blog.

They had an AI agent try to port it to Workers. The first attempts were bad. The turning point: they gave the AI a solid plan plus a clear definition of success, detailed enough that the agent could keep looping on its own and know when to come back and ask questions. And then it worked. Once they saw that barely-functional prototype, the team committed to building the real thing.

Then comes the core question they asked out loud:

Getting from a prototype to a full browser that can hold up in production takes a lot of work and iteration. We won't deny it: using AI to speed that up was key. But how do you use AI on a project this complex without letting the quality of both the code and the result slip, and without slowing down?

The answer: give it as many tests as possible.

Kitesurf launch blog post

The tool was the WPT — it gave the AI agent a clear goal: a test either passes or it doesn't, no ambiguity. Humans do exactly two things: choose and prioritize which features to hand to the agent, and watch the architecture to make sure the agent's approach stays sound.

Humans do exactly two things Pick which features to hand over · Watch the architecture and approach AI agent edits code Run Web Platform Tests · auto-scores What passed, what didn't Edit again WPT can't catch real-world sites → a parallel layer: run Chromium side by side, compare render output step by step
Diagram drawn by this site. The loop only works because the middle step auto-scores.

But WPT only measures spec conformance — it can't tell you whether a real website renders and behaves correctly. So they added another layer: integration tests plus visual regression tests, using Puppeteer to run multi-step operations on real sites while running Chromium and Kitesurf in parallel. They compare not just the assertion results, but the rendered output of every single step, flagging any unexpected differences.

You can lift this method out of the browser context entirely: to get an AI to do a job that's complex and easy to lose control of, first give it a target that scores itself. Then humans retreat to the two positions that matter: choosing the problems and watching the architecture. Wherever the test can't reach, add another layer that can compare automatically.

Four rules set before the first line of production code

Beyond testing, there were four rules locked in before any real code was written. Each one comes with its "and here's what that means."

Rule 1

Use Rust wherever possible, compiled straight to WebAssembly

No Emscripten-style emulation layer — compile directly with wasm-bindgen. What that means: the compiled binary stays lean and fast, running as close to the metal as possible.

Rule 2

Exception handling is a survival problem, not a hygiene problem

A browser has to render the entire unreliable, sometimes hostile web — and it must never lose track of the page it's on. Their iron rule: any failure degrades into a blank frame or a missing element. A session must never just die. Every boundary catches errors, defaults to a safe empty result, and logs enough to debug.

Rule 3

Treat every page load as untrusted input

When you open a browser on your laptop, you're visiting sites you trust, and sharing a few resources between pages is fine. An agent is different — it gets pointed anywhere the task demands, running arbitrary code from arbitrary sources. So every session starts from scratch, and every component can only touch the resources its job strictly requires.

Rule 4

Be stateless whenever possible

State is what makes failures expensive. With nothing to rebuild, recovering from a crash is just starting over and replaying the request. What that means: stateless components are disposable by nature, parallelizable, killable the moment they hang, runnable a thousand at once, and they scale on demand without needing to stay warm — which fits automation workloads perfectly, since they arrive in bursts.

A diagram of Kitesurf's isolation design, showing boundaries between each component
The official isolation design diagram. The Workers platform provides the boundaries between isolated environments; the rest — "who can touch what" — has to be defined at the application layer. Source: Cloudflare blog.
Fit

What it's good for, and what it isn't

This section exists to help you decide: should my workload switch over?

Good fit

These workloads can move today

  • AI agents that need page rendering but can accept "not a full-featured, pixel-perfect Chromium"
  • One-shot automation: extracting text content from a page
  • One-shot automation: generating a PDF
  • One-shot automation: taking a screenshot
Not a fit

Use Chromium for these four

  • Playing videouse Chromium
  • Rendering WebGLuse Chromium
  • Bot-challenge handshakes at the TLS-fingerprint leveluse Chromium
  • Ten-minute logged-in sessions that need persistent stateuse Chromium
Both columns are straight from the official post. For the four things it can't do, the default Chromium in Browser Run still works — the two coexist and you switch between them inside the same product.

Their positioning line is worth quoting: think of Kitesurf as a short-lived, fully isolated, stateless engine that exists only for the duration of a single task — built for AI loads that arrive in bursts.

On site compatibility, things that render correctly right now include: the various TodoMVC versions (vanilla, React, Vue, Angular, Preact), Wikipedia, Hacker News, the Cloudflare blog, and most of the Cloudflare dashboard. The fastest way to check a specific site: type the URL into the public playground and see for yourself.

Kitesurf rendering a real website. Source: Cloudflare blog.
Getting started

How to try it, and the open source plan

Free public beta: it's available for free testing inside Cloudflare's Browser Run product, with per-account rate limits. To use it, add one parameter to your API call:

Take a screenshot with Kitesurf
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot?browser=kitesurf' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{"url": "https://example.com"}' \
  --output "screenshot.png"
The key part is the trailing browser=kitesurf. Same deal for the CDP endpoint — add that one flag and you're switched over.

Online Playground: they've published kitesurf.cloudflare.app — enter any URL and watch Kitesurf render it live, with full interactivity.

There's something in there you won't see elsewhere: they injected Chrome DevTools into the UI, and specifically implemented the CDP commands the Memory panel needs — so you can see the WebAssembly footprint of each isolated environment, including individual frames.

Kitesurf playground screenshot: the left side shows a rendered Wikipedia homepage, the right side shows an injected Chrome DevTools Memory panel listing memory usage for three JavaScript VM instances
Playground in action: Wikipedia rendered by Kitesurf on the left, and the Memory panel on the right showing three instances — Main 25.6 MB, PageRenderer 24.5 MB, Engine 19.4 MB, total JS heap 69.5 MB. Those three rows map exactly to the component diagram above. Source: Cloudflare blog.

They list four things in active development: broader CDP coverage; rendering fidelity for screenshots and PDFs (their reasoning: AI often does better looking at pictures than text); more WPT coverage; and efficiency — CPU, memory, and wall-time benchmarks are continuously running.

Open source plan: they say they intend to open source Kitesurf, "ready when we're ready, hopefully soon." The goal: let customers deploy their own instance inside their own account.

🧰 Getting started · Kitesurf
PricingFree during beta, per-account rate limits apply
RequirementsWith a Cloudflare account: add browser=kitesurf to the Browser Run CDP endpoint or Quick Actions API — no changes needed to existing Puppeteer / Playwright code. Just want to see it work? Open the public playground and type in a URL.
Another piece of the same idea, covered on this site
Cloudflare releases @cloudflare/computer: a "virtual computer" for every AI agent
Kitesurf gives every agent a browser; that piece gives every agent a computer. Same philosophy — rebuilding infrastructure the way agents actually use it.
Source
Introducing Kitesurf (an agent-dedicated browser running in Cloudflare Workers' V8 isolates)Cloudflare blog·Original post·2026-08-06
Editor's note
Benchmark tables, WPT growth curves and coverage, component diagrams, playground screenshots, and both videos come from the official release and are attributed in their captions. Three diagrams — what humans and agents each need, the test-driven loop, and the merged component view — were drawn by this site. The WPT breakdown table was compiled from the official coverage report; the low numbers in the right column weren't mentioned in the official text. Kitesurf was one of several announcements on day four of Cloudflare Agents Week; the same day also brought WebMCP, MCP V2, AI Search and AEO, each with its own launch page. Not covered here.