Tools

Cloudflare Kitesurf review: a lean browser for bounded agent work

A documentation and hands-on review of Cloudflare Kitesurf, including where its lightweight browser engine works, where Chromium remains safer and how to test it.

A small Kitesurf test on 30 August 2026 produced usable HTML from four different public sites and a correct 1920 by 1080 screenshot of this site. Kitesurf worked for these bounded pages; a larger representative set is needed to establish where it fits.

That result is encouraging, but it does not make Kitesurf a drop-in replacement for Chromium. The product is a research preview, the public playground imposes tight execution limits, and Cloudflare documents several classes of site that it does not yet suit. The sensible question is where its smaller browser is sufficient.

What Kitesurf is trying to change

Browser automation usually starts a full browser engine such as Chromium. That provides broad compatibility with modern sites, but it also consumes substantial memory and CPU. The cost becomes noticeable when an agent needs to visit many pages, or when a platform must isolate a browser for every task.

Kitesurf takes a smaller route. Cloudflare describes it as a purpose-built browser engine based on Servo and designed for agent workloads. It can load pages, run JavaScript, return rendered HTML and capture screenshots. The public interface accepts a URL and exposes the result through simple HTTP endpoints.

Kitesurf renders pages, allowing it to recover content inserted by client-side JavaScript instead of returning only a server response. Its current strength is programmatic retrieval, while a remote desktop browser supports an agent or person operating a graphical session.

The distinction matters because “browser use” covers several jobs:

  • fetching a page and extracting its text;
  • rendering a client-side application before extraction;
  • taking a screenshot for visual checking;
  • completing a form across several steps;
  • maintaining an authenticated session; and
  • interacting with media, graphics or anti-bot systems.

Kitesurf looks most credible near the top of that list.

How I tested it

I used Cloudflare’s public playground rather than a private build. The playground reported a limit of 20 seconds of CPU time and 60 seconds of wall time for each navigation. I sent four URLs to its rendered-HTML endpoint:

  1. Example.com, a minimal static page;
  2. the React TodoMVC demonstration, which relies on client-side rendering;
  3. the Index Us article listing; and
  4. Cloudflare’s Kitesurf documentation, a much larger documentation page.

I then requested a screenshot of the Index Us article listing. For each request I recorded the HTTP status, response size and the memory figure returned in Kitesurf’s response headers. I inspected the returned markup for expected content rather than treating a 200 response as proof of success.

This functional check used five requests, one public service and one point in time. It did not control network conditions, caches or playground capacity. The measurements describe this test and provide no general performance estimate.

What worked

All four HTML requests returned HTTP 200 and contained the expected page content.

Page Rendered HTML x-kitesurf-memory-bytes Check
Example.com 544 bytes 7,667,712 bytes Title, paragraph and link present
React TodoMVC 1,567 bytes 9,594,700 bytes App heading, input prompt and navigation present
Index Us articles 3,712 bytes 8,262,136 bytes Canonical metadata and article cards present
Cloudflare documentation 123,865 bytes 35,823,780 bytes Documentation content present

The TodoMVC result is the useful one. A plain HTTP client can fetch the application’s shell, but the meaningful interface is assembled in the browser. Kitesurf returned the rendered controls, showing that JavaScript execution was doing useful work.

The screenshot endpoint also returned HTTP 200. The response was a valid 156,352-byte PNG at 1920 by 1080 pixels. A visual inspection showed the expected Index Us page with its navigation, heading and article grid in the correct positions.

These results support a modest conclusion: Kitesurf can handle static pages, a common client-rendered application, a production Astro site and a large documentation page within the public playground’s limits.

Reading Cloudflare’s benchmark carefully

Cloudflare’s launch article compares Kitesurf with warm Chromium across a 14-URL test set. The company reports a 3–7x CPU and memory advantage for Kitesurf, alongside roughly 1.7–1.8x longer wall-clock time.

