Latency graphs and uptime monitoring in one self-hosted box.
Pingraph combines SmokePing-style latency charts with Uptime Kuma-style checks, alerts and public status pages. It runs as a single Docker container with SQLite, and you set everything up in the web UI.
What Pingraph checks
Every host has its own check interval, a latency threshold for the degraded state, and a confirmation streak, so a single dropped packet doesn't page anyone.
Ping (ICMP)
Min, average and max round-trip time and packet loss from five packets per check.
HTTP(S)
Expected status, a keyword that must be present or absent, redirects, any method with headers, body and basic auth, and certificate expiry.
TCP port
Checks that a port accepts connections and records how long the connection took.
DNS
Resolves A, AAAA, CNAME, MX, NS or TXT records through your own resolver or the system's, and can check the answer.
Docker
A container is running and healthy, checked through the Docker socket or a socket proxy.
Redis
PING with an optional password. Also works with Valkey and KeyDB.
Push (heartbeat)
Cron jobs, backups and scripts call a URL when they run, and the host goes down when the calls stop. Uses Uptime Kuma's push URL format.
Speed tests
On-demand iperf3 throughput tests against any host running iperf3 -s.
Latency history, SmokePing style
Each ping check stores min, average and max round-trip time plus packet loss, and the host page charts them over time with a band for the spread. You see slow links and lossy Wi-Fi as trends, not just as up or down.
- Degraded state when latency crosses the host's threshold (350 ms by default) or packet loss climbs
- Grouped dashboard by service, location or team
- 30, 60 or 90 days of history
Alerts that wait for a real outage
Pingraph notifies you when a host goes down, becomes degraded or recovers. Status only changes after a streak of problem checks in a row (two by default, set per host), so one lost packet doesn't wake anyone up.
- Slack, email, Telegram, ntfy and a generic webhook
- Certificate expiry warnings for HTTPS checks
- Retries and a delivery log, plus a test button for each channel
Public status pages
Mark a group as public and Pingraph serves a status page for it, with no login needed. Uptime is measured over the time Pingraph was actually monitoring, so its own downtime never counts as uptime.
- Current status for every host in the group
- Last 24 hours of uptime in 30-minute bars
- Incident history for the past week
Built to self-host
Made for homelabs and small teams who run their own infrastructure and don't want another stack to maintain.
- One container. Web UI, scheduler and workers in a single image, with SQLite in one volume. No Postgres or Redis to run.
- No config files. Hosts, groups, alerts and settings all live in the web UI.
- Minimal privileges. Ping needs only the
NET_RAWcapability. Secrets are generated on first boot and kept in the volume. - Several users with 2FA. Authenticator-app codes with one-time recovery codes.
- Watches itself.
GET /healthreturns 503 when checks stop, and the Docker health check uses it. - Open source. MIT licensed, built with Rails 8, Solid Queue and Hotwire.
Quick Start
Up and running in under a minute.
$ docker run -d \ --name pingraph \ --cap-add NET_RAW \ -p 3000:80 \ -e SOLID_QUEUE_IN_PUMA=true \ -v pingraph_storage:/rails/storage \ ghcr.io/vdw/pingraph:latest
✓ Open http://localhost:3000, sign in as admin@pingraph.local / pingraph123 and choose a new password.
Requires SOLID_QUEUE_IN_PUMA=true, a persistent storage volume, and the
NET_RAW capability to send ICMP packets. See the
Docker Compose example
to run it with Compose.