PanicMonitr · Public Beta

Peer-to-peer health monitoring for your whole homelab — no central server, no VPS, no open ports. Live stats, Docker logs, and a remote shell on every node, over an encrypted iroh mesh.

$curl -fsSL https://raw.githubusercontent.com/Pallav0099/panicmonitr/main/install.sh | sh

SEE IT IN ACTION

Open any node and read its whole system — step through what you get, live and straight off the peer.

The dashboard

Fleet viewLogin-gatedLocal-first

Fleet status at a glance — uptime, heartbeat history, latency and incidents across every node.

PanicMonitr live dashboard — fleet status, multi-window uptime, heartbeat history, latency sparkline, and incident log

GET STARTED

Four steps from one-line install to live fleet view. Everything runs locally, talks P2P, and signs every trust mutation.

./prereqsBEFORE YOU BEGIN
  • OSLinux · x86_64 or aarch64
  • RuntimeNone — self-contained binary
  • Compatglibc 2.35+ (Debian 12 / Ubuntu 22.04+)
  • OptionalDocker (skip with --no-docker)
  1. 01 · INSTALL

    One line, no Python and nothing to build — it downloads the prebuilt binary for your machine. Run it on both nodes.

    fish · panic-monitor
    #Linux x86_64 / aarch64
    $curl -fsSL https://raw.githubusercontent.com/Pallav0099/panicmonitr/main/install.sh | sh
  2. 02 · INITIALIZE & RUN

    Create your Ed25519 identity, then install the background service. The installer auto-picks a password backend (systemd-creds, or a portable machine-id fallback on older/headless hosts) — your password is encrypted at rest, never plaintext on disk.

    fish · panic-monitor
    $panic-monitor --init
    $panic-monitor --install-service
  3. 03 · EXCHANGE IDENTITIES

    Trust is per-direction — both sides must add each other with at least `monitor` permission.

    fish · panic-monitor
    #Print your 64-char hex Node ID
    $panic-monitor --show-identity
    #Trust a peer
    $panic-monitor --add-peer <NODE_ID> --alias "my-server" --permissions monitor
  4. 04 · OPEN THE DASHBOARD

    A live SPA at 127.0.0.1:42069 — sign in with your identity password (the session survives restarts). A no-auth, read-only status page also runs on :8080.

    fish · panic-monitor
    $xdg-open http://127.0.0.1:42069/
./next

After both sides --add-peer each other, the peer appears in the fleet view within one probe interval (30s default).

THE TOPOLOGY

THE MESH

Flat and peer-to-peer — every device is a sovereign node, and any node can monitor any other. No central server to run, nothing to be a single point of failure.

Each is a sovereign Ed25519 peer that dials the others directly over iroh QUIC — hole-punched through NAT, encrypted end-to-end, with no central server. If a direct path is blocked, traffic falls back through a public iroh relay, still end-to-end. Every link is authenticated by node ID and authorized against a local, signed trust log — default-deny.

iroh relay · fallbackLAPTOP7c2a…e10WEB-01a91f…4d2NAS3e88…b07VPSd04c…9f1PI-EDGE5bb2…77abehind NAT
direct P2P · iroh QUIC relay fallback · DERP

INSIDE A NODE

Zoom into one peer: a single iroh QUIC endpoint, six ALPN handlers. The connection's verified node ID is checked against your signed trust log before any handler runs — default-deny.

HEARTBEATmonitor
panic-monitor/heartbeat/1 → peer

Liveness — the QUIC + TLS handshake itself proves the peer is up.

PUSHmonitor
panic-monitor/push/0 ← peer

Reverse heartbeat for nodes behind strict NAT — they dial out.

STATUSview_dashboard
panic-monitor/status/0 → peer

Delta pull of live system stats — only what's newer than your cursor.

LOGSview_dashboard
panic-monitor/logs/0 → peer

Docker logs, pulled on demand — never streamed continuously.

SYNCmonitor
panic-monitor/sync/0 → peer

Gap-fill — backfills metrics missed while you were offline.

SHELLshell
panic-monitor/shell/0 → peer

Live PTY bash over QUIC — its own grant, never implied, fully signed.