mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 22:41:09 +02:00
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:
parent
a1baf1053e
commit
38b9fdb91b
4 changed files with 278 additions and 508 deletions
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue