When Pulse runs in Docker, ARM users couldn't download the docker-agent
because only the host architecture binary was built. The Dockerfile now
builds amd64, arm64, and armv7 binaries and includes them at /opt/pulse/bin/
so the download endpoint can serve all architectures.
The update progress modal was stuck showing 'initializing' even after the
backend restarted and websocket reconnected. Users could see the connection
status badge reconnecting behind the modal, but the modal never cleared.
Now the modal:
- Watches websocket connection status during update
- Detects when backend disconnects and reconnects
- Verifies health after reconnection
- Automatically reloads the page when update is complete
- Shows clearer messaging about restart progress
Add no-cache headers to both the install script and agent binary download endpoints to prevent browsers and curl from serving stale cached versions. This ensures users always get the latest install script with URL normalization fixes for trailing slash issues.
Fixes#528
The PUT /api/config/nodes/{id} endpoint was corrupting node configurations
when making partial updates (e.g., updating just monitorPhysicalDisks):
- Authentication fields (tokenName, tokenValue, password) were being cleared
when updating unrelated settings
- Name field was being blanked when not included in request
- Monitor* boolean fields were defaulting to false
Changes:
- Only update name field if explicitly provided in request
- Only switch authentication method when auth fields are explicitly provided
- Preserve existing auth credentials on non-auth updates
- Applied fix to all node types (PVE, PBS, PMG)
Also enables physical disk monitoring by default (opt-out instead of opt-in)
and preserves disk data between polling intervals.
Simplified host sidebar to show only essential monitoring info (name, status, alerts, container count). Moved detailed metrics (CPU, memory, uptime) to host detail view when selected to eliminate duplication. Added alert highlighting with visual indicators for hosts with container alerts. Fixed double 'v' prefix in agent version display.
Improved the backup history chart UI by reorganizing the time range controls and date filter display. Selected dates now have enhanced visual highlighting with border strokes and brightness adjustments for better visibility.
Removed chevron toggle buttons from Settings and Alerts navigation sidebars. Sidebars now expand automatically on hover and collapse on mouse leave, providing a cleaner interface and more intuitive interaction pattern.
Integrate lucide-solid icon library to enhance visual navigation in Alerts
and Settings pages. Sidebars now display icons alongside labels and can
collapse to icon-only view for more screen space. Icons provide better
visual scanning and the collapsible design improves usability on smaller
displays while maintaining quick access to all sections.
Adds automatic data directory separation to prevent mock data from contaminating production alerts and configuration:
- hot-dev.sh: Explicitly sets PULSE_DATA_DIR based on PULSE_MOCK_MODE
- Production: /etc/pulse (real, persistent data)
- Mock: /opt/pulse/tmp/mock-data (isolated, throwaway data)
- clean-mock-alerts.sh: New utility to remove mock contamination from production alerts
- Auto-creates mock data directory when switching to mock mode
This prevents issues where mock alerts appear in production alert history after switching between modes.
Restores v4.22.0-rc.6 wider page layout (110rem/1760px max-width) and implements responsive column widths for dashboard table. Name column and progress bars scale wider on xl screens while small columns (Type, VMID, I/O metrics) stay compact. This better utilizes screen space without creating wasteful empty gaps.
Add green checkmark icon to "No active alerts" empty state for better visual feedback. Separate mock and production data directories to prevent contamination. Mock mode now uses /opt/pulse/tmp/mock-data while production uses /etc/pulse. Update toggle script to dynamically set data directory based on mode.
Add debug logging to track prop changes and hasCustomGlobalDefaults checks in ResourceTable. Fix quick tips documentation to use 0 instead of -1 for disabling alerts. Add factory defaults and reset support for PBS Servers section. Reorder PBS section to appear before Guests section.
Corrected to match v4.21.0 exactly:
- Width: 95% (not 98%)
- Max-width: 80rem/1280px (not 120rem/1920px)
- No horizontal padding on shell
- Fixed 0.75rem (12px) panel padding
This restores the more condensed, narrower layout from v4.21.0.
Adjusted container width and padding to reduce whitespace:
- Increased max-width from 110rem (1760px) to 120rem (1920px)
- Reduced shell horizontal padding from 20-52px to 8-16px
- Reduced panel padding from 12-24px to 8-12px
Maintains responsive behavior while matching the condensed feel of v4.21.0.
When global defaults differ from factory defaults:
- Show blue "Custom" badge next to "Global Defaults" label
- Show red trash bin icon in Actions column
- Clicking trash bin resets to factory defaults
- Matches existing pattern used for individual resource rows
- Add tooltips to threshold inputs explaining -1 disables alerts
- Add help banner at top of thresholds page with usage tips
- Add FAQ entry documenting how to disable specific metrics
- Add reset to defaults button for each threshold table
- Define factory default constants for all resource types
- Reset button restores defaults and marks form as unsaved
The Alerts page was redirecting any path that didn't exactly match the expected tab path. This prevented threshold sub-tabs (/alerts/thresholds/proxmox, /docker, /mail-gateway) from working.
Modified the path validation logic to allow sub-paths under /alerts/thresholds/ to pass through without triggering redirects.
Implement proper URL-based navigation for threshold sub-tabs (Proxmox, Docker, Mail Gateway). This enables bookmarking specific tabs and provides browser history integration.
Changes:
- Add route-based tab state management with useLocation
- Implement tab navigation using useNavigate
- Auto-redirect /alerts/thresholds to /alerts/thresholds/proxmox
- Add cursor-pointer CSS to improve UX
Backend was loading system settings from disk on every HTTP request
causing massive log spam and UI responsiveness issues. System settings
are now cached at startup and reloaded only when updated.
Also fixed tab cursor showing text cursor instead of pointer cursor.
Changes:
- Cache system settings in Router struct with mutex protection
- Load settings once at startup instead of on every request
- Add reloadSystemSettings() method to refresh cache when settings change
- Hook up cache reload in config handlers after successful save
- Add cursor-pointer to tab CSS classes for proper hover cursor
Replaced 4 separate PMG threshold tables with a single unified table containing all 16 columns. Each PMG instance now appears once instead of four times, with a single global defaults row.
Changes:
- Consolidated Queue/Deferred, Hold/Oldest, Spam/Virus, and Growth tables into one
- Removed index() === 0 workaround for offline alerts column
- Added 16 PMG tooltips with clear warn vs crit differentiation
- Warning tooltips emphasize early detection and monitoring
- Critical tooltips emphasize urgency and required action
This improves UX by eliminating duplicate instance rows and making threshold severity levels immediately clear to operators.
Each of the 4 PMG threshold tables was showing its own offline alerts column, resulting in 4 duplicate toggles per instance. Now only the first table displays the offline alerts column since the setting is per-instance, not per-threshold-group.
Adds dedicated PMG sub-tab under Alerts → Configuration with comprehensive
threshold management for all 7 PMG alert types:
- Queue depth monitoring (total, deferred, hold)
- Message age tracking (oldest message warnings)
- Quarantine monitoring (spam/virus absolute thresholds)
- Quarantine growth detection (percentage and minimum thresholds)
ThresholdsTable.tsx changes:
- Add PMG tab to threshold table with 16 editable threshold columns
- Implement PMG column groups for organized display (4 groups of 4 columns)
- Add PMG global defaults with normalization and mapping
- Support per-instance threshold overrides
- Include connectivity toggle support
Alerts.tsx changes:
- Add PMGTab component with 4 organized sections using SettingsPanel
- Create pmgThresholds signal with default values matching backend
- Wire PMG threshold loading from backend config
- Include pmgDefaults in config save payload
- Add PMG to AlertTab type and tab navigation
- Render PMGTab following same pattern as other configuration tabs
Backend alert logic (already implemented in alerts.go) monitors:
- Offline detection (3-poll confirmation)
- Queue depths with per-node outlier detection
- Oldest message age tracking
- Quarantine backlog with growth rate detection
- Spam/virus rate anomaly detection with 24h baseline