A real run, timed

a person opens a tenant page

  1. 1 edge CF edge → worker boot, TLS ~5–15ms est
  2. 2 auth domain row → authority walk → descendants → billing 256.0ms prod
  3. 3 render template + islands — with the data waterfall folded in 746.0ms prod
  1. edgeCF edge → worker boot, TLS~5–15ms oursno instrument reaches here
  2. authdomain row → authority walk → descendants → billing256ms oursServer-Timing on mover.chat · 222–274ms across ten hits, 2026-08-20
  3. rendertemplate + islands — with the data waterfall folded in746ms oursServer-Timing on mover.chat · 704–854ms across ten hits, 2026-08-20
Summing the steps gives 1002.0ms; the run printed 1005.0ms — the 3ms difference is untimed overhead between steps, and is not reconciled away.

That was one page load, end to end

Three phases off a live production response. Two carry a measured number, the first carries a tilde because no instrument reaches it, and the line underneath is a command you can run against this host right now.

What just happened

  1. the chip that says est on the first row

    No instrument reaches the edge boot, so that step carries a tilde and a range instead of a number, and it adds nothing to the total. Every other chip says prod: read off a live production response.

  2. the row marked auth

    Four database round trips, one after another, before the first line of page code runs: the domain row, the authority walk, the descendants, the billing record. That is the tenant tax, and it is the next thing to cut.

  3. the row marked render

    On this entry path, render still has the data reads folded into it — so it cannot be read as "rendering is slow". The split shipped for /u/[slug] and not for a custom-domain root, and until it does, that number is two things at once.

  4. the line under the run

    The timed phases sum to 1,002.0ms and the header printed 1,005.0ms. The 3.0ms difference is overhead between the phases that the timers cannot see. It is left in rather than reconciled away.

  5. the curl under the run

    That is the same header, on this host. This page is prerendered, so there is no server work to time and it answers zero. The run above is the expensive case; this line is the cheap one, and both are real.

How the header gets there

Five steps, and a page never writes the header itself.

  1. Step 1 of 5

    The request arrives

    Cloudflare Workers, at the nearest edge location. No cold start to pay.

  2. Step 2 of 5

    The clock starts

    A middleware wrapper starts the request timer and attaches the header on the way out.

    src/lib/perf-middleware.ts

  3. Step 3 of 5

    Authority resolves

    Domain row, session, workspace. The auth phase closes the instant the walk hands off.

    src/middleware.ts

  4. Step 4 of 5

    The page marks its own phases

    From a closed set of names. A page never builds the header itself.

    Astro.locals.perf?.mark('data')

  5. Step 5 of 5

    The header ships

    On every response, in a standard format your browser already parses.

    Server-Timing: auth;dur=…, render;dur=…, det;dur=…

These paths are real. Open the repo.

The timing you just watched is six files, and the runs behind it are four more.

  • one.ie/web/src
    • middleware.ts
    • lib
      • perf.ts
      • perf-middleware.ts
    • components
      • speed
        • speed-run.ts
        • SpeedLine.tsx
        • speed-line.css
  • text
    • speed-results.md
    • speed-lifecycle-run.md
    • speed-metrics.md
    • perf-baseline.json

src/lib/perf-middleware.ts starts the clock and attaches the header. src/components/speed/speed-run.ts holds the recorded runs — every step in it carries the command it was read from and the machine it was read on.

SpeedLine

src/components/speed/SpeedLine.tsx

Props of SpeedLine
Prop Type Default Notes
journey 'page' | 'chat' | 'agent' 'chat' Which recorded run this instance replays. The fold above is set to page. src/components/speed/SpeedLine.tsx:105
proof boolean true Renders the falsify-it-yourself line — the curl and what it answers. src/components/speed/SpeedLine.tsx:112
still boolean false Start paused on the final frame. Reduced motion already does this on its own. src/components/speed/SpeedLine.tsx:103
speed number 1 Multiplier on every dwell. src/components/speed/SpeedLine.tsx:107

The component at the top of this page is the same one on /speed-metrics, with one prop changed. There is no screenshot of it anywhere on this page.

Counted, with the command that counted it

A phase with no measurement gets no millisecond. That rule is why one of these is a gap rather than a win.

0.0ms

server work behind the prerendered host

curl -sI https://one.ie/ | grep -i server-timing

1,005.0ms

server work behind one tenant page, in production

Server-Timing det;dur on mover.chat, ten hits, 2026-08-20 — text/speed-results.md

0 of 30

steps in the recorded machine run that woke a model

text/speed-lifecycle-run.md — RECORD in src/components/speed/speed-run.ts

3.0ms

gap between the printed total and the steps that make it up

untimedGapOf(page) — printed header minus summed phases, left in

Run it yourself

From an empty folder to a provisioned workspace, on the same runtime the run above was measured on. These are the commands the CLI prints, and that middle line is what it prints back.

bash
$ npx oneie create my-nodeNode created — free plan, no credit card.$ cd my-node$ bun install$ one setup

Limits

Three of these rows go against us. They are the ones worth reading first.

FeatureONETypical chatbot platformIn-house build
Every response carries a phase-by-phase timing headeryou build it
No cold startsvariesvaries
Streaming inference from the edgevariesyou build it
Ships in one command, no build pipeline to configurevariesyou build it
A dated performance baseline in the repo you can re-runrarely publishedrarely published
Sub-second first byte on a tenant custom domainConceded. The run at the top of this page is real, and it spends 1,005.0ms in the worker before a byte leaves. Our prerendered host spends none. A tenant page on a custom domain is not there yet, and the auth phase is why.variesvaries
Model response timeConceded. Inference is measured in seconds and it runs on the provider’s clock. Fallback chains route around a slow provider; nothing routes around slow.
Total control of infrastructure and costDedicated in-house infrastructure can match these deploy times. It costs meaningfully more to build and to run.

Speed is the architecture, not a tier

Every plan gets the same edge and the same runtime.

Starter

Same edge, same runtime, every plan.

$500/mo
Full Cloudflare edge runtime
Streaming inference
Single-command deploy
Server-Timing header on every response
Email support
Most popular

Agency

Priority routing · faster reports

$5,000/mo
Priority edge routing
Faster report generation
Priority support

Scale

Dedicated edge region

$50,000
Dedicated Cloudflare edge region
Reserved Groq capacity
Uptime SLA
Latency percentile dashboard

Questions about speed

You watched a real page load at the top. Now read the header yourself.

Every number here names where it was measured, and the one step nobody has timed says so out loud.

No credit card · every number names its source