Blog

We open-sourced our status page

A self-hosted status page for Next.js and Vercel — live health checks, 90-day uptime, incidents that open and close themselves. No database. MIT.

Engineering3 min read

Today we're open-sourcing the status page we run at status.clusy.io. It's on GitHub at clusy-io/status-page, under MIT, and it deploys to Vercel's free tier in about five minutes without a database.

YOUR DOMAINMITno database
status.clusy.io, and the same thing on your own domain — clone, set your service list, deploy.

We built it because the alternatives were a bad trade for a company our size. Hosted status pages start at a real monthly number for the tier that lets you use your own domain, and the free self-hosted options mostly want a Postgres instance and a worker to babysit — which is a strange amount of infrastructure to stand up for a page whose entire job is to be online when the rest of your infrastructure isn't.

So the constraint we set was: no database, no queue, no separate worker. A status page should be the least likely thing you own to go down.

What it does

It probes on every page load. Each service is checked server-side when someone opens the page, and the page re-polls every 45 seconds. A visitor sees what is true now, not what a cache believed five minutes ago. The probe targets live in server code, so internal hostnames and vendor URLs never reach the browser.

Incidents open and close themselves. Each service runs a small state machine: two consecutive failed probes opens an incident as investigating, it escalates if things get worse, and two consecutive healthy probes post a resolved. The timeline writes itself while you are busy fighting the actual fire, which is exactly when nobody has a spare hand to write a status update.

For everything the probes cannot see — an upstream degradation, a maintenance window, a post-mortem — you add an entry to a plain TypeScript file and push. There is no CMS.

Ninety-day uptime bars, recorded by a cron that keeps a daily up/total tally per service. This is the one optional piece: it needs a free KV store. Skip it and you still get live status and incidents; you just don't get history.

It tells people. Visitors can subscribe by email (double opt-in through Resend, one-click unsubscribe), and you can point Slack, Discord or a generic webhook at it. Every update — auto-detected or hand-written — is announced exactly once, on the next cron tick.

What it doesn't do

It is not a monitoring system. It has no alerting rules, no on-call rotation, no metrics backend, and it will not page you at 3am — it is the page your users look at, not the tool you run your incident response from. If you already have Grafana or Datadog, this sits in front of them; it does not replace them.

It also cannot tell you about a failure it cannot reach. A probe from Vercel's edge checking a public health endpoint sees what a user sees, which is the point, but it means an internal degradation that still returns 200 will not open an incident on its own. That is what the hand-curated entries are for.

Deploying it

Clone it, edit one file to list your services, and push. There is a deploy button in the README that will do the Vercel side for you; the only required environment variable is a secret that protects the cron endpoint.

git clone https://github.com/clusy-io/status-page
# edit src/config/services.ts — your services, your probe URLs
vercel deploy

The whole thing is Next.js, Tailwind and one icon package. No tracking, and no external services beyond the ones you choose to configure.

Why we're giving it away

We wrote this for ourselves and it took about a day. It is not our product and it is never going to be, and every seed-stage company we know has either paid for one of these or gone without. Going without is the worse option: a status page is the cheapest trust you will ever buy, and the moment you need one is the moment you have no time to build one.

Issues and pull requests are welcome. If you deploy it somewhere, we'd like to see it.


github.com/clusy-io/status-page · MIT