agent: lumotia-rebrand — docs, scripts, root config, residuals
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>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 80" width="240" height="80">
|
||||
<text x="12" y="54" font-family="'Instrument Serif', Georgia, serif" font-style="italic" font-weight="400" font-size="48" fill="#e8a87c" letter-spacing="-0.01em">Magnotia</text>
|
||||
<text x="12" y="54" font-family="'Instrument Serif', Georgia, serif" font-style="italic" font-weight="400" font-size="48" fill="#e8a87c" letter-spacing="-0.01em">Lumotia</text>
|
||||
<text x="92" y="46" font-family="'Instrument Serif', Georgia, serif" font-size="28" fill="#e8a87c">ක</text>
|
||||
<text x="12" y="70" font-family="'Lexend', sans-serif" font-size="9" fill="#716b60" letter-spacing="1.4" text-transform="uppercase" style="text-transform:uppercase">THINK OUT LOUD</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 597 B After Width: | Height: | Size: 596 B |
@@ -1,16 +1,16 @@
|
||||
# Magnotia — Design System
|
||||
# Lumotia — Design System
|
||||
|
||||
> **Think out loud.** A voice-first dictation app built for neurodivergent minds, by CORBEL.
|
||||
|
||||
## What is Magnotia?
|
||||
## What is Lumotia?
|
||||
|
||||
Magnotia is a local-first dictation + thought-capture app. You press a hotkey, speak, and Magnotia transcribes, cleans, and — optionally — extracts tasks from what you said. Everything runs on your machine (Whisper / Parakeet models); nothing is sent anywhere.
|
||||
Lumotia is a local-first dictation + thought-capture app. You press a hotkey, speak, and Lumotia transcribes, cleans, and — optionally — extracts tasks from what you said. Everything runs on your machine (Whisper / Parakeet models); nothing is sent anywhere.
|
||||
|
||||
**Company:** CORBEL — an AI consultancy and technology integrator that removes friction from day-to-day life and work.
|
||||
|
||||
**Product essence:** *Clarity without friction.* Every design decision is measured against it. If something adds cognitive load, it doesn't ship.
|
||||
|
||||
**Archetypes:** Sage (primary) + Magician (secondary). Magnotia listens more than it speaks.
|
||||
**Archetypes:** Sage (primary) + Magician (secondary). Lumotia listens more than it speaks.
|
||||
|
||||
**Visual reference points:** The Barbican, Muji, Amsterdam urban design, Nujabes album art — warm brutalism, honest materials, structural clarity. **Anti-references:** Notion-style feature density, generic blue/white SaaS, FAANG aesthetics.
|
||||
|
||||
@@ -18,9 +18,9 @@ Magnotia is a local-first dictation + thought-capture app. You press a hotkey, s
|
||||
|
||||
## Sources
|
||||
|
||||
- **Repo:** `github.com/jakejars/magnotia` — Tauri + Svelte 5 + Tailwind v4 desktop app. Imported into `magnotia-source/` (lib components + routes).
|
||||
- **Repo:** `github.com/jakejars/lumotia` — Tauri + Svelte 5 + Tailwind v4 desktop app. Imported into `lumotia-source/` (lib components + routes).
|
||||
- **Design brief:** Pasted in the initial message — complete token system, type scale, motion guidelines, ideology.
|
||||
- **Key reads in `magnotia-source/`:**
|
||||
- **Key reads in `lumotia-source/`:**
|
||||
- `app.css` — @theme tokens, global base, zone + motion system
|
||||
- `lib/Sidebar.svelte` — navigation shell
|
||||
- `lib/pages/DictationPage.svelte` — record / transcribe (the hero screen)
|
||||
@@ -41,8 +41,8 @@ Magnotia is a local-first dictation + thought-capture app. You press a hotkey, s
|
||||
| `SKILL.md` | Agent-skill manifest (cross-compatible with Claude Code Agent Skills). |
|
||||
| `assets/` | Logos, the sinhala wordmark glyph, grain texture, icon references |
|
||||
| `preview/` | HTML spec cards shown in the Design System tab (swatches, specimens, components) |
|
||||
| `ui_kits/magnotia-app/` | UI kit — pixel-level recreation of the Magnotia desktop app with interactive click-thru |
|
||||
| `magnotia-source/` | Imported Svelte source — the ground truth for component structure |
|
||||
| `ui_kits/lumotia-app/` | UI kit — pixel-level recreation of the Lumotia desktop app with interactive click-thru |
|
||||
| `lumotia-source/` | Imported Svelte source — the ground truth for component structure |
|
||||
|
||||
No slide template was attached, so `slides/` is not created.
|
||||
|
||||
@@ -52,12 +52,12 @@ No slide template was attached, so `slides/` is not created.
|
||||
|
||||
> **Voice:** A calm friend who has already done the anxious part for you.
|
||||
|
||||
**Person.** Addresses the user as *you*; never refers to itself as *I*. Brand name "Magnotia" appears sparingly — the product speaks, it doesn't narrate itself. *(Settings labels: "Save recordings", "British English" — never "I'll save your recordings".)*
|
||||
**Person.** Addresses the user as *you*; never refers to itself as *I*. Brand name "Lumotia" appears sparingly — the product speaks, it doesn't narrate itself. *(Settings labels: "Save recordings", "British English" — never "I'll save your recordings".)*
|
||||
|
||||
**Sentence shape.** Short. Direct. Rarely more than ~12 words per line of UI copy. Never exclaims. Never hypes. Full stops inside UI labels are dropped; in prose (empty states, toasts) they're used naturally.
|
||||
|
||||
**Tone.**
|
||||
- **Ambient, not demanding.** Empty states are *"Your words will appear here…"* — not *"Record your first transcript!"* Blank screens trigger freeze; Magnotia offers presence instead of prompting.
|
||||
- **Ambient, not demanding.** Empty states are *"Your words will appear here…"* — not *"Record your first transcript!"* Blank screens trigger freeze; Lumotia offers presence instead of prompting.
|
||||
- **Calm on failure.** Failed transcription copy leads with *"Your audio is saved"* — the anxiety reducer, not the apology. Never red all-caps.
|
||||
- **No guilt, no streaks.** No streak-shaming, no *"keep it up!"*, no urgency.
|
||||
- **British English.** "Minimise", "finalising", "customise". `britishEnglish` is a first-class setting.
|
||||
@@ -65,7 +65,7 @@ No slide template was attached, so `slides/` is not created.
|
||||
**Casing.**
|
||||
- Sentence case for all headings and buttons. *"Start recording"*, *"Clear all"*, *"Sensory zone"* — never *Start Recording* or *START RECORDING*.
|
||||
- Eyebrow labels (10px, uppercase, 0.12em tracking) are the **only** place all-caps appears — e.g. *THINK OUT LOUD* under the sidebar wordmark. Never apply uppercase to sentences.
|
||||
- Brand name is always `Magnotia` (capital K, one lowercase letter).
|
||||
- Brand name is always `Lumotia` (capital K, one lowercase letter).
|
||||
- Product tagline — *"Think out loud"* — always sentence case.
|
||||
|
||||
**Buttons.** Verbs. *Record, Stop, Save, Copy, Clear, Export, Extract Tasks, Open viewer.* The one exception is *Tasks* (noun) as a sidebar toggle — consistent with its icon label.
|
||||
@@ -147,7 +147,7 @@ Lucide icons, 2px stroke, rounded terminals. 16px in nav, 20px in features, 24px
|
||||
|
||||
## Iconography
|
||||
|
||||
**Library:** [Lucide Icons](https://lucide.dev) (MIT). Every Lucide glyph Magnotia uses is listed in `magnotia-source/docs/icon-mapping.md`.
|
||||
**Library:** [Lucide Icons](https://lucide.dev) (MIT). Every Lucide glyph Lumotia uses is listed in `lumotia-source/docs/icon-mapping.md`.
|
||||
|
||||
**Stroke weight:** 2px default · 2.5 on active sidebar items · 1 for empty-state illustrations (48px, opacity 40%).
|
||||
|
||||
@@ -165,7 +165,7 @@ Lucide icons, 2px stroke, rounded terminals. 16px in nav, 20px in features, 24px
|
||||
- `--danger` for destructive and the recording state indicator
|
||||
- `--success` for completion checks
|
||||
|
||||
**Core Magnotia set (from the audit):** `Mic` (Dictation), `FileText` (Files), `SquareCheck` (Tasks), `Clock` (History), `Settings`, `Circle`/`Square` (record/stop), `Play`/`Pause`, `Search`, `Upload`, `Download`, `Copy`, `ChevronDown`, `ChevronLeft`, `ChevronRight`, `X`, `Check`, `Plus`, `Pin`, `User`, `AlignLeft`, `AlertTriangle`, `Loader2`.
|
||||
**Core Lumotia set (from the audit):** `Mic` (Dictation), `FileText` (Files), `SquareCheck` (Tasks), `Clock` (History), `Settings`, `Circle`/`Square` (record/stop), `Play`/`Pause`, `Search`, `Upload`, `Download`, `Copy`, `ChevronDown`, `ChevronLeft`, `ChevronRight`, `X`, `Check`, `Plus`, `Pin`, `User`, `AlignLeft`, `AlertTriangle`, `Loader2`.
|
||||
|
||||
**Brand glyph:** The Sinhala letter **ක** (U+0D9A) sits next to the wordmark in `--accent`. Decorative only. During recording it spins slowly (2s linear infinite, `sinhala-spin`). A Unicode codepoint, not an SVG — scales perfectly, no asset needed.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: magnotia-design
|
||||
description: Use this skill to generate well-branded interfaces and assets for Magnotia (by CORBEL), either for production or throwaway prototypes/mocks/etc. Contains essential design guidelines, colors, type, fonts, assets, and UI kit components for prototyping.
|
||||
name: lumotia-design
|
||||
description: Use this skill to generate well-branded interfaces and assets for Lumotia (by CORBEL), either for production or throwaway prototypes/mocks/etc. Contains essential design guidelines, colors, type, fonts, assets, and UI kit components for prototyping.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
@@ -21,6 +21,6 @@ If the user invokes this skill without any other guidance, ask them what they wa
|
||||
- `colors_and_type.css` — import this for all tokens + semantic type.
|
||||
- `README.md` — full brand + content + visual foundations.
|
||||
- `assets/` — logos, glyph, grain, icon samples.
|
||||
- `ui_kits/magnotia-app/` — component recreations of the desktop app.
|
||||
- `ui_kits/lumotia-app/` — component recreations of the desktop app.
|
||||
- `preview/` — spec cards (swatches, specimens, components).
|
||||
- `magnotia-source/` — ground-truth Svelte source from the Magnotia repo.
|
||||
- `lumotia-source/` — ground-truth Svelte source from the Lumotia repo.
|
||||
|
||||
@@ -8,7 +8,7 @@ function RecordButton({ recording, onToggle }) {
|
||||
transition:'all 150ms cubic-bezier(.2,.8,.2,1)',
|
||||
background: recording ? 'var(--danger)' : 'var(--accent)',
|
||||
boxShadow: recording ? '0 0 0 0 rgba(232,113,113,.4)' : '0 4px 20px rgba(232,168,124,.3)',
|
||||
animation: recording ? 'magnotiaPulse 2s ease-in-out infinite' : 'none',
|
||||
animation: recording ? 'lumotiaPulse 2s ease-in-out infinite' : 'none',
|
||||
};
|
||||
return (
|
||||
<button onClick={onToggle} style={style} aria-label={recording ? 'Stop recording' : 'Start recording'}>
|
||||
@@ -29,7 +29,7 @@ function Waveform({ recording }) {
|
||||
<span key={i} style={{
|
||||
width:2, borderRadius:999, background:'rgba(232,113,113,.7)',
|
||||
height:`${h*100}%`,
|
||||
animation:`magnotiaBar 1.2s ease-in-out ${i*60}ms infinite`,
|
||||
animation:`lumotiaBar 1.2s ease-in-out ${i*60}ms infinite`,
|
||||
}}/>
|
||||
))}
|
||||
</span>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Magnotia app · UI kit
|
||||
# Lumotia app · UI kit
|
||||
|
||||
Desktop transcription app — local-first, neurodivergent-first, amber on warm black.
|
||||
|
||||
@@ -12,4 +12,4 @@ Desktop transcription app — local-first, neurodivergent-first, amber on warm b
|
||||
Open `index.html`. Click nav items to switch. Click the amber circle to toggle "recording" — the button pulses and the waveform bars animate. Check tasks off on the Tasks page.
|
||||
|
||||
## Notes on fidelity
|
||||
Recreated from the Svelte source in `magnotia-source/`. The visual language, component shapes, copy tone and icon stroke weights match the app. Local transcription, model loading, Tauri IPC, and the real audio pipeline are stubbed — this kit is for visual + interaction reference.
|
||||
Recreated from the Svelte source in `lumotia-source/`. The visual language, component shapes, copy tone and icon stroke weights match the app. Local transcription, model loading, Tauri IPC, and the real audio pipeline are stubbed — this kit is for visual + interaction reference.
|
||||
|
||||
@@ -42,16 +42,16 @@
|
||||
background-size: 200px 200px; opacity: .025; mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
@keyframes magnotiaPulse {
|
||||
@keyframes lumotiaPulse {
|
||||
0%,100% { box-shadow: 0 0 0 0 rgba(232,113,113,.4); }
|
||||
50% { box-shadow: 0 0 0 8px rgba(232,113,113,0); }
|
||||
}
|
||||
@keyframes magnotiaBar {
|
||||
@keyframes lumotiaBar {
|
||||
0%,100% { transform: scaleY(.5); opacity:.6; }
|
||||
50% { transform: scaleY(1); opacity:1; }
|
||||
}
|
||||
@keyframes magnotiaFade { from { opacity: 0 } to { opacity: 1 } }
|
||||
[data-fade] { animation: magnotiaFade 300ms cubic-bezier(.2,.8,.2,1); }
|
||||
@keyframes lumotiaFade { from { opacity: 0 } to { opacity: 1 } }
|
||||
[data-fade] { animation: lumotiaFade 300ms cubic-bezier(.2,.8,.2,1); }
|
||||
|
||||
button:focus-visible, input:focus-visible, textarea:focus-visible {
|
||||
outline: none; box-shadow: 0 0 0 3px var(--accent-glow);
|
||||
|
||||
@@ -19,7 +19,12 @@ export const SUPPORTED_LOCALES: { code: Locale; label: string }[] = [
|
||||
{ code: "de", label: "Deutsch" },
|
||||
];
|
||||
|
||||
const STORAGE_KEY = "magnotia_locale";
|
||||
import { migrateLocalStorageKey } from "$lib/utils/localStorageMigration";
|
||||
|
||||
const STORAGE_KEY = "lumotia_locale";
|
||||
|
||||
// One-shot key rename from the magnotia era. Idempotent.
|
||||
migrateLocalStorageKey("magnotia_locale", STORAGE_KEY);
|
||||
|
||||
register("en", () => import("./locales/en.json"));
|
||||
register("es", () => import("./locales/es.json"));
|
||||
|
||||
@@ -387,12 +387,12 @@
|
||||
// script.
|
||||
const handoff = JSON.stringify({ id: String(item.id) });
|
||||
try {
|
||||
localStorage.setItem("magnotia_viewer_item", handoff);
|
||||
localStorage.setItem("magnotia_viewer_mode", "view");
|
||||
localStorage.setItem("lumotia_viewer_item", handoff);
|
||||
localStorage.setItem("lumotia_viewer_mode", "view");
|
||||
await invoke("open_viewer_window");
|
||||
} catch {
|
||||
localStorage.setItem("magnotia_viewer_item", handoff);
|
||||
localStorage.setItem("magnotia_viewer_mode", "view");
|
||||
localStorage.setItem("lumotia_viewer_item", handoff);
|
||||
localStorage.setItem("lumotia_viewer_mode", "view");
|
||||
window.open("/viewer", "_blank", "width=600,height=700");
|
||||
}
|
||||
}
|
||||
@@ -551,12 +551,12 @@
|
||||
// (see openViewer above for the rationale).
|
||||
const handoff = JSON.stringify({ id: String(item.id) });
|
||||
try {
|
||||
localStorage.setItem("magnotia_viewer_item", handoff);
|
||||
localStorage.setItem("magnotia_viewer_mode", "edit");
|
||||
localStorage.setItem("lumotia_viewer_item", handoff);
|
||||
localStorage.setItem("lumotia_viewer_mode", "edit");
|
||||
await invoke("open_viewer_window");
|
||||
} catch {
|
||||
localStorage.setItem("magnotia_viewer_item", handoff);
|
||||
localStorage.setItem("magnotia_viewer_mode", "edit");
|
||||
localStorage.setItem("lumotia_viewer_item", handoff);
|
||||
localStorage.setItem("lumotia_viewer_mode", "edit");
|
||||
window.open("/viewer", "_blank", "width=600,height=700");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -515,7 +515,7 @@ interface TaskChannelMessage {
|
||||
}
|
||||
|
||||
const taskChannel = typeof BroadcastChannel !== "undefined"
|
||||
? new BroadcastChannel("magnotia_task_sync")
|
||||
? new BroadcastChannel("lumotia_task_sync")
|
||||
: null;
|
||||
|
||||
if (taskChannel) {
|
||||
|
||||
@@ -92,8 +92,8 @@
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
loadFromHandoff(localStorage.getItem("magnotia_viewer_item"));
|
||||
const mode = localStorage.getItem("magnotia_viewer_mode");
|
||||
loadFromHandoff(localStorage.getItem("lumotia_viewer_item"));
|
||||
const mode = localStorage.getItem("lumotia_viewer_mode");
|
||||
if (mode === "edit" || mode === "view") viewerMode = mode;
|
||||
|
||||
// Listen for new items via storage events
|
||||
@@ -139,7 +139,7 @@
|
||||
}
|
||||
|
||||
function handleStorageChange(e: StorageEvent) {
|
||||
if (e.key === "magnotia_viewer_item" && e.newValue) {
|
||||
if (e.key === "lumotia_viewer_item" && e.newValue) {
|
||||
void loadFromHandoff(e.newValue);
|
||||
}
|
||||
}
|
||||
@@ -317,7 +317,7 @@
|
||||
if (!item) return;
|
||||
try {
|
||||
localStorage.setItem(
|
||||
"magnotia_viewer_item",
|
||||
"lumotia_viewer_item",
|
||||
JSON.stringify({ id: String(item.id), stamp: Date.now() }),
|
||||
);
|
||||
} catch {}
|
||||
|
||||
Reference in New Issue
Block a user