Uptime Kuma vs Gatus: Monitoring Compared
GUI-First vs Config-First Monitoring
Uptime Kuma and Gatus are both self-hosted uptime monitoring tools with status pages. They check if your services are up and alert you when they’re not. The fundamental difference is how you configure them.
Uptime Kuma is configured entirely through a web UI. Click “Add Monitor,” fill in the form, save. No files to edit, no YAML to write.
Gatus is configured through a YAML file. Define your endpoints, conditions, and alerts in code. Redeploy to apply changes. Infrastructure-as-code for monitoring.
Feature Comparison
| Feature | Uptime Kuma | Gatus |
|---|---|---|
| Configuration | Web UI (click and fill) | YAML file |
| Monitor types | HTTP, TCP, Ping, DNS, Docker, gRPC, MQTT, keyword, push | HTTP, TCP, DNS, ICMP, SSH, STARTTLS |
| Conditions/assertions | Basic (status code, keyword) | Advanced (response time, body, headers, certificate) |
| Status pages | Yes (public, customizable) | Yes (built-in, auto-generated) |
| Alert channels | 90+ integrations | 15+ (Slack, Discord, PagerDuty, email, custom) |
| Dashboard | Rich web UI with graphs | Minimal (status page IS the dashboard) |
| Historical data | Response time graphs (SQLite) | Badge-style uptime history |
| Maintenance windows | Yes | No |
| Multi-user | Yes (2FA support) | No (read-only status page) |
| API | Yes | Yes |
| Docker native monitoring | Yes (container health checks) | No |
| Certificate monitoring | Basic (expiry alerts) | Advanced (chain validation, conditions) |
| RAM usage | ~80MB | ~15MB |
| Language | Node.js | Go |
| Config as code | No (SQLite state) | Yes (YAML, git-friendly) |
Configuration Approach
Uptime Kuma stores everything in SQLite. You configure monitors, notification channels, and status pages through the web interface. This is excellent for users who prefer clicking over typing — adding a new monitor takes 30 seconds. The downside: your monitoring config isn’t in version control. Migrating or replicating a setup means exporting/importing the database.
Gatus configuration lives in a single YAML file:
endpoints:
- name: Nextcloud
url: "https://cloud.example.com"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 1000"
- "[CERTIFICATE_EXPIRATION] > 48h"
- name: Database
url: "tcp://db.internal:5432"
interval: 30s
conditions:
- "[CONNECTED] == true"
alerting:
discord:
webhook-url: "https://discord.com/api/webhooks/..."
default-alert:
enabled: true
failure-threshold: 3
success-threshold: 2
Everything is declarative, version-controllable, and reproducible. Spin up a new Gatus instance with the same YAML and you have identical monitoring. The downside: adding a monitor means editing a file and restarting/reloading the container.
Advanced Conditions
Gatus supports richer health check conditions than Uptime Kuma:
| Condition Type | Uptime Kuma | Gatus |
|---|---|---|
| Status code check | Yes | Yes |
| Response time threshold | Alert only | Yes (as condition) |
| Body keyword match | Yes | Yes (regex, JSONPath) |
| Header check | No | Yes |
| Certificate expiry | Alert only | Yes (with custom threshold) |
| Certificate chain valid | No | Yes |
| DNS record match | Basic | Yes (specific record values) |
| Connected check (TCP) | Yes | Yes |
| Response body JSONPath | No | Yes |
If you need “alert me when this API returns a JSON response where $.status is not healthy AND response time exceeds 500ms AND the TLS certificate expires within 7 days” — that’s a Gatus condition. Uptime Kuma handles the simple cases well but lacks this granularity.
Status Pages
Both offer public status pages, but they work differently.
Uptime Kuma has a dedicated status page builder in the UI. Create multiple status pages, group monitors, add custom CSS, set a custom domain. The status page is separate from the admin dashboard — you choose what’s public. Supports incident reporting with manual updates.
Gatus auto-generates a status page from your config. Every endpoint defined in YAML appears on the status page with a badge-style uptime history (green/red dots for recent checks). Clean and functional, but less customizable — you can’t create multiple status pages or hide specific endpoints without editing the YAML.
Alerting
Uptime Kuma has 90+ notification integrations: Telegram, Slack, Discord, Microsoft Teams, Email (SMTP), Pushover, Gotify, ntfy, Matrix, Webhook, PagerDuty, OpsGenie, and many more. Configure them through the UI — test notification buttons included.
Gatus supports ~15 alerting providers: Slack, Discord, PagerDuty, Twilio, custom webhooks, email, Telegram, Microsoft Teams, Google Chat, Opsgenie. Fewer options, but covers the most common channels. Configuration is in YAML alongside endpoints.
For most self-hosters, both tools support the popular notification channels. If you need a niche integration (Gotify, ntfy, Matrix), check Uptime Kuma first.
Resource Usage
| Metric | Uptime Kuma | Gatus |
|---|---|---|
| RAM (idle, 10 monitors) | ~80MB | ~15MB |
| RAM (100 monitors) | ~120MB | ~25MB |
| Docker image size | ~180MB | ~20MB |
| CPU (idle) | Minimal | Minimal |
| Startup time | 2-3s | <1s |
Gatus is dramatically lighter. A Go binary compiled to a 20MB image versus a Node.js application with dependencies. On resource-constrained devices or when running alongside many other services, Gatus’s 15MB footprint is attractive.
Use Cases
Choose Uptime Kuma If…
- You prefer configuring monitoring through a web UI
- You need 90+ notification channel options
- You want Docker container health monitoring
- You need maintenance windows
- You want customizable public status pages with incident reporting
- You have multiple users who need access to the monitoring dashboard
Choose Gatus If…
- You want monitoring configuration in version control (GitOps)
- You need advanced health check conditions (JSONPath, header checks, cert chain)
- You run on resource-constrained hardware
- You manage monitoring for multiple environments (dev, staging, prod) with config files
- You prefer infrastructure-as-code over GUI configuration
- You want the lightest possible monitoring footprint
Final Verdict
Uptime Kuma is the better choice for most self-hosters. The web UI makes adding and managing monitors effortless, the notification ecosystem is unmatched, and features like Docker monitoring and maintenance windows cover common needs. It’s the monitoring tool you recommend to anyone who asks “how do I know when my stuff goes down?”
Gatus is the better choice for infrastructure-as-code enthusiasts. If your servers are configured with Ansible, your containers defined in Compose files, and your infrastructure documented in git — Gatus fits that workflow. Its advanced condition system is also genuinely useful for monitoring APIs where you need to assert response body contents.
FAQ
Can I run both Uptime Kuma and Gatus?
You can, but there’s little reason to. They monitor the same thing (service availability). Pick the one that matches your workflow. If you want GUI + config-as-code, Uptime Kuma has an API you can use to create monitors programmatically.
Does Gatus support Docker container monitoring?
Not directly like Uptime Kuma (which queries the Docker socket for container status). Gatus monitors endpoints — if a container exposes an HTTP endpoint or TCP port, Gatus can check it. It can’t tell you “container X is stopped” without an exposed port to check.
Which is more reliable for production status pages?
Both are reliable. Gatus has a slight edge for public status pages because it’s stateless (reads config, checks endpoints, renders page) — there’s less that can break. Uptime Kuma’s SQLite database adds a dependency but enables richer features (incident history, custom status pages).
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments