docs: add Apr 16 devlog, remove duplicate devlogs, update MODULE_REGISTRY

- Add devlog for April 16 (Library, Wetter, Voice-Interview, Research-Lab)
- Remove duplicate devlog files for Apr 9 and Apr 10
- Update MODULE_REGISTRY: profile voice interview, wetter, wishes modules

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-17 15:27:00 +02:00
parent a1baf1053e
commit 38b9fdb91b
4 changed files with 278 additions and 508 deletions

View file

@ -1,245 +0,0 @@
---
title: 'News-Modul, Body-Tracker, Nutriphi AI-Foto, Workbench-Polish + Infra-Marathon'
description: 'Größter Commit-Tag seit Launch: 143 Commits. News-Modul mit Backend-Ingester und Workbench-ListView live. Body-Modul (Fitness + Körperkomposition) mit Routinen und Correlation-Chart. Nutriphi bekommt AI-Foto-Erkennung und Meal-Details. Cloudflare-Tunnel-Rebuild, Sync-Debug-Runbook, Wire-Format-Versioning, mana-api Deployment-Fix, 270 Svelte-Warnings auf Null.'
date: 2026-04-09
author: 'Till Schneider'
category: 'feature'
tags:
[
'news',
'body',
'nutriphi',
'workbench',
'cloudflare',
'mana-api',
'sync',
'ai',
'vercel-ai-sdk',
'gemma4',
'infrastructure',
]
featured: true
commits: 143
readTime: 18
stats:
filesChanged: 833
linesAdded: 40847
linesRemoved: 22379
contributors:
- name: 'Till Schneider'
handle: 'Till-JS'
commits: 143
workingHours:
start: '2026-04-09T09:00'
end: '2026-04-09T23:30'
---
## Highlights
- **News-Modul komplett**: Backend-Ingester (`news-ingester` Service), Client-Data-Layer, Web-Routes, i18n, Workbench-ListView mit Dashboard-Widget — alles in einem Tag
- **Body-Modul** (Fitness + Body-Composition): Exercise-Picker, Routinen, Phasen, Progression-Chart, Calorie×Weight-Correlation, i18n, Integration-Tests
- **Nutriphi AI-Foto**: Photo-Capture + AI-Meal-Recognition-Flow, Meal-Detail-Page mit Foods-Breakdown, Quick-Add in Workbench, Context-Menu-Quickaction
- **Workbench-Inline-Actions** für 7 Module: Inventory, Picture, Moodlit, Events, Context, Who — jeweils eigene Quick-Create-UIs im ListView
- **Cloudflare-Tunnel-Rebuild**: `cloudflared-config.yml` als Single Source of Truth, Pre-Commit-Validator, Apex-Domain via API
- **Wire-Format Envelope Versioning** + Anthropic Prompt-Cache-Hints für mana-api
- **270 Svelte-Warnings auf Null** in einem Sweep
- **mana-api Deployment-Fix**: `mana-api.mana.how` statt `api.mana.how` wegen Conflict mit dem bestehenden Gateway
---
## News-Modul — von Null auf Workbench in einem Tag
Das News-Modul war bis heute nur eine Idee. Jetzt steht die komplette Pipeline:
### Backend: news-ingester Service
Neuer eigenständiger Service `news-ingester` — ein Hono/Bun-Server der RSS-Feeds pollt, Artikel parsed (Readability-Fallback für Volltext), und über eine curated Feed-API bereitstellt. Drei Bugs gleich am ersten Tag gefunden und gefixt:
- **Readability-Fallback crashte den Service** in einer Endlosschleife — disabled als Quick-Fix, JSDOM-CSS-Errors vorher schon gesilenced
- **Unused `@mana/shared-hono` Workspace-Dep** machte den Docker-Build unnötig komplex — gedroppt
- **JSDOM process-level Safety-Net** hinzugefügt damit ein einzelner Parse-Fehler nicht den ganzen Ingester killt
### Client: Data-Layer + Module-Library
Standard-Muster: `collections.ts` + `queries.ts` + `stores/` + `module.config.ts`. Dexie-Tabellen für Articles und User-Preferences (Feed-Selection, Read-Status, Bookmarks).
### Web-Routes + i18n
`/news` mit Feed-Tabs, Artikel-Cards, Onboarding-Flow. i18n für de/en/fr/es/it. Die Onboarding-Handoff zum Feed-Branch war ein subtiler Bug — User der Preferences speichert bevor er Feeds gewählt hat, landete auf einer leeren Seite statt im Onboarding.
### Workbench-Integration
ListView + Dashboard-Widget. "Interested" markiert Artikel als gespeichert und hält sie sichtbar auch wenn der Feed weiterscrollt.
### Auth-Fixes
- Bearer-Token fehlte in API-Calls → 401
- Dexie v4 Schema-Upgrade nötig wegen neuer Tabellen
- `getValidToken()` statt `getAccessToken()` — letzteres gibt abgelaufene Tokens zurück
- Vault-Lock-Guard auf Preferences damit verschlüsselte Reads nicht crashen
---
## Body-Modul — Fitness + Körperkomposition
Komplett neues Modul in `modules/body/`:
### Phase 1: Foundation
- Dexie-Tabellen: `bodyMeasurements`, `bodyExercises`, `bodyRoutines`, `bodyWorkouts`
- UI-Komponenten: Route, Dashboard-Widget, i18n (de/en)
- Encryption für alle User-Typed-Fields
### Phase 2: Exercise + Routinen
- **Exercise-Picker** mit Kategorien (Kraft, Cardio, Flexibilität, …)
- **Routinen-System**: vordefinierte + Custom-Routinen, Phasen-basierte Progression
- **Progression-Chart** mit d3-basierter Visualisierung
### Phase 3: Correlation
- **Calorie × Weight Correlation-Chart** — verknüpft Body-Measurements mit Nutriphi-Daten
- Full i18n für alle neuen UI-Strings
### Integration-Tests
`bodyStore` Mutations (create, update, delete Measurements + Workouts) mit fake-indexeddb getestet.
**Fix am selben Tag**: Routine-Creation war geblocked wegen eines Duplicate-Headers — `<PageHeader>` war sowohl im Layout als auch in der Routine-Page.
---
## Nutriphi — AI-Foto-Erkennung + Meal-Details
### Photo-Capture + AI-Recognition
Neuer Flow: Foto aufnehmen → Upload an `/api/v1/nutriphi/photos/upload` → Analyse via `/api/v1/nutriphi/analysis/photo` → erkannte Lebensmittel werden als Foods in die Mahlzeit eingetragen.
**API-Refactor**: Der monolithische Photo-Endpoint wurde in zwei getrennt (Upload + Analysis), damit der Upload sofort ein Thumbnail liefert und die Analysis async laufen kann.
**Vision-Model-Fixes**:
- `supportsStructuredOutputs=true` auf dem mana-llm Provider gesetzt
- Default Vision-Model auf `ollama/gemma3:4b` geändert
- mana-llm Path-Prefix und Model-Name in Vision-Routes korrigiert
- `response_format` zum Ollama-Adapter hinzugefügt + Markdown-Fences gestrippt
### Meal-Details + Quick-Add
- **Meal-Detail-Page** mit Foods-Breakdown und Thumbnail-aware Listen
- **Inline Text + Photo Quick-Add** im Workbench-ListView
- **Global Quick-Input Adapter** für die Search-Bar
- **Context-Menu Quick-Action** "Neue Mahlzeit"
- Integration-Tests für Meal-Mutations + Encryption
---
## Workbench-Inline-Actions — 7 Module an einem Tag
Sechs Module bekamen eigene Quick-Create-UIs direkt im Workbench-ListView:
| Modul | Inline-Action |
| --------- | ------------------------------------ |
| Inventory | Quick Item Creation |
| Picture | Inline Upload |
| Moodlit | Inline Mood Creation |
| Events | Detail-Overlay via ViewProps |
| Context | Inline Document Creation |
| Who | Inline Game-Play + Character-Dossier |
Plus **shared Voice-Transcription-Helper** als wiederverwendbarer Baustein für Module die Voice-Input wollen.
**Who-Modul Extras**:
- Character-Dossier-System mit staged Fact-Disclosure
- Chat-Bubble Tailwind-Classes von v3 → v4 migriert
- `createdAt` + `gameId`-Index für Messages
---
## Cloudflare-Tunnel-Rebuild
Die Tunnel-Konfiguration war verstreut über Compose-Files, lokale Configs und die Cloudflare-API. Heute konsolidiert:
1. **`cloudflared-config.yml` als Single Source of Truth** — alle Ingress-Rules an einem Ort
2. **Pre-Commit-Validator**`chore(infra): pre-commit validator for cloudflared-config.yml` verhindert kaputte Configs
3. **Apex-Domain via API** — smarter Tunnel-Rebuild der die Root-Domain per API statt per Dashboard konfiguriert
4. **Sane Health-Probes** — keine false-positive Alerts mehr bei Container-Restarts
---
## Wire-Format Envelope Versioning
mana-api bekommt Envelope-Versioning für die Client-Server-Kommunikation. Jede Response enthält jetzt eine `v`-Property die dem Client sagt welches Format er erwarten kann. Dazu: **Anthropic Prompt-Cache-Hints** für AI-Calls — die System-Prompts werden als cacheable markiert damit wiederholte Calls günstiger werden.
---
## AI-Backend-Fixes
- **Vercel AI SDK + Zod** für Nutriphi/Planta Vision-Routes — strukturierte Outputs statt JSON-Parse
- **Shared AI Zod-Schemas** in `@mana/shared-types` extrahiert, alle AI-Endpoints konsumieren via `z.infer`
- **gemma4:e4b** als neues Default-Model auf dem mana-server
- **`shared-llm`**: Fallback auf `message.reasoning` wenn `content` leer ist
- **mana-server Tier-Topologie** in Code + CLAUDE.md korrigiert
---
## Sync-Debug + Infra
### Sync-Debug-Runbook
`SYNC_DEBUG.md` mit neuem Debug-API in Schritt C. Client-seitig: Debug-Info exposed, silent Push-Failures werden jetzt sichtbar als Toast.
### mana-api Deployment
`mana-api.mana.how` statt `api.mana.how` — der alte Hostname kollidierte mit dem API-Gateway. Dockerfile-Fix: `@mana/shared-types` muss explizit in den Build-Context kopiert werden.
### Who-Modul Server-Side
- Server-Side Validation von `[IDENTITY_REVEALED]` Sentinel
- `/v1/chat/completions` Path für mana-llm korrigiert
- Guest-Prompt auf JWT-Expiry surfaced
### Sonstige Fixes
| Fix | Detail |
| ----------------------- | -------------------------------------------------------------- |
| 270 Svelte-Warnings → 0 | `mana/web` + packages komplett bereinigt |
| Vault-Unlock-Failures | Logging + Toast hinzugefügt |
| shared-llm Privacy-Tier | Candidate-Tiers privacy-first sortiert (Browser vor Server) |
| mana-media Migration | Initial Schema-Migration + Run on Startup |
| Packages | Modal keydown-Handlers, `$derived.by` Usage, UserData-Fields |
| Cross-Package Imports | Broken Imports + Missing Exports gefixt |
| Mac Mini | Container-Conflicts in build-app.sh Restart-Cycle bereinigt |
| shared-auth | Passkey/2FA/Session-Methods durch ManaAuthStore durchgeproxied |
| Help-Modul | Broken Imports + SupportedLanguage-Typing gefixt |
| liveQuery | Migration auf `useLiveQueryWithDefault` |
| Rename | inventar → inventory across the codebase |
---
## Numbers
| | |
| ----------------------------------- | -------------- |
| Commits | 143 |
| Files changed | 833 |
| LOC added | ~40.800 |
| LOC removed | ~22.400 |
| Net | +18.400 |
| Neue Module | 2 (News, Body) |
| Module mit Workbench-Inline-Actions | 7 |
| API-Fixes | 8 |
| Svelte-Warnings eliminiert | 270 |
---
## Lehren
1. **Ein News-Backend ist mehr Arbeit als erwartet** — RSS-Parsing, Readability-Fallback, JSDOM-Crashes, Feed-Curation. Jedes einzelne ist trivial, zusammen sind's einen halben Tag.
2. **Vision-Model-Routing hat viele Moving Parts** — Provider-Config, Model-Name, Path-Prefix, Response-Format, Structured-Output-Flag. Fünf Stellen die alle stimmen müssen damit ein Bild erkannt wird.
3. **Cloudflare-Tunnel-Config als Code** spart langfristig Debugging-Zeit. Die Pre-Commit-Validation hat am selben Tag schon einen kaputten Ingress-Rule gefangen.
4. **270 Warnings sind nicht "noise"** — der Sweep fand drei echte Bugs (falsche `$derived.by`-Usage, fehlende `createdAt`-Stamps, broken cross-package Imports) die nur zufällig nicht im Prod-Build crashten.

