Self-hosting
Run on Bun or Node with your own scheduler, SQLite or PostgreSQL.
A self-hosted status page is an ordinary framework server plus a scheduler. Pick the database your host can actually keep — SQLite on a persistent disk, PostgreSQL anywhere else — and register the three cron jobs.
--deployment later skips the platform overlay and leaves a project that
runs anywhere.
Scheduling with node-cron
scheduleStatusPage() registers runChecks, summarize and cleanup with
their configured expressions and returns { stop }. Failures inside a job are
contained, so one bad run never kills the process. Wrap the calls yourself if
you want them reported to your own observability.
The scheduler argument is structural — anything exposing
schedule(expression, task) and returning { stop } works, including a test
double.
Running inside the server process
If you run several replicas behind a load balancer, only one should schedule. Otherwise every replica checks every monitor, multiplying outbound traffic and writing duplicate history rows.
Options: a dedicated scheduler container, a leader election, or an external
trigger hitting POST /admin/checks/run on a timer.
External triggers
Any scheduler that can make an authenticated HTTP request works:
Note that /admin/checks/run only runs checks. Summarize and cleanup have no
HTTP route; run them from the CLI or with scheduleStatusPage.
Without a framework
The CLI can serve the API on its own, which is enough for a JSON-only status service or a smoke test:
It serves every endpoint under basePath and a small index page at /. The
full UI needs a framework project.
A container
Mount /data on a persistent volume — SQLite on a container-local filesystem
loses the history on every redeploy.
Checklist
| Item | Why |
|---|---|
HEYO_STATUS_API_TOKEN set | Otherwise the management API stays closed. |
siteUrl set | Feeds, notifications and subscription links need a canonical URL. |
| Persistent database storage | SQLite on an ephemeral disk loses everything on restart. |
| Exactly one scheduler | Avoids duplicate checks and duplicate alerts. |
| Node.js 20.19+ (22.12+ for Astro 7) | Required for tcp and ssl monitors. |
heyo-status db migrate on release | For PostgreSQL; SQLite migrates itself. |
| Reverse proxy forwards the real host | Or siteUrl will disagree with the request origin. |