kitesurf · bench

← back to latest

Viewing archived run 2026-06-02 · commit 36cc68a. 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 1131ms · p95 1694ms · p99 1694mscontainer · median 334ms · p95 377ms · p99 377ms Example Domainexample-comkitesurf · median 1459ms · p95 1517ms · p99 1517mscontainer · median 731ms · p95 782ms · p99 782ms Hacker Newshacker-newskitesurf · median 2090ms · p95 4689ms · p99 4689mscontainer · median 913ms · p95 1055ms · p99 1055ms Cloudflare Developer Docscf-developerskitesurf · median 1940ms · p95 3872ms · p99 3872mscontainer · median 1034ms · p95 1161ms · p99 1161ms The Cloudflare Blogcf-blogkitesurf · median 1534ms · p95 3111ms · p99 3111mscontainer · median 763ms · p95 809ms · p99 809ms Wikipedia Portalwikipedia-portalkitesurf · median 2350ms · p95 3129ms · p99 3129mscontainer · median 1844ms · p95 1978ms · p99 1978ms Der Spiegelspiegelkitesurf · median 3494ms · p95 5758ms · p99 5758mscontainer · median 2344ms · p95 3255ms · p99 3255ms El Mundoelmundokitesurf · median 1231ms · p95 1370ms · p99 1370mscontainer · median 450ms · p95 504ms · p99 504ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 1203ms · p95 1265ms · p99 1265mscontainer · median 456ms · p95 510ms · p99 510ms TodoMVC · Reacttodomvc-reactkitesurf · median 1162ms · p95 1297ms · p99 1297mscontainer · median 476ms · p95 503ms · p99 503ms TodoMVC · Vuetodomvc-vuekitesurf · median 1818ms · p95 1828ms · p99 1828mscontainer · median 587ms · p95 621ms · p99 621ms TodoMVC · Angulartodomvc-angularkitesurf · median 1270ms · p95 1362ms · p99 1362mscontainer · median 451ms · p95 662ms · p99 662ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · wall

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 919ms · p95 1017ms · p99 1017mscontainer · median 159ms · p95 318ms · p99 318ms Example Domainexample-comkitesurf · median 1394ms · p95 1494ms · p99 1494mscontainer · median 549ms · p95 823ms · p99 823ms Hacker Newshacker-newskitesurf · median 1730ms · p95 1906ms · p99 1906mscontainer · median 668ms · p95 800ms · p99 800ms Cloudflare Developer Docscf-developerskitesurf · median 2258ms · p95 3797ms · p99 3797mscontainer · median 903ms · p95 962ms · p99 962ms The Cloudflare Blogcf-blogkitesurf · median 1393ms · p95 3171ms · p99 3171mscontainer · median 446ms · p95 622ms · p99 622ms Wikipedia Portalwikipedia-portalkitesurf · median 2283ms · p95 2391ms · p99 2391mscontainer · median 1424ms · p95 1463ms · p99 1463ms Der Spiegelspiegelkitesurf · median 2989ms · p95 3268ms · p99 3268mscontainer · median 1853ms · p95 2327ms · p99 2327ms El Mundoelmundokitesurf · median 1188ms · p95 1242ms · p99 1242mscontainer · median 217ms · p95 289ms · p99 289ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 1074ms · p95 1421ms · p99 1421mscontainer · median 252ms · p95 284ms · p99 284ms TodoMVC · Reacttodomvc-reactkitesurf · median 1206ms · p95 2125ms · p99 2125mscontainer · median 271ms · p95 300ms · p99 300ms TodoMVC · Vuetodomvc-vuekitesurf · median 1701ms · p95 1777ms · p99 1777mscontainer · median 336ms · p95 358ms · p99 358ms TodoMVC · Angulartodomvc-angularkitesurf · median 984ms · p95 1267ms · p99 1267mscontainer · median 234ms · p95 258ms · p99 258ms 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 2500ms 5000ms 7500ms 10000ms kitesurf · median 345ms · p95 403ms · p99 403mscontainer · median 540ms · p95 556ms · p99 556ms Example Domainexample-comkitesurf · median 465ms · p95 497ms · p99 497mscontainer · median 808ms · p95 891ms · p99 891ms Hacker Newshacker-newskitesurf · median 969ms · p95 1198ms · p99 1198mscontainer · median 2070ms · p95 2222ms · p99 2222ms Cloudflare Developer Docscf-developerskitesurf · median 675ms · p95 797ms · p99 797mscontainer · median 2358ms · p95 2575ms · p99 2575ms The Cloudflare Blogcf-blogkitesurf · median 664ms · p95 836ms · p99 836mscontainer · median 1800ms · p95 1905ms · p99 1905ms Wikipedia Portalwikipedia-portalkitesurf · median 1267ms · p95 1299ms · p99 1299mscontainer · median 3520ms · p95 3883ms · p99 3883ms Der Spiegelspiegelkitesurf · median 2020ms · p95 2296ms · p99 2296mscontainer · median 5497ms · p95 7273ms · p99 7273ms El Mundoelmundokitesurf · median 356ms · p95 415ms · p99 415mscontainer · median 870ms · p95 993ms · p99 993ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 385ms · p95 395ms · p99 395mscontainer · median 878ms · p95 1114ms · p99 1114ms TodoMVC · Reacttodomvc-reactkitesurf · median 491ms · p95 516ms · p99 516mscontainer · median 970ms · p95 1037ms · p99 1037ms TodoMVC · Vuetodomvc-vuekitesurf · median 690ms · p95 748ms · p99 748mscontainer · median 1122ms · p95 1154ms · p99 1154ms TodoMVC · Angulartodomvc-angularkitesurf · median 353ms · p95 376ms · p99 376mscontainer · median 854ms · p95 901ms · p99 901ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · cpu

