kitesurf · bench

← back to latest

Viewing archived run 2026-07-05 · commit be11786. View latest →

Backend comparison — median wall time

One grouped bar per page, one bar per backend. Bar height = median wall time from the orchestrator's performance.now() span. Hover a bar for median/p95/p99. Missing or all-errored cells render as a thin grey stub.

screenshot · wall

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 885ms · p95 2004ms · p99 2004mscontainer · median 354ms · p95 374ms · p99 374ms Example Domainexample-comkitesurf · median 1234ms · p95 2547ms · p99 2547mscontainer · median 698ms · p95 712ms · p99 712ms Hacker Newshacker-newskitesurf · median 3196ms · p95 3445ms · p99 3445mscontainer · median 871ms · p95 938ms · p99 938ms Cloudflare Developer Docscf-developerskitesurf · median 2567ms · p95 2647ms · p99 2647mscontainer · median 897ms · p95 911ms · p99 911ms The Cloudflare Blogcf-blogkitesurf · median 2015ms · p95 2692ms · p99 2692mscontainer · median 778ms · p95 849ms · p99 849ms Wikipedia Portalwikipedia-portalkitesurf · median 2836ms · p95 4671ms · p99 4671mscontainer · median 1645ms · p95 1696ms · p99 1696ms Der Spiegelspiegelkitesurf · median 4171ms · p95 6854ms · p99 6854mscontainer · median 1505ms · p95 1585ms · p99 1585ms El Mundoelmundokitesurf · median 1418ms · p95 1531ms · p99 1531mscontainer · median 412ms · p95 428ms · p99 428ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 1457ms · p95 1623ms · p99 1623mscontainer · median 453ms · p95 460ms · p99 460ms TodoMVC · Reacttodomvc-reactkitesurf · median 1459ms · p95 1519ms · p99 1519mscontainer · median 495ms · p95 529ms · p99 529ms TodoMVC · Vuetodomvc-vuekitesurf · median 1511ms · p95 1819ms · p99 1819mscontainer · median 523ms · p95 817ms · p99 817ms TodoMVC · Angulartodomvc-angularkitesurf · median 944ms · p95 1486ms · p99 1486mscontainer · median 452ms · p95 556ms · p99 556ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · wall

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 852ms · p95 1228ms · p99 1228mscontainer · median 154ms · p95 164ms · p99 164ms Example Domainexample-comkitesurf · median 1077ms · p95 1117ms · p99 1117mscontainer · median 511ms · p95 759ms · p99 759ms Hacker Newshacker-newskitesurf · median 3155ms · p95 6458ms · p99 6458mscontainer · median 643ms · p95 761ms · p99 761ms Cloudflare Developer Docscf-developerskitesurf · median 2553ms · p95 3057ms · p99 3057mscontainer · median 742ms · p95 796ms · p99 796ms The Cloudflare Blogcf-blogkitesurf · median 1820ms · p95 2228ms · p99 2228mscontainer · median 486ms · p95 647ms · p99 647ms Wikipedia Portalwikipedia-portalkitesurf · median 2786ms · p95 2823ms · p99 2823mscontainer · median 1563ms · p95 1670ms · p99 1670ms Der Spiegelspiegelkitesurf · median 3021ms · p95 3946ms · p99 3946mscontainer · median 1109ms · p95 1196ms · p99 1196ms El Mundoelmundokitesurf · median 1390ms · p95 1557ms · p99 1557mscontainer · median 270ms · p95 277ms · p99 277ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 946ms · p95 1496ms · p99 1496mscontainer · median 312ms · p95 333ms · p99 333ms TodoMVC · Reacttodomvc-reactkitesurf · median 1449ms · p95 1478ms · p99 1478mscontainer · median 320ms · p95 387ms · p99 387ms TodoMVC · Vuetodomvc-vuekitesurf · median 929ms · p95 1526ms · p99 1526mscontainer · median 325ms · p95 367ms · p99 367ms TodoMVC · Angulartodomvc-angularkitesurf · median 863ms · p95 1424ms · p99 1424mscontainer · median 233ms · p95 261ms · p99 261ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

Backend comparison — median backend CPU time

Server-side CPU per call. Kitesurf reports $workers.cpuTimeMs from Workers Observability; container reports Node-side CPU via timing headers. Browser-run doesn't expose a CPU counter — bars render as a grey stub.

