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

FeatureUptime KumaGatus
ConfigurationWeb UI (click and fill)YAML file
Monitor typesHTTP, TCP, Ping, DNS, Docker, gRPC, MQTT, keyword, pushHTTP, TCP, DNS, ICMP, SSH, STARTTLS
Conditions/assertionsBasic (status code, keyword)Advanced (response time, body, headers, certificate)
Status pagesYes (public, customizable)Yes (built-in, auto-generated)
Alert channels90+ integrations15+ (Slack, Discord, PagerDuty, email, custom)
DashboardRich web UI with graphsMinimal (status page IS the dashboard)
Historical dataResponse time graphs (SQLite)Badge-style uptime history
Maintenance windowsYesNo
Multi-userYes (2FA support)No (read-only status page)
APIYesYes
Docker native monitoringYes (container health checks)No
Certificate monitoringBasic (expiry alerts)Advanced (chain validation, conditions)
RAM usage~80MB~15MB
LanguageNode.jsGo
Config as codeNo (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 TypeUptime KumaGatus
Status code checkYesYes
Response time thresholdAlert onlyYes (as condition)
Body keyword matchYesYes (regex, JSONPath)
Header checkNoYes
Certificate expiryAlert onlyYes (with custom threshold)
Certificate chain validNoYes
DNS record matchBasicYes (specific record values)
Connected check (TCP)YesYes
Response body JSONPathNoYes

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

MetricUptime KumaGatus
RAM (idle, 10 monitors)~80MB~15MB
RAM (100 monitors)~120MB~25MB
Docker image size~180MB~20MB
CPU (idle)MinimalMinimal
Startup time2-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).

Comments