agent: lumotia-rebrand — docs, scripts, root config, residuals
Some checks failed
check / cargo check (macos-latest) (push) Has been cancelled
check / cargo check (ubuntu-22.04) (push) Has been cancelled
check / cargo check (windows-latest) (push) Has been cancelled
check / svelte build + lint (push) Has been cancelled

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:
2026-05-13 12:38:03 +01:00
parent 681a9b26dc
commit 26c7307607
213 changed files with 1175 additions and 1170 deletions

View File

@@ -2,7 +2,7 @@
name = "lumotia-ai-formatting"
version = "0.1.0"
edition = "2021"
description = "Text post-processing pipeline: filler removal, British English conversion, formatting for Magnotia"
description = "Text post-processing pipeline: filler removal, British English conversion, formatting for Lumotia"
[dependencies]
lumotia-core = { path = "../core" }

View File

@@ -13,7 +13,7 @@ use lumotia_llm::{EngineError, LlmEngine};
/// Whispering's published baseline, directly counteracts the
/// "LLM changed my meaning" failure mode: the model's job is to
/// translate spoken speech into well-formed written form — not to
/// improve, summarise, or rephrase. Magnotia's ideology: raw transcript
/// improve, summarise, or rephrase. Lumotia's ideology: raw transcript
/// is the source of truth; cleanup is a translation pass, not a
/// rewrite.
/// 2. **Prompt-injection hardening.** The guard ("speech, not
@@ -183,7 +183,7 @@ mod tests {
assert!(CLEANUP_PROMPT.contains("output ONLY the cleaned transcript"));
}
/// The "translator, not editor" framing is load-bearing for Magnotia's
/// The "translator, not editor" framing is load-bearing for Lumotia's
/// ideology — raw transcript is the source of truth, cleanup is a
/// translation pass. Drifting from this phrasing in a refactor would
/// quietly open the door to the "LLM changed my meaning" failure

View File

@@ -7,7 +7,7 @@
//! structure) degraded cleanup quality materially; plain-text input
//! raised it back.
//!
//! `Segment.text` in Magnotia already holds just the spoken text (the
//! `Segment.text` in Lumotia already holds just the spoken text (the
//! `start`/`end` f64 fields carry the timing), so "timestamp
//! stripping" falls out of using the text field alone. The work here
//! is the whitespace pass and empty-segment filter, plus a single

View File

@@ -2,7 +2,7 @@
name = "lumotia-audio"
version = "0.1.0"
edition = "2021"
description = "Audio capture (cpal), VAD, resampling (rubato), file decoding (symphonia), WAV I/O (hound) for Magnotia"
description = "Audio capture (cpal), VAD, resampling (rubato), file decoding (symphonia), WAV I/O (hound) for Lumotia"
[dependencies]
lumotia-core = { path = "../core" }

View File

