Open Source · MIT Docker · SQLite

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.

https://pingraph.local
Pingraph host page for Cloudflare DNS (1.1.1.1): a latency-over-time chart with a min/max band, and a table of recent probes with average, min and max round-trip time and packet loss

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.


Quick Start

Up and running in under a minute.

bash
$ 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.