- Add comprehensive install.sh script for LXC and manual installations
- Add systemd service file (pulse.service)
- Add build-release.sh for creating release archives
- Support for multiple architectures (amd64, arm64, armv7)
- Automatic dependency installation (Go, Node.js)
- User creation and permission management
- Update/reinstall/remove functionality
- Matches the installation experience of the original Pulse
- Remove .air.toml (hot reload config)
- Remove tygo.yaml (TypeScript generation)
- Remove systemd service files (not needed for Docker)
- Remove .env.example (outdated config format)
- Remove Makefile (development convenience)
- Remove scripts/ directory (development scripts)
- Remove testing-tools/ directory (only for testing)
These files are only needed for development and shouldn't be in the production repository
- Docker build tested and working
- Fixed port configuration (UI and API both on port 3000)
- Updated docker-compose.yml to map 7655:3000
- Updated Dockerfile health check to use correct port
- Removed obsolete version field from docker-compose.yml
- Updated README to reflect correct port mappings
- Application successfully tested in Docker container
- Add multi-stage Dockerfile for optimized builds
- Add docker-compose.yml for easy deployment
- Add .dockerignore to keep images lean
- Ready for complete replacement of old Pulse repository
- Remove backend binary (should be built, not committed)
- Remove api.ts.bak backup file
- Add backend binary to .gitignore
- Repository now only contains source files, not build artifacts
- Completely rewrite README.md configuration section
- Remove all references to manual pulse.yml editing
- Emphasize UI-only configuration like Radarr/Sonarr
- Simplify Docker examples
- Rewrite SECURITY.md from scratch
- Explain automatic encryption system
- Document how AES-256-GCM encryption works
- Add security architecture diagram
- Remove outdated manual config references
- Move CONFIGURATION.md to dev-docs (outdated)
- Documentation now correctly reflects that:
- All configuration is done through the web UI
- Credentials are automatically encrypted
- No manual file editing is needed or supported
- Complete rewrite of README.md in the style of original Pulse
- Add comprehensive user-facing documentation:
- FAQ.md with common questions and troubleshooting
- PBS-AGENT.md for push mode monitoring
- SCREENSHOTS.md placeholder for visual guide
- Update SECURITY.md intro to match new style
- Move internal dev docs to separate dev-docs folder
- Documentation now properly reflects Go/SolidJS architecture
- Replace real Gmail app password with placeholder in all test files
- Fix remaining production node name references in documentation
- Ensure no sensitive credentials remain in codebase
IMPORTANT: The exposed Gmail app password should be revoked immediately
- Replace personal email with generic test@example.com
- Replace production node names (delly, pimox) with generic examples
- Replace specific security tokens with placeholder values
- Update IP addresses to use localhost or generic examples
- Sanitize all testing files and documentation
- Active alerts now persist to /var/lib/pulse/alerts/active-alerts.json
- Alerts are saved when created, resolved, and every minute
- On startup, alerts are restored with original timestamps
- Prevents duplicate email notifications after service restarts
- Skips restoration of alerts older than 24 hours
- Preserves acknowledgment state and escalation levels
- Remove all unencrypted configuration fallback logic
- Fix PBS user realm handling with automatic @pbs appending
- Enable test connection for existing nodes using stored credentials
- Delete legacy migration code and unified config system
- Fix redundant "No guests found" message when no PVE nodes configured
- Remove old example yml and migration binary
- Ensure all credentials stored only in encrypted .enc files
The issue: Backend returns empty password for security, so when UI
loaded the config and sent it back for testing, it had no password.
Solution: Don't send config from UI - let backend use the saved
config which has the actual encrypted password.
This fixes the issue where UI said "success" but no email was sent.
- Frontend was sending 'server' but backend expects 'smtpHost'
- Fixed field mapping in testEmailConfig function
- Changed config type to 'any' since backend expects different structure
- Removed provider and starttls fields not needed by backend
The UI test email button should now work correctly.
- Backend now uses From address as recipient when To array is empty
- Fixed sendEmail and sendGroupedEmail to not check for recipients
- Added detailed logging for SMTP operations
- Fixed recipient logging to show actual recipients sent
This allows users to send test emails to themselves without
having to enter their email address in the recipients field,
as promised by the UI.
- Fix alert acknowledgement API calls to use correct URL format
- Remove all TypeScript 'any' types - notifications.ts now properly typed
- Add comprehensive alert and threshold testing scripts
- Add final system verification test
- Clean up test artifacts and screenshots
- Update testing tools documentation in package.json and CLAUDE.md
- Verify all systems operational with 100% test pass rate
- Fix Gmail email configuration (field mapping between frontend/backend)
- Implement proper AES-256-GCM encryption for sensitive config files
- Add responsive column hiding for Storage tab on mobile devices
- Fix email configuration persistence and auto-populate recipients
- Add comprehensive testing tools for UI and API validation
- Fix alert acknowledge/clear functionality returning 404 errors
- Improve mobile UX: Storage shows only essential columns on small screens
- Revert dashboard to consistent table view (removed card layout experiment)
- Fix various UI issues: threshold detection, email template spacing
- Update notification system to use actual node data in test emails
- Add initialDataReceived signal to track when first WebSocket data arrives
- Show loading spinner instead of empty state while waiting for initial data
- Update Dashboard and Storage components to check for initial data
- Reset flag on disconnect to ensure proper state when reconnecting
This prevents the confusing experience where users with configured nodes
briefly see "No Proxmox VE nodes configured" message on page refresh.
- Remove chart.js dependency from package.json
- Delete all chart-related components (DynamicChart, Sparkline)
- Remove chart stores (charts.ts, chartDimensions.ts)
- Remove chart types and API endpoints
- Clean up Dashboard and GuestRow components to remove chart UI
- Remove chart-related constants and configurations
- Simplify Storage component to only show progress bars
This completes the removal of all chart functionality as requested.
The application now uses only MetricBar components for visualization.
- Backend update manager with GitHub Releases API integration
- Support for stable and RC update channels
- Safe update process with backups and rollback capability
- Docker environment detection
- Update API endpoints (check, apply, status)
- Frontend update UI in Settings with progress tracking
- WebSocket events for real-time update progress
- Auto-update configuration options
- Version display in app footer
- TypeScript types for update operations
- Replace all 'any' types with proper TypeScript types throughout the codebase
- Fix Record<string, any> to use specific types (AlertThresholds, unknown)
- Update logger methods to use 'unknown' instead of 'any' for parameters
- Fix type assertions to use proper types instead of 'as any'
- Update generic type defaults from 'any' to 'unknown'
- Fix WebSocket message types to use 'unknown' for optional data
- Move global Toast declaration to top level to fix TypeScript errors
- Comment out legacy PBS backup code that referenced non-existent fields
- Ensure all code follows TypeScript standards as documented in CLAUDE.md
All TypeScript compilation errors have been resolved and the codebase now
adheres to strict typing standards with no 'any' types remaining.
- Fix all any types in Alerts.tsx:
- Create proper interfaces for refs (DestinationsRef, ScheduleRef)
- Add type parameters for AlertThresholds and HysteresisThreshold
- Fix callback types and remove any type assertions
- Type all component props properly
- Fix any types in NodeModal.tsx:
- Use NodeConfig type instead of any for editingNode
- Handle union type properties with type guards
- Fix any types in DynamicChart.tsx:
- Use ChartPoint[] type instead of any for data prop
- Fix any types in websocket store:
- Initialize PVEBackups, Performance, and Stats with proper structures
- Import all necessary types
Some TypeScript errors remain due to complex union types and interface
mismatches that need further work, but this removes the vast majority
of any types improving type safety significantly.
- Create ChartsAPI class with proper TypeScript types
- Add chart types (ChartPoint, MetricData, etc) with string indexing support
- Replace direct fetch calls with typed API methods:
- AlertsAPI.getConfig/updateConfig instead of fetch('/api/alerts/config')
- NotificationsAPI methods for test, templates, and providers
- ChartsAPI.getCharts instead of fetch('/api/charts')
- Fix type mismatches between API interfaces and component interfaces
- Add index signatures to chart data types for dynamic property access
- Make some AlertConfig fields optional to match backend response
This improves type safety by ensuring all API calls go through typed methods
that validate request/response formats at compile time.
- Preserve node connection status from backend instead of hardcoding to 'disconnected'
- Add status field to NodeConfig type definition
- Backend already provides correct status ('connected', 'disconnected', 'error')
Nodes will now correctly show green indicators when connected.
- Add new `/api/config/nodes/test-config` endpoint for testing unsaved node configurations
- Update NodesAPI to use appropriate endpoint based on whether node has an ID
- Existing nodes use `/api/config/nodes/{id}/test`, new nodes use `/api/config/nodes/test-config`
- Fix TypeScript types to include latency in test response details
This resolves the 400 error when testing connections for new nodes before they are saved.
- Fixed TypeScript interfaces to match Go backend (username -> user)
- Fixed NodesAPI to handle flat array response instead of nested object
- Reverted Settings component to use correct property names
The issue was a mismatch between TypeScript expectations and the
actual API response format.
- Fixed all TypeScript compilation errors
- Replaced remaining any types with proper interfaces
- Fixed API imports in Alerts page
- Corrected node property access (user -> username)
- Added type guards for union types in Settings component
- Mapped between API and local email config formats
- Removed unused imports
The codebase now has comprehensive type safety with no any types
in critical paths. This prevents runtime errors and improves
developer experience with better IntelliSense support.
- Added typed API classes for alerts and notifications
- Replaced direct fetch calls with typed API methods
- Fixed any types in Storage, NodeModal, and Settings components
- Created NotificationsAPI with proper types for email/webhook config
- Enhanced error handling to show actual error messages
This prevents issues like the polling interval bug by ensuring
type safety across API boundaries.
- Remove backend/frontend port configuration from Settings UI
- Port changes are rarely needed and disruptive
- Advanced users can still use environment variables
- Simplifies UI and reduces potential for misconfiguration
- Fix hardcoded WebSocket URLs for proper proxy support
- Changed from hardcoded port 3000 to relative URLs
- WebSocket now uses window.location.host instead of fixed port
- Enables seamless operation behind reverse proxies (nginx, Caddy, etc)
- Works with any port mapping or proxy configuration
These changes make Pulse more user-friendly for typical deployments
while maintaining flexibility for advanced configurations.
- Remove recently resolved alerts from frontend display
- Keep recently resolved tracking in backend for potential future use
- Update alert indicators to show only critical and warning states
- Remove fade animations and resolved alert styling
- Improve dashboard clarity by focusing only on current issues
The dashboard now provides a cleaner, more focused view showing only
alerts that require immediate attention.
- Fixed alert clearing logic to work even when alerts are acknowledged
- Added immediate WebSocket state broadcast after alert resolution
- Fixed frontend activeAlerts store updates to maintain SolidJS reactivity
- Added logging for alert resolution events
The alert system now properly:
- Creates alerts when thresholds are exceeded
- Clears alerts automatically when values drop below clear threshold
- Updates frontend in real-time without requiring page refresh
- Reduce backup polling interval from 60s to 20s
- Add immediate polling on first cycle for faster initial load
- Add loading spinner UI while waiting for backup data
- Update frontend port from 3001 to 7655 in vite config
- Add .vite directory to gitignore
- Update CLAUDE.md with service management commands
- Go backend with Proxmox/PBS integration
- Modern TypeScript/SolidJS frontend
- WebSocket real-time updates
- Clean project structure with no legacy code