screenshot · cpu

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 84ms · p95 915ms · p99 915mscontainer · median 508ms · p95 537ms · p99 537ms Example Domainexample-comkitesurf · median 289ms · p95 594ms · p99 594mscontainer · median 696ms · p95 866ms · p99 866ms Hacker Newshacker-newskitesurf · median 709ms · p95 741ms · p99 741mscontainer · median 1872ms · p95 1952ms · p99 1952ms Cloudflare Developer Docscf-developerskitesurf · median 451ms · p95 471ms · p99 471mscontainer · median 2003ms · p95 2140ms · p99 2140ms The Cloudflare Blogcf-blogkitesurf · median 615ms · p95 1031ms · p99 1031mscontainer · median 1734ms · p95 1965ms · p99 1965ms Wikipedia Portalwikipedia-portalkitesurf · median 1315ms · p95 1806ms · p99 1806mscontainer · median 3343ms · p95 3436ms · p99 3436ms Der Spiegelspiegelkitesurf · median 1680ms · p95 2882ms · p99 2882mscontainer · median 3931ms · p95 4181ms · p99 4181ms El Mundoelmundokitesurf · median 110ms · p95 171ms · p99 171mscontainer · median 679ms · p95 748ms · p99 748ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 143ms · p95 149ms · p99 149mscontainer · median 781ms · p95 823ms · p99 823ms TodoMVC · Reacttodomvc-reactkitesurf · median 101ms · p95 159ms · p99 159mscontainer · median 879ms · p95 1029ms · p99 1029ms TodoMVC · Vuetodomvc-vuekitesurf · median 115ms · p95 161ms · p99 161mscontainer · median 922ms · p95 1079ms · p99 1079ms TodoMVC · Angulartodomvc-angularkitesurf · median 116ms · p95 170ms · p99 170mscontainer · median 736ms · p95 913ms · p99 913ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · cpu

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 53ms · p95 91ms · p99 91mscontainer · median 312ms · p95 339ms · p99 339ms Example Domainexample-comkitesurf · median 139ms · p95 161ms · p99 161mscontainer · median 544ms · p95 654ms · p99 654ms Hacker Newshacker-newskitesurf · median 606ms · p95 1576ms · p99 1576mscontainer · median 1320ms · p95 1658ms · p99 1658ms Cloudflare Developer Docscf-developerskitesurf · median 310ms · p95 486ms · p99 486mscontainer · median 1702ms · p95 1870ms · p99 1870ms The Cloudflare Blogcf-blogkitesurf · median 406ms · p95 573ms · p99 573mscontainer · median 1088ms · p95 1392ms · p99 1392ms Wikipedia Portalwikipedia-portalkitesurf · median 1273ms · p95 1311ms · p99 1311mscontainer · median 3220ms · p95 3387ms · p99 3387ms Der Spiegelspiegelkitesurf · median 1663ms · p95 1960ms · p99 1960mscontainer · median 2889ms · p95 3068ms · p99 3068ms El Mundoelmundokitesurf · median 66ms · p95 134ms · p99 134mscontainer · median 599ms · p95 609ms · p99 609ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 96ms · p95 98ms · p99 98mscontainer · median 642ms · p95 710ms · p99 710ms TodoMVC · Reacttodomvc-reactkitesurf · median 60ms · p95 61ms · p99 61mscontainer · median 685ms · p95 701ms · p99 701ms TodoMVC · Vuetodomvc-vuekitesurf · median 65ms · p95 69ms · p99 69mscontainer · median 689ms · p95 770ms · p99 770ms TodoMVC · Angulartodomvc-angularkitesurf · median 57ms · p95 60ms · p99 60mscontainer · median 478ms · p95 560ms · p99 560ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

Backend comparison — median memory

Per-page memory at end of render. The two backends report different things — bars are directionally comparable, not strictly apples-to-apples.

In short: kitesurf overcounts (high-water peak across the whole renderer); container undercounts (JS heap only). The truth for either backend lives somewhere between the two columns.

screenshot · mem

0MiB 24MiB 48MiB 72MiB 95MiB kitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 16MiB · p95 16MiB · p99 16MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 33MiB · p95 33MiB · p99 33MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 33MiB · p95 33MiB · p99 33MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB The Cloudflare Blogcf-blogkitesurf · median 32MiB · p95 32MiB · p99 32MiBcontainer · median 3MiB · p95 6MiB · p99 6MiB Wikipedia Portalwikipedia-portalkitesurf · median 69MiB · p95 103MiB · p99 103MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB Der Spiegelspiegelkitesurf · median 40MiB · p95 66MiB · p99 66MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB El Mundoelmundokitesurf · median 13MiB · p95 13MiB · p99 13MiBcontainer · median 2MiB · p95 3MiB · p99 3MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Reacttodomvc-reactkitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Vuetodomvc-vuekitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB TodoMVC · Angulartodomvc-angularkitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · mem

