Cloudflare Browser Run · free while in beta
A browser built for machines, not humans.
Kitesurf is a stateless, agent-first browser that runs entirely on Cloudflare Workers. It spins up as an ephemeral, fully isolated engine, exists only for the duration of a task — then vanishes, leaving nothing running and nothing to pay for.
· booting isolate…
01 Concept
Appears out of nowhere.
Does its work. Vanishes.
No warm pools. No idle browsers burning money between requests. Each task gets its own engine — spawned in a V8 isolate on Workers, fully isolated, untrusted by default — and when the answer comes back, the engine is gone.
Tuned for what an agent feels
- token count
- context windows
- scalability
- performance
- cost
Jettisoned — only humans need these
- tabs
- themes
- extensions
- pixel-perfect rendering
- 60 fps scrolling
Structured, machine-readable content matters; visual perfection doesn't. Every page load is treated as untrusted input, and every session starts fresh — a browser built for the Agentic Cloud.
02 Scale
Bursty work, met with bursty engines.
Agentic load arrives in gusts. Kitesurf sizes itself to demand — a thousand disposable engines in parallel when the gust hits, zero the moment it passes. Watch a burst land:
Each block is one engine: spawned for one task, gone right after. Idle cost: nothing.
Heavy engines kept warm between tasks — you pay for the pool whether it works or not.
03 Proof · performance
The metrics that drive your bill.
Against Chromium on Browser Run Quick Actions, Kitesurf spends a fraction of the CPU and memory on the two jobs agents do most. Explore it — switch the workload, switch the metric:
Medians of five Quick Action runs across a 14-URL corpus. CPU and memory — not wall time — are what you pay for.
04 Proof · standards
An instrument panel,
not a promise.
Kitesurf is built against the Web Platform Tests — the same W3C conformance suite every real browser answers to — with hundreds more subtests passing every week.
Strongest exactly where agents live: the DOM, HTML parsing, selection, encodings, and the network surface. URL sits at 83% — the frontier being tamed next.
Correctly renders, today:
- TodoMVC vanilla · React · Vue · Angular · Preact
- Wikipedia
- Hacker News
- Cloudflare Blog
- Cloudflare dashboard
05 Candor
What we left on the beach.
A stateless browser is a set of deliberate omissions. Here they are, on the record — because you should choose the right engine, not the newest one.
-
No video
Agents read the DOM; they don't watch movies. Media pipelines are weight an agent never asked for.
-
No WebGL
GPU-backed 3D exists for human eyes. Kitesurf spends those cycles on tokens instead.
-
No bot-challenge TLS fingerprinting
Kitesurf doesn't negotiate bot-challenge handshakes with real TLS fingerprints. It doesn't pretend to be human — it's a browser for machines, and it says so.
-
No long-running authenticated sessions
Stateless by design: no ten-minute logged-in flows that need persistent state. Every session starts fresh, and nothing leaks across tasks.
06 Touch it
One parameter away: browser=kitesurf
Quick Actions, your existing Puppeteer or Playwright setup over CDP, or any MCP client that speaks CDP — opting in is the same single query parameter everywhere.
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/browser-run/screenshot?browser=kitesurf' \
-H 'Authorization: Bearer <API_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://en.wikipedia.org/wiki/Kitesurfing"
}' \
--output "screenshot.png"
Any Quick Action endpoint — screenshot, HTML, PDF, and friends — takes browser=kitesurf.
import puppeteer from "puppeteer-core";
const browser = await puppeteer.connect({
browserWSEndpoint:
"wss://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>" +
"/browser-run/devtools/browser?browser=kitesurf",
headers: { Authorization: "Bearer <API_TOKEN>" },
});
const page = await browser.newPage();
await page.goto("https://news.ycombinator.com");
const html = await page.content(); // the whole page, 3.8× less CPU
await browser.close(); // engine vanishes — nothing left running
Your existing Puppeteer setup already speaks CDP. Change one URL; keep everything else.
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP(
"wss://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>" +
"/browser-run/devtools/browser?browser=kitesurf",
{ headers: { Authorization: "Bearer <API_TOKEN>" } }
);
const page = await browser.newPage();
await page.goto("https://todomvc.com/examples/react/dist/");
await page.screenshot({ path: "todo.png" }); // 4.7× less memory
await browser.close();
Same CDP endpoint, same parameter — connectOverCDP drops straight in.
{
"mcp": {
"kitesurf": {
"type": "local",
"command": [
"npx",
"-y",
"chrome-devtools-mcp@latest",
"--wsEndpoint=wss://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/browser-run/devtools/browser?browser=kitesurf",
"--wsHeaders={\"Authorization\":\"Bearer <API_TOKEN>\"}"
],
"enabled": true
}
}
}
Any agent that speaks MCP and CDP can drive Kitesurf — no Chrome install required.
Catch the wind
while it's free.
Kitesurf is in beta and currently free, behind per-account limits. Point it at your ugliest URL and see what a browser for machines gives back.