v0.20.0 — Startup Performance & Draft Preservation
What's New
⚡ Startup Performance
- Flash-free window launch — window starts hidden (
show: false) and appears only afterready-to-show, eliminating the white flash on startup - Non-blocking analytics init — PostHog initialization in the main process is now fire-and-forget instead of
await-blockingapp.whenReady() - Deferred analytics sync — renderer-side
syncAnalyticsSettings()moved from module-level to auseEffectso IPC calls don't block first paint - Lazy model cache revalidation — model list revalidation (which spawns a Claude SDK subprocess) is deferred by 3 seconds, reducing startup IPC contention while cached models serve the initial render
- Relaxed session prefetch timing — idle callback timeout raised from 1.5s → 5s and fallback timeout from 250ms → 3s, with 50ms yields between sequential loads to let the main process event loop breathe
🎨 Draft Preservation
- BottomComposer component — new wrapper keeps the InputBar always mounted (hidden via
aria-hidden+inert) while a permission prompt is active, preserving any unsent text the user was composing - Test coverage — static-render tests verify both states: InputBar visible when no permission is pending, and InputBar hidden-but-mounted alongside the PermissionPrompt
Full Changelog: v0.19.1...v0.20.0