Those numbers come from the vendor’s workloads and environment. They show the intended design trade-off and need independent measurement on another system. The slower wall time is especially important: lower resource use can increase throughput or reduce cost while an interactive agent still feels slower to a user.

Before adopting the engine, measure the unit that matters to your service: accepted pages per dollar, completed jobs per Worker, time to first usable text, or end-to-end task time. A browser that is frugal per process can still be the wrong choice if compatibility failures cause repeated attempts.

Where the lean design helps

Kitesurf is a plausible fit when the job has a clear boundary and the target pages are known or can be sampled in advance.

Retrieval for research. An agent that needs rendered text from public pages can try Kitesurf before paying the memory cost of Chromium. Preserve source URLs and page dates because successful rendering does not establish the truth of the content.

Large-scale link and content checks. Teams can render pages, confirm that expected elements exist and send failures to a heavier browser. The small per-navigation budget encourages focused checks.

Screenshots for regression triage. The screenshot endpoint can provide visual evidence when a simple HTML assertion fails and help identify whether a page loaded at all. Full visual regression testing needs comparison, thresholds and failure review around that image.

Agent tool calls with strict limits. A narrow tool such as get_rendered_page(url) is easier to secure and monitor than a general computer-control interface. The caller can restrict domains, response size, elapsed time and output format.

In each case, success means retrieving an intended result under a defined resource budget. It does not require the browser to impersonate a person across an arbitrary site.

When Chromium remains the safer choice

Cloudflare’s documentation identifies unsupported or unsuitable areas including video, WebGL, bot challenges and long-running authenticated sessions. Those are meaningful gaps.

Use a mature full browser when the workflow depends on broad web compatibility, persistent login state, extension support, complex file interactions, rich media or precise visual behaviour. The same applies when a failure could submit a transaction or alter important data. Compatibility and observability matter more than shaving memory from a rare, consequential operation.

Websites also change without notice. A representative test set can pass today and fail after a framework update, consent banner change or authentication redesign. A production integration needs a fallback path and a way to see why rendering failed.

Host-side security still needs separate testing

The five-request test covered rendering only. The following controls are production requirements for the host application; they are not observed Kitesurf behaviours. Pages can contain prompt injection, misleading instructions, tracking code and hostile downloads, so rendered text remains untrusted input.

The host application should restrict destination schemes and, where practical, destination domains. It should block private network ranges to reduce server-side request forgery risk, cap response sizes, set timeouts and keep browser output separate from system instructions. An agent should not gain permission to send a message, upload a file or approve a purchase merely because a rendered page asks it to.

Logging should capture the requested URL, final URL, timestamp, engine version, outcome and any fallback. Do not log sensitive page content by default. Authenticated use requires a deliberate cookie and credential policy rather than passing a user’s browser state into a new service.

A practical adoption test

Build a set of about twenty URLs from the work you actually expect Kitesurf to perform. Include ordinary pages, client-rendered pages, large pages, redirects, consent banners, one slow response and known failures. Define success for each URL before running the test, following the same discipline as the twenty-case evaluation method.

Record:

  • whether the expected content appeared;
  • total wall time and reported resource use;
  • output size;
  • redirect behaviour;
  • screenshot correctness where relevant; and
  • whether Chromium succeeded when Kitesurf did not.

Run the set more than once and keep the failures. If Kitesurf clears the required success rate, place it first in a tiered browser service and send unsupported cases to Chromium. Set a review date while the product remains a research preview.

Adopt Kitesurf only if the representative set clears the required success rate and the Chromium fallback is visible in logs and cost measurements. The announcement-verification guide provides the evidence record for revisiting that decision as the research preview changes.

Sources

  1. Cloudflare — Introducing Kitesurf
  2. Cloudflare Developers — Kitesurf documentation
  3. Cloudflare — Kitesurf playground

Last reviewed: . See our editorial policy for how we test, source and correct our work.