- Create /usr/src/app/config and /usr/src/app/data directories before setting ownership
- Fixes permission issues when saving configuration via web UI
- Resolves issue #109 where appuser cannot write to .env file in mounted config volume
- Add comprehensive webhook support for Discord, Slack, Teams
- Rich embeds with color-coded severity and inline fields
- Webhook configuration UI with test functionality
- Dual payload format (Discord embeds + Slack attachments)
- Error handling with timeout and proper HTTP responses
- Test webhook endpoint with sample alert data
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add nodemailer dependency for SMTP email sending
- Implement email notification channel in AlertManager
- Add rich HTML email templates with alert details
- Create email configuration UI in settings page
- Add test email functionality with validation
- Support for multiple recipients and Gmail app passwords
- Addresses feature request in issue #111🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Client now uses 'auto-detect' placeholder when node can't be determined
- Server handles node auto-detection by looking up VM/LXC in current state
- Fixes 'Please select a VM/LXC from the dropdown first' error in v3.17.3
- Addresses issue #110
- Add sanitization for name fields in Proxmox and PBS configurations
- Sanitize PBS node_name values to prevent leaking actual node names
- Improve URL sanitization to handle URLs without protocols
- Use clearer redaction patterns (REDACTED-IP, REDACTED-HOST)
- Add more aggressive fallback sanitization for malformed URLs
This prevents exposure of sensitive infrastructure details when diagnostic
reports are shared for debugging purposes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added clickable links to node names in both regular and mobile summary cards.
When a node URL is available, users can now click the node name to open the
node's web interface in a new tab.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix download URL property mismatch (downloadUrl vs browser_download_url)
- Add comprehensive error logging for update failures
- Create test mode for update mechanism (UPDATE_TEST_MODE=true)
- Add test script for easy update testing without releases
- Improve restart logic for different deployment environments
- Add tar package dependency for creating update packages
- Update .gitignore to exclude backup and temp directories
- Add documentation for update testing workflow
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
When custom node names are configured, the dashboard shows display names
but node links were failing because getHostUrl was checking actual node
names first. This fix reorders the lookup to check display names first,
ensuring that custom-named nodes have working links.
- Check display names before actual node names in getHostUrl
- Maintains backward compatibility for non-custom setups
- Fixes issue where clicking custom node names didn't open web interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed handleMouseOut to properly detect when leaving tooltip triggers
- Added document mouseleave handler to hide tooltips when mouse leaves viewport
- Added scroll event handler to prevent tooltips getting stuck during scrolling
- Improved event handling to prevent premature tooltip hiding from child element bubbling
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change config loader to set name to null instead of host address when no custom name is provided
- This ensures discovered node names are used by default
- Custom names are only applied when PROXMOX_NODE_NAME is explicitly set
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add support for custom display names via PROXMOX_NODE_NAME configuration
- Handle multi-node clusters properly by prefixing node names with endpoint name
- Fix dashboard and nodes views to show configured display names
- Fix non-sequential endpoint numbering issue in settings (node_2, node_8, node_14)
- Improve endpoint configuration loading to handle any index number
Fixes#100🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed diagnostics icon button from header
- Removed JavaScript code that managed icon visibility
- Removed event listener for diagnostics icon click
- Diagnostics functionality remains available in settings menu
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Backup .env file before removing old installation
- Restore .env file after extracting new version
- Fix both update and migration processes
- Ensure proper ownership and permissions on restored .env file
- Store release data when checking for updates
- Use server API for update checks to get Docker status
- Implement proper applyUpdate function with progress tracking
- Handle Docker deployments with appropriate warning message
- Add WebSocket listeners for update progress events
- Strip http:// or https:// from PBS_HOST values in settings form
- Update placeholders to show IP/hostname format without protocol
- Fix discovery cycle to trigger for PBS-only configurations
- Resolves issue where PBS data wouldn't load due to malformed host URL
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Previously, the config loader required sequential numbering (2, 3, 4...) for additional Proxmox/PBS endpoints. If a user had PROXMOX_HOST_2 and PROXMOX_HOST_4 (skipping 3), only endpoint 2 would be loaded.
This fix scans all environment variables to find any PROXMOX_HOST_N or PBS_HOST_N patterns, regardless of numbering sequence. Now users can have endpoints numbered 2, 5, 10, etc. and all will be properly loaded.
Fixes#96🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added SHA-based version tracking to avoid GitHub CDN caching issues
- Uses GitHub API to check latest commit SHA for the installer
- Falls back to simple diff check if jq is not available
- Updates embedded SHA when downloading new version
- Much more reliable than simple file comparison
This restores the update method from the original installer that
properly handles GitHub's aggressive CDN caching.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Check for Express version mismatch after extracting tarball
- Reinstall dependencies if Express version is wrong
- Fixes service startup failure due to path-to-regexp error
- Works around issue where GitHub releases have wrong Express version
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added back the self-update check for the installer script
- Installer now checks for updates to itself before running
- Skips update check when running from pipe (curl | bash)
- User is prompted before updating the installer
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed npm dependency installation from installer (tarballs include deps)
- Cleaned up output with better icons and formatting
- Simplified installation flow since tarballs are pre-built
- Reduced installer from 590 to 522 lines
- Fixed messaging to be cleaner and more professional
The installer now expects properly built tarballs from create-release.sh
that include all dependencies and pre-built CSS.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Install all dependencies (including dev) initially
- Build CSS with tailwindcss available
- Remove dev dependencies after CSS is built
- Fixes installation failure due to missing tailwindcss
- Check if CSS is already built before attempting to rebuild
- Skip CSS build if tailwindcss is not available (dev dependency)
- Continue installation even if CSS build fails (tarball should have pre-built CSS)
- Fix issue where installation would fail due to missing tailwindcss
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set should_update_deps=true when Express version mismatch is found
- Previously, the installer would detect the mismatch but still skip npm install
- This was causing the path-to-regexp error to persist even after detection
The installer will now properly update dependencies when it detects
that Express version is not 4.19.2.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove 'local' keyword usage outside of functions
- Variables should_update_deps, current_express_ver, and express_version are now global
- Fixes "./install-pulse.sh: line 2204: local: can only be used in a function" error
This was preventing the dependency update logic from running properly.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed installer to always run npm install on updates, not just fresh installs
- Added Express version check even for tarball installations
- Forces dependency update if Express version doesn't match expected 4.19.2
- Removed manual fix script as it's no longer needed
The issue was that tarball installations include pre-built node_modules,
which prevented dependency updates when package.json changed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add fix-express-version.sh script to manually resolve path-to-regexp errors
- Script performs complete node_modules cleanup and reinstall
- Verifies correct Express 4.19.2 version is installed
- Provides immediate solution while installer is being debugged
Run this script on affected servers:
sudo /opt/pulse/scripts/fix-express-version.sh
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Stop the service before updating dependencies
- Remove node_modules directory to force clean install
- Add Express version verification after install
- This ensures old Express 4.21.x dependencies are completely removed
The service recovery was masking the real issue - old node_modules
were not being updated properly, keeping the problematic Express version.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Switch from npm install to npm ci for clean installs based on package-lock.json
- Add fallback to npm install if npm ci fails
- Remove --unsafe-perm flag and use --omit=dev for production installs
- Show dependency installation output (filtering npm WARN messages)
This ensures that package-lock.json changes are properly applied during updates,
fixing issues where old dependencies remain after updates.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Downgrade Express from ^4.21.2 to 4.19.2 to avoid path-to-regexp compatibility issues
- Express 4.21.x includes a newer version of path-to-regexp with breaking changes
- Routes with multiple parameters (e.g., /api/thresholds/:endpointId/:nodeId/:vmid) were causing startup failures
- This resolves the "pulse-monitor.service: Failed with result 'exit-code'" error
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace overly broad npm notice detection with specific checks
- Add detection for actual npm start misconfiguration in ExecStart
- Separate npm errors/warnings from service configuration issues
- Provide clearer troubleshooting guidance for each error type
This prevents false positives when npm notices appear in logs
during normal operation with direct node execution.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replace npm execution with direct node server/index.js in systemd service to eliminate npm-related startup failures and update notices. Add improved diagnostics to detect and explain npm execution issues.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add clearer messaging when service recovery succeeds to provide better user feedback during installation process.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>