From 35ffa8a0799239c1b2f2870d56d35539a267e535 Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 16 Apr 2026 16:36:18 +0200 Subject: [PATCH] =?UTF-8?q?docs(landing):=20devlog=20entries=20Apr=209?= =?UTF-8?q?=E2=80=9315?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seven devlog posts covering the daily development sprint: - Apr 9: News module, Body tracker, Nutriphi AI photo, infra marathon - Apr 10: Journal sync, credits/billing, geocoding, a11y - Apr 11: Settings redesign, geocoding, deployment, monitoring - Apr 12: UI redesign, wallpaper generator, floating input, drink module - Apr 13: Companion brain, sleep/stretch/recipes/mail modules - Apr 14: AI Workbench, actor attribution, missions, key-grants - Apr 15: Multi-agent workbench, news-research, settings, theme migration Co-Authored-By: Claude Opus 4.6 (1M context) --- ...4-09-news-body-nutriphi-workbench-infra.md | 245 ++++++++++++ ...-09-news-body-nutriphi-workbench-sprint.md | 296 ++++++++++++++ ...-10-journal-sync-billing-geocoding-a11y.md | 247 ++++++++++++ ...ournal-sync-credits-geocoding-workbench.md | 259 ++++++++++++ ...11-settings-geocoding-deploy-monitoring.md | 170 ++++++++ ...redesign-wallpaper-floating-input-drink.md | 180 +++++++++ ...panion-brain-sleep-stretch-recipes-mail.md | 251 ++++++++++++ ...4-14-ai-workbench-actor-missions-grants.md | 338 ++++++++++++++++ ...-workbench-news-research-settings-theme.md | 372 ++++++++++++++++++ 9 files changed, 2358 insertions(+) create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-sprint.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-billing-geocoding-a11y.md create 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-11-settings-geocoding-deploy-monitoring.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-12-ui-redesign-wallpaper-floating-input-drink.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-13-companion-brain-sleep-stretch-recipes-mail.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-14-ai-workbench-actor-missions-grants.md create mode 100644 apps/mana/apps/landing/src/content/devlog/2026-04-15-multi-agent-workbench-news-research-settings-theme.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 new file mode 100644 index 000000000..0b43486ce --- /dev/null +++ b/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-infra.md @@ -0,0 +1,245 @@ +--- +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-09-news-body-nutriphi-workbench-sprint.md b/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-sprint.md new file mode 100644 index 000000000..53a71b8c8 --- /dev/null +++ b/apps/mana/apps/landing/src/content/devlog/2026-04-09-news-body-nutriphi-workbench-sprint.md @@ -0,0 +1,296 @@ +--- +title: 'Mega-Sprint: News-Modul, Body-Fitness, Nutriphi AI-Foto, Workbench Inline-Actions + 60 Bugfixes' +description: 'Größter Tag seit dem Encryption-Rollout: News-Modul mit Backend-Ingester + RSS-Feeds, Body-Fitness-Modul mit Routinen + Progressions-Chart, Nutriphi AI-Foto-Erkennung, 8 Module mit Workbench-Inline-Actions, Who-Dossier-System, Sync-Debug-Runbook, Wire-Format-Versioning, Cloudflare-Tunnel-Rebuild, 270 Warnings auf null.' +date: 2026-04-09 +author: 'Till Schneider' +category: 'feature' +tags: + [ + 'news', + 'body', + 'nutriphi', + 'workbench', + 'inline-actions', + 'who', + 'sync', + 'cloudflare', + 'ai', + 'zod', + 'vercel-ai-sdk', + 'bug-sweep', + ] +featured: true +commits: 143 +readTime: 22 +stats: + filesChanged: 833 + linesAdded: 40847 + linesRemoved: 22379 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 143 +workingHours: + start: '2026-04-09T08:00' + end: '2026-04-09T23:59' +--- + +## Highlights + +- **News-Modul** — Backend-Ingester-Service, kuratierte RSS-Feeds, Client-Data-Layer, Workbench-ListView + Dashboard-Widget, "Interested"-Bookmark, Onboarding-Flow +- **Body-Fitness-Modul** — neues Modul für kombiniertes Fitness-Training + Körperkomposition, Exercise-Picker, Routinen, Phasen, Progressions-Chart, Calorie×Weight-Korrelation, i18n, Integration-Tests +- **Nutriphi AI-Foto-Erkennung** — Photo-Capture + AI-Meal-Recognition, Meal-Detail-Page mit Foods-Breakdown, Inline Quick-Add, globaler Quick-Input-Adapter +- **Workbench Inline-Actions** für 8 Module — Inventory, Picture, Moodlit, Context, Events, Who, Body, Chat +- **Who-Dossier-System** — Character-Dossier mit gestaffelter Fact-Disclosure, inline Who-Games im Workbench +- **Wire-Format Envelope Versioning** + Anthropic Prompt-Cache Hints im API-Server +- **270 Compiler-Warnings auf null** — großer Sweep über mana/web + alle Packages +- **Cloudflare-Tunnel-Rebuild** — Tunnel als Single Source of Truth, Pre-Commit-Validator +- **Sync-Debug-Runbook** mit neuem Debug-API + +--- + +## News-Modul — von Null auf Dashboard-Widget + +Das News-Modul wurde an einem Tag end-to-end aufgebaut, vom Backend-Ingester bis zum Workbench-Widget. + +### Backend: news-ingester Service + +Neuer Service `news-ingester` als Hono/Bun-App mit kuratierten RSS-Feed-Quellen. Der Ingester pollt Feeds per Cron, parsed Articles via JSDOM + Readability, speichert in PostgreSQL. Zwei Bugs im Ingester sofort gefixt: + +- **JSDOM CSS-Errors**: Readability-Fallback crashte den Ingester in einer Loop. Fix: CSS-Error-Silence + Process-Level Safety-Net + Readability-Fallback komplett disabled +- **Unused `@mana/shared-hono` dep**: entfernt, der Ingester braucht kein Auth-Middleware + +### Frontend: Client-Data-Layer + UI + +``` +news-ingester (Hono/Bun) + ↓ curated RSS feeds +PostgreSQL + ↓ /api/v1/news/* +mana-web + ↓ Dexie collections + liveQuery +News workbench (ListView + detail) + ↓ dashboard widget +Dashboard +``` + +- `collections.ts` + `queries.ts` + Store mit Bookmark/Interest-Aktionen +- i18n Locales für de/en +- Workbench ListView mit Article-Cards +- Dashboard-Widget mit den neuesten 5 Artikeln +- **"Interested"-Feature**: Artikel als interessant markieren → bleibt sichtbar + bekommt ein Saved-Badge +- **Onboarding**: Instant Handoff zum Feed-Branch nach der ersten Selektion + +### Auth + Vault Guards + +Drei Auth-Fixes für das News-Modul: + +- Bearer Token korrekt im API-Client +- `getValidToken()` statt raw `getAccessToken()` +- Guard gegen Vault-Lock (Prefs nicht laden wenn Vault locked) +- Client-side API URL statt Server-URL für SSR-Kompatibilität +- Dexie v4 Schema-Upgrade für die neuen News-Tabellen + +--- + +## Body-Fitness-Modul — kombiniertes Training + Körperkomposition + +Komplett neues Modul `body` in `$lib/modules/body/`: + +**Phase 1 — Foundation**: + +- Dexie-Tabellen für Workouts, Exercises, Body-Measurements +- UI-Komponenten, Route, i18n, Dashboard-Widget +- Module in den Workbench-App-Registry eingetragen + +**Phase 2 — Features**: + +- Exercise-Picker mit Kategorien (Kraft, Cardio, Flexibility) +- Routinen-System mit vordefinierten Trainingsabläufen +- Phasen-Tracking (Aufwärmen, Training, Cool-Down) +- Progressions-Chart (Gewicht × Wiederholungen über Zeit) +- Calorie×Weight-Korrelation-Chart (volle i18n) + +**Phase 3 — Quality**: + +- Integration-Tests für `bodyStore` Mutations mit fake-indexeddb +- Fix: Routine-Creation unblocked + Duplicate-Header entfernt + +--- + +## Nutriphi: AI-Foto-Mahlzeit-Erkennung + +Das Nutriphi-Modul (Ernährungstracking) bekommt eine AI-gestützte Foto-Erkennung: + +### API-Refactor + +`/api/v1/nutriphi/photo` aufgesplittet in zwei Endpoints: + +- `POST /photos/upload` — Foto in MinIO ablegen, Thumbnail generieren +- `POST /analysis/photo` — AI-Vision-Analyse über mana-llm (Vercel AI SDK + Zod für strukturierte Outputs) + +Beide Endpoints nutzen jetzt den Vercel AI SDK mit `supportsStructuredOutputs: true` und Zod-Schemas für typsichere AI-Responses. Der Default-Vision-Model wurde auf `ollama/gemma3:4b` gesetzt. + +### Frontend + +- **Photo-Capture**: Kamera-Button in der Workbench-ListView, nimmt ein Foto auf → Upload → AI-Analyse → strukturierte Mahlzeit mit Lebensmitteln + Kalorien +- **Meal-Detail-Page**: Foods-Breakdown mit Nährwerten pro Lebensmittel, Thumbnail-aware Listen +- **Inline Quick-Add**: Text + Photo direkt in der ListView +- **Global Quick-Input-Adapter**: Nutriphi ist über die globale Suchleiste erreichbar ("Neue Mahlzeit") +- **Context-Menu Quick-Action**: Rechtsklick → "Neue Mahlzeit" + +### Tests + +- Integration-Tests für Meal-Mutations + Encryption +- Consistency-Guard-Test: Workbench-Registry ↔ `MANA_APPS` + +--- + +## Workbench Inline-Actions — 8 Module + +Statt jedes Modul nur als ListView zu rendern, bekommen jetzt 8 Module direkte Inline-Aktionen im Workbench: + +| Modul | Inline-Action | +| --------- | ----------------------------------------- | +| Inventory | Quick Item Creation | +| Picture | Inline Upload | +| Moodlit | Inline Mood Creation | +| Context | Inline Document Creation | +| Events | Detail Overlay via ViewProps | +| Who | Inline Game Play + Detail | +| Body | (bereits mit Routinen) | +| Chat | Workbench Detail Overlay mit Streaming AI | + +### Chat: AI-Streaming im Workbench + +Die Chat-Detail-Seite bekommt Streaming-AI-Completions: + +- Vercel AI SDK wired für streaming +- Workbench-Detail-Overlay zeigt den Chat inline +- Auth-Header + Template-System-Prompts + Streaming-Debounce +- `api/who`: Server-side Validation des `[IDENTITY_REVEALED]` Sentinel + +### Who-Dossier-System + +Das Who-Modul (Charakter-Ratespiel) bekommt ein Dossier-System: + +- **Staged Fact Disclosure**: Fakten werden stufenweise enthüllt, nicht alle auf einmal +- **Inline Play**: Who-Games direkt auf der Workbench-Page spielbar +- Chat-Bubble Tailwind-Klassen von v3 → v4 migriert +- `createdAt` + simple `gameId` Index für Messages + +--- + +## Wire-Format Envelope Versioning + Prompt-Cache + +Der API-Server (`@mana/api`) bekommt zwei Architektur-Verbesserungen: + +### Envelope Versioning + +Jeder API-Response wird in ein versioniertes Envelope gewrapped: + +```json +{ + "version": 1, + "data": { ... }, + "meta": { "requestId": "...", "timestamp": "..." } +} +``` + +Damit können Breaking Changes am Response-Format versioniert werden ohne bestehende Clients zu brechen. + +### Anthropic Prompt-Cache Hints + +Für AI-Endpoints die Anthropic-Modelle nutzen: Cache-Control-Hints im System-Prompt damit wiederholte Aufrufe den Prompt-Cache treffen. Reduziert Latenz und Kosten. + +### Zod-Schemas für AI Structured Outputs + +Neue `@mana/shared-types` Zod-Schemas für alle AI-Structured-Output-Formate. Die API-Routes konsumieren die Schemas via `z.infer` statt manueller Typen. Nutriphi/Planta Vision-Routes komplett auf Vercel AI SDK + Zod migriert. + +--- + +## Cloudflare-Tunnel-Rebuild + +Drei Commits für Infrastructure-Hardening: + +1. **Single Source of Truth**: `cloudflared-config.yml` wird zum einzigen Ort für Tunnel-Konfiguration +2. **Smarter Rebuild**: Apex-Domain via API + sane Health-Probes statt alle Probes gleichzeitig +3. **Pre-Commit-Validator**: Neuer Hook validiert die Tunnel-Config vor jedem Commit — syntaktisch und semantisch (keine doppelten Hostnames, keine fehlenden Services) + +--- + +## Sync-Debug-Runbook + Silent Push Failures + +### Runbook + +Neues `SYNC_DEBUG` Runbook in `docs/sync/` mit einem neuen Debug-API in mana-sync: + +- Schritt A: Client-Side Debug-Info exponieren +- Schritt B: Server-Side Query per User +- Schritt C: Neue Debug-API mit `GET /debug/user/:userId/changes` + +### Silent Push Failures + +Das Problem: Sync-Pushes scheiterten still — kein UI-Feedback, kein Toast, kein Log. Jetzt: + +- Debug-Info in der Sync-Status-Anzeige +- Silent Push Failures als Toast + console.warn surfacen + +--- + +## 270 Warnings auf Null + +Größter Warning-Sweep bisher: + +- `da03fac72` — Alle 270 Svelte-Check Warnings in mana/web + allen Packages auf null +- Hauptsächlich: unused imports, missing types, deprecated API usage +- Includes Packages: `shared-auth`, `shared-llm`, `shared-branding` + +--- + +## Sonstige Features + Fixes + +| Bereich | Was | +| -------------------- | --------------------------------------------------------------------------------- | +| Guides | Komplettes Modul mit Types, CRUD, Detail-View, Run-Tracking | +| Zitare | Smooth Transitions, Custom Quotes, Notes, neue Kategorien, Fuzzy Search | +| Memoro | Title-Source-Label unter dem Title-Input | +| Architecture Cleanup | liveQuery Migration, Dead Types, Seed Registry | +| Shared Voice | Geteilter Voice-Transcription-Helper für alle Module | +| Workbench Registry | Body, Events, Who, Guides in den App-Registry eingetragen | +| mana-llm | `response_format` Support im ChatCompletionRequest + Ollama Strip-Markdown-Fences | +| shared-llm | Bump Default-Model auf `gemma4:e4b` + Fallback auf `message.reasoning` | +| mana-media | Initial Schema-Migration committed + Run-on-Startup | +| Help | Broken Imports gefixt + SupportedLanguage Typing | +| shared-auth | Passkey/2FA/Session Methods durch ManaAuthStore proxied | +| Api Dockerfile | @mana/shared-types in Build-Context kopiert | +| inventar → inventory | Rename über die ganze Codebase | +| shared-branding | APP_URLS aus APP_ICONS abgeleitet, Who-Entry nachgetragen | +| API Deploy | `mana-api.mana.how` statt `api.mana.how` (Konflikt-Vermeidung) | +| Sync | Fresh Writes sofort pushen via Listener-Bridge | +| AiSettings | h2/h3 durch div ersetzt (semantische Korrektheit) | + +--- + +## Numbers + +| | | +| ----------------------------------- | -------------- | +| Commits | 143 | +| Files changed | 833 | +| LOC added | ~40.850 | +| LOC removed | ~22.380 | +| Net | +18.470 | +| Neue Module | 2 (News, Body) | +| Module mit Workbench Inline-Actions | 8 | +| Warnings eliminated | 270 | + +--- + +## Lehren + +1. **AI-Vision braucht strukturierte Schemas**: Ohne Zod-Validierung halluziniert das Vision-Modell Felder die im Frontend crashen. Vercel AI SDK + Zod ist die richtige Abstraktion — type-safe bis zum UI. + +2. **Silent Failures sind schlimmer als laute Errors**: Sync-Pushes die still scheitern sind für den User unsichtbar — Daten gehen verloren ohne Feedback. Jedes I/O-System braucht Failure-Surfacing. + +3. **Pre-Commit-Validators für Infrastructure-as-Code**: Eine kaputte Tunnel-Config deployed erst nach 10 Minuten Build — der Pre-Commit-Hook fängt das in Sekunden. diff --git a/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-billing-geocoding-a11y.md b/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-billing-geocoding-a11y.md new file mode 100644 index 000000000..32cb40632 --- /dev/null +++ b/apps/mana/apps/landing/src/content/devlog/2026-04-10-journal-sync-billing-geocoding-a11y.md @@ -0,0 +1,247 @@ +--- +title: 'Journal-Modul, Sync-Billing Phase 2, Self-Hosted Geocoding, 215 A11y-Fixes' +description: 'Neues Journal-Modul mit Voice + Mood + Encryption, Sync-Billing mit Server-Side Billing-Gate + Cron-Charging, Self-Hosted Geocoding mit Pelias (DACH), Firsts-Modul, 215 A11y-Suppressions durch echte Fixes ersetzt, Credits-Vereinfachung, TimeBlocks-Integration für 9 Module.' +date: 2026-04-10 +author: 'Till Schneider' +category: 'feature' +tags: + [ + 'journal', + 'sync', + 'billing', + 'geocoding', + 'pelias', + 'a11y', + 'credits', + 'timeblocks', + 'firsts', + 'workbench', + 'docker', + ] +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** — Tagebuch mit Voice-Capture, Mood-Tracking und Encryption +- **Sync-Billing Phase 2** — Server-Side Billing-Gate, Cron-basiertes Credit-Charging, E-Mail-Benachrichtigungen +- **Self-Hosted Geocoding** mit Pelias (DACH-Region) — Autocomplete, Reverse-Geocoding, Auto-Kategorisierung +- **Firsts-Modul** — "Erstes Mal"-Tracking von Traum bis Realität +- **215 A11y-Suppressions** durch echte Fixes ersetzt +- **Credits-Vereinfachung** — Productivity Credits, Guild Pools und komplexe Gift-Types entfernt +- **TimeBlocks-Integration** für 9 weitere Module +- **Workbench-Redesign** — Page Cards mit runden Ecken, unified Header, DnD entfernt + +--- + +## Journal-Modul + +Neues Modul `journal` in `$lib/modules/journal/`: + +- **Voice-Capture**: VoiceCaptureBar-Integration für gesprochene Einträge +- **Mood-Tracking**: Stimmung pro Eintrag (1–5 Skala mit Emoji-Feedback) +- **Encryption**: Alle Einträge AES-GCM-256 verschlüsselt (Registry + Store korrekt verdrahtet) +- **Dexie-Collections**: `journalEntries` mit `userId`, `createdAt`, `mood`, `content`, `tags` +- **Workbench-Integration**: ListView mit Inline-Erstellung + +Das Journal unterscheidet sich bewusst von Notes: Notes sind Arbeitsdokumente (Markdown, Tags, Referenzen), das Journal ist chronologisch, stimmungsbezogen und persönlicher. + +--- + +## Sync-Billing Phase 2 — Server-Side Gate + Cron Charging + +### Phase 1 Recap (Credits) + +`mana-credits` Service bekommt Sync-Billing: monatliches Credit-Abo für Cloud-Sync. Neue Subscription-Tabelle, Activation/Cancellation-Flow, Admin-Gifted Subscriptions. + +### Phase 2: Server-Side Enforcement + +Die wichtigere Hälfte — der Server-Side Billing-Gate in `mana-sync`: + +1. **Billing-Middleware**: Jeder Sync-Push prüft ob der User ein aktives Sync-Abo hat. Ohne Abo → 402 Payment Required mit Link zur Credits-Page +2. **Cron-Charging**: Täglicher Cron-Job berechnet den anteiligen Credit-Verbrauch pro aktivem Sync-Abo +3. **E-Mail-Benachrichtigungen**: Low-Balance-Warning + Subscription-Expiry via `mana-notify` +4. **Docs**: mana-sync CLAUDE.md aktualisiert mit Billing-Middleware, neuen Env-Vars, Projektstruktur + +### Sync UI + +- **Sync-Status PillNav Dropdown**: Der Sync-Status ist jetzt über einen PillNav-Dropdown sichtbar — Pending Changes, Last Sync, Subscription-Status +- **Onboarding-Step**: Neuer Onboarding-Schritt für Cloud-Sync mit Erklärung + Upgrade-CTA +- **Batched Push**: `PUSH_BATCH_SIZE = 200` — große Sync-Pushes werden in 200er-Batches gesplittet statt als Monolith gesendet + +--- + +## Self-Hosted Geocoding mit Pelias + +Statt auf Google Maps oder Mapbox zu setzen, hosten wir Geocoding selbst mit **Pelias** (Open-Source, OpenStreetMap-basiert): + +### Setup + +- **DACH-only Import**: Pelias-Config auf Deutschland, Österreich, Schweiz beschränkt. Spart 80% Storage vs. Welt-Import +- **Single-Country Filter**: Nur DACH-Ergebnisse werden zurückgegeben +- **Docker-Compose**: Pelias-Stack (Elasticsearch, PIP, Placeholder, Interpolation, API) in der prod compose + +### Features + +- **Autocomplete**: Live-Suche während der Eingabe in Places +- **Reverse-Geocoding**: GPS-Koordinaten → Adresse (für Location-Tracking) +- **Auto-Kategorisierung**: Pelias-Taxonomy mapped OSM-Kategorien auf Places-Kategorien (Restaurant, Café, Park, ...) +- **Fallback**: Wenn `/autocomplete` leer ist → `/search` als Fallback + +### Places-Integration + +- **Clickable Tracking-Label**: Zeigt die aktuelle Adresse während GPS-Tracking +- **Full Address Display**: Vollständige Adresse statt nur Koordinaten +- **Browser-Proxy**: Geocoding-Requests laufen über den SvelteKit-Proxy (CORS) + +### Cross-Module + +Geocoding wurde auch in Events, Contacts und Photos integriert — überall wo Orte relevant sind. + +### Infra + +- Pelias Health über den Wrapper für Monitoring proxied +- libpostal nicht auf Host-Port 4400 binden (Konflikt-Vermeidung) +- Unit-Tests + E2E-Smoke-Test-Script +- Docs: Pelias-Category-Patch + Import-Gotchas + +--- + +## Firsts-Modul — "Erstes Mal"-Tracker + +Neues Modul `firsts` für die Dokumentation von "ersten Malen": + +- **Dream-to-Lived Tracking**: Träume (aus dem Dreams-Modul) werden zu erlebten Firsts +- **Design-Dokument**: `docs/firsts/` mit Feature-Beschreibung + Datenmodell +- **Fix**: Invalid JS-Comment in CSS-Block entfernt (Build-Blocker) + +--- + +## 215 A11y-Fixes + +Commit `b8cd33df7` — der größte Accessibility-Sweep bisher: + +Alle 215 `// eslint-disable-next-line` A11y-Suppressions im Code durch echte Fixes ersetzt: + +- `on:click` auf non-interactive Elements → `