codeburn/app/renderer/components
iamtoruk 300e949951 feat(app): refresh cadence, instant switching, cache coherence, telemetry v1
Performance and coherence:
- Settings > General 'Refresh every' (Manual/30s/1m/3m/5m/10m), live via
  RefreshCadenceContext; Manual polls only on demand
- usePolled memoKey LRU: provider/period switches paint the last-good
  result instantly with a switching hairline while refreshing quietly
- quota TTL 5min + honest rate-limited copy on 429 backoff
- version-suffixed cache files (session-cache.v5.json, daily-cache.v12,
  auto-minted on future bumps); legacy files never written or deleted,
  adopted once when versions match: old and new binaries coexist
  without clobbering (field-observed menubar-vs-desktop ping-pong)
- advisory hydration lock: concurrent cold starts share one scan
  (wait-then-read-warm), stale/dead locks self-heal, never a
  correctness gate

Telemetry v1 + onboarding (desktop only, per owner decisions):
- first-launch onboarding (3 feature screens + consent); region-split
  default (EU/EEA/UK/CH off, elsewhere on, unknown off); nothing sends
  before consent completion or while off; dev builds never send
- anonymous install UUID, rotated on opt-out; day-granularity events,
  cost buckets only; whitelisted names; 200-event queue, 5min flush
- Settings > Privacy live toggle replaces the static claim

Zero computed-number changes. App 316/316, root 1805.

Wire contract targets api.codeburn.app/v1/telemetry (Worker follows).
2026-07-16 11:47:05 -07:00
..
AboutModal.tsx feat(app): retraced brand flame — one mark for icon, splash, sidebar, About 2026-07-16 05:54:40 -07:00
ActivityHeatmap.tsx style(app): merge hero + daily-activity heatmap into one split card 2026-07-11 11:30:15 -07:00
CliErrorPanel.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
ConnectAffordance.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Dropdown.tsx feat(app): Claude config switcher (multi-account overview scope) 2026-07-16 03:06:05 -07:00
EmptyState.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
ErrorBoundary.test.tsx feat(app): error boundary so a crashing screen shows the error, not a blank 2026-07-11 14:33:16 -07:00
ErrorBoundary.tsx feat(app): error boundary so a crashing screen shows the error, not a blank 2026-07-11 14:33:16 -07:00
FlameMark.tsx feat(app): exact approved flame art everywhere 2026-07-16 06:10:22 -07:00
Hint.tsx feat(app): window chrome, sidebar nav, and Overview smoke view 2026-07-10 15:17:11 -07:00
ListRow.tsx feat(app): Sessions provider quick-filter + Spend project inline expand 2026-07-16 02:49:17 -07:00
Onboarding.test.tsx feat(app): refresh cadence, instant switching, cache coherence, telemetry v1 2026-07-16 11:47:05 -07:00
Onboarding.tsx feat(app): refresh cadence, instant switching, cache coherence, telemetry v1 2026-07-16 11:47:05 -07:00
Panel.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
ProviderLogo.test.tsx fix(app): provider logos key on internal ids + monogram fallback 2026-07-16 09:27:46 -07:00
ProviderLogo.tsx fix(app): provider logos key on internal ids + monogram fallback 2026-07-16 09:27:46 -07:00
ProviderPop.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
RangeCalendar.tsx feat(app): working periods, detected-provider dropdown, drag-select date range 2026-07-11 09:14:54 -07:00
Sankey.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
SegTabs.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
Sidebar.test.tsx feat(app): exact approved flame art everywhere 2026-07-16 06:10:22 -07:00
Sidebar.tsx feat(app): flame splash startup loader + living sidebar flame 2026-07-16 04:51:30 -07:00
Skeleton.test.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Skeleton.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Splash.test.tsx polish(app): compact first-run splash 2026-07-16 10:59:20 -07:00
Splash.tsx polish(app): compact first-run splash 2026-07-16 10:59:20 -07:00
StackedBars.test.tsx fix(app): accuracy batch A — provider scoping, honest chart axes, range threading, stale-error banner 2026-07-16 01:14:41 -07:00
StackedBars.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
StaleBanner.test.tsx fix(app): accuracy batch A — provider scoping, honest chart axes, range threading, stale-error banner 2026-07-16 01:14:41 -07:00
StaleBanner.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
Stat.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
ToastHost.test.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
ToastHost.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
TopBar.tsx feat(app): Claude config switcher (multi-account overview scope) 2026-07-16 03:06:05 -07:00
Window.tsx feat(app): window chrome, sidebar nav, and Overview smoke view 2026-07-10 15:17:11 -07:00