Uptime and status pages· In use, not yet public
Hinoban
The alarm that doesn't live in the house it guards.
Uptime checks, incidents, alerts and public status pages. It already watches our own services and the sites of a client we look after; it isn't open to the public yet.
- Checks
- Websites, ports, heartbeats
- Every
- 30 seconds to 24 hours
- Alerts
- Email, Telegram, webhook, push
- Status
- In use, not yet public
Three kinds of check.
Websites, with an optional word that must be on the page; ports; and heartbeats, where a scheduled job calls in and silence is the failure. Certificates are watched too, with warnings 30, 14, 7 and 1 day before they run out.
An incident in seconds, not minutes.
A failed check is tried again at once, then after 5 and 15 seconds. Two failures open the incident about five seconds after the first, instead of two minutes later. Closing it takes two clean passes, so a flicker can't.
One alert per change.
Email, Telegram, signed webhooks in Slack and Discord formats, and web push. Each change sends exactly one alert per channel, reminders follow until someone acknowledges, and a channel that keeps failing is switched off, loudly.
Status pages that weigh nothing.
No JavaScript, 8.6 KB compressed, refreshed every minute. Visitors follow updates by push or email without an account, and incidents stay private until they're published.
The alarm apart from the app.
The checks run in their own process, separate from the dashboard, so a crash or a redeploy of the app can't silence them.
It watches what we run, and what we look after.
- 01
Our own services.
OrePretzel's record service has been watched since October 2026; its down and up alerts were tested the same day.
- 02
A client's sites.
Five domains of a client we look after have been watched since September 2026.
- 03
One dashboard.
About a dozen monitors in production, one definition of downtime: only a declared incident counts, and uptime is time-weighted.
03— Under the hood
Why try again at once.
Most failures are a blip. Retrying at once, then after 5 and 15 seconds, tells a blip from an outage in seconds, without waiting for the next scheduled check.
An outbox for alerts.
An incident and its alerts are written in one transaction, then sent from an outbox, so an alert is never lost between the two and never sent twice.
A prober that drains.
Three loops: checks every 5 seconds, alerts every 2, jobs every minute. On shutdown it drains for 8 seconds, sized to the container's stop grace.
Small.
Bun, Astro and Vue on Postgres, with eight runtime dependencies. Web push is written in-house.
Where it is now
In use on our own services and a client's sites. Before it opens to the public: invitations, password reset, and its new name in the app itself.