The Problem

Monitoring Proxmox, Docker, and Kubernetes typically requires separate tools with different UIs, alerting systems, and data models. Operators end up juggling multiple dashboards, writing glue scripts, and missing cross-platform correlations. Pulse consolidates these into a single interface with unified alerting and optional AI-assisted analysis.

What This Does

Pulse is a Go backend with a React/TypeScript frontend (frontend-modern/). The backend (internal/, pkg/, cmd/) handles API serving, agent communication, and data persistence. The frontend provides the dashboard, alert configuration, and AI chat interface. Entry points in cmd/pulse-agent/main.go and cmd/eval/main.go indicate a standalone agent binary and an evaluation tool.

The system monitors Proxmox VE/PBS/PMG, Docker/Podman, and Kubernetes via agents. It supports auto-discovery, metrics history, backup exploration, and notifications to Discord, Slack, Telegram, and email. AI features (chat, patrol, alert analysis) are bring-your-own-key.

How It Is Wired

Execution starts in frontend-modern/src/App.tsx (App at line 230), which sets up WebSocket connections and routing. The call graph shows apiFetchJSON is called from 116 places and apiFetch from 61—these are the primary HTTP paths to the backend. useWebSocket (20 call sites) handles real-time updates.

Traced network paths are short: handleKeyDown → handleSubmit → apiClient.fetch (one hop to the wire). handleAnswerQuestion → answerQuestion → apiFetch → fetchJSON (two hops). The heaviest files are Alerts.tsx (77 functions, 18 types), App.tsx (40 functions), and DockerUnifiedTable.tsx (82 functions). The frontend calls out for inference (1 function), database access (1), file I/O (2), and external commands (1).

Three modules form a circular import cycle (SetupWizard.tsx, SecurityStep.tsx, CompleteStep.tsx), which complicates refactoring and increases coupling.

How To Use It

Setup: Clone and build with the included Dockerfile or docker-compose.yml. The README documents a one-liner LXC install for Proxmox and a docker run command exposing port 7655.

Configuration: Copy .env.example to .env and set required values. Backend config lives in internal/config/. Frontend dependencies are in frontend-modern/package.json.

Running: For Docker: docker run -d --name pulse -p 7655:7655 -v pulse_data:/data rcourtman/pulse:latest. Access the dashboard at http://<your-ip>:7655. Agents install via commands generated in Settings → Agents.

Real-World Use

A homelab operator with a Proxmox host, a Docker swarm, and a Kubernetes cluster installs Pulse on an LXC container. After adding credentials via the Setup Wizard, Pulse auto-discovers nodes, starts collecting metrics, and fires alerts to a Discord channel. The operator uses the AI chat to ask "Which container has the highest CPU over the last hour?" and gets an answer without querying three separate tools.

Code Health & Issues

Static analysis found 492 findings (104 high, 388 medium) across 4 kinds:

  • High - Deep nesting (50 instances): DiscoveryTab.tsx, HistoryChart.tsx, StepIndicator.tsx reach indentation depth 14. Flatten with early returns.
  • High - Import cycle (3 instances): SetupWizard.tsx, SecurityStep.tsx, CompleteStep.tsx form a circular dependency. Extract shared types.
  • High - Oversized files (6 instances): DiscoveryTab.tsx (914 lines), App.tsx, agent_internal_test.go. Split by responsibility.
  • High - Duplicated code (318 repeated 6-line blocks across 187 files): Extract shared helpers.

Security audit found 6 issues: unpinned GitHub Actions (high), discarded exit codes in create-release.yml (high), no Dependabot (medium), unpinned base image in .devcontainer/Dockerfile (medium), no dependency scan in CI (medium), missing job timeouts (low).

The Bottom Line

Pulse is a functional, feature-rich monitoring tool with a solid architecture and active CI. The frontend has real maintainability debt—deep nesting, oversized components, and duplication—that will slow future changes. It's best suited for homelab users or small MSPs wanting a single pane of glass; teams needing enterprise-grade reliability should wait for the code health issues to be addressed.