Phase 9 of the rebrand cascade. Sweep covers everything the Phase 8
frontend pass deliberately skipped: docs/, root markdown, scripts,
Cargo.toml descriptions, code comments that survived earlier
word-boundary sed, plus a handful of identifiers caught on the final
verify pass.
transcription-app changes:
- README.md, HANDOVER.md, KNOWN-ISSUES.md, run.sh — magnotia/Magnotia
-> lumotia/Lumotia.
- docs/ — sweep across all subdirs except docs/handovers/ (preserved
as immutable audit trail). Includes architecture-map references
to magnotia_core::*, magnotia_storage::*, etc. now pointing at
lumotia_*; dev-setup.md tracing output examples (lumotia_startup
target); brief/ + superpowers/ + issues/ + whisper-ecosystem/ +
audit/.
- Cargo.toml descriptions on 9 crates (core, audio, cloud-providers,
hotkey, llm, mcp, plus referenced others).
- crates/core/src/{error,hardware,recommendation,paths}.rs +
crates/audio/src/wav.rs + crates/llm/src/model_manager.rs +
crates/cloud-providers/src/keystore.rs + crates/mcp/src/lib.rs —
doc comments and a model-manager user-agent string.
- Caught on final pass: BroadcastChannel("magnotia_task_sync") -> ...
("lumotia_task_sync"); magnotia_locale i18n localStorage key
renamed + migration shim added; CSS keyframe names
magnotiaPulse / magnotiaBar / magnotiaFade renamed in the design-
system kit; magnotia_viewer_item / magnotia_viewer_mode handoff
keys renamed in HistoryPage + viewer/+page.svelte; src/assets/
wordmark.svg text.
- src-tauri/src/lib.rs comment cleanup ("magnotia era" was sed'd
to "lumotia era" earlier — restored).
Preserved (intentional):
- crates/core/src/paths.rs — keeps "magnotia" / "Magnotia" / ".magnotia"
legacy detection strings in legacy_and_target_paths() so the
migration shim can still find user data from the magnotia era.
- src/lib/stores/{page,focusTimer}.svelte.ts + src/lib/i18n/index.ts
— migration call sites reference the legacy magnotia keys
deliberately.
- docs/handovers/ — historical audit trail.
cargo build --workspace passes. npm run check: 0 errors / 0 warnings
(3958 files). cargo test --workspace: 339 pass / 0 fail.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
name, type, slice, last_verified
| name | type | slice | last_verified |
|---|---|---|---|
| Frontend slice (Svelte 5 + SvelteKit + Tauri webview) | architecture-map-slice-index | 01-frontend | 2026/05/09 |
Frontend (Slice 01)
Where you are: Architecture map → Frontend
Plain English summary. This slice is everything the user sees. It is a Svelte 5 single page app, served by SvelteKit in SPA mode, hosted inside Tauri's webview. It owns four windows (main, tasks float, transcript viewer, transcription preview overlay), seven page modules switched by an in memory router store, around thirty reusable components, ten reactive stores, and the design system tokens. The frontend never touches the filesystem, audio, models or the LLM directly. Everything that crosses the WebView boundary goes through invoke() (calling Rust commands) or Tauri events. If you delete this slice, you delete the entire user surface but keep the engine.
At a glance
- Path:
src/ - Total LOC counted: about 17 200 (583
app.css+ 2 740 routes + 6 230 pages + 3 174 components + 4 085 stores/utils/types + ~ 2 360 design system + 130 misc). - File counts: 7 pages, 25 components, 10 stores, 1 action, 16 utils, 1 type module, 3 locales, 4 routes (root + float/viewer/preview), 20 design system preview HTMLs, 3 design system JSX kits.
- Frameworks: Svelte 5 (runes mode), SvelteKit 2.58,
@sveltejs/adapter-staticwithindex.htmlfallback (SPA), Vite 6, Tailwind v4 via@tailwindcss/vite, svelte-i18n 4, lucide-svelte for icons. - Tauri SDK touchpoints:
@tauri-apps/api(core invoke, event, window) plusplugin-autostart,plugin-dialog,plugin-global-shortcut,plugin-notification,plugin-opener. SSR is disabled (src/routes/+layout.js) so the whole tree is client side only. - Persistence used directly by frontend:
localStorageforlumotia_settings,lumotia_profiles,lumotia_task_lists,lumotia_templates,lumotia_locale, plus a small handoff key for the viewer window. Preferences additionally persist via Tauri (save_preferences). - Build commands:
npm run dev(svelte-kit sync && vite dev),npm run build,npm run check(svelte-check usingjsconfig.json).
Map of this slice
- Windows and routes. The four Tauri windows, the SvelteKit routes that back them, the
+layout@.sveltebreak, and how the shell decides between custom chrome and native decorations. - Pages overview. Index of the seven pages routed by
page.current, and the/float,/viewer,/previewroute pages. - Pages: dictation. The hero recording surface.
- Pages: settings. The 2 484 line settings panel.
- Pages: history. FTS5 backed transcript browser.
- Pages: tasks. Inbox, today, soon, later board.
- Pages: files. Drag and drop file transcription.
- Pages: first run. Hardware probe and model bootstrap.
- Components. All 25 reusable components grouped by role.
- Stores. Ten Svelte 5
$statestores, plus what each owns and what events they react to. - Actions, utils, types. The single Svelte action, the 16 utility modules, and the
app.tstype bible. - Internationalisation. svelte-i18n setup, locale persistence, current coverage.
- Design system. Reference material under
src/design-system/(preview HTML, JSX UI kits). Note: this is reference, not live code. - Frontend ↔ Tauri bridge. Every
invoke()command name and every event listened for or emitted, with their callers. - App shell and styling.
app.css,app.html, fonts, Tailwind v4 configuration, accessibility CSS variables.
How this slice connects to others
In (frontend depends on Tauri runtime, slice 02).
- Sixty plus distinct
invoke()commands. Full list with caller in frontend-tauri-bridge.md. - Tauri events listened to:
model-download-progress,parakeet-download-progress,lumotia:llm-download-progress,lumotia:hotkey-pressed,lumotia:open-wind-down,lumotia:preferences-changed,task-window-focus,preview-listening,preview-cleanup,preview-hide, plus drag drop (tauri://drag-drop,tauri://drag-enter,tauri://drag-leave). - Window APIs:
getCurrentWindow().minimize() / toggleMaximize() / setPosition() / label. - Plugin imports loaded lazily:
@tauri-apps/plugin-global-shortcut,@tauri-apps/plugin-dialog.
Out (frontend triggers behaviour back into the runtime).
- DOM
CustomEventbus onwindowcarries internal traffic (lumotia:start-timer,lumotia:toggle-recording,lumotia:task-completed, etc). The Rust side does not listen to these; they are intra frontend. - Tauri
emit()is used forlumotia:preferences-changedonly, to fan preference updates across windows. - Multi window orchestration: pages call
open_task_window,open_viewer_window,open_preview_windowto ask Rust to spawn secondary webviews.
Other slices that read frontend conventions.
- Slice 02 (Tauri runtime) emits the events listed above and registers commands the frontend invokes.
- Slice 03 (audio + transcription) ships partial results via a
Channel(Tauri 2 typed channel) opened inDictationPage. - Slice 04 (LLM, formatting, MCP) emits
lumotia:llm-download-progressandcleanup_transcript_text_cmdresults consumed by Dictation. - Slice 05 (storage, hotkey, build) supplies
add_transcript,delete_transcript, profiles, tasks and the evdev hotkey backend.
Existing in repo docs (do not duplicate)
docs/brief/anddocs/whisper-ecosystem/brief.md. Product brief and feature set.docs/icon-mapping.md. Lucide icon migration audit.docs/code-review-2026-04-22.md. Last code review snapshot.docs/handovers/. Ship logs (e.g. Phase 9c is the most recent settings related one).docs/audit/. UX and accessibility audits.docs/superpowers/. Process artefacts.src/design-system/README.md,src/design-system/SKILL.md. Brand and design ground truth.
This slice index is the navigation hub. The map files referenced above carry the detail.
Open questions, debt, drift, dead code
src/lib/Sidebar.sveltelives outsidecomponents/. Every other reusable Svelte module is undersrc/lib/components/. The sidebar is the only sibling of those folders. Cosmetic but it surprises contributors.- Two parallel theme systems.
settings.theme(string"Light"/"Dark"/"System") coexists withpreferences.theme("light"/"dark"/"system").+layout.svelte:61-68andfloat/+layout@.svelteboth run a "legacy → new" migration$effectevery time. The legacy pathway should be retired. @ts-nocheckis widespread.+layout.svelte,DictationPage.svelte,FilesPage.svelte,FirstRunPage.svelteand the float/viewer/preview layouts all opt out of TypeScript. Type safety stops at the page boundary.SettingsPage.svelteis 2 484 lines. Phase 9c handover already flagged this.SettingsGroup.svelteexists but the deeper restructure into seven progressive disclosure groups plus search has been deferred.profilesredirect is a dead route.+page.svelte:13still rewritespage.current === "profiles"to"settings", suggesting the old profiles page was removed but call sites may persist. Worth grepping and deleting the redirect after a release.- Cross window settings sync uses
localStoragestorageevents.float/+layout@.sveltelistens forstorageto apply settings, while preferences use the dedicatedlumotia:preferences-changedTauri event. Inconsistent. Settings sync viastorageis fragile because it only fires on cross document writes. shims.d.tsnext to the lib root. Single shim file atsrc/lib/shims.d.ts. Worth verifying it is still needed (Svelte 5 + SvelteKit ship most ambient types now).design-system/ui_kits/contains JSX components and an HTML index. They are reference, not live, and should not import from the runtime tree. Confirm the build excludes them.speaker.svelte.tsis ten lines. A near empty store. Used bySpeakerButton.svelte. Consider folding into a util if it never grows.- CSS variable
--font-size-transcriptis set onbodyfrom+layout.sveltebutpreferencesalready sets--font-size-bodyand--transcript-font-size. Three knobs for transcript text size in different stores. Drift betweensettings.fontSizeandpreferences.accessibility.transcriptSizeis likely. - i18n coverage is thin. Each locale has 19 lines. svelte-i18n is wired but most strings remain hardcoded. Treat as a stub.
- Tailwind v4 has no standalone config file. All theming lives in
app.css@theme. There is notailwind.config.{js,ts}. Mention this so contributors do not waste time looking. docs/architecture-map/01-frontend/was empty before this pass. Reciprocal slice indexes (02 to 05) need updating to point here.