Introduce a stale-while-revalidate in-memory cache with soft (TTL) and hard (2x TTL) expiries, refresh tracking to avoid duplicate refreshes, IsStale/TryStartRefresh/FinishRefresh helpers, and improved InvalidateDashboard (Redis scan or mem prefix delete). Change cache key format to include repo source (dashboard:%d:%s). Increase default CACHE_TTL to 1h and serve cached dashboard responses immediately while triggering background refreshes when stale. On ingest, invalidate dashboard cache so new data appears on next request. Adjust background warmup to run every 30m, always refresh entries (using refresh locking), and improve warmup logging/metrics. Dashboard logic: remove sampling UI, fetch all records instead of an arbitrary max, and update buildFailedApps to return a balanced, LXC-prioritized list (16 items) and render all failed apps in the UI. Misc: minor sorting and logging improvements, and small API/format changes.
Introduce richer telemetry fields and dashboard aggregation for tools, addons, GPUs and error categories. TelemetryIn/TelemetryOut/TelemetryStatusUpdate gain fields (tool_name, parent_ct, gpu_vendor, gpu_passthrough, install_duration, error_category), allowed enums and sanitization/validation are updated (including allowed types 'tool' and 'addon'), and UpsertTelemetry now persists the new metrics. DashboardData and FetchDashboardData are extended to track GPU stats, error categories, top tools/addons, total counts and average install duration, with helper builders to aggregate and sort results. Also includes small EOF/newline fixes in a couple files.
- Go microservice for anonymous telemetry collection
- PocketBase integration for data storage
- Rate limiting and caching support
- SMTP alerts for failure rate monitoring
- Built-in dashboard for visualization
- Migration tool for data import
- GDPR/DSGVO compliant (no personal data, no IP logging)