TwiN/gatus
DevOps & Self-hostingSelf-hosted health dashboard that monitors endpoints and sends alerts when services degrade.
What It Does
Gatus is a self-hosted health dashboard aimed at developers and operators. It actively probes endpoints over HTTP, ICMP, TCP, DNS, gRPC, SSH, TLS and other protocols, then evaluates the results against configurable conditions such as status code, response time, response body (with JSONPath), certificate expiry and resolved IP. Failing conditions mark an endpoint unhealthy and can trigger alerts.
The design point is proactive detection: metric-based alerting depends on existing traffic, so if a load balancer dies and no requests arrive, nothing fires. Gatus schedules its own health checks, which means it can notice a failure before clients do (Why Gatus?). Endpoints can be grouped, reused through environment variables, and composed into multi-step suites that pass values through a shared context, which helps with login flows or CRUD API workflows.
Alerting covers a long list of providers, including Slack, PagerDuty, Discord, Teams, Telegram, email, GitHub/GitLab/Gitea issues and Home Assistant, alongside custom providers. Storage can be in-memory, SQLite or Postgres, and Prometheus-style metrics plus uptime and response-time badges are available for embedding.
Quick Start
The README's shortest path is Docker; this command expects a reachable Docker daemon on the host:
docker run -p 8080:8080 --name gatus ghcr.io/twin/gatus:stable
After it starts, open http://localhost:8080 for the dashboard. This run uses the built-in configuration; to monitor your own services, mount a config/config.yaml at the default config/config.yaml path or point GATUS_CONFIG_PATH at your file or directory (Docker usage). A minimal configuration looks like this:
endpoints:
- name: website
url: "https://twin.sh/health"
interval: 5m
conditions:
- "[STATUS] == 200"
- "[BODY].status == UP"
- "[RESPONSE_TIME] < 300"
Each condition is re-evaluated every interval; a failed check makes the endpoint unhealthy, which is where alert thresholds come in. Configuration supports $VAR and ${VAR} environment-variable substitution, and when GATUS_CONFIG_PATH is a directory, all *.yaml/*.yml files are merged, with maps deep-merged and slices appended; primitive parameters may be defined only once.
Usage Constraints
- Configuration path: defaults to
config/config.yaml; useGATUS_CONFIG_PATHto override. When$appears literally in a value, escape it as$$(configuration notes). - Storage: the default is in-memory, so history is lost on restart. Use
sqliteorpostgresand setstorage.pathfor persistence; caching is only supported for certain backends. - Secret-bearing alerts: most providers require tokens or webhook URLs, so treat the config file as sensitive. GitHub/Gitea alerts need a token with at least read-write on issues and read on metadata.
- Maturity of integrations: Datadog and IFTTT alert providers are explicitly marked as untested in the README (Datadog); Suites and remote instances are labeled ALPHA and EXPERIMENTAL respectively.
- Network reach: endpoints are probed from where Gatus runs. Private services need SSH tunneling through a jump host, or external endpoints pushed by an agent inside the private network.
- License: Apache-2.0.
HotRepo's take
Gatus is a mature Go project (created in 2019) with a broad protocol and alerting surface. In the HotRepo-recorded Go daily snapshot for 2026-11-08 it gained 88 stars, reaching 12,604 total and placing 14th on that day's Go list on GitHub; there is no recorded all-language daily rank, and a single snapshot does not establish a trend. The README's choice to frame itself against Alertmanager and Cloudwatch is the useful read: it is a complement for black-box health checks rather than a replacement for metric-based observability, so teams already running Prometheus will most likely deploy it alongside, not instead.
Written by AI from the project's README, updated . The project's own docs are the source of truth.