01 Watch
Five kinds of check, one dashboard.
Every monitor reports live over WebSocket. Set a latency threshold and a slow service shows as degraded before it shows as down.
httpURLs and APIsStatus codes, keywords and latency thresholds
tcpPorts and servicesAny socket: databases, Redis, SMTP
tlsCertificate expiryAn alert days before a certificate runs out
dnsDNS resolutionRecords resolve, and to the right addresses
heartbeatCron jobsYour job posts to /ping/:id. A missed ping is an alert.
02 Tell
The status page is already there.
Monitor privately at /admin. Share publicly at /. When a check fails Relay opens the incident, and when it recovers Relay closes it. You add the words in between.
- Grouped components with 90-day uptime bars
- Incident timeline updates and a public history
- Email subscribers, double opt-in, one-click unsubscribe
- Dark mode that follows the visitor's system
Acme Status
Incident history
API services
API Gateway99.98% · up
Auth Service100% · up
Infrastructure
Database99.95% · up
Media Server97.12% · down
03 Own
No Node, no Postgres, no second tool. A binary and a file.
<20 MBDistroless Docker image. No shell, nothing to attack, a healthcheck built in.
1Go binary with its templates and assets embedded at build time.
0Runtime dependencies. Runs on any Linux box or a Raspberry Pi.
90 dOf history in SQLite in WAL mode, with retention you choose.
# one command, no config file
docker run -d \
--name relay \
--restart unless-stopped \
-p 8080:8080 \
-v relay-data:/data \
-e RELAY_SECRET=$(openssl rand -hex 16) \
-e RELAY_ADMIN_PASS=yourpassword \
-e RELAY_SITE_NAME="Acme Status" \
ghcr.io/rohzzn/relay
/ is your status page, /admin your dashboard, /api/v1/ the REST API.
Back it up with cp relay.db relay.db.bak. Put Caddy in front with the included compose file and TLS takes care of itself.
Read the docs04 Team
What a whole team needs, minus the SaaS bill.
Team rolesAdmin, Editor or Viewer for everyone you invite. The root admin lives in environment variables.
REST API and keysMonitors, incidents and metrics at /api/v1/, with scoped keys for CI, Terraform or scripts.
Maintenance windowsChecks keep running and recording during a deploy, but nothing alerts and no incident opens.
PagerDuty and OpsGenieTriggers open and resolves close, next to Slack, webhook and SMTP channels.
Audit logWho changed a monitor, posted an update or changed a role. Paginated and searchable.
Monitor groupsAPI, Database, CDN, Auth: each group is its own section on the dashboard and the status page.
Pause and Test nowPause a monitor in one click, or fire a probe and see the result before you save.
Alert routingDatabase alerts to PagerDuty, API alerts to Slack, certificate expiry to email.
Latency metricsP50 and P95 in time buckets over up to 720 hours, ready for Grafana or Datadog.
05 Replace
Uptime Kuma watches. Statuspage.io tells. Relay does both.
| Uptime Kuma | Statuspage.io | Relay | |
|---|---|---|---|
| Self-hosted | yes | no | yes |
| Public status page | no | yes | yes |
| Grouped components | no | yes | yes |
| Email subscribers | no | paid | yes |
| Incident management | no | yes | yes |
| REST API | no | paid | yes |
| Team roles | no | paid | yes |
| PagerDuty and OpsGenie | no | paid | yes |
| Maintenance windows | no | yes | yes |
| Audit log | no | paid | yes |
| Slack and webhook alerts | yes | paid | yes |
| Docker image | ~200 MB | n/a | <20 MB |
| Free | yes | no | yes |