0MiB 24MiB 48MiB 72MiB 95MiB kitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 9MiB · p95 9MiB · p99 9MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 31MiB · p95 31MiB · p99 31MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 33MiB · p95 33MiB · p99 33MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB The Cloudflare Blogcf-blogkitesurf · median 32MiB · p95 32MiB · p99 32MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB Wikipedia Portalwikipedia-portalkitesurf · median 70MiB · p95 70MiB · p99 70MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB Der Spiegelspiegelkitesurf · median 38MiB · p95 38MiB · p99 38MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB El Mundoelmundokitesurf · median 8MiB · p95 8MiB · p99 8MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Reacttodomvc-reactkitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB TodoMVC · Vuetodomvc-vuekitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB TodoMVC · Angulartodomvc-angularkitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

Run 2026-07-05 · per-metric tables

Same layout as npm run bench: per endpoint, tables for wall, cpu, mem. Each backend's median/p95/p99 side by side. ks = kitesurf, br = browser-run, ct = container. = backend doesn't report this metric. err = every recorded run for that combination errored. See the memory chart's caption above for the per-backend metric semantics.

screenshot

wall — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 885ms2004ms2004ms354ms374ms374ms
Hacker News hacker-news 1234ms2547ms2547ms698ms712ms712ms
Cloudflare Developer Docs cf-developers 3196ms3445ms3445ms871ms938ms938ms
The Cloudflare Blog cf-blog 2567ms2647ms2647ms897ms911ms911ms
Wikipedia Portal wikipedia-portal 2015ms2692ms2692ms778ms849ms849ms
Der Spiegel spiegel 2836ms4671ms4671ms1645ms1696ms1696ms
El Mundo elmundo 4171ms6854ms6854ms1505ms1585ms1585ms
TodoMVC · JavaScript ES6 todomvc-js-es6 1418ms1531ms1531ms412ms428ms428ms
TodoMVC · React todomvc-react 1457ms1623ms1623ms453ms460ms460ms
TodoMVC · Vue todomvc-vue 1459ms1519ms1519ms495ms529ms529ms
TodoMVC · Angular todomvc-angular 1511ms1819ms1819ms523ms817ms817ms
TodoMVC · Preact todomvc-preact 944ms1486ms1486ms452ms556ms556ms
cpu — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 84ms915ms915ms508ms537ms537ms
Hacker News hacker-news 289ms594ms594ms696ms866ms866ms
Cloudflare Developer Docs cf-developers 709ms741ms741ms1872ms1952ms1952ms
The Cloudflare Blog cf-blog 451ms471ms471ms2003ms2140ms2140ms
Wikipedia Portal wikipedia-portal 615ms1031ms1031ms1734ms1965ms1965ms
Der Spiegel spiegel 1315ms1806ms1806ms3343ms3436ms3436ms
El Mundo elmundo 1680ms2882ms2882ms3931ms4181ms4181ms
TodoMVC · JavaScript ES6 todomvc-js-es6 110ms171ms171ms679ms748ms748ms
TodoMVC · React todomvc-react 143ms149ms149ms781ms823ms823ms
TodoMVC · Vue todomvc-vue 101ms159ms159ms879ms1029ms1029ms
TodoMVC · Angular todomvc-angular 115ms161ms161ms922ms1079ms1079ms
TodoMVC · Preact todomvc-preact 116ms170ms170ms736ms913ms913ms
mem — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 11MiB11MiB11MiB2MiB2MiB2MiB
Hacker News hacker-news 16MiB16MiB16MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 33MiB33MiB33MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 33MiB33MiB33MiB3MiB4MiB4MiB
Wikipedia Portal wikipedia-portal 32MiB32MiB32MiB3MiB6MiB6MiB
Der Spiegel spiegel 69MiB103MiB103MiB9MiB9MiB9MiB
El Mundo elmundo 40MiB66MiB66MiB9MiB9MiB9MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 13MiB13MiB13MiB2MiB3MiB3MiB
TodoMVC · React todomvc-react 11MiB11MiB11MiB3MiB4MiB4MiB
TodoMVC · Vue todomvc-vue 11MiB11MiB11MiB3MiB4MiB4MiB
TodoMVC · Angular todomvc-angular 11MiB11MiB11MiB9MiB9MiB9MiB
TodoMVC · Preact todomvc-preact 11MiB11MiB11MiB3MiB3MiB3MiB

html

