A single ~16MB binary that monitors your entire infrastructure. Designed to run on a Raspberry Pi Zero W — fast enough for everything else.
From HTTP endpoints and databases to passive Heartbeats, updu checks the things that matter — and alerts you when they don't respond.
Monitor web endpoints with configurable expected status codes, response time thresholds, and keyword matching in response bodies.
Verify that services are accepting connections on specific ports. Catch firewall misconfigurations and service crashes instantly.
Validate DNS records resolve correctly. Detect hijacking, propagation delays, and misconfigured zones before users notice.
Low-level reachability checks for hosts and network devices. Know immediately when a server goes dark.
Verify SSH connectivity to remote machines. Make sure your management plane stays reachable at all times.
Track certificate expiry dates and get warned before they lapse. No more surprise expired-cert outages.
Deep-check API responses by validating JSON fields and values. Verify WebSocket and WSS connection upgrades.
Ping Redis, PostgreSQL, MySQL or MongoDB instances. Verify SMTP and UDP ports are open and responding.
Passive monitoring endpoint for cron jobs and external scripts to ping when they finish running.
updu was purpose-built to run on the smallest hardware. A single Go binary with an embedded SvelteKit frontend and SQLite database — no Node.js runtime, no external database, no containers required.
512MB RAM · 1GHz single-core · $10 board
No microservices. No sidecars. Just one file that does the job.
Go compiles to a single static executable. Drop it on any host and run. No runtime, no package manager, no fuss.
The SvelteKit frontend is compiled and embedded directly inside the Go binary using go:embed.
One file serves everything.
No Postgres, no MySQL, no Redis. Data lives in a single SQLite file alongside the binary. Backup is just a file copy.
Server-Sent Events push monitor status updates to the dashboard instantly. No polling, no WebSocket complexity.
Get alerted via Webhook, Discord, Slack, Email (SMTP), or Ntfy. Route notifications per monitor and integrate with any workflow.
Optional OIDC integration for single sign-on via a Go build tag. The default binary ships without OIDC code entirely — no unused auth libraries, no extra endpoints, reducing your attack surface where SSO isn't needed.
Share beautiful, public-facing status pages with custom slugs, grouped monitors, and optional custom CSS. Select exactly which monitors appear on each page.
Official multi-arch Docker image. One docker run command and you're monitoring. Works on ARM
and x86.
Declarative YAML configuration with deterministic IDs (SHA256 of name+type). Drop a .updu.conf file and monitors sync on startup — idempotent and version-controllable.
One-click updates from GitHub Releases with automatic checksum verification. Stay current without manual downloads or redeployments.
GET /api/v1/metrics exposes monitor counts, runtime stats, incident gauges, and GC metrics. Plug directly into your existing Prometheus + Grafana stack.
Track incidents with severity levels, status progression (investigating → identified → resolved), and per-monitor history. Keep your team informed through every stage.
Schedule planned maintenance to suppress alerts and pause checks. Avoid false positives during deployments, upgrades, and planned downtime.
Export your entire configuration as JSON or GitOps-ready YAML. Import backups to restore or clone your setup across instances.
SQLite-backed by design, with clear tuning knobs when you need to push further.
WAL journal mode, NORMAL synchronous, 5s busy timeout, and single-writer serialization. Tuned for low-resource ARM devices out of the box.
Raw check results are purged after 30 days. 5-minute aggregates are retained indefinitely (~288 rows/monitor/day). Database stays compact even at scale.
GET /healthz returns DB, scheduler, and SSE status (use for Docker, K8s, or load balancer probes). Prometheus metrics at /api/v1/metrics for full visibility.
Concurrent check workers auto-scale to CPU×4 (clamped 4–50). Jitter, stagger, and retry logic prevent thundering-herd write bursts on SQLite.
UPDU_WORKER_POOL_SIZE — concurrent workersUPDU_MIN_INTERVAL_S — min check intervalUPDU_ALLOW_LOCALHOST — target localhostUPDU_ENABLE_CUSTOM_CSS — status page CSSChoose your preferred installation method.
# Pull and run updu
docker run -d \
--name updu \
-p 3000:3000 \
-v updu_data:/data \
ghcr.io/nwpeckham88/updu:latest
# docker-compose.yml
services:
updu:
image: ghcr.io/nwpeckham88/updu:latest
ports:
- "3000:3000"
volumes:
- updu_data:/data
restart: unless-stopped
volumes:
updu_data:
# 1. Download for your architecture
curl -LO https://github.com/nwpeckham88/updu/releases/latest/download/updu-linux-amd64
# 2. Make executable and run
chmod +x updu-linux-amd64
./updu-linux-amd64
Open localhost:3000 and create your first monitor. That's it.