0.0ms 1250ms 2500ms 3750ms 5000ms kitesurf · median 305ms · p95 313ms · p99 313mscontainer · median 339ms · p95 442ms · p99 442ms Example Domainexample-comkitesurf · median 349ms · p95 368ms · p99 368mscontainer · median 605ms · p95 688ms · p99 688ms Hacker Newshacker-newskitesurf · median 796ms · p95 832ms · p99 832mscontainer · median 1546ms · p95 1678ms · p99 1678ms Cloudflare Developer Docscf-developerskitesurf · median 609ms · p95 730ms · p99 730mscontainer · median 1971ms · p95 3122ms · p99 3122ms The Cloudflare Blogcf-blogkitesurf · median 421ms · p95 552ms · p99 552mscontainer · median 1068ms · p95 1552ms · p99 1552ms Wikipedia Portalwikipedia-portalkitesurf · median 1048ms · p95 1086ms · p99 1086mscontainer · median 2713ms · p95 2895ms · p99 2895ms Der Spiegelspiegelkitesurf · median 1358ms · p95 1447ms · p99 1447mscontainer · median 4201ms · p95 5058ms · p99 5058ms El Mundoelmundokitesurf · median 330ms · p95 345ms · p99 345mscontainer · median 487ms · p95 642ms · p99 642ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 338ms · p95 370ms · p99 370mscontainer · median 571ms · p95 630ms · p99 630ms TodoMVC · Reacttodomvc-reactkitesurf · median 440ms · p95 452ms · p99 452mscontainer · median 600ms · p95 694ms · p99 694ms TodoMVC · Vuetodomvc-vuekitesurf · median 713ms · p95 744ms · p99 744mscontainer · median 756ms · p95 893ms · p99 893ms TodoMVC · Angulartodomvc-angularkitesurf · median 296ms · p95 313ms · p99 313mscontainer · median 512ms · p95 553ms · p99 553ms 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 48MiB 95MiB 143MiB 191MiB kitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB The Cloudflare Blogcf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB Wikipedia Portalwikipedia-portalkitesurf · median 114MiB · p95 114MiB · p99 114MiBcontainer · median 7MiB · p95 7MiB · p99 7MiB Der Spiegelspiegelkitesurf · median 100MiB · p95 100MiB · p99 100MiBcontainer · median 19MiB · p95 21MiB · p99 21MiB El Mundoelmundokitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Reacttodomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Vuetodomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 7MiB · p95 7MiB · p99 7MiB TodoMVC · Angulartodomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · mem

