Gatus is an automated uptime monitor and status page replacing tools like Better Uptime with lightweight, code-configured health checks written in Go.
Gatus is an automated service health monitor and status page engine configured entirely through code. Rather than asking operators to manually publish incident notices or navigate web forms, it evaluates live endpoints against declarative rules and updates public status in real time. The entire service compiles into a single Go binary that consumes minimal memory while probing HTTP, TCP, UDP, and DNS endpoints.
Better Uptime operates as a hosted monitoring platform that polls targets across public internet transit from centralized cloud regions. While external vantage points detect public network outages, internet transit introduces latency jitter and CDN caching anomalies into synthetic benchmarks, and frequent polling intervals quickly push organizations into higher pricing tiers. Furthermore, commercial status pages often depend on manual operator updates, creating a delay between service degradation and customer visibility.
Gatus approaches monitoring from an internal, performance-oriented perspective by running directly alongside your infrastructure in Kubernetes or a local cluster. Executing inside the same network eliminates transit noise, enabling accurate latency measurements down to the millisecond and aggressive polling loops without SaaS rate limits. What Better Uptime provides that Gatus omits is an out-of-the-box global probe network and on-call scheduling with telephone alerts. If you require multi-continent synthetic triangulations and automated phone dispatch, Better Uptime fits that operational profile; if you need deterministic in-cluster health validation, GitOps configuration, and immediate status updates with near-zero runtime overhead, Gatus is the right choice.
How does Gatus differ from Better Uptime? Better Uptime is a managed SaaS platform offering global multi-location checks and on-call telephone paging, whereas Gatus is a self-hosted engine focused on local synthetic probing and automated status pages without per-monitor fees.
Can Gatus monitor private internal endpoints behind a firewall? Yes. Because Gatus runs within your own network or cluster, it validates private IP addresses, internal DNS queries, and microservices that external cloud monitors cannot reach.
Is Gatus free for commercial use? Yes. The project is completely open source under a permissive license with no artificial monitor caps, seat pricing, or locked enterprise tiers.
Gatus is a dependable choice for engineering teams that prioritize automated health checks and fast internal response validation over hosted on-call escalations; organizations requiring global geographic triangulation or telephone dispatch will need a dedicated SaaS platform. Active maintenance with recent updates in 2026 and an Apache-2.0 license make it straightforward to deploy across enterprise infrastructure or integrate into private platform toolchains.
We started this exact setup from scratch in a clean Linux machine on Nov 2, 2026 and checked it through Gatus's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p gatus && cd gatus
curl -fsSL https://open-source.store/tools/gatus/compose.yml -o compose.ymltouch .envdocker compose up -dservices:
gatus:
image: twinproduction/gatus:v5.38.0
restart: always
ports:
- "8080:8080"
volumes:
- gatus-data:/data
configs:
- source: gatus_config
target: /config/config.yaml
configs:
gatus_config:
content: |
storage:
type: sqlite
path: /data/data.db
ui:
title: "Service Status"
header: "Status Dashboard"
endpoints:
- name: example
group: core
url: "https://example.com"
interval: 10s
conditions:
- "[STATUS] == 200"
volumes:
gatus-data: {}
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that Gatus is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 6 s: twinproduction/gatus:v5.38.0.
Based on the upstream setup. Official compose with SQLite storage. Image pinned to v5.38.0; configuration provided via compose config with persistent SQLite data volume.
gatus-1 | 2026-11-02T02:32:01.955638169Z 2026/11/02 02:32:01 [api.ErrorHandler] error when reading request headers: too many Host headers. Buffer size=282, contents: "POST /\"/onmouseover=alert(document.domain);// HTTP/1.1\r\nHost: 192.168.65.19:8080\r\nHost: oss-verify.example\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 100\r\n\r\na[b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][1][2][3][4][5][6]=12345\r\n" gatus-1 | 2026-11-02T02:32:01.955646836Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.956377002Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.957416502Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.959068794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-json/mapsvg/v1/maps/2 gatus-1 | 2026-11-02T02:32:01.960452586Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.961418586Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.961426961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.961662711Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.961723669Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.961934752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.963179044Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.963348544Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /archive/download gatus-1 | 2026-11-02T02:32:01.963516086Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.963595336Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /karma.js gatus-1 | 2026-11-02T02:32:01.964588502Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/documentor-lite/core/js/documentor.js gatus-1 | 2026-11-02T02:32:01.964664294Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/infographic-and-list-builder-ilist/assets/js/ilist_custom_admin.js gatus-1 | 2026-11-02T02:32:01.964857544Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-login.php gatus-1 | 2026-11-02T02:32:01.964979544Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /Visitor/bin/WebStrings.srf gatus-1 | 2026-11-02T02:32:01.965131461Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /archive/download gatus-1 | 2026-11-02T02:32:01.966262919Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-json/mapsvg/v1/maps/2 gatus-1 | 2026-11-02T02:32:01.967217336Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.967346586Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.967564794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /Visitor/bin/WebStrings.srf gatus-1 | 2026-11-02T02:32:01.967740961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.968125044Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.968128169Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.968129586Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.968133794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.970044252Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.970480419Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.970678461Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.971783586Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/infographic-and-list-builder-ilist/assets/js/ilist_custom_admin.js gatus-1 | 2026-11-02T02:32:01.971928169Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.972021461Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.972153544Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.972285627Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /index.php gatus-1 | 2026-11-02T02:32:01.972466044Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.972604961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.973332002Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.974496211Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.975436502Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.976484461Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.976589419Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.976657711Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /user/login gatus-1 | 2026-11-02T02:32:01.976721252Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.976781044Z 2026/11/02 02:32:01 [api.ErrorHandler] Method Not Allowed gatus-1 | 2026-11-02T02:32:01.976850877Z 2026/11/02 02:32:01 [api.ErrorHandler] Method Not Allowed gatus-1 | 2026-11-02T02:32:01.976913544Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /user/login gatus-1 | 2026-11-02T02:32:01.976982794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977052502Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977088752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977157794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977248211Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /Visitor//%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fwindows%5Cwin.ini gatus-1 | 2026-11-02T02:32:01.977323794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977361127Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977428752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977483919Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/documentor-lite/core/js/documentor.js gatus-1 | 2026-11-02T02:32:01.977568877Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977623961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /index.php gatus-1 | 2026-11-02T02:32:01.977735919Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977861752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977941336Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.977987044Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /Visitor//%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fwindows%5Cwin.ini gatus-1 | 2026-11-02T02:32:01.978601669Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/click5_sitemap/API/update_html_option_AJAX gatus-1 | 2026-11-02T02:32:01.978728836Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/click5_sitemap/API/update_html_option_AJAX gatus-1 | 2026-11-02T02:32:01.978828877Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.978861752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.979266627Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.979730919Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.979851711Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.980355836Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /user/login gatus-1 | 2026-11-02T02:32:01.981306336Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot HEAD /wp-login.php gatus-1 | 2026-11-02T02:32:01.981573086Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/arprice-responsive-pricing-table/js/arprice.js gatus-1 | 2026-11-02T02:32:01.981714961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /mgmt/tm/util/bash gatus-1 | 2026-11-02T02:32:01.981796127Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-json/metform/v1/forms/templates/0 gatus-1 | 2026-11-02T02:32:01.981856127Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-json/rsvpmaker/v1/sked/1 gatus-1 | 2026-11-02T02:32:01.981931252Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/site-offline/readme.txt gatus-1 | 2026-11-02T02:32:01.982173419Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.982632461Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.982872669Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/rsvpmaker/v1/stripesuccess/anythinghere gatus-1 | 2026-11-02T02:32:01.982963961Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-admin/admin-ajax.php gatus-1 | 2026-11-02T02:32:01.983169294Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /mgmt/tm/util/bash gatus-1 | 2026-11-02T02:32:01.983290044Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-json/rsvpmaker/v1/sked/1 gatus-1 | 2026-11-02T02:32:01.983291711Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/am-member/license gatus-1 | 2026-11-02T02:32:01.983672752Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot HEAD /wp-login.php gatus-1 | 2026-11-02T02:32:01.983737086Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /proxy gatus-1 | 2026-11-02T02:32:01.983822794Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /user/login gatus-1 | 2026-11-02T02:32:01.984021169Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/rsvpmaker/v1/stripesuccess/anythinghere gatus-1 | 2026-11-02T02:32:01.984087086Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot POST /wp-json/am-member/license gatus-1 | 2026-11-02T02:32:01.984257002Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/simple-membership/readme.txt gatus-1 | 2026-11-02T02:32:01.984866377Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /wp-content/plugins/simple-membership/readme.txt gatus-1 | 2026-11-02T02:32:01.984868669Z 2026/11/02 02:32:01 [api.ErrorHandler] Cannot GET /proxy gatus-1 | 2026-11-02T02:32:02.752955003Z 2026/11/02 02:32:02 [main.listenToConfigurationFileChanges] Configuration file has been modified gatus-1 | 2026-11-02T02:32:02.752994586Z 2026/11/02 02:32:02 [watchdog.monitorEndpoint] Canceling current execution of group=core; endpoint=example; key=core_example gatus-1 | 2026-11-02T02:32:02.752996919Z 2026/11/02 02:32:02 [controller.Handle] Server has shut down successfully gatus-1 | 2026-11-02T02:32:02.952494628Z 2026/11/02 02:32:02 [api.ErrorHandler] Cannot POST /wp-json/click5_sitemap/API/update_html_option_AJAX gatus-1 | 2026-11-02T02:32:02.952539503Z 2026/11/02 02:32:02 [api.ErrorHandler] Cannot POST /wp-json/click5_sitemap/API/update_html_option_AJAX gatus-1 | 2026-11-02T02:32:02.952541711Z 2026/11/02 02:32:02 [api.ErrorHandler] Cannot POST /wp-json/click5_sitemap/API/update_html_option_AJAX gatus-1 | 2026-11-02T02:32:05.983373213Z 2026/11/02 02:32:05 [api.ErrorHandler] Request Timeout gatus-1 | 2026-11-02T02:32:05.983419588Z 2026/11/02 02:32:05 [api.ErrorHandler] Request Timeout gatus-1 | 2026-11-02T02:32:05.983423629Z 2026/11/02 02:32:05 [api.ErrorHandler] Request Timeout gatus-1 | 2026-11-02T02:32:05.985202379Z 2026/11/02 02:32:05 [api.ErrorHandler] Request Timeout gatus-1 | 2026-11-02T02:32:07.055317630Z 2026/11/02 02:32:07 [config.LoadConfiguration] Reading configuration from configFile=config/config.yaml gatus-1 | 2026-11-02T02:32:07.057724922Z 2026/11/02 02:32:07 [config.ValidateAlertingConfig] Alerting is not configured gatus-1 | 2026-11-02T02:32:07.057731547Z 2026/11/02 02:32:07 [config.ValidateEndpointsConfig] Validated 1 endpoints gatus-1 | 2026-11-02T02:32:07.057734380Z 2026/11/02 02:32:07 [config.ValidateEndpointsConfig] Validated 0 external endpoints gatus-1 | 2026-11-02T02:32:07.057736505Z 2026/11/02 02:32:07 [config.ValidateSuitesConfig] No suites configured gatus-1 | 2026-11-02T02:32:07.061632088Z 2026/11/02 02:32:07 [main.initializeStorage] Total endpoint keys to preserve: 1 gatus-1 | 2026-11-02T02:32:07.061933630Z 2026/11/02 02:32:07 [controller.Handle] Listening on 0.0.0.0:8080 gatus-1 | 2026-11-02T02:32:07.061939672Z gatus-1 | 2026-11-02T02:32:07.061942005Z ┌───────────────────────────────────────────────────┐ gatus-1 | 2026-11-02T02:32:07.061945755Z │ Fiber v2.52.13 │ gatus-1 | 2026-11-02T02:32:07.061948005Z │ http://[::]:8080 │ gatus-1 | 2026-11-02T02:32:07.061949880Z │ │ gatus-1 | 2026-11-02T02:32:07.061951713Z │ Handlers ............ 41 Processes ........... 1 │ gatus-1 | 2026-11-02T02:32:07.061953463Z │ Prefork ....... Disabled PID ................. 1 │ gatus-1 | 2026-11-02T02:32:07.061955297Z └───────────────────────────────────────────────────┘ gatus-1 | 2026-11-02T02:32:07.061957630Z gatus-1 | 2026-11-02T02:32:07.574147422Z 2026/11/02 02:32:07 [watchdog.executeEndpoint] Monitored group=core; endpoint=example; key=core_example; success=true; errors=0; duration=283ms