Real-time monitoring for Proxmox, Docker, Kubernetes, and TrueNAS infrastructure.
Live Demo • Pulse Pro • Documentation • Report Bug
Localized getting started: Deutsch • Español
Issue-first contribution policy: please open an issue or discussion before investing time in a code change. External pull requests are not part of the normal contribution flow for this repository. See CONTRIBUTING.md.
Pulse is a modern, unified monitoring workspace for your infrastructure across Proxmox, Docker, Kubernetes, and TrueNAS. It consolidates metrics, alerts, and AI-powered insights from all your systems into a single, beautiful interface.
Designed for homelabs, sysadmins, internal IT teams, and providers who need a clear monitoring view without the complexity of enterprise monitoring stacks. MSP access is a separate, request-assisted provider path and is not part of ordinary self-hosted setup.

Pulse now groups everything by task instead of data source: - Infrastructure for hosts and nodes - Workloads for VMs, containers, and Kubernetes pods - Storage and Backups as top-level views - PMG now routes into Infrastructure (source filter), and Kubernetes routes into Workloads (K8s filter) - Legacy URLs are no longer routed as compatibility aliases; use canonical v6 routes.
Power-user shortcuts:
- g i → Infrastructure, g w → Workloads, ? → shortcuts help
- / or Cmd/Ctrl+K → global search
PULSE_TELEMETRY=false.Paid Pulse Pro / Relay / legacy customers: GitHub release assets and the public
rcourtman/pulseDocker image are community builds. Activate your license key under Settings → Plans → Existing purchases to unlock Pro features. These community builds do not include the private Pulse Pro runtime hooks (Audit Log, Audit Webhooks, RBAC, governed remediation). For those, use https://pulserelay.pro/download.html with a v6 activation key (starts withppk_live_) to get the private Pulse Pro Docker image or Linux archive. A v5 or legacy license key is not appk_live_activation key and will not work on that page.
Replace vX.Y.Z with the exact release tag you want, verify the signed installer, then run it on your Proxmox host:
export PULSE_VERSION=vX.Y.Z
curl -fsSLO "https://github.com/rcourtman/Pulse/releases/download/${PULSE_VERSION}/install.sh"
curl -fsSLO "https://github.com/rcourtman/Pulse/releases/download/${PULSE_VERSION}/install.sh.sshsig"
ssh-keygen -Y verify \
-f <(printf '%s\n' 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMZd/DaH+BldzOkq1A8KVTcFk73nAyrE8aJOyf7i00jm pulse-installer') \
-I pulse-installer \
-n pulse-install \
-s install.sh.sshsig < install.sh
bash install.sh --version "${PULSE_VERSION}"
rm -f install.sh install.sh.sshsig
Note: this installs the Pulse server. Agent installs and v5-to-v6 agent upgrades use the command generated in Settings → Infrastructure → Install on a host (served from /install.sh on your Pulse server).
docker run -d \
--name pulse \
-p 7655:7655 \
-v pulse_data:/data \
--restart unless-stopped \
rcourtman/pulse:vX.Y.Z
Open Pulse at http://<your-ip>:7655.
Use the managed dev runtime from the repo root:
npm run dev
Open http://127.0.0.1:5173 in the browser. 5173 is the frontend dev shell,
and it proxies /api and /ws to the backend on 7655. 7655 is the backend
dependency for API and websocket traffic, not the primary browser URL for local
frontend development.
The managed dev runtime resets its local login to admin / adminadminadmin
on startup unless you override it with HOT_DEV_AUTH_USER and
HOT_DEV_AUTH_PASS.
Canonical local dev commands:
npm run dev — start the managed runtime and reclaim the canonical dev ports if an older unmanaged session is still using themnpm run dev:lab — start the managed runtime in lab-agent mode, with the frontend/backend exposed on the LAN and Proxmox LXC Docker inventory enabled for installed lab agentsnpm run dev:status — show frontend shell health, proxied API health, direct backend health, and listener ownershipnpm run dev:status:lab — show status using the same LAN-bound lab-agent defaults used by dev:labnpm run dev:verify — run the managed browser proof pack against the live dev runtime, including runtime recovery, the Patrol blocked-runtime page contract, and the desktop Recovery layout guard while the launcher suppresses unrelated backend rebuild churn for the duration of the proof packnpm run dev:verify:lab — run the managed proof pack after applying lab-agent runtime defaultsnpm run dev:logs — tail the managed runtime lognpm run dev:backend-restart — bounce only the managed backend through the launcher contractnpm run dev:stop — stop the managed runtimenpm run dev:foreground — run the foreground hot-reload launcher intentionally if you need an attached shellnpm run dev:foreground:lab — run the foreground hot-reload launcher with lab-agent defaults for troubleshootingIf npm run dev:verify passes, the managed dev shell, proxy path, backend
health endpoint, browser recovery path, Patrol blocked-runtime page behavior,
and Recovery desktop history-table layout are all aligned.
Community-maintained integrations and addons:
Pulse is full-featured for core monitoring in every self-hosted tier. Self-hosted pricing no longer sells more room for monitoring volume; paid value comes from convenience, history, AI operations, and advanced administration. Cloud remains the hosted Pulse path. MSP is request-assisted provider hosting, with one isolated Pulse runtime per client.
Self-hosted tiers:
| Plan | Price | Core monitoring | Metric history | Main value |
|---|---|---|---|---|
| Community | Free | Included | 7 days | Full self-hosted monitoring |
| Relay | $39/yr or $4.99/mo | Included | 14 days | Remote web access, mobile app pairing, and push notifications |
| Pro | $79/yr or $8.99/mo | Included | 90 days | Hands-on Patrol modes, issue investigation, verified fixes, and operations tooling |
Pulse still counts top-level monitored systems once no matter how they are collected. VMs, containers, pods, disks, backups, and other child resources under that system are included rather than counted separately, but that count is no longer the self-hosted paid gate.
Community keeps Patrol available with your own provider or local model. Relay remains the convenience tier, and Pro is the paid operations tier.
Runtime-aligned capability summary:
| Capability | Community | Relay | Pro | Cloud |
|---|---|---|---|---|
| Pulse Patrol (Background Health Checks) | ✅ | ✅ | ✅ | ✅ |
| Remote Access / Mobile / Push | — | ✅ | ✅ | ✅ |
| Patrol Investigates Issues | — | — | ✅ | ✅ |
| Patrol Handles Safe Fixes | — | — | ✅ | ✅ |
| Centralized Agent Profiles | — | — | ✅ | ✅ |
| Update Alerts (Container/Package Updates) | ✅ | ✅ | ✅ | ✅ |
| SSO (OIDC/SAML/Multi-Provider) | ✅ | ✅ | ✅ | ✅ |
| Role-Based Access Control (RBAC) | — | — | ✅ | ✅ |
| Enterprise Audit Logging | — | — | ✅ | ✅ |
| Advanced Infrastructure Reporting (PDF/CSV) | — | — | ✅ | ✅ |
| Extended Metric History | 7 days | 14 days | 90 days | 90 days |
Pulse Patrol runs on your schedule (every 10 minutes to every 7 days, default 6 hours) and finds: - ZFS pools approaching capacity - Backup jobs that silently failed - VMs stuck in restart loops - Clock drift across cluster nodes - Container health check failures
On self-hosted installs, Pulse Patrol uses the provider you configure from your Pulse server. That can be a commercial API key or a local model endpoint. Chat Assistant follows the same self-managed provider model.
Technical highlights: - Cross-system context (nodes, VMs, backups, containers, and metrics history) - LLM analysis with your provider plus alert-triggered root-cause investigations (Pro / hosted Cloud) - Optional safe remediation execution with command safety policies and audit trail - Centralized agent profiles for consistent fleet settings
Try the live demo → or learn more at pulserelay.pro
Pulse plan technical details: docs/PULSE_PRO.md
Pulse is maintained by one person. Sponsorships help cover the costs of the demo server, development tools, and domains. If Pulse saves you time, please consider supporting the project!
MIT © Richard Courtman. Use of Pulse Pro is subject to the Terms of Service.
$ claude mcp add Pulse \
-- python -m otcore.mcp_server <graph>