wall — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 852ms1228ms1228ms154ms164ms164ms
Hacker News hacker-news 1077ms1117ms1117ms511ms759ms759ms
Cloudflare Developer Docs cf-developers 3155ms6458ms6458ms643ms761ms761ms
The Cloudflare Blog cf-blog 2553ms3057ms3057ms742ms796ms796ms
Wikipedia Portal wikipedia-portal 1820ms2228ms2228ms486ms647ms647ms
Der Spiegel spiegel 2786ms2823ms2823ms1563ms1670ms1670ms
El Mundo elmundo 3021ms3946ms3946ms1109ms1196ms1196ms
TodoMVC · JavaScript ES6 todomvc-js-es6 1390ms1557ms1557ms270ms277ms277ms
TodoMVC · React todomvc-react 946ms1496ms1496ms312ms333ms333ms
TodoMVC · Vue todomvc-vue 1449ms1478ms1478ms320ms387ms387ms
TodoMVC · Angular todomvc-angular 929ms1526ms1526ms325ms367ms367ms
TodoMVC · Preact todomvc-preact 863ms1424ms1424ms233ms261ms261ms
cpu — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 53ms91ms91ms312ms339ms339ms
Hacker News hacker-news 139ms161ms161ms544ms654ms654ms
Cloudflare Developer Docs cf-developers 606ms1576ms1576ms1320ms1658ms1658ms
The Cloudflare Blog cf-blog 310ms486ms486ms1702ms1870ms1870ms
Wikipedia Portal wikipedia-portal 406ms573ms573ms1088ms1392ms1392ms
Der Spiegel spiegel 1273ms1311ms1311ms3220ms3387ms3387ms
El Mundo elmundo 1663ms1960ms1960ms2889ms3068ms3068ms
TodoMVC · JavaScript ES6 todomvc-js-es6 66ms134ms134ms599ms609ms609ms
TodoMVC · React todomvc-react 96ms98ms98ms642ms710ms710ms
TodoMVC · Vue todomvc-vue 60ms61ms61ms685ms701ms701ms
TodoMVC · Angular todomvc-angular 65ms69ms69ms689ms770ms770ms
TodoMVC · Preact todomvc-preact 57ms60ms60ms478ms560ms560ms
mem — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 6MiB6MiB6MiB2MiB2MiB2MiB
Hacker News hacker-news 9MiB9MiB9MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 31MiB31MiB31MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 33MiB33MiB33MiB3MiB4MiB4MiB
Wikipedia Portal wikipedia-portal 32MiB32MiB32MiB3MiB4MiB4MiB
Der Spiegel spiegel 70MiB70MiB70MiB9MiB9MiB9MiB
El Mundo elmundo 38MiB38MiB38MiB9MiB9MiB9MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 8MiB8MiB8MiB3MiB3MiB3MiB
TodoMVC · React todomvc-react 6MiB6MiB6MiB3MiB4MiB4MiB
TodoMVC · Vue todomvc-vue 6MiB6MiB6MiB4MiB4MiB4MiB
TodoMVC · Angular todomvc-angular 6MiB6MiB6MiB9MiB9MiB9MiB
TodoMVC · Preact todomvc-preact 6MiB6MiB6MiB3MiB3MiB3MiB

History

date commit kitesurf · screenshotkitesurf · htmlcontainer · screenshotcontainer · html note
2026-07-11 17:4615ac2dc1195ms1488ms884ms589ms
2026-07-05 14:03be117861645ms1468ms915ms677msboa eval-less runtime — run page JS (Runtime.evaluate + dynamic import) without V8 code-gen-from-string @lduarte
2026-07-02 00:361f76dfb560ms547ms696ms512msReduce wasm peak memory ~23% (emoji SVG-strip + node-slab pre-size + lazy serif) @lduarte
2026-06-15 10:3678edd791008ms996ms683ms473ms
2026-06-06 10:289afdd69727ms1457ms778ms548ms
2026-06-05 15:46c8a9da7715ms597ms1080ms920msRefactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-05 15:34c8a9da7715ms597ms1080ms920msRefactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-02 09:1536cc68a950ms1060ms858ms572ms
2026-06-02 00:32bc688751088ms1234ms734ms520ms
2026-06-02 00:1584bf4a3835ms1360ms521ms356ms
2026-06-02 00:04885052c923ms1079ms693ms505ms
2026-06-01 23:56d1fa08a1173ms1182ms879ms480ms
2026-06-01 23:304e0f0e71358ms1181ms697ms460ms
2026-05-31 19:29cd6a6d51109ms869ms864ms610ms
2026-05-25 22:39caf5678633ms658ms608ms369msrerun with concurrent-producer wallMs fix
2026-05-25 21:37a4d9bf51442ms1151ms741ms410mstail-worker CPU attribution: now includes page-script wasm/JS cost
2026-05-25 11:4804351641359ms1194ms916ms618ms
2026-05-25 11:4804351641362ms1160ms823ms714ms
2026-05-25 11:4804351641215ms1020ms704ms487ms
2026-05-25 11:4804351641172ms925ms706ms394ms

Archived report (markdown)

# 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.

bundle built 2026-07-11T17:46:18.286Z