From 38b9fdb91b2afc82cce9020b92b858aa972c8517 Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 17 Apr 2026 15:27:00 +0200 Subject: [PATCH] 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) --- ...4-09-news-body-nutriphi-workbench-infra.md | 245 ---------------- ...ournal-sync-credits-geocoding-workbench.md | 259 ----------------- ...ary-wetter-voice-interview-research-lab.md | 267 ++++++++++++++++++ docs/MODULE_REGISTRY.md | 15 +- 4 files changed, 278 insertions(+), 508 deletions(-) delete mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md delete mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-credits-geocoding-workbench.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-16-library-wetter-voice-interview-research-lab.md diff --git a/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md b/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md deleted file mode 100644 index 0b43486ce..000000000 --- a/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md +++ /dev/null @@ -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 — `` 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. diff --git a/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-credits-geocoding-workbench.md b/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-credits-geocoding-workbench.md deleted file mode 100644 index 29007bbb0..000000000 --- a/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-credits-geocoding-workbench.md +++ /dev/null @@ -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 `` — 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 `
` 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: `