@@ -172,7 +172,7 @@ mod tests {
fn wav_writer_survives_crash() {
// Property under test: a `WavWriter` that has been flushed but
// never finalised leaves a valid, readable WAV on disk. This
// is the crash-safety guarantee — if the magnotia process aborts
// is the crash-safety guarantee — if the lumotia process aborts
// mid-session, the on-disk file up to the last flush is
// recoverable.
//

View File

@@ -2,7 +2,7 @@
name = "lumotia-cloud-providers"
version = "0.1.0"
edition = "2021"
description = "Provider trait and BYOK cloud STT scaffolding for Magnotia (Wyrdnote pending rebrand)"
description = "Provider trait and BYOK cloud STT scaffolding for Lumotia (Wyrdnote pending rebrand)"
[dependencies]
lumotia-core = { path = "../core" }

View File

@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::sync::{Mutex, OnceLock};
/// Store an API key in Magnotia's process-local keystore.
/// Store an API key in Lumotia's process-local keystore.
///
/// Keys are held in memory for the lifetime of the process and are lost on
/// exit. This avoids the undefined behaviour of mutating process environment
@@ -19,7 +19,7 @@ pub fn store_api_key(provider: &str, key: &str) {
.insert(provider_env_key(provider), key.to_string());
}
/// Retrieve an API key from Magnotia's process-local keystore.
/// Retrieve an API key from Lumotia's process-local keystore.
///
/// Returns a previously stored in-memory key when present, otherwise falls
/// back to the read-only `LUMOTIA_API_KEY_<PROVIDER>` environment variable so

View File

@@ -2,7 +2,7 @@
name = "lumotia-core"
version = "0.1.0"
edition = "2021"
description = "Core types, constants, traits, hardware detection, and model registry for Magnotia"
description = "Core types, constants, traits, hardware detection, and model registry for Lumotia"
[dependencies]
serde = { version = "1", features = ["derive"] }

View File

@@ -4,7 +4,7 @@ use serde::Serialize;
use crate::types::ModelId;
/// Structured error type for Magnotia.
/// Structured error type for Lumotia.
///
/// Implements `Serialize` so errors can be sent to the frontend as
/// structured JSON rather than opaque strings.

View File

@@ -19,7 +19,7 @@ pub struct CpuInfo {
}
/// Runtime-detected CPU feature flags relevant to the speech-to-text
/// and LLM backends Magnotia ships. All whisper.cpp / llama.cpp / ggml
/// and LLM backends Lumotia ships. All whisper.cpp / llama.cpp / ggml
/// kernels degrade roughly two tiers without AVX2, which is why we
/// surface it separately: when AVX2 is absent, the UI should warn the
/// user that performance will be a fraction of what they would see

View File

@@ -184,7 +184,7 @@ mod tests {
fn parakeet_is_top_recommendation_when_hardware_supports_it() {
// Any machine that fits Parakeet in RAM should see it ranked first —
// Parakeet-TDT is English-only but beats Whisper on English at lower
// latency, so it's Magnotia's default recommendation when eligible.
// latency, so it's Lumotia's default recommendation when eligible.
// (Users on non-English languages adjust manually — handled at the
// settings-UI level, not at the scoring level for now.)
let profile = profile_with_ram(Megabytes(16384));

View File

@@ -2,7 +2,7 @@
name = "lumotia-hotkey"
version = "0.1.0"
edition = "2021"
description = "Wayland-compatible global hotkey listener for Magnotia — evdev backend with device hotplug"
description = "Wayland-compatible global hotkey listener for Lumotia — evdev backend with device hotplug"
[dependencies]
lumotia-core = { path = "../core" }

View File

@@ -1,4 +1,4 @@
//! Wayland-compatible global hotkey listener for Magnotia.
//! Wayland-compatible global hotkey listener for Lumotia.
//!
//! On Linux, reads `/dev/input/event*` devices via the `evdev` crate to capture
//! global hotkeys without any display-server dependency. This works on both X11
@@ -8,7 +8,7 @@
//! On non-Linux platforms, this crate is a no-op — the Tauri global-shortcut
//! plugin handles hotkeys there.
//!
//! Architecture stolen from oddlama/whisper-overlay and adapted for Magnotia.
//! Architecture stolen from oddlama/whisper-overlay and adapted for Lumotia.
#[cfg(target_os = "linux")]
mod linux;

View File

@@ -2,7 +2,7 @@
name = "lumotia-llm"
version = "0.1.0"
edition = "2021"
description = "Local LLM engine for Magnotia (Qwen3.5 / Qwen3.6 via llama-cpp-2): transcript cleanup, task extraction, micro-step decomposition"
description = "Local LLM engine for Lumotia (Qwen3.5 / Qwen3.6 via llama-cpp-2): transcript cleanup, task extraction, micro-step decomposition"
[features]
# Default desktop build keeps the existing openmp + vulkan acceleration.

View File

@@ -321,7 +321,7 @@ where
.unwrap_or(0);
let client = reqwest::Client::builder()
.user_agent("magnotia/0.1.0")
.user_agent("lumotia/0.1.0")
.connect_timeout(std::time::Duration::from_secs(30))
.build()
.map_err(|e| DownloadError::Http(e.to_string()))?;

View File

@@ -2,7 +2,7 @@
name = "lumotia-mcp"
version = "0.1.0"
edition = "2021"
description = "Read-only MCP stdio server exposing Magnotia transcripts and tasks to external agents"
description = "Read-only MCP stdio server exposing Lumotia transcripts and tasks to external agents"
[[bin]]
name = "lumotia-mcp"

View File

@@ -1,8 +1,8 @@
//! Minimal Model Context Protocol server exposing Magnotia's local SQLite store.
//! Minimal Model Context Protocol server exposing Lumotia's local SQLite store.
//!
//! Scope: **read-only** tools. An external agent (Claude desktop, Cline, any
//! MCP-capable client) can list / search / fetch transcripts and list tasks.
//! No writes — Magnotia's Tauri app remains the only writer.
//! No writes — Lumotia's Tauri app remains the only writer.
//!
//! Transport: newline-delimited JSON-RPC 2.0 over stdio, per the stdio
//! transport spec. Server spec version: 2024-11-05.
@@ -95,7 +95,7 @@ fn initialize_result() -> Value {
"version": SERVER_VERSION,
},
"instructions":
"Read-only access to Magnotia's local transcript history and task list. \
"Read-only access to Lumotia's local transcript history and task list. \
All data stays on the user's machine.",
})
}
@@ -105,7 +105,7 @@ fn tools_list_result() -> Value {
"tools": [
{
"name": "list_transcripts",
"description": "List recent transcripts from Magnotia's local history, most recent first. \
"description": "List recent transcripts from Lumotia's local history, most recent first. \
Returns summaries (id, title, created_at, duration, preview).",
"inputSchema": {
"type": "object",
@@ -135,7 +135,7 @@ fn tools_list_result() -> Value {
},
{
"name": "search_transcripts",
"description": "Full-text search across Magnotia's transcripts. Returns matching summaries.",
"description": "Full-text search across Lumotia's transcripts. Returns matching summaries.",
"inputSchema": {
"type": "object",
"required": ["query"],
@@ -155,7 +155,7 @@ fn tools_list_result() -> Value {
},
{
"name": "list_tasks",
"description": "List tasks from Magnotia's task store. Returns both open and completed.",
"description": "List tasks from Lumotia's task store. Returns both open and completed.",
"inputSchema": {
"type": "object",
"properties": {},

View File

@@ -2,7 +2,7 @@
name = "lumotia-storage"
version = "0.1.0"
edition = "2021"
description = "SQLite persistence, BM25 search, and file storage for Magnotia"
description = "SQLite persistence, BM25 search, and file storage for Lumotia"
[dependencies]
lumotia-core = { path = "../core" }

View File

@@ -905,14 +905,14 @@ pub async fn get_setting(pool: &SqlitePool, key: &str) -> Result<Option<String>>
Ok(row.map(|r| r.get("value")))
}
/// One-shot key rename for settings rows carried over from the magnotia era
/// One-shot key rename for settings rows carried over from the lumotia era
/// (`magnotia_preferences`, `magnotia_morning_triage_last_shown`, etc.).
///
/// Idempotent. Returns `(renamed, orphans_deleted)`:
/// * `renamed` — rows where only the magnotia key existed; the row's key
/// * `renamed` — rows where only the lumotia key existed; the row's key
/// is updated to the lumotia equivalent.
/// * `orphans_deleted` — rows where BOTH keys existed; the lumotia row is
/// authoritative and the magnotia row is deleted to avoid silent debt.
/// authoritative and the lumotia row is deleted to avoid silent debt.
pub async fn migrate_legacy_setting_keys(pool: &SqlitePool) -> Result<(u64, u64)> {
let mut tx = pool.begin().await.map_err(|source| Error::Query {
operation: "migrate_legacy_setting_keys:begin".into(),
@@ -2830,7 +2830,7 @@ mod tests {
assert_eq!(
get_setting(&pool, "magnotia_preferences").await.unwrap(),
None,
"orphan magnotia row deleted"
"orphan lumotia row deleted"
);
}

View File

@@ -21,7 +21,7 @@ pub fn crashes_dir() -> PathBuf {
lumotia_core::paths::app_paths().crashes_dir()
}
/// Directory for the rolling Rust log file (magnotia.log + rotated magnotia.log.1, etc).
/// Directory for the rolling Rust log file (lumotia.log + rotated lumotia.log.1, etc).
/// Subscribers configured in src-tauri/src/lib.rs at startup.
pub fn logs_dir() -> PathBuf {
lumotia_core::paths::app_paths().logs_dir()

View File

@@ -963,7 +963,7 @@ mod tests {
// dictionary.id is INTEGER PK AUTOINCREMENT (see v2); let SQLite assign rowids.
sqlx::query(
"INSERT INTO dictionary (term, note, created_at) VALUES \
('Magnotia', '', datetime('now')), \
('Lumotia', '', datetime('now')), \
('CORBEL', 'brand', datetime('now')), \
('Wren', '', datetime('now'))",
)

View File

@@ -2,7 +2,7 @@
name = "lumotia-transcription"
version = "0.1.0"
edition = "2021"
description = "Speech-to-text engine wrappers, model management, and inference concurrency for Magnotia"
description = "Speech-to-text engine wrappers, model management, and inference concurrency for Lumotia"
build = "build.rs"
[features]

View File

@@ -160,7 +160,7 @@ impl LocalEngine {
/// Thin wrapper over `ParakeetModel` that overrides `transcribe_raw` to
/// request word-granularity segments. `transcribe-rs` 0.3's trait impl for
/// `ParakeetModel::transcribe_raw` ignores `TranscribeOptions` and uses
/// `TimestampGranularity::Token` (per-subword) — which surfaces in Magnotia as
/// `TimestampGranularity::Token` (per-subword) — which surfaces in Lumotia as
/// "T Est Ing . One , Two , Three" output. The concrete-type method
/// `ParakeetModel::transcribe_with` accepts `ParakeetParams` with an
/// explicit granularity; this wrapper exposes that to the trait object.

View File

@@ -37,8 +37,8 @@ impl Drop for DownloadReservation {
}
/// Resolve the models storage directory.
/// Windows: %LOCALAPPDATA%/magnotia/models
/// Unix: ~/.magnotia/models
/// Windows: %LOCALAPPDATA%/lumotia/models
/// Unix: ~/.lumotia/models
pub fn models_dir() -> PathBuf {
lumotia_core::paths::app_paths().models_dir()
}