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.

session · booting isolate…
ride the wind

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.

spawn 0 ms
work 380 ms CPU
vanish nothing left

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:

◆ Kitesurf 0 engines alive · 0 MiB resident

Each block is one engine: spawned for one task, gone right after. Idle cost: nothing.

● Chromium warm pool 3 browsers resident · 813 MiB, always

Heavy engines kept warm between tasks — you pay for the pool whether it works or not.

…or wait — bursts arrive on their own.

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:

3.1× less CPU than Chromium
Kitesurf
380 ms
Chromium (warm pool)
1,173 ms

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.

0 WPT subtests passing — and climbing weekly
conformance run: live

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.

CANDOR.md read before adopting
  • 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.

screenshot.sh
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.

agent.mjs
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.

agent.mjs
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.

opencode.json — or any MCP client
{
  "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.

View more demos Get $10 off Kimi K3