- Fixed circular reference errors preventing WebSocket communication
- Added alert count badges to all alert rules (system and custom)
- Made global email/webhook toggles act as true master switches
- Fixed email toggle not saving to .env file
- Added proper notification channel indicators for both system and custom alerts
- Fixed system alert enable/disable functionality with correct ID mapping
- Improved alert display clarity:
- Shows actual rule names for custom alerts
- Displays rule conditions to identify which rule triggered
- Removed redundant details button and popup
- Added triggered time and escalation status directly to cards
- Fixed email configuration not displaying in UI
- Made notification checkboxes disable when global settings are off
- Improved UI text clarity (removed confusing 'optional overrides' language)
- Enhanced auto-refresh for real-time alert updates
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed undefined guest.type errors in generateAlertMessage by adding proper null checks
- Separated notification status from alert objects to prevent circular references during serialization
- Added comprehensive error handling with fallback data when alert serialization fails
- Improved alert state management to track notification status separately
- Fixed alert display issues in UI by ensuring proper data structure
- Added debugging helpers for troubleshooting serialization issues
- Cleaned up console logging and removed development artifacts
These changes resolve the "Converting circular structure to JSON" errors that were
preventing alerts from being properly displayed and managed in the UI.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add auto-resolve checkbox option in custom alert creation/editing with clear description
- Remove "Additional Email Recipients" section to simplify email configuration
- Enhance email provider selection with better error handling and password preservation
- Add provider-specific SMTP guidance (Gmail STARTTLS, custom placeholders)
- Improve password field UX with context-aware placeholders based on provider
- Fix WebSocket connectivity by binding server to all interfaces (0.0.0.0)
- Add visual feedback for email save/test operations
Users can now choose between auto-resolving alerts (default) or keeping them active
for manual acknowledgment, providing better control over alert accountability.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major enhancements to backup monitoring accuracy and user experience:
## Core Fixes
- **Fix timestamp precision loss**: PVE/PBS age filtering now shows correct times (17h vs incorrect 36h)
- **Server-side deduplication**: Shared storage backups no longer counted multiple times
- **Client-side deduplication**: Calendar drill-down shows each guest only once per date
- **Clean UI**: Removed redundant backup count numbers when type badges are shown
## Technical Implementation
- Added `latestTimes` object with type-specific timestamps to guest data structure
- Implemented `deduplicateStorageBackups()` function using volid-based deduplication
- Enhanced calendar-heatmap processing to merge duplicate guest entries by vmid
- Updated backup detail card to use direct timestamp lookup instead of date aggregation
## Files Modified
- `server/dataFetcher.js`: Added shared storage deduplication logic
- `src/public/js/ui/backups.js`: Enhanced guest data with type-specific latest times
- `src/public/js/ui/backup-detail-card.js`: Fixed age calculation and removed redundant counts
- `src/public/js/ui/calendar-heatmap.js`: Implemented client-side guest deduplication
- `docs/BACKUP_ARCHITECTURE.md`: Documented pragmatic solution approach
## Result
- Accurate backup ages when filtering by PVE/PBS/Snapshots
- No more duplicate counting from shared storage (NFS, Ceph, etc.)
- Clean calendar view with single guest entries per date
- Foundation for future backup system enhancements
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Alert button now opens alert management modal directly instead of dropdown
- Updated tooltip to "Click to manage alerts"
- Provides more streamlined access to full alert management interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Major Development Environment Improvements
### Integrated Development Mode
- Modified systemd service to use 'npm run dev' for complete development stack
- Concurrently runs both development server and Tailwind CSS watcher
- Automatic CSS rebuilding when Tailwind classes change
- Seamless hot reload for frontend, backend, and CSS changes
### Hot Reload Enhancements
- Always attempt to load chokidar for development convenience
- Enhanced file watcher initialization with better error messaging
- Added debug logging for NODE_ENV detection and chokidar availability
- Improved development experience with real-time change detection
### Development vs Production Distinction
- Development: systemd runs 'npm run dev' with NODE_ENV=development
- Production: installer creates service running 'node server/index.js' with NODE_ENV=production
- Clear separation between development and production environments
- Updated CLAUDE.md with integrated development mode documentation
### UI and Configuration Updates
- Removed DEV branding from title and header (development-specific cleanup)
- Added CLAUDE.md to .gitignore (development reference file)
- Restored proper RC branding for release candidate version
### Development Workflow Optimization
- No more manual 'npm run build:css' commands needed
- Complete hot reload: frontend JS → browser reload, CSS changes → auto-rebuild → browser reload
- Production-ready systemd service management with PolicyKit
- Optimal development experience with automatic toolchain management
This creates a seamless development environment where any change to Tailwind classes
automatically rebuilds CSS and triggers browser reload, while maintaining proper
production deployment through the existing install script.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed title to 'Pulse RC - DEV'
- Updated header badge from 'RC' to 'DEV' with green styling
- Clear visual indication this is a development instance
- Fixed PVE and snapshot filtered views showing incorrect ages
- Age now consistently represents overall backup health regardless of filter
- Filters affect display of backup types/counts but not age calculation
- Ensures backup health assessment accuracy across all views
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix issue where single PVE backup was counted multiple times
- Add deduplication by volid when combining endpoint-generic and node-specific snapshots
- Prevents inflated backup counts when same backup is indexed under multiple keys
The root cause is that PVE backups are intentionally stored under multiple
keys in snapshotsByGuest Map for cross-node lookup flexibility, but this
caused duplicates when retrieving them. This fix deduplicates by the unique
volume ID.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement unified alert rendering system with consistent styling
- Add color-coded enable/disable toggles that dim when disabled
- Remove redundant status labels to reduce visual clutter
- Implement nested sub-tabs for Alert History within Alerts tab
- Redesign notifications with primary config + additional items pattern
- Remove all descriptive banners for cleaner interface
- Add consistent subtitles to all main tabs
- Fix duplicate content in email and webhook sections
- Update function exports to match new simplified design
The notification system now matches the settings page pattern with
cleaner add/remove functionality for multiple email recipients and
webhook endpoints.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update PBS connectivity check endpoint for better compatibility
- Make alert checking asynchronous to prevent blocking
- Update test expectations for webhook error messages with retry counts
- Enhance alerts handler with better event listeners and error handling
- Improve PBS UI by replacing symbols with clearer text labels
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Major Improvements
### Alert Threshold Calculation Fix
- Fixed compound threshold rules to properly calculate disk usage percentages
- Resolved issue where raw bytes were compared against percentage thresholds
- Consistent behavior between single-metric and compound threshold rules
### Enhanced Debugging & Error Handling
- Added environment-controlled debug logging with ALERT_DEBUG=true
- Comprehensive error messages with specific property validation context
- New /api/alerts/debug endpoint for threshold evaluation testing
- Clear feedback on missing/invalid threshold properties
### Alert Management UI Fixes
- Fixed alert editing to properly pre-populate form values
- Support for both old (type/value) and new (metric/threshold) property formats
- Unified threshold population logic for dashboard presets and existing alerts
- Clean alert message display with correct percentage values
### Hot Reload Improvements
- Excluded runtime data files (alert-rules.json, acknowledgements.json) from hot reload
- Prevents page refreshes when creating/deleting alerts
- Better development experience with targeted file watching
### Code Quality & Maintainability
- Consistent property naming throughout (metric/condition/threshold)
- Input validation with descriptive error messages
- Backward compatibility maintained for existing alerts
- Production-ready with clean, optimized code
## Technical Changes
- Server: Enhanced AlertManager validation and evaluation logic
- Client: Fixed threshold population and property mapping
- Debug: Environment-based logging and API endpoints
- DevEx: Improved hot reload exclusions
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes modal positioning from centered to top-anchored to maintain stable positioning when tab content height varies. Applied to both Alert Management and Settings modals.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove hot reload test comment and test file from development testing.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement resilient DNS resolution for API calls with fallback mechanisms
- Add compound threshold alert rules with multi-metric evaluation
- Enable immediate alert evaluation when rules are enabled
- Add alert rules file watching for dynamic configuration updates
- Improve alert state management with proper resolution handling
- Include comprehensive testing and documentation for DNS features
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Enhanced refreshRules() to trigger immediate evaluation of current state
- Added evaluateCurrentState() method to check existing conditions without duration delays
- Added API endpoints for alert evaluation and rule reloading
- Improved alert management modal with better status loading and configuration
- Fixed async handling in config API for rule refreshing
- Added immediate alert creation for down alerts when re-enabling rules
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed missing hideAlertsDropdown() call in the 'no alerts' state button
- Added consistent dropdown closing behavior for both alert states
- Resolved issue where dropdown lingered when no active alerts present
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Show notification channels on alert rule cards with visual badges
- Display "Pulse UI" (always), "Email", and "Webhook" with color-coded badges
- Fix notification checkbox persistence when editing existing alerts
- Users can now see at-a-glance which delivery methods are configured
- Simplify UI by removing over-engineered notification status checking
- Maintain clean, straightforward interface without API complexity
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove static green "Dashboard Thresholds Imported" card that showed stale values
- Users can see live threshold updates in the "Active Thresholds" preview at bottom
- Preserve hidden input field for preset threshold data submission
- Eliminate visual redundancy and potential confusion from outdated values
- Cleaner, less cluttered alert creation interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove confusing "Single Metric" vs "Multiple Metric" toggle that added unnecessary cognitive load
- Unify interface to use dashboard-style sliders for CPU/Memory/Disk (familiar to users)
- Consolidate 4 separate network monitoring fields into single "Network Activity" dropdown
- Add VM/LXC Status monitoring checkbox for status change alerts
- Eliminate ~50 lines of complex conditional UI logic and mode-switching code
- Maintain full backward compatibility with preset thresholds from dashboard
- Support all previous alert functionality with cleaner, more intuitive UX
- Update form submission logic to handle simplified unified interface
- Rename preview functions and IDs to match simplified approach
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace VM/LXC ID text input with pre-populated dropdown showing all VMs/containers
- Add unified threshold system supporting both single and multiple metric alerts
- Improve dashboard-to-modal threshold flow with visual feedback
- Fix toast notifications to appear in bottom-left as requested
- Resolve JavaScript syntax error in alert modal template literal
- Enhanced UX with better visual hierarchy and clearer mode selection
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhance custom alert modal to support multiple thresholds similar to dashboard sliders:
- Add toggle between single and multiple threshold modes in custom alert modal
- Implement slider-based threshold configuration for CPU, Memory, and Disk metrics
- Add dropdown selectors for network I/O thresholds (Disk Read/Write, Net In/Out)
- Include real-time threshold preview showing active conditions
- Update form submission logic to handle both single and multiple threshold modes
- Add CSS styling for new range sliders to match dashboard aesthetic
- Maintain backward compatibility with existing preset threshold functionality
This unifies the threshold creation experience across dashboard sliders and custom alert modal,
allowing users to create complex multi-metric alerts from either interface.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix non-functional delete buttons for custom alerts by removing broken confirmation dialogs
- Add comprehensive toast notification system with bottom-left positioning
- Hide Add Custom Alert button on System Alerts tab, show only on Custom Alerts tab
- Replace all browser alert() calls with consistent toast notifications across alert management
- Remove confirmation requirements for delete operations to streamline workflow
- Ensure high z-index (9999) for toast notifications to appear above all UI elements
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replaces toggle switches with standard action buttons, updates banner layout for consistency, and implements threshold badge display matching custom alerts interface.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated system alert cards to use same styling as custom alerts
- Removed colored icons and fancy styling for consistency
- Added status badges and threshold displays matching custom alerts
- Updated layout to use border-gray-600, p-3, same structure
- System and custom alerts now have identical visual design
- Added status badge updates in updateSystemAlertDisplay function
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed Global Alert Thresholds card for better consistency
- Added individual system alert rule cards (CPU, Memory, Disk, Down) with edit buttons
- Each system alert now has its own toggle and edit functionality matching custom alerts
- Added editSystemAlert modal with threshold configuration
- System alerts now follow the same interaction pattern as custom alerts
- Improved UI consistency across alert management interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Restored settings.js to previous working state to fix broken modal.
Alert Configuration tab is still removed from HTML navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed Alert Configuration tab from settings navigation
- Updated remaining alert references to redirect to alert management modal
- Cleaned up hasSignificantConfiguration function alert case
- Settings modal now focuses on system config only
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed renderThresholdsTab function that was duplicating alert management modal functionality
- Cleaned up references to alerts tab and loadThresholdConfigurations
- Removed alert-related exports from settings module
- Settings modal should now open properly
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove alert tab case from activeTab checks
- Replace switchTab('alerts') calls with alert management modal
- Redirect custom threshold actions to new alert management modal
- This should fix the broken settings modal opening
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed the massive renderAlertsTab function (314 lines)
- Removed alerts case from main tab switch
- Still need to remove remaining alert references and functions
- This is partial cleanup to avoid having duplicate alert management
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove duplicate Global Alert Settings section from settings.js
- All alert management functionality now centralized in Alert Management modal
- Global thresholds available in System Alerts tab
- Email configuration enhanced in Notification Settings tab
- Eliminates redundancy and consolidates user experience
- Prevents confusion from having same settings in multiple places
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Integrate global alert thresholds into existing System Alerts tab
- Add toggle controls for CPU, Memory, Disk, and Down alerts
- Include threshold percentage inputs with proper validation
- Create save functionality for global thresholds configuration
- Load existing configuration from PulseApp.config
- Add event handlers for all threshold controls
- Place configuration logically above system alert rules list
- Maintain consistent styling with blue theme for system alerts
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove duplicate Global Settings tab that duplicated existing functionality
- Add comprehensive email provider selection (Gmail, Outlook, Yahoo, Custom)
- Include provider-specific configuration and helpful instructions
- Add advanced SMTP settings with collapsible interface
- Implement test email and save configuration functionality
- Add proper event handlers for all email configuration elements
- Maintain existing webhook functionality without duplication
- Keep clean separation between email and webhook configuration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add new Global Settings tab with comprehensive alert configuration
- Include global alert type toggles (CPU, Memory, Disk, Down alerts)
- Add threshold configuration for CPU (85%), Memory (90%), Disk (95%)
- Implement custom per-VM/LXC threshold integration placeholder
- Add advanced settings for alert frequency and suppression
- Create modern toggle switches and form controls
- Load configuration from backend /api/config endpoint
- Set up event handlers for all form controls
- Prepare foundation for migrating from settings.js
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Edit button to custom alert cards
- Implement editCustomAlert function to pre-fill form with existing data
- Update createCustomAlertModal to handle both create and edit modes
- Modify saveCustomAlert to use PUT requests for updates vs POST for creation
- Update modal titles and button text based on create vs edit mode
- Preserve existing alert properties like enabled status and creation date
- Expose editCustomAlert in public API for onclick handlers
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove modern styling that conflicted with app's design language
- Implement nested tab structure consistent with existing UI patterns
- Replace large gradient cards with clean, tabbed interface
- Email and Webhook settings now in separate, focused tabs
- Maintain same functionality with improved consistency
- Use standard app colors and styling throughout
- Simplify layout while keeping all interactive features
The per-rule overrides section that directed users to the Alert Rules tab
was unnecessary since users are already within the alert management modal.
This simplifies the Notification Settings tab and removes redundant navigation.
- Replace basic form layout with interactive card-based design
- Add gradient backgrounds and better visual hierarchy
- Implement expandable configuration panels for email and webhook setup
- Add modern toggle switches with real-time status indicators
- Include popular service presets (Discord, Slack, Teams, Custom)
- Add progressive disclosure to reduce cognitive load
- Improve responsive design with better mobile layout
- Enhanced UX with hover states and visual feedback
- Maintain all existing functionality while improving usability
- Replace localStorage with real API calls to /api/alerts/rules
- Load custom alerts from backend via GET /api/alerts/rules
- Create alerts via POST /api/alerts/rules
- Update alerts via PUT /api/alerts/rules/:id
- Delete alerts via DELETE /api/alerts/rules/:id
- Improve alert card display to handle backend data structure
- Add proper error handling for all API operations
- Add localStorage-based persistence for custom alerts as temporary solution
- Create custom alert cards with enable/disable and delete functionality
- Display created alerts immediately in Alert Rules tab
- Add proper error handling and user feedback
- Maintain alert data structure for future backend integration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add comprehensive alert management modal with 3-tab structure (Alerts, Alert Rules, Notifications)
- Connect dashboard threshold buttons to new alert management system
- Implement threshold pre-population for custom alert creation
- Support multiple threshold capture from dashboard to single alert rule
- Add "Manage Alerts" button to alerts dropdown for centralized access
- Maintain backward compatibility with existing alert functionality
- Enhance user workflow from threshold setting to alert rule creation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>