These 3 windows were declared in tauri.conf.json and created eagerly at startup, each holding a resident WKWebView content process even though they're rarely shown. Remove them from tauri.conf; create on first show via WebviewWindowBuilder (ensure_qa_window / ensure_less_computer_window / ensure_less_computer_glow_window) with config matching the old declarations exactly. QA drag-fix (make_qa_window_draggable_macos) was startup-only — re-applied on create. Drops ~3 resident WebKit processes (~30-50MB each) when idle.
Tradeoffs to verify on macOS: (1) first QA/Less-Computer open builds the webview before showing (slight first-use delay); (2) QA emit-race is benign (first emit = idle/empty = panel default); Less-Computer's first turn bubble could be missed on cold open (recovers next emit) — verify. Confirm QA still drags + positions; glow shows over fullscreen.
All 5 locales (en/ja/ko/zh-CN/zh-TW) were statically bundled into the index chunk that every one of the 5 webviews loads. Keep only zh-CN (fallback + source of truth) inline so init stays synchronous; lazy-load the other 4 as separate chunks on demand (initial non-zh-CN locale loads async after first paint, then changeLanguage; setLocalePreference awaits the locale before switching). Worst case = graceful zh-CN fallback, never broken keys. Cuts ~155KB raw / ~75KB gzip from the per-webview index; zh-CN users never load the other 4.
Build-verified: index 285KB + en/ja/ko/zh-TW separate chunks. Runtime-sanity: switch language in settings (en/ja/ko/zh-TW) to confirm it loads + applies.
During recording the audio level updates ~60Hz, re-rendering the whole Pill. The cancel/confirm SVG buttons and the pill metrics don't depend on level, so: React.memo(CircleButton) + useCallback(onCancel/onConfirm) lets the two buttons skip re-render per frame, and useMemo the os-derived metrics. Pure render optimization — identical output, no behavior/NSPanel change. Build-verified.
Re-add width=device-width after dark-mode squash replaced it; keep color-scheme meta for native control hints.
Co-authored-by: Cursor <cursoragent@cursor.com>
All 5 webviews (settings/capsule/qa/less-computer/glow) shared one ~942KB bundle, so every WebKit content process parsed+held the entire app (settings UI + LocalAsr 3.4k LOC + Style + Marketplace + chat panels). React.lazy each window root: FloatingShell (settings, 352KB) + QaPanel + LessComputerPanel + LessComputerGlow + Onboarding + AutoUpdateGate are now separate chunks loaded on demand. Capsule kept eager (tiny + latency-sensitive). Secondary webviews no longer load the settings UI → much lower resident memory per process.
Frontend-only, build-verified (chunks split, tsc+vite pass). Runtime-sanity: open settings / QA / Less Computer / glow once to confirm they still render (Suspense fallback is blank during first chunk load).
v1.3.7 fixed cross-desktop but not fullscreen: a plain NSWindow can't draw over ANOTHER app's fullscreen Space even with CanJoinAllSpaces+FullScreenAuxiliary+level (known Tauri limit: tauri#9556/#11488). The window must be a non-activating NSPanel. Add tauri-nspanel (macOS-only git dep), register the plugin, and convert the capsule via to_panel() at setup with NSNonactivatingPanel mask + FullScreenAuxiliary|CanJoinAllSpaces + level 25, per the plugin's own fullscreen example.
Note: Cargo.lock not regenerable here (no local cargo) — CI resolves the git dep; commit the lock update after the first local 'tauri dev'. Runtime-verify on macOS before release.
v1.3.6-5 fixed cross-desktop following but not fullscreen: FULL_SCREEN_AUXILIARY only lets the capsule JOIN the fullscreen Space; at alwaysOnTop's floating level (~3) it still renders behind the fullscreen window. setLevel(25) (above the menu bar, matching show_less_computer_glow which does overlay fullscreen) makes it render on top. Add a contract assertion to lock it in.
Runtime-verify on macOS: enter a fullscreen app, trigger dictation, capsule should now appear over it.
Add useRafThrottle; QaPanel/LessComputerPanel parse streamed markdown at frame-rate instead of per-token (was O(n^2)); LessComputer DOM-measure + IPC window-resize coalesced to one per frame. Capsule keyframes injected once into document.head instead of re-created every ~60Hz audio-level frame.
Backend perf: add [profile.release] (lto=thin/codegen-units=1/strip); tray mic watcher 1.5s->10s; global-hotkey dispatcher blocks on recv() instead of 250ms poll; coding_agent supervisor exits on non-macOS instead of 5s poll; cache+reuse reqwest client across utterances (net.rs) in OpenAI/Codex/Gemini providers (kills per-utterance cold TLS handshake).
fix(macos): capsule joins all Spaces + fullscreen via an absolute setCollectionBehavior(273) matching show_less_computer_glow; drop the racy Tauri set_visible_on_all_workspaces that deferred-overwrote the manual FullScreenAuxiliary bit.
chore: remove 12 orphaned coordinator/*.rs (never mod-declared -> not compiled); repoint macos-capsule-spaces contract test to the live coordinator.rs.
Replace fixed sidebar on narrow/Android with top bar, bottom tabs, and more sheet; adapt Overview, History, Vocab, and Settings for portrait; add android-ui-verify.ps1.
Co-authored-by: Cursor <cursoragent@cursor.com>
generate_context! requires ../dist; the android-check job was missing npm ci + vite build, causing proc macro panic on CI.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add signed release APK builds on v*-tauri tags, minisign manifests per ABI, custom Android in-app updater, and CI cargo check for aarch64-linux-android.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply theme before first paint via main.tsx, persist preference locally, and expose a segmented control in General settings with aura-skin contract coverage.
Co-authored-by: Cursor <cursoragent@cursor.com>