Relay

It goes down.
You know first.
They know next.

Relay checks your sites, APIs, ports, certificates and cron jobs, tells you the moment one fails, and keeps a public status page your users can trust. Self-hosted, in one Go binary.

api.acme.com · last 90 days · example 99.98%
90 days agoone outage, its incident opened and closed by itselftoday

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
Partial outage · Media Server is not responding

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 docs

04 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 KumaStatuspage.ioRelay
Self-hostedyesnoyes
Public status pagenoyesyes
Grouped componentsnoyesyes
Email subscribersnopaidyes
Incident managementnoyesyes
REST APInopaidyes
Team rolesnopaidyes
PagerDuty and OpsGenienopaidyes
Maintenance windowsnoyesyes
Audit lognopaidyes
Slack and webhook alertsyespaidyes
Docker image~200 MBn/a<20 MB
Freeyesnoyes