View file

@ -1,259 +0,0 @@
---
title: 'Journal-Modul, Sync-Billing, Credits-Vereinfachung, Geocoding + Workbench-Redesign'
description: 'Journal-Modul mit Voice-Capture und Mood-Tracking. Sync bekommt serverseitiges Billing mit Cron-Charging. Credits-System radikal vereinfacht. Places-Modul mit self-hosted Pelias-Geocoding (DACH). Workbench-Redesign: unified Bottom-Bar, neue Page-Cards, Settings-Redesign. 215 A11y-Suppressions durch echte Fixes ersetzt.'
date: 2026-04-10
author: 'Till Schneider'
category: 'feature'
tags:
[
'journal',
'sync',
'billing',
'credits',
'geocoding',
'pelias',
'workbench',
'a11y',
'firsts',
'timeblocks',
'settings',
]
featured: true
commits: 53
readTime: 16
stats:
filesChanged: 556
linesAdded: 22514
linesRemoved: 3220
contributors:
- name: 'Till Schneider'
handle: 'Till-JS'
commits: 53
workingHours:
start: '2026-04-10T09:00'
end: '2026-04-10T22:00'
---
## Highlights
- **Journal-Modul** mit Voice-Capture, Mood-Tracking und Encryption live
- **Sync Phase 2**: serverseitiges Billing-Gate, Cron-Charging, E-Mail-Benachrichtigungen, Batched Push mit `PUSH_BATCH_SIZE=200`
- **Credits radikal vereinfacht**: Productivity-Credits, Guild-Pools und komplexe Gift-Types rausgeworfen
- **Self-hosted Geocoding** mit Pelias (DACH-only) — Places, Events, Contacts, Photos können jetzt reverse-geocoden
- **Workbench-Redesign**: unified Bottom-Bar ersetzt Minimize-Tabs + Scene-Tabs, neue Page-Cards mit runden Ecken
- **Firsts-Modul**: Dream-to-Lived-Tracking ("Erstes Mal X gemacht")
- **215 A11y-Suppression-Comments** durch echte Fixes ersetzt
- **Settings-Page Redesign** mit PillNav-Compute-Selector
---
## Journal — Voice-Capture + Mood-Tracking
Neues Modul `modules/journal/` — ein tägliches Journal mit drei Kernfeatures:
1. **Voice-Capture** via die geteilte `<VoiceCaptureBar>` — sprich deinen Eintrag, STT transkribiert, Text wird als Eintrag gespeichert
2. **Mood-Tracking** — Stimmung pro Eintrag mit 5-Punkt-Skala + optionale Tags
3. **Encryption** — alle Einträge AES-GCM-256 verschlüsselt wie alle anderen User-Content-Module
Standard-Module-Pattern: `collections.ts`, `queries.ts`, `stores/journal.svelte.ts`, `module.config.ts`. Dexie-Tabellen: `journalEntries`. Dashboard-Widget zeigt den letzten Eintrag + Mood-Trend.
---
## Sync Phase 2 — Server-Side Billing
Bis jetzt war Sync ein reines Push/Pull-Protokoll ohne Kosten-Gate. Ab heute zahlen User für Cloud-Sync per Credits:
### Server-Side Billing-Gate
`mana-sync` (Go) bekommt Billing-Middleware:
- Prüft vor jedem Push ob der User eine aktive Sync-Subscription hat
- Subscription wird über `mana-credits` verwaltet
- Cron-Job charged monatlich — kein Prepaid, sondern Post-Paid mit Grace-Period
### Credits: Sync-Billing
Neuer Credit-Typ `sync_subscription` in `mana-credits`. Monthly-Credit-Subscription für Cloud-Sync. Admin kann Sync-Subscriptions giften (für Beta-User).
### E-Mail-Benachrichtigungen
User bekommen E-Mails bei:
- Subscription-Aktivierung
- Niedrigem Credit-Balance (Warning)
- Subscription-Ablauf
### Batched Push
`PUSH_BATCH_SIZE = 200` — statt alle pending Changes in einem Request zu schicken, werden sie in 200er-Batches aufgeteilt. Verhindert Timeouts bei großen initialen Syncs.
### Sync-Status UI
Neues PillNav-Dropdown zeigt den Sync-Status (connected, syncing, error) + Onboarding-Step für neue User die Sync noch nicht aktiviert haben.
### Dokumentation
`mana-sync` CLAUDE.md aktualisiert mit Billing-Middleware, neuen Env-Vars, Projektstruktur.
---
## Credits — Radikale Vereinfachung
Das Credit-System war overengineered:
**Gelöscht**:
- Productivity-Credits (automatisch verdient durch App-Nutzung)
- Guild-Pools (geteilte Credit-Töpfe)
- Komplexe Gift-Types (Promo-Codes, Referral-Bonuses, …)
**Behalten**:
- Simple Credit-Balance
- Admin-Gifting
- Sync-Subscription als einziger Abo-Typ
Resultat: **-2.200 LOC** im Credits-Modul, deutlich weniger cognitive Load für User und Entwickler.
---
## Geocoding — Self-Hosted Pelias (DACH)
### Warum Self-Hosted?
Kein externer Geocoding-Provider (Google Maps, Mapbox) wegen Privacy. Pelias ist Open-Source, läuft lokal, und kann mit OpenStreetMap-Daten für DACH (Deutschland, Österreich, Schweiz) gefüttert werden.
### Setup
- **Pelias-Stack**: Elasticsearch + Pelias-API + Placeholder + Interpolation + PIP + libpostal
- **DACH-Only Import** — Pelias-Config auf `DE`, `AT`, `CH` eingeschränkt. Single-Country-Filter im API-Wrapper.
- **Auto-Kategorisierung** via Pelias-Taxonomy — Adressen bekommen automatisch Kategorien (Restaurant, Park, Schule, …)
### Integration
Geocoding wird in vier Module integriert:
- **Places** — Reverse-Geocoding beim Tracking, Klickbares Location-Label mit voller Adresse, Browser-Proxy für die API
- **Events** — Veranstaltungsort wird geocoded
- **Contacts** — Adressfeld wird geocoded
- **Photos** — GPS-Koordinaten aus EXIF werden reverse-geocoded
### Fixes während der Integration
| Fix | Detail |
|---|---|
| Pelias /autocomplete leer | Fallback auf `/search` wenn `/autocomplete` keine Ergebnisse liefert |
| libpostal Port-Conflict | Host-Port 4400 nicht mehr gebunden |
| Pelias Health | Health-Endpoint durch Wrapper geproxied für Monitoring |
| Unused Services | Überflüssige Pelias-Services gedroppt, Bun idleTimeout erhöht |
| DACH-Only | Config auf DACH eingeschränkt, Single-Country-Filter |
### Monitoring
Pelias + mana-geocoding in Production-Compose, Prometheus, Grafana und status.mana.how integriert. Unit-Tests + End-to-End-Smoke-Test-Script. CLAUDE.md mit Deploy-Lessons-Learned und Pelias-Category-Patch-Doku.
---
## Workbench-Redesign
### Unified Bottom-Bar
Minimize-Tabs und Scene-Tabs waren zwei separate UI-Elemente am unteren Rand. Jetzt ersetzt durch eine **unified Bottom-Bar** die beides in einem Element kombiniert. Weniger visuelles Noise, mehr Platz für Content.
### Page-Cards Redesign
Neue Cards mit:
- Runde Ecken (8px → 12px)
- Unified Header (Icon + Title + Actions)
- DnD entfernt — wurde nie genutzt und machte Touch-Scrolling kaputt
### AppPagePicker
Design an Module-Pages angepasst — gleiche Card-Styles, gleiche Spacing.
### Settings-Redesign
Settings-Page komplett umgebaut:
- PillNav-Compute-Selector für AI-Tier-Auswahl
- Inline-Section statt ausgelagerte Sub-Routes
- Konsistentes Section-Header-Design
---
## Firsts — Dream-to-Lived-Tracking
Neues Modul `modules/firsts/` — trackt "Erste Male":
- Erstelle Dinge die du zum ersten Mal erleben willst
- Markiere sie als "erlebt" mit Datum und Notizen
- Design-Dokument mit Feature-Backlog
Kleiner Fix: ein JS-Comment war in einem CSS-Block gelandet und brach den Build.
---
## TimeBlocks-Integration
Drei weitere Modul-Gruppen in TimeBlocks integriert:
- **Music, Moodlit, Presi** — Musik-Sessions, Stimmungs-Logs, Präsentations-Timeslots
- **Guides, Places, Cards** — Guide-Runs, Orts-Besuche, Lernkarten-Sessions
- **Planta, Dreams, Skilltree, Cycles** — Pflanzenpflege, Traum-Logs, Skill-Sessions, Zyklus-Events
Zwei Guides-Fixes nötig:
- `{@const}` aus `<div>` verschoben (Svelte 5 Build-Error)
- Stub `GUIDES` Export damit der Build durchgeht
---
## Accessibility
**215 `a11y-`-Suppression-Comments** durch echte Fixes ersetzt. Die suppressions waren ein "wir kümmern uns später"-Pattern aus der schnellen Feature-Phase. Heute wurde "später" zu "jetzt":
- Missing `alt`-Attributes auf Images
- Missing `aria-label` auf Icon-Buttons
- Interactive Elements ohne Keyboard-Support
- Missing `role` Attributes
- Calendar: `<button>` statt `<div>` für Event-Rows
---
## Sonstige Fixes + DevEx
| Fix | Detail |
|---|---|
| Dev-Startup | Redis eviction-policy, mana-media Port-Crash, Svelte-Warnings |
| DX | mana-media Dev-Startup-Chain verkürzt, AZURE_OPENAI_API_KEY-Warning unterdrückt |
| Tier-Patch | Test-Patch reverted, `toggleField` gewidened, spiral-db prepare |
| AI-Tier | AI-Tier-Selector-Dropdown in PillNavigation |
| Top-5 ROI | CI-Gate, Auth-Fields, Body×TimeBlocks, Sync-Pull, Tests |
| Chat | Auth-Header, Template-System-Prompts, Streaming-Debounce |
| Playground | Persistent Chat-History, Token-Display, Model-Comparison |
| Zitare | Smooth Transitions, Custom Quotes, Notes, neue Kategorien, Fuzzy-Search |
| Architecture | liveQuery-Migration, Dead Types, Seed-Registry Cleanup |
| E2E | Smoke-Test, Lazy Widget Loading, Typed Module Context |
| svelte-check | 14 pre-existing Type-Errors resolved |
| Monitoring | 10 fehlende Module zu Blackbox-Probes + Geocoding zu Status |
| Docker | mana-credits Dockerfile komplett umgeschrieben (multi-stage, pnpm, WORKDIR) |
| mana-sync | Dockerfile: shared-go Dependency kopieren, Go 1.25 Base-Image |
| Status-Page | Shell-Kompatibilität: `set -e` drop, `set -u` Safety, ash-compatible Loop |
---
## Numbers
| | |
|---|---|
| Commits | 53 |
| Files changed | 556 |
| LOC added | ~22.500 |
| LOC removed | ~3.200 |
| Net | +19.300 |
| Neue Module | 2 (Journal, Firsts) |
| A11y-Suppressions eliminiert | 215 |
| LOC entfernt (Credits) | ~2.200 |
| TimeBlock-Integrationen | 12 Module |
---
## Lehren
1. **Self-hosted Geocoding ist ein Infra-Projekt, kein Feature-Commit**. Pelias braucht Elasticsearch, libpostal, OpenStreetMap-Imports — allein das Setup sind 10+ Config-Files. Aber die Privacy-Garantie ist es wert.
2. **A11y-Suppressions akkumulieren schnell** wenn man sie als "later"-Marker benutzt. 215 in ~3 Monaten. Der Fix-Sweep dauerte länger als erwartet, weil viele Suppressions echte UX-Probleme kaschierten (Buttons ohne Keyboard-Support).
3. **Credit-Systeme neigen zu Overengineering**. Productivity-Credits, Guild-Pools, Promo-Codes — alles gut gemeint, keins davon wurde je von einem User benutzt. Die Vereinfachung auf "Credits + Admin-Gift" deckt 100% der aktuellen Use-Cases ab.

