Whealbit · Software company · Penzance, Cornwall

Field notes

A status page with no server

We wanted a live status page on a fully static site: no backend to measure from. Here is how we did it, and the trade-off we chose to be upfront about.

We wanted a status page: a place that shows the software we run is up, with each service’s real response time, not a static “everything’s fine” badge.

There was one wrinkle: this site is completely static. It builds to plain HTML and files on a CDN. There is no server of ours running to ping the services and report back. So how do you show a live number on a page that has no live anything?

The wrong answers

Two tempting options, both misleading:

  1. Bake it in at build time. Ping each service when the site builds, hard-code the numbers. But that is a snapshot from a build machine days ago, dressed up as live. A service could be down right now and the page would cheerfully say “142 ms”.
  2. Show a green “Operational” badge and move on. That is the vanity-metric status page: it tells you nothing and everyone knows it.

We didn’t want either. If the number isn’t real, it is worse than no number, because now the page is lying quietly.

Our answer: measure from the visitor

So we moved the measurement to the one live thing on the page: your browser. When the status page loads, a small script measures the round-trip time to each service from wherever you are:

const start = performance.now();
await fetch(url, { mode: "no-cors", cache: "no-store" });
const ms = Math.round(performance.now() - start);

A no-cors request resolves when the service responds (any status) and rejects on a network failure. That reflects reachability from here, right now, with no server of ours in the loop and nothing cached.

With no JavaScript it degrades to a plain “Operational” label taken from each product’s real lifecycle status, so the page still says something true.

The trade-off we put in writing

A browser-side measurement reflects the visitor’s own connection, not a monitor in a data centre. So we say exactly that on the page: “measured live from your browser… not a central monitor.” There is also a known edge: a service can set a header that makes the check read “no response” even when it is up.

We could hide those caveats. We wrote them down instead, because a status page is precisely where a sceptical buyer checks whether you are the sort of company that tells the truth about its own software.

When we’ll change it

The browser check is the right tool for a static site today. When we want a central number with real uptime history, the upgrade is a small serverless function that pings from a fixed location, or a dedicated monitor the page embeds. Until we need that, we would rather ship the honest small thing than the impressive fake one.

If you can’t measure something properly at full scale, measure a smaller version accurately and say which one you did.

Talk to our team about your project

Whether it is a website, a custom platform or a problem you have not solved yet, start with a conversation. We reply within one working day, and we will tell you if we are the right fit.

Call Start a project