mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 21:21:10 +02:00
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) <noreply@anthropic.com>
This commit is contained in:
parent
3a133555b8
commit
d4c6f257b3
2 changed files with 341 additions and 226 deletions
|
|
@ -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 |
|
||||
|
|
@ -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<T>()` — 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 |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue