← Back to all posts
Tools

Cloudflare Rewrote the Browser in Rust. It Can't Play Video.

August 8, 2026 · 06:12 UTC · Tools
Cloudflare Rewrote the Browser in Rust. It Can't Play Video.

TL;DR

On August 6, Cloudflare launched Kitesurf, a headless browser it wrote from scratch in Rust for AI agents, with no Chromium anywhere inside it. It runs in a V8 isolate on Workers, passes 215,000+ Web Platform Tests, and on Cloudflare's own benchmarks uses 3.1x to 3.8x less CPU and 4.7x to 7.0x less memory than Chromium for screenshots and HTML extraction. It is also 1.7x to 1.8x slower on wall time, cannot play video, and cannot render WebGL. Your existing Puppeteer or Playwright client works against it by adding one query parameter.


Why anyone would rewrite a browser in 2026

Cloudflare's framing is the part worth stealing even if you never call the API. Browser engines were built for a species that is not using them any more:

Browser engines like Chromium were built for humans, not agents, and they come with overhead that AI models simply do not need. They consume so much memory and compute that providing every agent with its own instance is prohibitively expensive.

The list of things your agent does not want is long. Cloudflare names tabs, themes, extensions, and cross-device sync, then points at what an agent actually optimizes for: token count, context windows, scalability, and cost. Pixel perfection and 60 fps scrolling are not on the list.

Think of Chromium as a car built for a passenger who might recline the seat, change the radio, and watch a film on the drive. Your agent opens the door, reads the odometer, and leaves. You are still paying for the sound system, every single time, on every single session.

The numbers, and the methodology behind them

Cloudflare published medians of five Browser Run quick-action runs across a 14-URL corpus, comparing Kitesurf against Chromium pulled from a warm pool. Memory is where the gap is widest.

memory per task, MiB (lower is better) screenshot: chromium271.0 screenshot: kitesurf57.8 extract: chromium273.7 extract: kitesurf39.4 medians of five Browser Run quick-action runs, 14-URL corpus Chromium measured from a warm pool
HTML extraction is the lopsided one: 39.4 MiB against 273.7 MiB, a 7.0x gap.

CPU follows the same shape with a smaller spread: 380 ms against 1,173 ms for a screenshot, and 229 ms against 877 ms for extraction. Those are the two operations most agent stacks actually perform, which is a fair corpus choice rather than a flattering one.

How it is put together

Kitesurf is Rust compiled to WebAssembly, assembled from parts that already existed rather than written entirely from nothing. HTML rendering comes from Blitz, a modular Rust rendering engine. CSS parsing comes from Stylo, which is Firefox's parser. Scripts and .wasm files on the page run inside the same isolate.

your existing client, unchanged, to a non-Chromium engine Puppeteer /Playwright CDP KitesurfV8 isolate on Workers Blitz + Stylo+ Boa JS for eval() Rust compiled to WebAssembly. No Chromium in the path.
Speaking CDP is the whole compatibility story: nothing above the protocol has to change.

The eval problem

Workers does not support eval natively, for security reasons, and Cloudflare could not spin up a second isolate to handle it because that isolate would not share globalThis. So Kitesurf compiles and runs page evals through Boa JS, an ECMAScript engine written in Rust. Cloudflare is refreshingly blunt about how that feels:

We are basically executing a runtime on top of a runtime, which doesn't seem optimal, and it isn't, but it works well enough to handle the occasional evals we find in the code.

The plan is to drop Boa once native eval support lands in Workers. Until then, a JavaScript engine is running inside a JavaScript engine, which is the kind of thing that is either a hack or an architecture depending on how well it holds.

One door to the network

Fetching arbitrary assets from untrusted pages is the most dangerous thing a browser does, so Kitesurf funnels all of it through a single component called SandboxOutbound, with Dynamic Workers enforcing that nothing else touches the network directly. That component applies CORS and injects browser-shaped headers. The renderer itself holds no page state beyond a disposable cache, which means the engine can kill and relaunch it on any stuck or failed RPC call. Every render is self-contained, retryable, and disposable.

The trade you are actually making

Chromium wins the stopwatch, and Cloudflare says so plainly.

resources saved vs Chromium (bigger is better) cpu, screenshot3.1x cpu, extraction3.8x memory, screenshot4.7x memory, extraction7.0x what you pay for it (smaller is better) wall time1.7-1.8x slower Chromium wins wall time: a warm JIT beats a cold renderer
You trade latency for density. Which one hurts depends entirely on how many agents you run.

A screenshot takes 1,148 ms on Kitesurf against 637 ms on warm Chromium. Extraction is 820 ms against 472 ms. Cloudflare attributes the gap to a JIT that has already seen the page beating a cold software renderer, with most of the remaining difference coming from rasterization and JPEG or PNG encoding.

That is the entire decision in one line. If you run one browser, latency is your problem and Chromium is faster. If you are trying to hand a browser to every concurrent agent session, memory is your problem, and 39.4 MiB versus 273.7 MiB decides how many fit on a box before your bill does.

What it cannot do yet

Cloudflare put the limits in a section with its own heading, which is more honest than most launch posts manage. Kitesurf is not the right choice if you need to:

  • Play video.
  • Render WebGL.
  • Negotiate a bot-challenge handshake with real TLS fingerprints.
  • Start a ten-minute authenticated session that requires persistent state.

For any of those, Cloudflare tells you to use Browser Run's default, which is still Chromium. The video gap sounds worse than it is, given your agent was never going to watch it. The TLS fingerprint one is the gap that will actually bite: a meaningful share of the web that agents want to read is behind exactly that kind of challenge.

The design target is narrow on purpose. Cloudflare describes Kitesurf as an ephemeral, fully isolated, stateless engine meant to exist only for the duration of a task, tuned for bursty AI workloads. Long-lived authenticated sessions are explicitly not the use case.

Trying it without rewriting anything

The Browser Run CDP endpoint accepts Kitesurf as an option, so Puppeteer, Playwright, chrome-remote-interface, and any agent that speaks MCP and CDP work unchanged. You add browser=kitesurf to the CDP or Quick Action endpoint and that is the migration.

There is also a public playground with Chrome DevTools injected into the UI, so you can paste a URL, watch it render, and inspect the DOM, console, and network activity. Cloudflare published its 14-URL benchmark corpus too, which means you can check the claim rather than take it. Use the playground first: site compatibility is the real variable here, and it is faster to test than to reason about.

Cloudflare says the project started twelve weeks ago. It also runs Doom, because a browser project is not finished until it does.

Whether you should care

Two caveats sit on top of the numbers. It is beta, free for now, behind per-account limits, and priced at nothing precisely because the pricing is not settled. And it is not open source. Cloudflare says it plans to open source Kitesurf "once we're ready" so customers can deploy their own version, but today the only place this runs is Cloudflare, which makes the efficiency win a Cloudflare efficiency win until that changes.

Still, the useful move does not require adopting anything. Go count what fraction of your agent's browser work is screenshots, HTML extraction, and PDF generation on cooperative sites. That fraction is what a stripped engine could serve at roughly a seventh of the memory. The rest, the video and the WebGL and the bot challenges, was always going to need a real browser, and now you have a reason to route it separately instead of paying Chromium prices for the whole workload.

Key Takeaways

  • Cloudflare launched Kitesurf on August 6: a headless browser written in Rust, compiled to WebAssembly, running in a V8 isolate on Workers with no Chromium in it.
  • It uses 3.1x to 3.8x less CPU and 4.7x to 7.0x less memory than warm-pool Chromium on screenshots and HTML extraction, measured across a published 14-URL corpus.
  • It is 1.7x to 1.8x slower on wall time, because a warm JIT beats a cold software renderer. You are trading latency for density.
  • It passes 215,000+ Web Platform Tests and adds hundreds weekly, built on Blitz for rendering, Stylo for CSS, and Boa JS for evals that Workers cannot run natively.
  • It cannot play video, render WebGL, pass TLS-fingerprint bot challenges, or hold persistent authenticated sessions. Cloudflare says use Chromium for those.
  • Existing Puppeteer, Playwright, and CDP or MCP clients work by adding browser=kitesurf. It is free in beta, and not open source yet.

Sources: Cloudflare Blog, Cloudflare Developer Changelog, Cloudflare Browser Rendering docs, Kitesurf playground, TechCrunch

AIAgentsCloudflareBrowser AutomationRustWebAssemblyDeveloper ToolsInfrastructure
CONSOLE
$