settings.theme and preferences.theme overlap: the legacy localStorage field still drives two SegmentedButton bindings in SettingsPage.svelte while preferences.theme is the canonical Tauri-persisted store. A migration \$effect in the four route +layout files syncs the legacy value into preferences whenever it changes. Resolution requires touching SettingsPage.svelte (2 484 LOC), src/lib/stores/page.svelte.ts, four route layouts, and the localStorage migration system. That is moderate-risk frontend work, not pre-launch polish, so it lands in KNOWN-ISSUES with a concrete plan and is deferred from v0.1. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.3 KiB
Known issues
Tracked limitations and partial implementations in the current codebase. Each entry points at the code that owns the gap so future work can find it.
Power management
KI-01 — macOS App Nap guard pending Apple Silicon runtime verification
Status: macOS code path compiles and the registry tests pass, but runtime behaviour against actual OS idle-throttling has not been confirmed on Apple Silicon hardware. Also tracked internally as RB-08.
Source: src-tauri/src/commands/power.rs:73 (PowerAssertion::begin), src-tauri/src/commands/power.rs:140 (objc_bridge).
Impact: Long live-dictation sessions on macOS may still be slowed or paused by the OS until verified end-to-end on hardware.
Workaround: Keep the app window focused, or move the cursor periodically. For testing, App Nap can be disabled globally with defaults write NSGlobalDomain NSAppSleepDisabled -bool YES (revert with -bool NO).
KI-02 — Linux power assertion is a no-op
Status: PowerAssertion::begin does nothing on Linux. The planned implementation (systemd-logind / GNOME idle inhibitor via org.freedesktop.login1.Inhibit) is described in the file-level doc but not wired up.
Source: src-tauri/src/commands/power.rs.
Impact: Long sessions can be paused by the compositor's idle hooks (screen lock, suspend timers) on KDE, GNOME, Hyprland, Sway, etc.
Workaround: Raise the system idle / screen-lock timeout while dictating, or wrap launch with systemd-inhibit --what=idle:sleep:handle-lid-switch ./run.sh.
KI-03 — Windows power assertion is a no-op
Status: PowerAssertion::begin does nothing on Windows. The planned implementation (SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED) on begin, ES_CONTINUOUS alone on end) is described in the file-level doc but not wired up.
Source: src-tauri/src/commands/power.rs.
Impact: Long sessions can be paused by Windows sleep policies.
Workaround: Set the active power plan's sleep to "Never" while dictating.
Cloud providers
KI-04 — magnotia-cloud-providers crate is not user-exposed
Status: The crate is a declared workspace dependency in src-tauri/Cargo.toml:36 and compiles into the binary, but no Tauri command, page, or settings field invokes store_api_key / retrieve_api_key. There is no UI to enter or store a cloud API key in the current build.
Source: crates/cloud-providers/src/keystore.rs. The TODO in the doc comment captures the planned migration to OS-native credential storage (the keyring crate or equivalent) before the feature is wired up.
Impact: None for end users today (no exposed surface). When the feature is wired post-launch, cross-restart persistence must land before any "save key" UX ships, otherwise saved keys reset on every restart.
Workaround: N/A.
Frontend
KI-05 — Dual theme system: settings.theme and preferences.theme coexist
Status: Theme is stored twice. The legacy settings.theme ("Dark" / "Light" / "System", localStorage-only) is bound to two SegmentedButton controls in SettingsPage.svelte. The canonical preferences.theme ("dark" / "light" / "system", Tauri-persisted via save_preferences) is what the DOM and runtime actually consume. A migration $effect in src/routes/+layout.svelte (and the secondary +layout@.svelte files for /preview, /viewer, /float) syncs settings.theme → preferences.theme whenever the legacy value changes.
Source:
src/lib/stores/page.svelte.ts:61(legacy default:theme: "Dark")src/lib/stores/preferences.svelte.ts:30(canonical default:theme: "dark")src/routes/+layout.svelte:61-68(migration$effect)src/lib/pages/SettingsPage.svelte:1118,:2360(UI bindings still on the legacy field)
Impact: No user-facing bug; theme switching works. The cost is code complexity and a small race window where preference fan-out can lag behind a settings.theme change. The $effect is lightweight (string compare plus a debounced persist when the mapped value differs), not a hot-loop performance problem despite earlier framing.
Resolution (deferred): Switch the two SettingsPage bindings to preferences.theme with mapped options, retire the migration $effect in all four route layouts, drop theme from SettingsState, and add a one-shot localStorage migration that copies any historical settings.theme into preferences on first run after the cleanup. Touches ~5 files including the 2 484-LOC SettingsPage.svelte; deferred from the v0.1 polish pass to avoid a moderate-risk frontend change immediately before launch.
Workaround: N/A.
How to add an entry
When shipping a partial implementation or known limitation, add a KI-NN entry here with the four standard fields: Status, Source (file:line), Impact, Workaround. Link from the affected module's doc comment back to this file by ID.