Your status page should not go down with your app.
status-keeper watches your sites, APIs and cron jobs, and publishes a public status page with 90-day uptime bars, an incident timeline, scheduled maintenance, an Atom feed, a JSON API and a README badge. One Node process, no dependencies, open source, running in your own account on a different host from the thing it watches.
It also watches the two things that take sites down by surprise: the TLS certificate and the domain registration. You get one alert at 30, 14, 7, 3 and 1 days left, not a daily nag.
What does "99.9% uptime" actually allow?
Check this before you promise a number on your pricing page.
| Target | Per month | Per year |
|---|
With a 60-second check interval you cannot see an outage shorter than a minute, and failAfter=2 means the incident opens after about two minutes.
Build your monitors
Set it as MONITORS_JSON. For a cron job use {"id":"backup","type":"push","token":"<12+ random characters>","intervalSec":86400} and have the job run curl -fsS -X POST "https://<your-host>/ping/backup?token=..." when it finishes.
Run it yourself
git clone https://github.com/Duncan-Haywood/fp-monorepo && cd fp-monorepo/ventures/status-keeper ADMIN_KEY=$(openssl rand -hex 16) TITLE="Acme" MONITORS_JSON='[...]' node server.mjs # status page: http://localhost:8080/ badge: /badge.svg feed: /feed.xml
Post an incident: curl -X POST -H "Authorization: Bearer $ADMIN_KEY" -d '{"title":"Slow checkout","impact":"minor","message":"Investigating"}' https://<host>/v1/incidents. One-click Render deploy and Docker are in the README. Mount a persistent disk at the path in STATE or history is lost on restart.
Questions
Why host my own status page?
A status page hosted next to your app goes down with it. Run it on a different provider from the thing it watches, in your own account, and customers can still read it during an outage. You also avoid per-seat and per-subscriber pricing.
How does it avoid false alarms?
A monitor only opens an incident after failAfter checks in a row fail (2 by default), and the incident is dated from the first failure. One dropped request does not page anyone.
Can it watch a cron job?
Yes. A push monitor expects your job to POST to /ping/<id> with a secret token every interval. If a ping is late by more than the grace period, it goes down.
Does maintenance count against my uptime?
No. Checks that run inside a scheduled maintenance window are not counted, and they cannot open an incident.
Does it email subscribers?
Yes, once you add your own Resend API key and a verified sender. Visitors confirm by email first (double opt-in), every notice has a one-click unsubscribe, and addresses stay in your own state file. Without a key it still posts alerts to a Slack or Discord compatible webhook and publishes an Atom feed.
Where does my data live?
On the disk of the server you deploy in your own account. The author runs nothing in between and never sees your monitors or results.