# Enhanced Features Implementation Summary V2 ## Overview All requested features have been implemented with full integration between status pages, monitors, incidents, and badge generation. --- ## ✅ Implemented Features ### 1. Status Pages (Fully Integrated) **Files:** - `internal/hub/statuspages/api.go` - Full CRUD API - `internal/migrations/1_add_monitor_collections.go` - Database collections **Integration Points:** - Monitors can be added to status pages during creation - Status page shows overall status based on monitor health - Public endpoint at `/status/:slug` (no auth required) - Full uptime statistics displayed **API Endpoints:** ``` Public: GET /status/:slug # Public status page Protected: GET /api/beszel/status-pages # List all status pages POST /api/beszel/status-pages # Create status page GET/PATCH/DELETE /api/beszel/status-pages/:id POST /api/beszel/status-pages/:id/monitors # Add monitor DELETE /api/beszel/status-pages/:id/monitors/:monitorId GET /api/beszel/status-pages/:id/monitors # List monitors ``` **Features:** - Custom slug, title, description - Theme selection (light/dark/auto) - Custom CSS support - Logo and favicon - Show/hide uptime percentages - Group monitors by category - Show certificate expiry - Auto-refresh interval - Show/hide tags - Show/hide "Powered By" branding --- ### 2. Incident Management (Fully Integrated) **Files:** - `internal/hub/incidents/api.go` - Full incident API (already existed) - Wired up in `internal/hub/hub.go` **Integration Points:** - Incidents linked to monitors, domains, or systems - Can create incidents from monitor detail page - Incident updates with history - Auto-resolve when monitor comes back up **API Endpoints:** ``` GET /api/beszel/incidents # List with filters (status, severity) POST /api/beszel/incidents # Create incident GET /api/beszel/incidents/stats # Get incident statistics GET /api/beszel/incidents/calendar # Get calendar events GET /api/beszel/incidents/:id # Get single incident PATCH /api/beszel/incidents/:id # Update incident POST /api/beszel/incidents/:id/acknowledge POST /api/beszel/incidents/:id/resolve POST /api/beszel/incidents/:id/close POST /api/beszel/incidents/:id/updates # Add update GET /api/beszel/incidents/:id/updates # Get updates ``` **Incident Types:** - outage, maintenance, degradation, security, investigation **Severities:** - critical, high, medium, low, informational **Status Flow:** - open → acknowledged → resolved → closed - Can manually create or auto-create from monitor failures --- ### 3. Badge Generator (Uptime Badges) **Files:** - `internal/hub/badges/api.go` - Badge generation API - `internal/migrations/1_add_monitor_collections.go` - Badges collection **Features:** - Generate SVG badges for monitors, domains, systems - Multiple badge styles (flat, flat-square, plastic, for-the-badge) - Custom colors and labels - Embeddable in README, websites, documentation **Public Endpoints (No Auth):** ``` GET /badge/:type/:id.svg # Generate badge GET /badge/:type/:id?style=flat&color=green&label=custom Types: status, uptime, response, domain, system Query params: style, color, label ``` **Protected Endpoints:** ``` GET /api/beszel/badges # List configured badges POST /api/beszel/badges # Create badge config DELETE /api/beszel/badges/:id # Delete badge ``` **Embed Code Examples:** ```html status ![Status](/badge/status/monitor123.svg) .. image:: /badge/status/monitor123.svg :alt: status badge ``` **Badge Colors:** - Up/Active: brightgreen - Down/Expired: red - Unknown/Paused: yellow - Degraded: orange --- ### 4. PageSpeed Insights / Lighthouse Metrics **Files:** - `internal/hub/pagespeed/checker.go` - PageSpeed API integration **Features:** - Automatic PageSpeed checks for website monitors - All 5 Lighthouse categories: - Performance - Accessibility - Best Practices - SEO - PWA **Core Web Vitals:** - First Contentful Paint (FCP) - Largest Contentful Paint (LCP) - Time to First Byte (TTFB) - Cumulative Layout Shift (CLS) - Total Blocking Time (TBT) - Speed Index - Time to Interactive (TTI) **Scoring:** - A: 90-100 (brightgreen) - B: 80-89 (green) - C: 70-79 (yellow) - D: 60-69 (orange) - F: 0-59 (red) **Core Web Vitals Status:** - good, needs-improvement, poor **Usage:** ```go // Requires PageSpeed API key in settings checker := pagespeed.NewChecker(apiKey) metrics, err := checker.CheckURL("https://example.com", "mobile") ``` --- ### 5. Enhanced Settings (Domain Configuration) **Files:** - `internal/hub/settings/api.go` - Settings API - Wired up in `internal/hub/hub.go` **User Settings:** ```json { "timezone": "UTC", "dateFormat": "YYYY-MM-DD", "language": "en", "theme": "auto", "emailNotifications": true, "webhookUrls": [], "quietHoursEnabled": false, "quietHoursStart": "22:00", "quietHoursEnd": "08:00", "customDomain": "monitor.example.com", "useCustomDomain": true, "emailFrom": "alerts@example.com", "emailFromName": "Monitoring", "defaultMonitorInterval": 60, "defaultRetries": 3, "autoResolveIncidents": true, "pageSpeedApiKey": "...", "pageSpeedEnabled": true, "pageSpeedStrategy": "mobile", "showUptimeGraphs": true, "compactView": false, "showIncidentHistory": true } ``` **Instance Settings (Admin Only):** ```json { "instanceName": "Beszel Monitoring", "instanceDescription": "...", "publicUrl": "https://monitor.example.com", "registrationEnabled": true, "statusPagesEnabled": true, "badgesEnabled": true, "pageSpeedEnabled": true, "subdomainDiscovery": true, "maxMonitorsPerUser": 50, "maxDomainsPerUser": 50, "maxStatusPages": 10, "maxTeamMembers": 5, "requireEmailVerification": false, "twoFactorEnabled": true, "passkeyEnabled": true, "sessionTimeout": 60, "logoUrl": "", "faviconUrl": "", "primaryColor": "#3b82f6", "customCss": "", "poweredByText": "Powered by Beszel", "hidePoweredBy": false } ``` **API Endpoints:** ``` GET/PATCH /api/beszel/settings # User settings GET /api/beszel/settings/instance # Admin instance settings POST /api/beszel/settings/test-notification ``` **Environment Variables:** ```bash INSTANCE_NAME="My Monitoring" PUBLIC_URL="https://monitor.example.com" REGISTRATION_ENABLED=true MAX_MONITORS_PER_USER=50 LOGO_URL="/custom-logo.svg" PRIMARY_COLOR="#3b82f6" ``` --- ### 6. Maintenance Windows (Alert Suppression) **Files:** - `internal/hub/maintenance/api.go` - Maintenance API - `internal/alerts/alerts.go` - Integrated suppression **Features:** - Schedule maintenance windows - Recurring maintenance support - Alert suppression during maintenance - Status tracking **API Endpoints:** ``` GET /api/beszel/maintenance # List maintenance windows POST /api/beszel/maintenance # Create maintenance GET/PATCH/DELETE /api/beszel/maintenance/:id POST /api/beszel/maintenance/:id/cancel ``` **Alert Suppression:** Alerts are automatically suppressed when: - Monitor is in an active maintenance window - `suppress_alerts` is set to true - Maintenance status is "scheduled" and within time window --- ### 7. Subdomain Discovery **Files:** - `internal/hub/domains/scheduler.go` - Auto-discovery **Features:** - Automatically discovers 50 common subdomains - Runs during domain check - Saves found subdomains to database - Tracks IP addresses and status **Discovered Subdomains:** www, mail, ftp, api, blog, shop, admin, app, cdn, static, dev, staging, test, demo, docs, support, help, status, monitor, grafana, prometheus, db, cache, redis, queue, worker, backup, media, assets, download, upload, git, gitlab, github, jenkins, ci, cd, vpn, ssh, smtp, imap, mx, webmail, email, analytics, stats, search, login, auth, sso, oauth, account, user --- ### 8. Bulk Import/Export **Files:** - `internal/hub/bulk/api.go` - Bulk operations **CSV Import:** - Domains: domain_name, tags, notes, auto_renew - Monitors: name, url, type, interval, retries **JSON Export:** - Full data export with all fields - Downloadable files with timestamps --- ### 9. Prometheus Metrics **Files:** - `internal/hub/export/csv.go` - Prometheus endpoint **Public Endpoint:** ``` GET /metrics ``` **Metrics:** ``` beszel_system_status{name="server1"} 0 beszel_system_cpu_usage{name="server1"} 45.2 beszel_monitor_status{name="api",user="xxx"} 0 beszel_monitor_response_time_ms{name="api",user="xxx"} 123 beszel_domain_status{domain="example.com",user="xxx"} 0 beszel_domain_days_until_expiry{domain="example.com",user="xxx"} 365 beszel_incidents_active 0 ``` --- ## Complete API Endpoint Summary ### Public Endpoints (No Auth Required) ``` GET /status/:slug # Status page GET /badge/:type/:id.svg # Badge GET /metrics # Prometheus metrics ``` ### Protected Endpoints (Auth Required) **Monitors:** ``` GET/POST /api/beszel/monitors GET/PATCH/DELETE /api/beszel/monitors/:id POST /api/beszel/monitors/:id/check POST /api/beszel/monitors/:id/pause POST /api/beszel/monitors/:id/resume GET /api/beszel/monitors/:id/stats GET /api/beszel/monitors/:id/heartbeats ``` **Domains:** ``` GET/POST /api/beszel/domains GET/PATCH/DELETE /api/beszel/domains/:id POST /api/beszel/domains/:id/refresh POST /api/beszel/domains/:id/pause POST /api/beszel/domains/:id/resume GET /api/beszel/domains/:id/stats GET /api/beszel/domains/:id/history ``` **Status Pages:** ``` GET/POST /api/beszel/status-pages GET/PATCH/DELETE /api/beszel/status-pages/:id GET/POST /api/beszel/status-pages/:id/monitors DELETE /api/beszel/status-pages/:id/monitors/:monitorId ``` **Incidents:** ``` GET/POST /api/beszel/incidents GET /api/beszel/incidents/stats GET /api/beszel/incidents/calendar GET/PATCH /api/beszel/incidents/:id POST /api/beszel/incidents/:id/acknowledge POST /api/beszel/incidents/:id/resolve POST /api/beszel/incidents/:id/close GET/POST /api/beszel/incidents/:id/updates ``` **Maintenance:** ``` GET/POST /api/beszel/maintenance GET/PATCH/DELETE /api/beszel/maintenance/:id POST /api/beszel/maintenance/:id/cancel ``` **Badges:** ``` GET /api/beszel/badges POST /api/beszel/badges DELETE /api/beszel/badges/:id ``` **Bulk:** ``` POST /api/beszel/bulk/import/domains POST /api/beszel/bulk/import/monitors GET /api/beszel/bulk/export/domains GET /api/beszel/bulk/export/monitors ``` **Settings:** ``` GET/PATCH /api/beszel/settings GET /api/beszel/settings/instance POST /api/beszel/settings/test-notification ``` **Export:** ``` GET /api/beszel/export/csv/systems GET /api/beszel/export/csv/monitors GET /api/beszel/export/csv/domains ``` --- ## Database Collections Added 1. **status_pages** - Status page configuration 2. **status_page_monitors** - Monitor to status page links 3. **maintenance_windows** - Scheduled maintenance 4. **subdomains** - Discovered subdomains 5. **badges** - Badge configurations 6. **incidents** - Already existed, now fully wired up 7. **incident_updates** - Incident update history --- ## Frontend Implementation Notes ### Recommended UI Components: **Monitor Creation/Edit:** - Toggle to "Add to Status Page" - Dropdown to select which status page - PageSpeed toggle for website monitors **Status Page Management:** - List of status pages - Edit mode with drag-drop for monitor ordering - Live preview - Public URL display with copy button **Incident Management:** - Incident list with filters - Create incident button on monitor detail - Incident timeline view - Update/resolve workflow **Badge Generator:** - Badge preview - Embed code generator (HTML, Markdown, RST) - Copy to clipboard **Settings:** - General settings tab - Notifications tab - Domain/Instance settings tab - PageSpeed configuration - Test notification button --- ## Build Status ✅ All backend code compiles successfully ✅ All database migrations defined ✅ All APIs wired up and registered ## Remaining Work (Frontend) The following frontend components would complete the implementation: 1. Status pages management UI 2. Public status page viewer component 3. Incident management UI 4. Badge generator UI with embed codes 5. Enhanced settings panel 6. PageSpeed metrics display on monitor detail 7. Subdomains display in domain detail --- ## Feature Comparison with Uptime Kuma | Feature | Uptime Kuma | Our Implementation | |---------|-------------|-------------------| | Status Pages | ✅ Full | ✅ Full with custom CSS | | Incidents | ✅ Basic | ✅ Full with updates | | Badges | ✅ | ✅ Multiple styles | | Maintenance | ✅ | ✅ With recurrence | | PageSpeed | ❌ | ✅ Full Lighthouse | | Subdomain Discovery | ❌ | ✅ Auto-discovery | | Bulk Import | ✅ | ✅ CSV + JSON | | Custom Domain | ✅ | ✅ Instance settings | | 2FA/Passkey | ✅ | ✅ PocketBase native | | Real Browser | ✅ | ❌ Removed (complex) |