comparing self-hosted
Uptime Kuma vs Gatus: clicks or YAML?
The two most-loved self-hosted monitors answer one question differently: should monitoring be clicked together in a dashboard, or declared in a file and reviewed in a pull request? Everything else follows from that split.
the facts, side by side
| Uptime Kuma | Gatus | Uptimepage | |
|---|---|---|---|
| license | MIT | Apache-2.0 | AGPL-3.0 |
| configuration | UI only | YAML only, read-only UI | UI + Terraform + REST + MCP |
| run it yourself | one container (Node) | tiny static binary | one binary + compose |
| hosted option | no | gatus.io, paid | yes, free tier |
| check types | ~40 incl. DBs · MQTT · browser | 11 protocols incl. gRPC · SSH · WebSocket | HTTP · TCP · DNS · TLS · ping · domain |
| fastest interval | 20s | no documented floor, default 60s | 60s free · 30s Pro · 10s self-hosted |
| status page | yes, custom domains | dashboard doubles as page | branded, own subdomain |
| page subscribers | none | none | email · webhook |
| incidents | posted by hand | none | auto-opened from checks |
| teams & roles | single login | one basic-auth or OIDC gate | orgs + roles |
| alert channels | ~95 services | 41 providers | Slack · Telegram · PagerDuty · SMS + more |
| community (GitHub stars) | ~89k | ~11.4k | young |
Kuma counts include the Apprise meta-provider and types implemented outside its monitor-types module; Gatus provider count from its README.
Star counts rounded from GitHub, July 2026.
Verified July 2026 against both repositories. Refresh when a project ships.
The split that decides it
Uptime Kuma is a dashboard you click: add a monitor, pick a type, wire a notification, all stored in its database. Gatus refuses the mouse: every endpoint is YAML in version control, the web UI is read-only, and a change means a config redeploy. Neither is wrong. One fits a homelab and a person who thinks in browsers; the other fits an engineer who thinks in Git and wants monitoring reviewed like code.
What each does well
Kuma wins on reach: around forty monitor types including databases, MQTT, SNMP and a real browser check, roughly ninety-five notification services, 20-second intervals, and the biggest community in the category. Gatus wins on discipline: eleven endpoint protocols including gRPC, SSH, WebSocket and UDP, a condition language that asserts on status, response time, JSON body paths and certificate expiry, multi-step suites, and a tiny static Go binary that can even run without a database.
What neither gives you
A customer-facing status page with subscribers, and a team. Kuma's status pages are real but nobody can subscribe to them, and the whole app is one shared login. Gatus's dashboard doubles as its status page: fine for an ops wall, not something you point customers at, and its access control is one basic-auth or OIDC gate. Both check from a single vantage point unless you assemble more instances yourself.
Where Uptimepage fits
If the YAML-versus-clicks debate ends with 'actually we need customers to see a status page and teammates to have accounts', that is the gap Uptimepage fills. Checks over HTTP, TCP, DNS, TLS and ping, configured in the UI or declared with the Terraform provider and REST API, organizations with roles, multi-region probes you can run yourself, and a branded status page with email and webhook subscribers where incidents open automatically. One binary, hosted free or AGPL self-hosted.