0MiB 48MiB 95MiB 143MiB 191MiB kitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB The Cloudflare Blogcf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB Wikipedia Portalwikipedia-portalkitesurf · median 114MiB · p95 130MiB · p99 130MiBcontainer · median 7MiB · p95 7MiB · p99 7MiB Der Spiegelspiegelkitesurf · median 83MiB · p95 84MiB · p99 84MiBcontainer · median 20MiB · p95 20MiB · p99 20MiB El Mundoelmundokitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Reacttodomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Vuetodomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 7MiB · p95 7MiB · p99 7MiB TodoMVC · Angulartodomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

Run 2026-06-02 · 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 1131ms1694ms1694ms334ms377ms377ms
Hacker News hacker-news 1459ms1517ms1517ms731ms782ms782ms
Cloudflare Developer Docs cf-developers 2090ms4689ms4689ms913ms1055ms1055ms
The Cloudflare Blog cf-blog 1940ms3872ms3872ms1034ms1161ms1161ms
Wikipedia Portal wikipedia-portal 1534ms3111ms3111ms763ms809ms809ms
Der Spiegel spiegel 2350ms3129ms3129ms1844ms1978ms1978ms
El Mundo elmundo 3494ms5758ms5758ms2344ms3255ms3255ms
TodoMVC · JavaScript ES6 todomvc-js-es6 1231ms1370ms1370ms450ms504ms504ms
TodoMVC · React todomvc-react 1203ms1265ms1265ms456ms510ms510ms
TodoMVC · Vue todomvc-vue 1162ms1297ms1297ms476ms503ms503ms
TodoMVC · Angular todomvc-angular 1818ms1828ms1828ms587ms621ms621ms
TodoMVC · Preact todomvc-preact 1270ms1362ms1362ms451ms662ms662ms
cpu — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 345ms403ms403ms540ms556ms556ms
Hacker News hacker-news 465ms497ms497ms808ms891ms891ms
Cloudflare Developer Docs cf-developers 969ms1198ms1198ms2070ms2222ms2222ms
The Cloudflare Blog cf-blog 675ms797ms797ms2358ms2575ms2575ms
Wikipedia Portal wikipedia-portal 664ms836ms836ms1800ms1905ms1905ms
Der Spiegel spiegel 1267ms1299ms1299ms3520ms3883ms3883ms
El Mundo elmundo 2020ms2296ms2296ms5497ms7273ms7273ms
TodoMVC · JavaScript ES6 todomvc-js-es6 356ms415ms415ms870ms993ms993ms
TodoMVC · React todomvc-react 385ms395ms395ms878ms1114ms1114ms
TodoMVC · Vue todomvc-vue 491ms516ms516ms970ms1037ms1037ms
TodoMVC · Angular todomvc-angular 690ms748ms748ms1122ms1154ms1154ms
TodoMVC · Preact todomvc-preact 353ms376ms376ms854ms901ms901ms
mem — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 73MiB73MiB73MiB2MiB2MiB2MiB
Hacker News hacker-news 73MiB73MiB73MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 73MiB73MiB73MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 73MiB73MiB73MiB4MiB4MiB4MiB
Wikipedia Portal wikipedia-portal 73MiB73MiB73MiB3MiB4MiB4MiB
Der Spiegel spiegel 114MiB114MiB114MiB7MiB7MiB7MiB
El Mundo elmundo 100MiB100MiB100MiB19MiB21MiB21MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 73MiB73MiB73MiB2MiB2MiB2MiB
TodoMVC · React todomvc-react 73MiB73MiB73MiB3MiB3MiB3MiB
TodoMVC · Vue todomvc-vue 73MiB73MiB73MiB3MiB3MiB3MiB
TodoMVC · Angular todomvc-angular 73MiB73MiB73MiB7MiB7MiB7MiB
TodoMVC · Preact todomvc-preact 73MiB73MiB73MiB2MiB2MiB2MiB

html

wall — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 919ms1017ms1017ms159ms318ms318ms
Hacker News hacker-news 1394ms1494ms1494ms549ms823ms823ms
Cloudflare Developer Docs cf-developers 1730ms1906ms1906ms668ms800ms800ms
The Cloudflare Blog cf-blog 2258ms3797ms3797ms903ms962ms962ms
Wikipedia Portal wikipedia-portal 1393ms3171ms3171ms446ms622ms622ms
Der Spiegel spiegel 2283ms2391ms2391ms1424ms1463ms1463ms
El Mundo elmundo 2989ms3268ms3268ms1853ms2327ms2327ms
TodoMVC · JavaScript ES6 todomvc-js-es6 1188ms1242ms1242ms217ms289ms289ms
TodoMVC · React todomvc-react 1074ms1421ms1421ms252ms284ms284ms
TodoMVC · Vue todomvc-vue 1206ms2125ms2125ms271ms300ms300ms
TodoMVC · Angular todomvc-angular 1701ms1777ms1777ms336ms358ms358ms
TodoMVC · Preact todomvc-preact 984ms1267ms1267ms234ms258ms258ms
cpu — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 305ms313ms313ms339ms442ms442ms
Hacker News hacker-news 349ms368ms368ms605ms688ms688ms
Cloudflare Developer Docs cf-developers 796ms832ms832ms1546ms1678ms1678ms
The Cloudflare Blog cf-blog 609ms730ms730ms1971ms3122ms3122ms
Wikipedia Portal wikipedia-portal 421ms552ms552ms1068ms1552ms1552ms
Der Spiegel spiegel 1048ms1086ms1086ms2713ms2895ms2895ms
El Mundo elmundo 1358ms1447ms1447ms4201ms5058ms5058ms
TodoMVC · JavaScript ES6 todomvc-js-es6 330ms345ms345ms487ms642ms642ms
TodoMVC · React todomvc-react 338ms370ms370ms571ms630ms630ms
TodoMVC · Vue todomvc-vue 440ms452ms452ms600ms694ms694ms
TodoMVC · Angular todomvc-angular 713ms744ms744ms756ms893ms893ms
TodoMVC · Preact todomvc-preact 296ms313ms313ms512ms553ms553ms
mem — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 73MiB73MiB73MiB2MiB2MiB2MiB
Hacker News hacker-news 73MiB73MiB73MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 73MiB73MiB73MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 73MiB73MiB73MiB4MiB4MiB4MiB
Wikipedia Portal wikipedia-portal 73MiB73MiB73MiB3MiB3MiB3MiB
Der Spiegel spiegel 114MiB130MiB130MiB7MiB7MiB7MiB
El Mundo elmundo 83MiB84MiB84MiB20MiB20MiB20MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 73MiB73MiB73MiB2MiB2MiB2MiB
TodoMVC · React todomvc-react 73MiB73MiB73MiB3MiB3MiB3MiB
TodoMVC · Vue todomvc-vue 73MiB73MiB73MiB3MiB3MiB3MiB
TodoMVC · Angular todomvc-angular 73MiB73MiB73MiB7MiB7MiB7MiB
TodoMVC · Preact todomvc-preact 73MiB73MiB73MiB2MiB2MiB2MiB

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-06-02

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

## Summary (median wall time)

| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 802ms | 565ms | 402ms | 253ms |
| Hacker News | 917ms | 987ms | 857ms | 624ms |
| Cloudflare Developer Docs | 1254ms | 1029ms | 1003ms | 775ms |
| The Cloudflare Blog | 1388ms | 1747ms | 1163ms | 1009ms |
| Wikipedia Portal | 950ms | 1060ms | 858ms | 572ms |
| Der Spiegel | 1402ms | 1513ms | 2039ms | 1705ms |
| El Mundo | 2844ms | 2266ms | 2441ms | 1957ms |
| TodoMVC · JavaScript ES6 | 829ms | 786ms | 538ms | 290ms |
| TodoMVC · React | 823ms | 666ms | 518ms | 332ms |
| TodoMVC · Vue | 683ms | 773ms | 551ms | 333ms |
| TodoMVC · Angular | 1275ms | 1264ms | 655ms | 403ms |
| TodoMVC · Preact | 855ms | 637ms | 508ms | 295ms |

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