From d4c6f257b3599b3fd348f51bfdc2d7dbd6c73398 Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 27 Mar 2026 12:33:06 +0100 Subject: [PATCH] docs: add devlog for 2026-03-25 and update 2026-03-26 Add missing devlog for March 25 (analytics, help system, CityCorners, ManaLink, infra). Expand March 26 devlog to include all 61 commits (Storage sprint, Passkeys/2FA, Tags, Zitare) alongside architecture planning. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../2026-03-25-storage-auth-tags-analytics.md | 170 ++++++++ ...6-03-26-local-first-architektur-planung.md | 397 ++++++++---------- 2 files changed, 341 insertions(+), 226 deletions(-) create mode 100644 apps/manacore/apps/landing/src/content/devlog/2026-03-25-storage-auth-tags-analytics.md diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-03-25-storage-auth-tags-analytics.md b/apps/manacore/apps/landing/src/content/devlog/2026-03-25-storage-auth-tags-analytics.md new file mode 100644 index 000000000..e1de939fd --- /dev/null +++ b/apps/manacore/apps/landing/src/content/devlog/2026-03-25-storage-auth-tags-analytics.md @@ -0,0 +1,170 @@ +--- +title: 'Analytics, Help-System, CityCorners, ManaLink & Infra-Hardening' +description: 'Analytics Event-Tracking in 8+ Apps, Help-Pages für alle 18 Apps, CityCorners mit Reviews und Kategorien, ManaLink Mobile-Optimierung, Infra-Verbesserungen und ManaCore Dashboard-Polish.' +date: 2026-03-25 +author: 'Till Schneider' +category: 'feature' +tags: + [ + 'analytics', + 'help', + 'citycorners', + 'manalink', + 'infrastructure', + 'docker', + 'observatory', + 'dashboard', + 'monitoring', + 'ci', + ] +featured: true +commits: 44 +readTime: 12 +stats: + filesChanged: 255 + linesAdded: 10890 + linesRemoved: 1264 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 44 +workingHours: + start: '2026-03-25T08:00' + end: '2026-03-25T21:00' +--- + +Breiter Arbeitstag mit **44 Commits** über viele Bereiche — Analytics, Help, CityCorners, ManaLink, Infra und Dashboard: + +- **Analytics überall** — Custom Event Tracking in 8+ Apps, neuer ManaScore-Metrik +- **Help-System** — Help-Pages in allen 18 Apps, shared Mana & Privacy FAQs +- **CityCorners Ausbau** — Reviews, Ratings, Öffnungszeiten, 7 neue Kategorien +- **ManaLink** — Mobile-Layout optimiert, Chat-UX verbessert +- **Infra** — CI-Workflows, Dockerfile-Validator erweitert, Health-Checks gestaffelt +- **ManaCore Dashboard** — UX-Polish, White-Screen-Fix, localStorage zentralisiert + +--- + +## 1. Analytics: Custom Event Tracking + +Neuer `Analytics Maturity`-Metrik in ManaScore und Custom Event Tracking in 8+ Apps: + +| App | Events | +|-----|--------| +| Storage | Upload, Download, Share, Preview | +| Photos | Upload, Edit, Album-Create | +| Context, SkillTree, Planta, Questions | App-spezifische Events | +| NutriPhi, ManaDeck | Meal-Log, Card-Create | + +### Commits + +- `d2264f53` — Analytics Maturity ManaScore-Metrik + 4 Apps +- `bade0a17` — Storage Event Tracking +- `3075e515` — Photos Event Tracking +- `12b3c4f0` — Context, SkillTree, Planta, Questions +- `1fe8f890` — NutriPhi, ManaDeck + +--- + +## 2. Help-System für alle Apps + +### Shared Help Content + +- **Mana FAQ** — Was ist Mana? Wie funktionieren Credits? Abo-Infos +- **Privacy FAQ** — Datenschutz, DSGVO, Datenexport +- **PillNav Integration** — Help- und Themes-Links in der Navigation aller Apps + +### App-spezifische Help-Pages + +Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für alle 18 Apps, shared Translations extrahiert. + +### Commits + +- `dd5c0d50` — Calendar, Todo Help +- `f0233b8d` — Storage, Chat, Picture Help +- `7077c0a3` — Help-Pages in 10 Apps +- `bdab2722` — Shared Translations, Zitare + Mukke Help + +--- + +## 3. CityCorners: Reviews & Kategorien + +### Reviews & Ratings + +- 5-Sterne-Bewertungen für Locations +- Review-Texte mit Zeitstempel +- Durchschnitts-Rating in Location-Cards + +### Neue Features + +- **Open/Closed Badges** — Echtzeit-Status basierend auf Öffnungszeiten +- **Map Category Filter** — Kategorien auf der Karte filtern +- **7 neue Kategorien** — Mit 35 Seed-Einträgen für Konstanz + +### Commits + +- `73037097` — Review und Rating System +- `89e32d47` — Open/Closed Badges, Map Category Filter, Öffnungszeiten +- `8b96b824` — 7 neue Kategorien mit 35 Seed-Einträgen + +--- + +## 4. ManaLink + +- **Mobile Layout** — Bottom-Sheets, kompakter Header, Touch-Interaktionen (`1edbc190`) +- **Chat UX** — Message-Grouping, Hover-Actions, Command-Palette (`06bf1502`) + +--- + +## 5. ManaCore Dashboard & Observatory + +### Dashboard Polish + +- UX-Verbesserungen (`623ce1f0`, `7da67feb`) +- White-Screen-Fix beim Todo-Toggle (`73d55294`) +- localStorage-Keys zentralisiert in `storage-keys` Config (`05194407`, `59c8974a`) +- Kritische Production-Readiness-Issues behoben (`23261aab`) + +### Seenplatte Observatory + +- Tabbed Gallery-Views für Pflanzen und Seen (`80beef25`) +- Rivers, Leaderboard, Compare und Trends-Tabs (`aeca35ee`) + +--- + +## 6. Infrastructure & DevOps + +### Auth & Performance + +- AuthGate-Pattern in allen Apps zentralisiert (`336cfedd`) +- JWKS Verification lokal statt HTTP-Call — Performance (`cacf8d7c`) +- Hardcoded localhost in User-Settings aller Apps gefixt (`3376b044`) + +### CI/CD & Docker + +- `audit:deps` und `generate:dockerfiles --check` in PR-Workflow (`858b7f68`) +- Dockerfile-Validator auf Backends und Services erweitert (`10524693`) +- Docker Health-Check Start-Periods gestaffelt (`37b061f7`) +- ManaDeck Docker Deployment für Backend + Web (`6c1b472e`) +- ManaScore Extended Codebase-Metrics für alle App-Audits (`b9a9052a`) +- Fehlende prom-client Dependency in 4 Backends (`422b4f9f`) +- Onboarding-Modal in 8 Apps aus Flex-Layout rausgeschoben (`491c71e2`) +- Fehlende Cloudflare-Tunnel-Routes für Zitare, SkillTree, Planta (`d8886346`) + +### Dokumentation + +- Windows GPU Server Docs hinzugefügt (`3631cc77`) +- Base-Images und build-app.sh dokumentiert (`6efeadb3`) + +--- + +## Zusammenfassung + +| Bereich | Änderung | +|---------|----------| +| **Analytics** | Custom Event Tracking in 8+ Apps, ManaScore-Metrik | +| **Help** | Help-Pages in allen 18 Apps, Shared Mana & Privacy FAQs | +| **CityCorners** | Reviews, Ratings, 7 Kategorien, Open/Closed-Status | +| **ManaLink** | Mobile Bottom-Sheets, Chat Message-Grouping | +| **Dashboard** | UX-Polish, White-Screen-Fix, localStorage zentralisiert | +| **Infra** | CI-Workflows, Dockerfile-Validator, Health-Checks gestaffelt | +| **Gesamt** | 44 Commits, 255 Dateien, +10.890 / -1.264 Zeilen | diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-03-26-local-first-architektur-planung.md b/apps/manacore/apps/landing/src/content/devlog/2026-03-26-local-first-architektur-planung.md index a1f8165b2..d23e7c8e2 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-03-26-local-first-architektur-planung.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-03-26-local-first-architektur-planung.md @@ -1,297 +1,242 @@ --- -title: 'Local-First Architektur: Von Login-Wall zu Instant-App mit neuem Tech-Stack' -description: 'Architekturplanung für den Umbau aller ManaCore-Apps auf Local-First mit Dexie.js, Go Sync-Server und Hono/Bun statt NestJS. Guest-Mode, Offline-CRUD und Instant UI als Kernziele.' +title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Zitare-Polish & Local-First Planung' +description: 'Massiver Tag mit 61 Commits: Storage auf ManaScore 87, WebAuthn/Passkeys und TOTP-2FA, Cross-App Tag-System, Zitare-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.' date: 2026-03-26 author: 'Till Schneider' -category: 'infrastructure' +category: 'feature' tags: [ - 'architecture', + 'storage', + 'auth', + 'passkeys', + '2fa', + 'tags', + 'zitare', + 'infrastructure', + 'docker', 'local-first', - 'offline', - 'dexie', - 'indexeddb', - 'go', - 'hono', - 'bun', - 'sync', - 'guest-mode', - 'pwa', - 'nestjs-migration', - 'tech-stack', + 'architecture', + 'i18n', + 'testing', ] featured: true -readTime: 15 +commits: 61 +readTime: 18 +stats: + filesChanged: 329 + linesAdded: 19553 + linesRemoved: 2838 contributors: - name: 'Till Schneider' handle: 'Till-JS' + commits: 61 workingHours: - start: '2026-03-26T10:00' - end: '2026-03-26T16:00' + start: '2026-03-26T08:00' + end: '2026-03-26T22:00' --- -Umfassende Architekturplanung mit dem Ziel, die gesamte ManaCore-Plattform fundamental zu modernisieren: +Massiver Tag mit **61 Commits** über **329 Dateien** und netto **+16.715 Zeilen** — Storage-Sprint, Auth-Features, Tag-System, Zitare-Polish, Infra und Architekturplanung: -- **Local-First statt API-First** — Alle Daten leben primär in IndexedDB (Dexie.js), Server synchronisiert im Hintergrund -- **Guest-Mode als Nebeneffekt** — Kein Login-Screen mehr beim ersten Besuch, Nutzer landen direkt in der App -- **Backend-Modernisierung** — NestJS wird durch Hono auf Bun ersetzt, neuer Go Sync-Server -- **Instant UI** — Reads < 1ms aus IndexedDB statt 200-500ms API-Roundtrip -- **Echtes Offline** — Voller CRUD ohne Netz, nicht nur gecachte Reads +- **Storage-App komplett** — Von Score 72 auf 87: Previews, Audio-Player, Skeleton Screens, Sharing, Tagging, i18n, E2E-Tests +- **Auth: Passkeys & 2FA** — WebAuthn/Passkeys und TOTP-2FA in allen Apps, Google/Apple Login entfernt +- **Cross-App Tag-System** — Neues Tag-System mit Gruppen und Entity-Links in 18 Apps integriert +- **Zitare Komplett-Polish** — i18n, Display-Settings, Suche, Filter, Author-Bios, Loading States +- **Local-First Architektur** — Umfassende Planung für Dexie.js + Go Sync-Server + Hono/Bun +- **Infra** — SvelteKit Base-Image, build-app.sh Script, Dockerfile-Fixes --- -## Ausgangslage: Das Login-Wall-Problem +## 1. Storage-App: Von 72 auf 87 ManaScore -Wenn ein neuer Nutzer `todo.mana.how` besucht, passiert aktuell Folgendes: +Massiver Sprint der die Storage-App von einem funktionalen MVP zu einer production-ready Anwendung transformiert hat. -1. SvelteKit App lädt -2. `AuthGate` Komponente prüft Auth-Status -3. Kein Token vorhanden → Redirect zu `/login` -4. Nutzer sieht Login-Screen, ohne die App je gesehen zu haben +### Datei-Previews -Das ist ein klassisches Conversion-Problem: Nutzer müssen sich committen (Account erstellen), bevor sie den Wert der App erleben. Die Lösung scheint einfach — `allowGuest=true` setzen und fertig. Aber die Frage "wo kommen dann die Daten her?" führt zu einer viel grundlegenderen Architekturentscheidung. +Vollständiges Preview-System für alle gängigen Dateitypen direkt im Browser: + +| Dateityp | Preview | +|----------|---------| +| **Audio** | Player mit Frequency-Visualizer (Canvas-basierte Wellenform-Animation) | +| **Video** | Native HTML5 Video Player | +| **PDF** | Eingebetteter Viewer | +| **Text/Code** | Syntax-Highlighting | +| **Markdown** | Gerenderte Ansicht | + +### UX-Verbesserungen + +- **Skeleton Shimmer Screens** — Loading-Spinner durch animierte Skeleton-Layouts ersetzt +- **SVG Empty State Illustrations** — Eigene SVGs für leere Ordner, Suche, Papierkorb, Favoriten +- **Share Modal** — Dialog zum Erstellen von Share-Links mit Ablaufdatum und Passwort +- **File Tagging** — TagPicker-Komponente für Tags direkt an Dateien +- **Bulk Operations** — Multi-Select mit Shift/Cmd-Klick, Bulk-Delete, Bulk-Move, Bulk-Tag +- **Storage Stats** — Echte Speicher-Nutzung in den Einstellungen + +### Backend-Qualität + +- **Swagger/OpenAPI Docs** — Vollständige API-Dokumentation +- **Structured Logging** — Pino Logger mit JSON-Output und Request-Tracing +- **i18n** — Französisch, Spanisch und Italienisch hinzugefügt +- **E2E-Tests** — Integration-Tests mit echtem Backend + +### Commits + +- `2150452a` — Audio Player mit Frequency Visualizer +- `59896521` — Video, PDF, Text/Code, Markdown Preview +- `9f668009` — Skeleton Shimmer Screens +- `56307a3d` — SVG Empty State Illustrations +- `56683876` — ShareModal +- `5c69dc7d` — File Tagging UI +- `a85682d8` — Bulk File Operations +- `9611544f` — Storage Usage Stats +- `8692b082` — Structured Logging (Pino) +- `8b5889e1` — Swagger/OpenAPI +- `a439d5d8` — FR/ES/IT Translations +- `8a1cb2dc` — Integration E2E Tests +- `c681a5d6` — ManaScore auf 87 aktualisiert --- -## Analyse: Was ist eigentlich "Offline"? +## 2. Auth: WebAuthn/Passkeys & TOTP-2FA -Aktuell haben alle 20 Web-Apps PWA-Support via `@manacore/shared-pwa` mit Workbox-Caching: +### Passkeys (WebAuthn) -| Schicht | Status | Was es kann | -|---------|--------|------------| -| Service Worker + Precaching | Alle 20 Apps | App-Shell (HTML/CSS/JS) offline laden | -| API Caching (NetworkFirst) | Alle Apps | Zuletzt geladene API-Responses aus Cache lesen | -| Offline-Seite | Alle Apps | Fallback-UI wenn komplett offline | -| Offline-Writes | Nur SkillTree | Daten in IndexedDB erstellen/bearbeiten | +Komplette WebAuthn/Passkey-Integration für passwortloses Login über alle Apps: -Das bedeutet: **Read-Only Offline** ist bereits da. Aber kein einziger Write funktioniert offline (ausser SkillTree mit dediziertem IndexedDB-Store). +- **PasskeyManager-Komponente** — UI zum Registrieren, Benennen und Löschen von Passkeys +- **Production Config** — Korrektes `rpId` und `origin` für `mana.how`-Domain +- **ManaCore Integration** — PasskeyManager in Settings-Page eingebaut +- **35 Tests** — Controller-Tests für Passkey und 2FA Flows -### Das Spektrum der Offline-Architekturen +### TOTP Two-Factor Authentication -``` -Level 0 Level 1 Level 2 Level 3 Level 4 -Online-Only → Cache-Read → Offline-Capable → Offline-First → Local-First - (AKTUELL) (ZIEL) -``` +- Authenticator-App Setup mit QR-Code und manuellem Secret +- Recovery Codes für Account-Zugang ohne 2FA-Gerät +- Alle Apps zeigen 2FA-Setup in den Security-Settings -- **Level 1 (aktuell):** Gecachte API-Responses lesbar, kein Write -- **Level 2:** Writes werden gequeued, sync bei Reconnect -- **Level 3:** App arbeitet immer gegen lokale DB, Server synced im Hintergrund -- **Level 4:** Volle CRDT-basierte Sync, Real-time Collab +### Auth UX & Cleanup -**Entscheidung: Level 3 (Offline-First)** — Guest-Mode wird Nebeneffekt, Instant UI, voller Offline-CRUD. Level 4 (CRDT) ist Overengineering ohne Real-time-Collab-Requirement. +- UX-Verbesserungen für Passkey- und 2FA-Management (`70737561`) +- Rate-Limit-Feedback, Audit-Log UI und E2E-Tests (`0dfd6038`) +- Google/Apple Social Login Code komplett entfernt — Self-Sovereign Auth (`2d11ba62`) + +### Commits + +- `3091da91` — WebAuthn/Passkey Support +- `c4d55209` — PasskeyManager Komponente + Production Config +- `ac4bacad` — ManaCore Settings Integration +- `f5a9edcf` — TOTP 2FA in allen Apps +- `e0e9ede8` — 35 Controller-Tests +- `70737561` — UX-Improvements +- `0dfd6038` — Rate-Limit, Audit-Log, E2E-Tests +- `2d11ba62` — Social Login entfernt --- -## Die neue Architektur +## 3. Cross-App Tag-System -### Client: Dexie.js als lokale Datenbank +### Architektur -Jede App bekommt eine lokale IndexedDB-Datenbank via Dexie.js. Statt API-Calls liest und schreibt die App gegen lokale Daten: +Neues, app-übergreifendes Tag-System mit: -``` -VORHER: Component → API Call → 200ms warten → State Update → Render -NACHHER: Component → IndexedDB Read (< 1ms) → Render → Sync im Hintergrund -``` +- **Tag-Gruppen** — Kategorisierung von Tags (z.B. "Priorität", "Status", "Thema") +- **Entity-Links** — Tags können an beliebige Entities gehängt werden +- **Farbige Tags** — Jeder Tag hat eine zuweisbare Farbe +- **Backend-Validierung** — FK-Constraints, Token-Validation, Input-Validation, 37 Tests -**Warum Dexie.js:** -- `liveQuery()` — reaktive Queries, die automatisch UI updaten (perfekt für Svelte 5 runes) -- 15KB Bundle (vs. 500KB für SQLite WASM) -- Kein OPFS nötig, breite Browser-Unterstützung -- Bewährte Library mit grosser Community +### Shared Components -**Neues Shared Package: `@manacore/local-store`** kapselt die gesamte Local-First-Logik: -- `createLocalCollection()` — Factory für typisierte, reaktive Collections -- Sync Engine mit Field-Level Last-Write-Wins Conflict Resolution -- WebSocket-Client für Push-Updates von anderen Geraeten -- Offline-Queue für pending Writes +- `TagStrip` — Horizontale Tag-Leiste für jede App +- `createTagStore` — Svelte-Store-Factory für Tag-Operationen -### Sync-Server: Go +### Integration -Ein zentraler Sync-Server (`mana-sync`) in Go, der das Sync-Protokoll fuer alle Apps implementiert: +1. `ce900d5f` — Todo: TagStrip + createTagStore +2. `69aa8378` — Contacts & Calendar: TagStrip + createTagStore +3. `91116bf0` — Alle 15 übrigen Apps: Shared TagStrip -**Warum Go:** -- 100.000+ gleichzeitige WebSocket-Verbindungen (Goroutines, ~4KB/Connection) -- P99 Latency < 1ms fuer Sync-Operationen -- Single Binary Deployment (~15MB) -- Perfekt fuer genau diese Art von I/O-bound Service +### Backend -**Was der Sync-Server macht:** -1. Empfaengt Changesets von Clients (Batch von Aenderungen) -2. Wendet Field-Level LWW an bei Konflikten -3. Persistiert in PostgreSQL -4. Gibt Server-Delta zurueck (was der Client noch nicht hat) -5. Pushed via WebSocket an andere Geraete des Users - -**Was er NICHT macht:** Business-Logik, Auth, File-Uploads, AI-Calls. Das bleibt in den App-Backends. - -### App-Backends: Von NestJS zu Hono auf Bun - -Die groesste Aenderung: NestJS wird durch Hono ersetzt, laeuft auf Bun statt Node. - -**Warum weg von NestJS:** -- Enterprise-Java-Philosophie (Angular-Style DI, Decorators, Module, Guards, DTOs...) -- ~50MB node_modules pro Backend -- 2-5 Sekunden Cold Start -- Viel Boilerplate fuer einfache Aufgaben - -**Warum Hono:** -- 14KB Bundle -- < 50ms Cold Start auf Bun (< 6ms fuer Bun selbst) -- Web-Standard API (fetch, Request/Response) -- RPC Type Safety: Client importiert Server-Typen ohne Codegen -- Laeuft ueberall: Bun, Node, Deno, Cloudflare Workers - -**Warum Bun:** -- Nativer TypeScript-Support (kein Compiler noetig) -- ~150K req/s (3x Node) -- Built-in SQLite, Test Runner, Package Manager -- Startup ~6ms statt ~300ms (Node) - -### Was sich am Backend aendert - -Durch Local-First fallen ~220 von ~260 Endpoints weg (alle CRUD). Was bleibt: - -| Kategorie | Beispiele | Bleibt weil | -|-----------|-----------|-------------| -| **External APIs** | Replicate (Bild-Gen), OpenRouter (LLM), Google OAuth | API Keys duerfen nicht zum Client | -| **Webhooks** | Stripe Payment, Replicate Completion | Server muss Callbacks empfangen | -| **Server-Compute** | RRULE Expansion (DoS-Schutz), Spaced Repetition | Zu teuer/riskant fuer Client | -| **File Uploads** | Bilder, vCards, CSVs → MinIO/S3 | Braucht Server-seitigen Storage-Zugang | -| **Credits** | Balance pruefen, Consumption tracken | Authoritative Quelle, Betrugsschutz | -| **Admin** | User-Uebersicht, Metriken | Zugriff auf alle Daten | - -### Auth: Better Auth bleibt, NestJS geht - -Better Auth hat einen nativen Hono-Adapter. Die Migration ist hauptsaechlich ein HTTP-Layer-Wechsel, die Auth-Logik (EdDSA JWT, SSO, Organizations, Credits) bleibt identisch. - -### AI Services: Bleiben Python - -`mana-llm`, `mana-stt`, `mana-tts`, `mana-image-gen` — Python ist das richtige Oekosystem fuer ML/AI. Keine Aenderung. +- `0c479b3e` — Tag-System mit Gruppen und Entity-Links +- `11ab265d` — FK-Constraints, Token-Validation, Input-Validation +- `4ddff848` — Transaction on Sync, Scroll-Indicator, 37 Backend-Tests --- -## Conflict Resolution: Field-Level Last-Write-Wins +## 4. Zitare: Komplett-Polish -Das Herzstück des Sync-Protokolls. Statt "ganzes Objekt gewinnt" wird pro Feld entschieden: +Umfassende Qualitätsverbesserungen für die Zitate-App: -``` -Gerät A (offline): Task "Einkaufen" → priority: "high" (14:01:03) -Gerät B (offline): Task "Einkaufen" → title: "Einkaufen Rewe" (14:01:05) - -Sync-Ergebnis: - title: "Einkaufen Rewe" (B war neuer für dieses Feld) - priority: "high" (A war einziger Editor für dieses Feld) - → Kein Datenverlust -``` - -Jede Tabelle bekommt ein `field_timestamps` JSONB-Feld das den letzten Aenderungszeitpunkt pro Feld speichert. +| Feature | Commit | +|---------|--------| +| Komplette i18n-Abdeckung aller Seiten | `90e61356` | +| Display-Settings (Schriftgrösse, Layout) | `6107d572` | +| Suche & Sortierung auf Kategorie-Detailseite | `40b55eb6` | +| Category Filter-Chips in Suchergebnissen | `b7d1d2ec` | +| Favorites-Count-Badge + Display-Settings | `7c7e5eb0` | +| Author-Bio auf Zitat-Karten | `1316ef57` | +| Loading States für Listen-Operationen | `96ff16b7` | +| Error-Feedback für stille API-Fehler | `326acf0e` | +| Maxlength-Validation im Listen-Formular | `5bb96dbf` | +| Settings/Spiral/Themes in Account-Dropdown | `08629b80` | +| Tailwind CSS v4 Vite-Plugin Fix | `30a0a651` | --- -## Guest-Mode: Kein Sonderfall mehr +## 5. Local-First Architekturplanung -Mit Local-First ist Guest-Mode kein Feature sondern der Default-Zustand: +Umfassende Planung für den fundamentalen Umbau der gesamten ManaCore-Plattform: -``` -Guest: IndexedDB ←→ UI (Sync Engine aus) -Eingeloggt: IndexedDB ←→ UI ←→ Sync ←→ Server (Sync Engine an) -``` +### Kernentscheidungen -Bei Login passiert: -1. User meldet sich an -2. Sync Engine startet -3. Lokale Daten bekommen `userId` -4. Alles wird zum Server gepusht -5. Server-Daten (von anderen Geraeten) werden gepullt +| Aspekt | Aktuell | Ziel | +|--------|---------|------| +| **Datenmodell** | API-First | Local-First (IndexedDB + Sync) | +| **Client-DB** | Keine | Dexie.js (15KB, liveQuery) | +| **Sync** | Kein | Go Sync-Server (100K+ WebSockets) | +| **Backend** | NestJS | Hono auf Bun (14KB, < 50ms Cold Start) | +| **Guest-Mode** | Separater Code | Nebeneffekt der Architektur | +| **Offline** | Read-Only Cache | Voller CRUD | +| **Performance** | 200-500ms API | < 5ms IndexedDB | -Kein separater Migrations-Endpoint, kein Sonderfall im Store-Code. +### Conflict Resolution -### Onboarding-Seed pro App +Field-Level Last-Write-Wins statt "ganzes Objekt gewinnt" — zwei Geräte können verschiedene Felder desselben Objekts offline bearbeiten ohne Datenverlust. -Jede App definiert Seed-Daten die bei erstem Besuch in IndexedDB geladen werden: +### Migrationsplan -- **Todo:** Beispiel-Projekt "Erste Schritte" mit erklaerenden Tasks -- **Contacts:** Beispiel-Kontakt mit allen Feldern ausgefuellt -- **Calendar:** Beispiel-Termine fuer diese Woche -- **Chat:** Willkommensnachricht mit Erklaerung der Features +5 Phasen über ~12 Wochen: Foundation → Todo-Pilot → Alle Apps → Auth-Migration → Cleanup + +Detaillierter Plan: `.claude/plans/local-first-architecture-migration.md` --- -## Performance-Vergleich +## 6. Infrastructure -| Metrik | Aktuell (NestJS/Node) | Ziel (Go + Hono/Bun) | -|--------|----------------------|----------------------| -| Task erstellen | 200-500ms (API) | < 5ms (lokal) | -| Seitenwechsel | Loading-Spinner + API | Instant (IndexedDB) | -| Backend Memory/Service | ~150MB | ~15MB (Go) / ~40MB (Bun) | -| Cold Start | 2-5s | ~6ms (Bun) / ~50ms (Go) | -| Concurrent WebSockets | ~5.000 | ~100.000 (Go) | -| Total Docker Image Size | ~3GB (6 NestJS) | ~250MB (1 Go + 3-4 Hono) | -| CRUD Endpoints | ~260 | ~40 + 1 Sync-Protokoll | +### SvelteKit Base Image ---- +Neues `sveltekit-base:local` Docker-Image mit allen Shared Packages vorinstalliert — einzelne App-Builds deutlich schneller. -## Migrationsplan (5 Phasen) +- `cdfbfcd1` — SvelteKit Base Image + build-app.sh Script +- `ba6b9537` — Container-Namen statt IDs in build-app.sh -### Phase 1: Foundation (2-3 Wochen) -- `@manacore/local-store` Package bauen -- `mana-sync` Go Service bauen -- Todo als Pilot umbauen +### Weitere Fixes -### Phase 2: Todo komplett (2-3 Wochen) -- Todo NestJS → Hono/Bun -- Guest-Mode + Onboarding-Seed -- PillNav Login-Button - -### Phase 3: Alle Apps (4-6 Wochen) -- Reihenfolge: Zitare → Calendar → Clock → ManaDeck → Contacts → Chat → Picture → Presi -- Pro App: Collections definieren, Stores umbauen, NestJS → Hono - -### Phase 4: Auth-Migration (2 Wochen) -- mana-core-auth: NestJS → Hono/Bun mit Better Auth Hono-Adapter - -### Phase 5: Cleanup (1-2 Wochen) -- NestJS Dependencies entfernen -- Shared Packages migrieren (shared-nestjs-auth → shared-hono-auth) -- Docker-Images auf Bun Base umstellen -- CI/CD anpassen - ---- - -## Technologie-Entscheidungen - -| Entscheidung | Gewählt | Alternativen betrachtet | Begründung | -|---|---|---|---| -| Lokale DB | Dexie.js | SQLite WASM, cr-sqlite | 15KB vs 500KB, liveQuery Reaktivität, breiter Support | -| Sync-Server | Go | Rust, Elixir, Node | Performance + Einfachheit, perfekt für I/O-bound WebSocket Service | -| App-Backend | Hono + Bun | Fastify, ElysiaJS, Express | RPC Type Safety, Web-Standard API, Multi-Runtime | -| Conflict Strategy | Field-Level LWW | Volles CRDT (Automerge/Y.js) | Löst 99% der Konflikte, CRDT nur nötig bei Real-time Collab | -| Runtime | Bun | Node, Deno | Nativer TS, 3x Performance, schnellster Startup | -| Auth | Better Auth (bleibt) | Lucia, Auth.js | Bereits integriert, Hono-Adapter vorhanden | +- `e676ba68` — `JSON.stringify` für Env-Var-Injection in allen `hooks.server.ts` +- `9c8bae3d` — NestJS Auth: Multiple JWT-Issuers für Docker/Public URL Mismatch +- `2b0b902b` — Credit-Operations Package Exports auf compiled `dist/` zeigend +- `5a3ee5c7` — Todo Task UI: Priority-Checkboxes, Drag-Styling, Route-Fix +- Diverse Dockerfile-Fixes für Zitare, Storage, Todo (fehlende Dependencies, Node Heap Size) --- ## Zusammenfassung -| Aspekt | Änderung | -|--------|----------| -| **Datenmodell** | API-First → Local-First (IndexedDB + Sync) | -| **Backend-Framework** | NestJS → Hono auf Bun | -| **Sync-Server** | Neu: Go Service (mana-sync) | -| **Runtime** | Node.js → Bun | -| **Guest-Mode** | Separater Code → Nebeneffekt der Architektur | -| **Offline** | Read-Only Cache → Voller CRUD | -| **UI-Geschwindigkeit** | API-abhängig → Instant (lokal) | -| **AI Services** | Python → Python (keine Änderung) | -| **Auth** | Better Auth bleibt, HTTP-Layer wechselt | - -## Nächste Schritte - -1. `@manacore/local-store` Package initialisieren -2. Go-Projekt `mana-sync` aufsetzen -3. Todo-App als Pilot: Stores auf Dexie.js umbauen -4. Sync-Protokoll zwischen Client und Go-Server implementieren -5. Guest-Seed und PillNav Login-Button für Todo - -Detaillierter Plan: `.claude/plans/local-first-architecture-migration.md` +| Bereich | Änderung | +|---------|----------| +| **Storage** | Score 72 → 87: Previews, Audio-Player, Sharing, Tagging, E2E-Tests, i18n | +| **Auth** | Passkeys + TOTP-2FA in allen Apps, Social Login entfernt, 35+ Tests | +| **Tags** | Cross-App Tag-System in 18 Apps integriert, 37 Backend-Tests | +| **Zitare** | Komplett i18n, Display-Settings, Suche, Filter, Author-Bios | +| **Architektur** | Local-First Planung: Dexie.js + Go Sync + Hono/Bun | +| **Infra** | SvelteKit Base-Image, build-app.sh, Dockerfile-Fixes | +| **Gesamt** | 61 Commits, 329 Dateien, +19.553 / -2.838 Zeilen |