View file

@ -0,0 +1,267 @@
---
title: 'Bibliothek, Wetter, Voice-Interview, Research-Lab + AI-Hardening'
description: 'Zwei neue Module (Bibliothek + Wetter), Voice-Interview für das Profil-Modul mit 4 vorgerenderten Edge-TTS-Stimmen (DE/CH × m/f), Research-Lab Service mit 4 synchronen Agenten + Provider-Vergleich, Wünsche-Modul, Rituals-Rename, Credits Reserve/Commit/Refund, mana-tts Orpheus + Zonos Backends, 10 AI-Bugfixes.'
date: 2026-04-16
author: 'Till Schneider'
category: 'feature'
tags:
[
'library',
'wetter',
'voice-interview',
'tts',
'edge-tts',
'research-lab',
'wishes',
'rituals',
'credits',
'ai-hardening',
'orpheus',
'zonos',
]
featured: true
commits: 146
readTime: 20
stats:
filesChanged: 938
linesAdded: 52763
linesRemoved: 11511
contributors:
- name: 'Till Schneider'
handle: 'Till-JS'
commits: 146
workingHours:
start: '2026-04-16T08:00'
end: '2026-04-16T23:59'
---
## Highlights
- **Bibliothek-Modul** — Bücher, Filme, Serien, Comics mit Progress-Tracking, CRUD, Grid-View
- **Wetter-Modul** — Open-Meteo + DWD-Warnungen + Regen-Nowcast + Multi-Model-Vergleich
- **Voice-Interview** — Profil-Interview per Sprache: 92 vorgerenderte MP3s (4 Stimmen × 23 Fragen), Voice/Gesprächs-Modus mit Auto-Save
- **Research-Lab** — Neuer mana-research Service mit 4 synchronen Agenten + Provider-Vergleichs-UI
- **Wünsche-Modul** — Wunschlisten mit Preis-Tracking
- **mana-tts** — Orpheus + Zonos TTS-Backends installiert auf GPU-Server
- **AI-Hardening** — P0/P1/P2 Bugfix-Batches: Tool-Exception-Handling, Mission-Mutex, N+1 Queries, Vault-Guard
- **Credits** — 2-Phase Debit (Reserve/Commit/Refund)
---
## Bibliothek-Modul
Neues Modul für Medien-Tracking:
### Milestone 1: Foundation
- Dexie-Tabellen für `libraryItems` mit Typ-Discriminator (Buch/Film/Serie/Comic)
- Workbench-App registriert in der Kreativ-Kategorie
### Milestone 2: CRUD + Views
- **Erstell-Formular** als Inline-Accordion (kein Modal)
- **Grid-View** mit Cover-Thumbnails + Status-Badge
- **Detail-View** mit allen Metadaten
### Milestone 3: Progress-Tracking
- **Seiten** für Bücher (aktuell/gesamt)
- **Episoden** für Serien (Staffel × Episode)
- **Issues** für Comics
- **Restart**: Abgeschlossenes Werk nochmal starten
UI-Fixes: Labels lesbar gemacht, Suche nach oben verschoben, Page-H1 entfernt.
---
## Wetter-Modul
Vollständiges Wetter-Modul mit Open-Meteo als Datenquelle:
- **Open-Meteo API** — kostenlos, kein API-Key, DSGVO-konform
- **DWD-Warnungen** — Deutsche Wetterwarnungen integriert
- **Regen-Nowcast** — Niederschlagsvorhersage für die nächsten 2 Stunden
- **Multi-Model-Vergleich** — Seite zeigt verschiedene Wettermodelle nebeneinander
- **Location-Management** — Orte speichern, löschen, Default setzen
- **Workbench-Integration** — ListView mit Scroll-Chips für Orte
Fixes nach dem ersten Build:
- Routes vor Auth-Middleware mounten (öffentliche Wetter-Daten brauchen kein Auth)
- Icons für Detail-Grid (Wind, Luftfeuchtigkeit, Druck, UV)
- Design: Scroll-Chips, Hierarchie, Duplikat-Bereinigung
---
## Voice-Interview für das Profil
Das Profil-Interview kann jetzt per Sprache durchgeführt werden:
### Audio-Generierung
92 MP3-Dateien vorgerendert via Edge TTS:
| Stimme | Voice-ID | Sprache |
| --------- | -------- | -------------------------- |
| Seraphina | `de-f` | Deutsch, weiblich |
| Florian | `de-m` | Deutsch, männlich |
| Leni | `ch-f` | Schweizerdeutsch, weiblich |
| Jan | `ch-m` | Schweizerdeutsch, männlich |
23 Interview-Fragen × 4 Stimmen = 92 Dateien, 1.4 MB total in `static/audio/interview/`.
### Interview-Hero
Neuer prominenter Block auf der Profil-Übersicht mit 3 Start-Modi:
- **Per Text** — Fragen lesen und tippen (wie bisher)
- **Per Sprache** — Frage wird vorgelesen, dann Mic aktiv für die Antwort
- **Als Gespräch** — Fließender Flow: Vorlesen → Mic → Auto-Save → nächste Frage
### TTS-System
`useInterviewTts()` spielt vorgerenderte MP3s über `new Audio()`. Voice-Auswahl wird in localStorage gespeichert. Web Speech API als Fallback für fehlende Audio-Dateien.
### STT-Integration
`useLocalStt()` (Whisper, WebGPU) für die Antwort-Transkription. Mic-Button an jedem text/textarea/tags Input. Conversation-Mode: Auto-Save nach 600ms, dann nächste Frage.
---
## mana-tts: Orpheus + Zonos Backends
Zwei neue TTS-Modelle auf dem GPU-Server installiert:
### Orpheus TTS
- **Modell**: `Kartoffel_Orpheus-3B_german_natural` (Deutsch-Finetune)
- **VRAM**: ~8 GB
- **Endpoint**: `POST /synthesize/orpheus`
- **Status**: Gated Repository — HuggingFace-Approval nötig
### Zonos TTS (Zyphra)
- **Modell**: `Zyphra/Zonos-v0.1-transformer` (200k Stunden Training)
- **VRAM**: ~5 GB
- **Endpoint**: `POST /synthesize/zonos`
- **Features**: Emotions-Steuerung (neutral/friendly/warm/curious), Speaking Rate, Pitch
- **Status**: Installiert und funktional, aber Qualität für kurze deutsche Sätze noch nicht optimal (kein Speaker-Embedding → inkonsistente Stimme)
### Infrastruktur
- espeak-ng auf dem GPU-Server installiert (Phonemizer-Dependency)
- `TORCHDYNAMO_DISABLE=1` gesetzt (kein MSVC-Compiler auf Windows)
- Vergleichs-Script `scripts/compare-german-tts.sh`
---
## Research-Lab
Neuer Service `mana-research` für parallele AI-Recherche:
### Phase 1-2: Service + API
- Hono/Bun Service
- Parallel-Query über mehrere LLM-Provider
### Phase 3: 4 synchrone Agenten
Vier Agenten recherchieren gleichzeitig zum selben Thema:
- Verschiedene Perspektiven und Quellen
- Ergebnisse werden zusammengeführt
### Phase 4: Provider-Vergleichs-UI
Side-by-side Vergleich der Antworten verschiedener Provider im Frontend.
---
## Wünsche-Modul
Neues Modul `wishes` für Wunschlisten:
- Wünsche mit Titel, Beschreibung, Preis, URL, Priorität
- Preis-Tracking über Zeit
- Kategorisierung + Tags
---
## AI-Hardening: 3 Bugfix-Batches
### P0 — Kritisch
- **Tool Exception Handling**: Uncaught Exceptions in AI-Tools crashten den Runner
- **Mission Run Mutex**: Zwei gleichzeitige Runs derselben Mission verhindert
### P1 — Hoch
- **N+1 Queries**: Workbench-Timeline lud jede Iteration einzeln
- **Vault-Locked Guard**: AI-Tools crashten wenn der Vault gesperrt war
- **Debug Hardening**: Debug-Log schrieb in die falsche Tabelle
- **Timeout**: Runner-Timeout war zu kurz für komplexe Missions
### P2 — Medium
- **Prompt Sync**: Planner-Prompt war out-of-sync mit dem Tool-Katalog
- **Perf**: Unnötige Re-Renders in der Workbench-Timeline
- **Dedup**: Doppelte Proposals bei schnellen Re-Runs
- **Scope Unification**: Agent-Scope und Scene-Scope waren inkonsistent
---
## Credits: 2-Phase Debit
Credits-System bekommt Reserve/Commit/Refund:
```
Reserve(100) → Credits blockiert, nicht abgebucht
↓ Aktion erfolgreich
Commit(100) → Credits endgültig abgebucht
↓ Aktion fehlgeschlagen
Refund(100) → Reservierung aufgehoben
```
Verhindert doppelte Abbuchungen bei Retry-Szenarien.
---
## Sonstige Features + Fixes
| Bereich | Was |
| --------------- | ----------------------------------------------------------------- |
| Rituals | Rename ai-rituals → rituals, Ceremony Step Types |
| LLM Errors | User-friendly Messages + Settings-Link bei Tier-Fehlern |
| Workbench | Inline Module Help (? Icon), ?app= Deep-Links reaktiv |
| Settings | Anchor Deep-Links reaktiv |
| Mobile | Text-Selection auf List-Rows disabled für Long-Press Context Menu |
| Docker | Deleted subscriptions Package + shared-ai zu sveltekit-base |
| Devlogs | Apr 9-15 nachgetragen |
| MODULE_REGISTRY | Index aller 72+ Module |
| pre-push Hook | --fail-on-warnings entfernt |
---
## Numbers
| | |
| ----------------------- | --------------------------------- |
| Commits | 146 |
| Files changed | 938 |
| LOC added | ~52.760 |
| LOC removed | ~11.510 |
| Net | +41.250 |
| Neue Module | 3 (Bibliothek, Wetter, Wünsche) |
| TTS-Stimmen | 4 (Seraphina, Florian, Leni, Jan) |
| Interview-Audio-Dateien | 92 |
| AI-Bugfixes | 10 (3×P0, 4×P1, 3×P2) |
---
## Lehren
1. **Vorgerenderte Audio > Live-TTS für statische Inhalte**: Edge TTS liefert konsistente Qualität, 1.4 MB für 92 Dateien ist vernachlässigbar, und es funktioniert offline. Zonos (selbst-gehostet) klingt bei kurzen Sätzen ohne Speaker-Embedding inkonsistent.
2. **AI-Tool-Exceptions müssen gefangen werden**: Ein einzelnes Tool das eine Exception wirft darf nicht den ganzen Mission-Runner crashen. Defensive try/catch um jeden Tool-Call ist Pflicht.
3. **Reserve/Commit/Refund > direktes Debit**: Bei AI-Operationen die fehlschlagen können, ist 2-Phase-Debit die einzig korrekte Lösung. Sonst verlieren User Credits für fehlgeschlagene Operationen.

