- Add proper defaults when writing settings to .env
- Prevents 'undefined' string from appearing in environment variables
- Ensures fallback values are used when settings are partially updated
- Settings were being cached by browser, causing stale values on refresh
- Added no-store, no-cache, must-revalidate headers
- Ensures fresh settings are always fetched from database
- Added incident_failure_threshold to POST /api/settings destructuring
- Added incident_failure_threshold to .env file generation
- Added incident_failure_threshold to process.env updates
- Added incident_failure_threshold to settingsTable for database storage
- Added incident_failure_threshold to GET /api/settings response (both success and fallback)
- All 27 settings now persist correctly to database and are retrieved properly
- Settings survive server restart and page reload
- Add in-app notification system with database storage
- Implement bell icon component with unread count badge in dashboard header
- Add full Notifications page tab with pagination and filtering (All/Unread/Read)
- Implement real-time WebSocket push notifications to all connected clients
- Add notification API endpoints: GET, PUT /read, DELETE, POST /clear
- Fix critical bug in notificationService where 'status' variable was undefined
- Add Notifications route to App.js routing
- Enhanced UI with notification popup in header and dedicated full-page view
- Auto-reconnect WebSocket with 5s timeout on disconnect
- Support rich notification content with resource details and timestamps
- Add description and failed_check_count fields to incidents table
- Update handleIncident() to use configurable threshold (default 10 checks)
- Auto-generate incident description with:
- Number of consecutive failures
- Last error message/reason
- First failure timestamp
- Add API endpoints: GET/POST /api/settings/incident-threshold
- Add UI settings field to configure incident failure threshold
- Server: Get threshold from database settings (persistent across restarts)
- Default threshold: 10 consecutive failed checks per resource
- notificationService: Parse comma-separated emails from resource.email_to or global config; validate and send to each recipient
- API: Add PATCH /api/resources/:id/group endpoint to move resource between groups with validation and cache invalidation
- UI: Add group selector to edit modal; wire group change to PATCH endpoint; add help text for multi-email format