# kitesurf bench report — 2026-07-05

commit: `be11786` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org

> boa eval-less runtime — run page JS (Runtime.evaluate + dynamic import) without V8 code-gen-from-string @lduarte

## Summary (median wall time)

| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 846ms | 811ms | 437ms | 215ms |
| Hacker News | 1207ms | 1042ms | 828ms | 826ms |
| Cloudflare Developer Docs | 2680ms | 2709ms | 1008ms | 760ms |
| The Cloudflare Blog | 2166ms | 2293ms | 1001ms | 837ms |
| Wikipedia Portal | 1645ms | 1468ms | 915ms | 677ms |
| Der Spiegel | 1688ms | 1973ms | 1790ms | 1739ms |
| El Mundo | 3013ms | 2026ms | 1590ms | 1195ms |
| TodoMVC · JavaScript ES6 | 1266ms | 1329ms | 493ms | 343ms |
| TodoMVC · React | 1384ms | 811ms | 965ms | 388ms |
| TodoMVC · Vue | 1331ms | 1392ms | 564ms | 801ms |
| TodoMVC · Angular | 1389ms | 821ms | 868ms | 706ms |
| TodoMVC · Preact | 785ms | 758ms | 522ms | 643ms |

Notes:

- Values are run medians across recorded runs. p95 and min/max are in the JSON.
- Backends are dispatched from inside the `kitesurf-bench` worker via RPC bindings: `env.KITESURF.fetch(/screenshot|/html)` for kitesurf (service binding to the engine), `env.BROWSER.quickAction('screenshot'|'content', …)` for browser-run (Browser Rendering RPC), and `env.CONTAINER_HOST.fetch(…)` for container (sibling worker fronting its container backend). Wall time is the orchestrator's `performance.now()` span; `backendWallMs` / `backendCpuMs` in the JSON come from Workers Observability (kitesurf) or container-side timing headers (container). None of the measurement paths traverse the public internet.
- A cell shows `—` when every recorded run for that combination errored. See `rows` in the JSON for individual failure messages.
