Everything the bench publishes, where it comes from, and how to read it programmatically. Methodology lives on the method page (generated from the collector, like this one); this page is the developer surface: series, endpoints, storage, repo layout.
| series | cadence | what one record is | storage |
|---|---|---|---|
| edge | every 30 min (minus borrowed slots) | one run: a tick group of the 14-provider panel, one timed quote per (provider × chain) over Ethereum, BSC, Base, Polygon, HyperEVM, Arbitrum, plus untimed dual-engine re-validation | KV day:YYYY-MM-DD, index, health |
| geo | every fourth edge slot | one sweep: transport timings (dns/tcp/tls/ttfb/total) for every keyless provider from our 12 Lambda endpoints, one Base quote each | KV geo:YYYY-MM-DD, geoindex, geohealth |
| swap | per run (event-scheduled) | one round: same-instant delivered-output comparison groups per chain, Base size
ladder, 12-datacenter quote consistency; the run publishes its own summary
(final: true on the last round) |
S3 rounds/ (immutable) + KV swapbench (summary) |
One endpoint, JSON, same-origin on every bench host, cache 300 s:
| request | returns |
|---|---|
| GET /api/latency | the index: days on record for both KV series,
health records (an ok:false with a recent at is a failing run; a
stale at — older than 90 min — is a dead cron), and who is
unmeasured |
| ?day=YYYY-MM-DD | one edge day, exactly as collected: runs with
at/tookMs/colo/tick and per-target,
per-chain samples (ms, q, sim, sim2,
via, err) |
| ?geo=YYYY-MM-DD | one geo day: sweeps with per-provider, per-datacenter cells |
| ?window=N | med/p95 per (provider × chain) over the last N
edge days (1..90), error tallies, colo histogram, and sim
aggregates (n, reverts, median oq bps, median gas) |
| ?swap=1 | the swap-benchmark summary as published by its own run:
per-chain stats, ladder, consistency, per-round series, and
final |
Raw responses are the contract; every figure travels with its n.
Manual triggers on the collector Worker (never the Pages host): ?run=1[&tick=N]
fires an edge run, ?geo=1 a sweep — writes require the trigger, a stray GET
cannot mint samples; the swap summary is published by POST ?swap=1, token-gated.
sim (primary simulator) is the only input to provider-facing stats;
sim2 audits the instruments and is never counted against a provider.sim.err), tallied separately.skipped, providers with no public
API are listed as unavailable, unreachable datacenters mark every cell with a reason.| path | what |
|---|---|
| workers/latency-bench/src/index.js | the collector: registry (targets, probes, simulators), edge runs, geo sweeps, storage, triggers — the single source of truth every generated page reads |
| workers/latency-bench/lambda/ | the 12-datacenter probe fleet (one generic timed fetcher, deployed identically everywhere) |
| workers/latency-bench/swap-bench/ | the swap-benchmark orchestrator Lambda: rounds, summary, publish, self-disable, report email |
| bench/functions/api/latency.js | the read side (Pages Function) |
| bench/public/ | this site: index.html (live cards),
swap.html (charts), method.html + docs.html
(generated) |
| bench/gen-method.mjs · bench/gen-docs.mjs · bench/nav.mjs | the generators; test/bench.mjs re-renders both pages and the shared nav
on every npm test and fails on a byte of drift |