Changelog
Performance
- Adaptive tick system — TUI animation tick adjusts based on activity (150ms active, 500ms idle, fully paused when unused), eliminating idle CPU usage (#59)
- Broadcaster snapshot deduplication — skip sending unchanged data frames to the TUI, reducing unnecessary re-renders (#59)
- Render cache fixes — cache key precision fixed (nanosecond to second), triple slice copy removed, 20+ redundant cache invalidations eliminated (#59)
- Lipgloss style caching — 42 inline style allocations replaced with cached package variables across render hot paths (#59)
- Read model cache optimization — remove unnecessary deep clone on every cache read (#59)
- Bubble Tea renderer reduced from 60 FPS to 30 FPS (#59)
Bug Fixes
- Daily series 30-day cap — fix hardcoded 30-day filter in daily aggregation queries that caused analytics cost to show 0 for older events (#59)
- SQL error propagation — add missing
rows.Err()checks in 9 telemetry query functions (#59) - Network error propagation — check
io.ReadAllerrors in daemon client instead of silently discarding (#59) - Context propagation — thread context through claude_code API calls, cursor API goroutine, daemon ServiceStatus, and dashboardapp ValidateAPIKey (#59)
- Stale snapshot guards — add existence checks in TUI render loops to prevent rendering empty tiles from stale IDs (#59)
- Config validation — validate and trace-log when thresholds, intervals, and retention days are silently clamped (#59)
- Cross-platform path — replace
os.Getenv("HOME")withos.UserHomeDir()in claude_code provider (#59) - Provider consistency — groq and gemini_api now use
shared.FinalizeStatus()(#59) - Input validation — reject empty API keys in SaveCredential, validate telemetry hook source names against known providers (#59)
- Temp file cleanup — deferred removal of orphaned temp files in spool and config writes (#59)
- Config load failures now log a warning instead of silently falling back to defaults (#59)
Security
- SQL table name validation — materialized table names validated against strict allowlist before SQL interpolation (#59)
- File permissions — spool files written with 0600 instead of 0644; credential file permissions enforced on update (#59)
Maintenance
- Provider dedup — extract
shared.FetchJSONhelper, remove 108 lines of duplicated HTTP+JSON boilerplate from deepseek, xai, mistral, alibaba_cloud (#59) - Update() refactor — extract 6 message handlers from 206-line switch statement (#59)
- Dead code removal — delete unused Panel/PanelRow types from widget.go (#59)
- Theme mutex documentation — document locking protocol and Bubble Tea single-goroutine safety invariants (#59)
- Test coverage — add 54 tests for shared helpers, groq, mistral, xai, gemini_api (all previously at 0%) (#59)
- Bump golang.org/x/crypto to 0.49.0 (#55), github.com/samber/lo to 1.53.0 (#52)
Full Changelog: v0.6.12...v0.7.0