View file

@ -1,6 +1,6 @@
# Mana Module Registry
Alle 73 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
Alle 76 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
---
@ -79,13 +79,14 @@ Alle 73 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
| `who` | Who | Mit historischen Persönlichkeiten chatten (Ratespiel) |
| `news` | News Hub | Kuratierter News-Feed mit persönlicher Leseliste |
## Orte & Natur (3)
## Orte & Wetter (4)
| Modul | Name | Beschreibung |
|---|---|---|
| `places` | Places | Location-Tracking, Orte erstellen, Bewegungshistorie |
| `plants` | Plants | Pflanzen verwalten mit Gieß-Erinnerungen und Pflege-Logs |
| `citycorners` | CityCorners | Stadtführer für Konstanz |
| `wetter` | Wetter | Open-Meteo Wetter, DWD-Warnungen, Regen-Nowcast, Multi-Model-Vergleich |
## Finanzen (2)
@ -101,6 +102,12 @@ Alle 73 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
| `myday` | Mein Tag | Tagesübersicht: Tasks, Events, Wasser, Ernährung, Streaks |
| `activity` | Aktivität | Live-Activity-Stream über alle Module |
## Shopping (1)
| Modul | Name | Beschreibung |
|---|---|---|
| `wishes` | Wünsche | Wunschlisten mit Preis-Tracking und Prioritäten |
## AI-System (8)
| Modul | Name | Beschreibung |
@ -119,7 +126,7 @@ Alle 73 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
| Modul | Name | Beschreibung |
|---|---|---|
| `settings` | Settings | App-Einstellungen (General, AI, Security, Credits, Data) |
| `profile` | Profil | User-Profil, Kontext-Interview, Account |
| `profile` | Profil | User-Profil, Kontext-Interview (Text/Voice/Gespräch), Account |
| `themes` | Themes | Theme-Auswahl und Appearance |
| `admin` | Admin Panel | System-Administration und Monitoring |
| `api-keys` | API Keys | API-Keys für Third-Party-Integration |
@ -139,4 +146,4 @@ Alle 73 Module der Mana-App (`apps/mana/apps/web/src/lib/modules/`).
---
**Gesamt: 72 Module** — davon ~51 public/published und ~21 intern/AI/System.
**Gesamt: 76 Module** — davon ~54 public/published und ~22 intern/AI/System.