diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-calendar.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-calendar.md new file mode 100644 index 000000000..5b8200cfc --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-calendar.md @@ -0,0 +1,138 @@ +--- +title: 'Calendar: Production Readiness Audit' +description: 'Umfassende Bewertung der Kalender-App - starkes Backend mit 13 Modulen, Svelte 5 Web-App, aber Lücken bei Tests und Mobile' +date: 2026-03-19 +app: 'calendar' +author: 'Till Schneider' +tags: ['audit', 'calendar', 'production-readiness'] +score: 76 +scores: + backend: 90 + frontend: 85 + database: 92 + testing: 52 + deployment: 88 + documentation: 95 + security: 82 + ux: 72 +status: 'production' +stats: + backendModules: 13 + webRoutes: 19 + components: 50 + dbTables: 9 + testFiles: 9 + testCount: 48 + languages: 5 +--- + +## Zusammenfassung + +Die Calendar-App ist die **ausgereifteste App im Monorepo**. Starkes NestJS Backend mit 13 Modulen und 16 Services, umfangreiche Svelte 5 Web-App mit 50 Komponenten, und die beste Dokumentation aller Apps. Hauptlücken: Test-Coverage noch ausbaubar, keine Mobile-App, PWA nicht konfiguriert. + +## Backend (90/100) + +**Stärken:** + +- 13 Module: Calendar, Event, Tags, TagGroups, Reminder, Share, Sync, Network, Email, Notification, Admin, Health, Database +- 16 Services mit sauberer Trennung +- 15 DTO-Klassen mit class-validator +- CalDAV/iCal Sync-Integration (tsdav, ical.js) +- RFC 5545 Recurrence Support +- Admin-Endpoints für GDPR +- Credit Operations Integration + +**Lücken:** + +- Keine Controller-Tests (nur Service-Tests) + +## Frontend (85/100) + +**Stärken:** + +- 19 Routes, 50 Komponenten, 24 Stores (Svelte 5 Runes) +- Alle Kalender-Ansichten: Week, Month, Day, Agenda +- Drag & Drop Composables +- 10 API-Client Module +- Skeleton Loading States +- Keyboard Navigation (useCalendarKeyboard) + +**Lücken:** + +- Kein globaler Error Boundary (+error.svelte) +- PWA Dependencies vorhanden aber nicht konfiguriert + +## Database (92/100) + +**Stärken:** + +- 9 Tabellen mit durchdachtem Schema +- Advisory Lock Migrations +- Drizzle ORM mit Type Safety +- JSONB für flexible Settings/Metadata +- Proper Indexes + +## Testing (52/100) + +**Stärken:** + +- 4 Backend Service-Specs + Mock Factories +- 5 Frontend Unit Tests (date helpers, event filtering) +- 5 Playwright E2E Tests (auth, views, CRUD, settings) +- Jest Config mit 80% Coverage Threshold + +**Lücken:** + +- Keine Controller-Tests +- Keine Integration-Tests +- Backend-Coverage unter 50% + +## Deployment (88/100) + +**Stärken:** + +- Multi-Stage Dockerfiles (Backend + Web) +- Health Checks konfiguriert +- docker-compose.macmini.yml Einträge +- Entrypoint Scripts mit DB-Wait-Logic + +**Lücken:** + +- Kein eigener CI/CD Job + +## Security (82/100) + +**Stärken:** + +- JwtAuthGuard auf allen Endpoints +- ThrottlerModule (100 req/min) +- ServiceAuthGuard für Admin +- CORS konfiguriert +- Encryption für CalDAV-Passwörter + +**Lücken:** + +- Kein Audit-Logging + +## UX (72/100) + +**Stärken:** + +- 5 Sprachen (DE, EN, FR, ES, IT) +- Keyboard Shortcuts +- Responsive Design +- Loading Skeletons +- Mini-Calendar Navigation + +**Lücken:** + +- PWA nicht aktiv +- Keine Offline-Sync +- Kein Error Boundary +- Mobile App fehlt komplett + +## Top-3 Empfehlungen + +1. **PWA aktivieren** - Dependencies sind da, nur Config fehlt. Service Worker + Manifest +2. **Test-Coverage auf 70% bringen** - Controller-Tests, Integration-Tests für Sharing/Recurrence +3. **Error Boundary** - `+error.svelte` in (app) Route Group hinzufügen diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-chat.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-chat.md new file mode 100644 index 000000000..2d03f9e4e --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-chat.md @@ -0,0 +1,64 @@ +--- +title: 'Chat: Production Readiness Audit' +description: 'AI-Chat mit 9 Backend-Modulen, 9 KI-Modellen (Ollama + OpenRouter), 5 Sprachen, deployed auf mana.how - aber keine Tests' +date: 2026-03-19 +app: 'chat' +author: 'Till Schneider' +tags: ['audit', 'chat', 'production-readiness', 'ai'] +score: 74 +scores: + backend: 88 + frontend: 82 + database: 85 + testing: 0 + deployment: 92 + documentation: 85 + security: 72 + ux: 80 +status: 'production' +stats: + backendModules: 9 + webRoutes: 24 + components: 17 + dbTables: 7 + testFiles: 0 + testCount: 0 + languages: 5 +--- + +## Zusammenfassung + +Chat ist die **feature-reichste AI-App** im Monorepo mit 9 KI-Modellen (7 lokale Ollama + 2 Cloud OpenRouter), deployed auf mana.how. Vollständige Multi-Plattform (Web, Mobile, Landing). Größte Schwäche: keine Tests. + +## Backend (88/100) + +- 9 Module: Chat, Conversation, Template, Space, Document, Model, Admin, Database, Health +- 7 Controller mit CRUD +- ManaCoreModule Integration (Auth + Credits) +- MetricsModule für Monitoring +- Health Checks konfiguriert +- **Lücke:** Kein Rate Limiting, nur 2 DTOs + +## Frontend (82/100) + +- 24 Web-Routes, 17 Komponenten, 10 Stores +- 5 Sprachen (DE, EN, IT, FR, ES) +- Mobile App (Expo SDK 52) vorhanden +- Landing Page (Astro) vorhanden +- **Lücke:** Keine PWA, kein Error Boundary + +## Testing (0/100) + +**Keine Tests.** Kritische Lücke für eine deployed App. + +## Deployment (92/100) + +- Deployed auf mana.how (Backend: Port 3030, Web: Port 5010) +- Docker Multi-Stage Builds +- Health Checks konfiguriert + +## Top-3 Empfehlungen + +1. **Tests schreiben** - Chat/Conversation Service Specs (kritisch für deployed App) +2. **Rate Limiting** - ThrottlerModule besonders für AI-Endpoints +3. **PWA aktivieren** - Dependencies vorhanden diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-clock.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-clock.md new file mode 100644 index 000000000..ff8eceb0f --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-clock.md @@ -0,0 +1,58 @@ +--- +title: 'Clock: Production Readiness Audit' +description: 'Uhr-App mit Alarmen, Timern und Weltzeiten - deployed aber ohne Dokumentation und Tests' +date: 2026-03-19 +app: 'clock' +author: 'Till Schneider' +tags: ['audit', 'clock', 'production-readiness'] +score: 58 +scores: + backend: 75 + frontend: 70 + database: 72 + testing: 0 + deployment: 88 + documentation: 10 + security: 60 + ux: 55 +status: 'beta' +stats: + backendModules: 7 + webRoutes: 17 + components: 7 + dbTables: 4 + testFiles: 0 + testCount: 0 + languages: 2 +--- + +## Zusammenfassung + +Clock ist eine **fokussierte Utility-App** mit Alarmen, Timern, Weltzeiten und Presets. Deployed auf mana.how, aber schwach dokumentiert und ohne Tests. + +## Backend (75/100) + +- 7 Module: Alarm, Timer, WorldClock, Preset, Admin, Database, Health +- 5 Controller, Scheduled Tasks (@nestjs/schedule) +- Metrics + Health Checks +- **Lücke:** Kein Rate Limiting, nur 1 DTO + +## Frontend (70/100) + +- 17 Routes, 7 Komponenten, 10 Stores +- 2 Sprachen (DE, EN) +- **Lücke:** Wenige Komponenten, kein PWA + +## Documentation (10/100) + +**Kein CLAUDE.md vorhanden.** Kritische Lücke. + +## Testing (0/100) + +**Keine Tests.** + +## Top-3 Empfehlungen + +1. **CLAUDE.md erstellen** - API-Endpoints, Schema, Commands dokumentieren +2. **Tests** - Alarm/Timer Service Specs +3. **Rate Limiting** hinzufügen diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-contacts.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-contacts.md new file mode 100644 index 000000000..b975b2fa0 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-contacts.md @@ -0,0 +1,60 @@ +--- +title: 'Contacts: Production Readiness Audit' +description: 'Kontaktverwaltung mit 14 Backend-Modulen, Google OAuth Import, Duplikaterkennung - die vollständigste App neben Calendar' +date: 2026-03-19 +app: 'contacts' +author: 'Till Schneider' +tags: ['audit', 'contacts', 'production-readiness'] +score: 80 +scores: + backend: 92 + frontend: 85 + database: 88 + testing: 58 + deployment: 90 + documentation: 88 + security: 85 + ux: 65 +status: 'production' +stats: + backendModules: 14 + webRoutes: 20 + components: 36 + dbTables: 6 + testFiles: 5 + testCount: 62 + languages: 2 +--- + +## Zusammenfassung + +Contacts ist neben Calendar die **vollständigste App** mit 14 Backend-Modulen, Google OAuth Import, Duplikaterkennung, Batch-Operationen und S3 Photo-Storage. Deployed auf mana.how. + +## Backend (92/100) + +- 14 Module: Contact, Tag, Note, Activity, Photo, Import, Export, Google, Duplicates, Batch, Network, Admin, Database, Health +- 12 Controller, 4 DTOs, 27 Auth Guard Usages +- **Rate Limiting aktiv** (100 req/min) - einzige App neben Calendar +- S3 Storage Integration (MinIO/Hetzner) +- GDPR Admin-Endpoints + +## Frontend (85/100) + +- 20 Routes, 36 Komponenten (meiste aller Apps), 11 Stores +- **Lücke:** Nur 2 Sprachen (DE, EN) + +## Testing (58/100) + +- 5 Test-Files mit 62 Tests + Service-Specs +- Mock Factories vorhanden +- **Lücke:** Keine E2E Tests + +## Security (85/100) + +- Rate Limiting ✓, Auth Guards ✓, Google OAuth ✓, GDPR ✓, CORS ✓ + +## Top-3 Empfehlungen + +1. **i18n erweitern** - Mindestens FR, IT, ES wie Chat/Calendar +2. **E2E Tests** - Import/Export Flows, Duplikaterkennung +3. **PWA aktivieren** diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-context.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-context.md new file mode 100644 index 000000000..5ff268533 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-context.md @@ -0,0 +1,66 @@ +--- +title: 'Context: Production Readiness Audit' +description: 'KI-Dokumentenverwaltung mit neuem NestJS Backend, 70 Tests - aber noch nicht containerisiert oder deployed' +date: 2026-03-19 +app: 'context' +author: 'Till Schneider' +tags: ['audit', 'context', 'production-readiness', 'ai'] +score: 60 +scores: + backend: 75 + frontend: 75 + database: 82 + testing: 55 + deployment: 25 + documentation: 85 + security: 68 + ux: 65 +status: 'beta' +stats: + backendModules: 5 + webRoutes: 15 + components: 10 + dbTables: 5 + testFiles: 4 + testCount: 70 + languages: 2 +--- + +## Zusammenfassung + +Context hat gerade ein **neues NestJS Backend** bekommen (Port 3020) mit AI-Generation, Token-Economy und 70 Unit Tests. Web-App von Supabase auf API-Client migriert. Aber noch nicht containerisiert. + +## Backend (75/100) + +- 5 Module: Space, Document, AI, Token, Database +- AI-Generation server-seitig (Azure OpenAI + Google Gemini) +- Token-Economy mit Balance, Stats, Transactions +- Rate Limiting konfiguriert (ThrottlerModule) +- **Lücke:** Keine DTOs (class-validator), kein Admin-Modul + +## Frontend (75/100) + +- 15 Routes, 10 Komponenten, 7 Stores +- 2 Sprachen (DE, EN) +- Svelte 5 Runes, API Client Pattern +- **Lücke:** Kein PWA, kein Error Boundary + +## Testing (55/100) + +- 4 Test-Suites, 70 Tests (Space, Document, Token, AI) +- Mock Factories + Mock DB Infra +- Jest mit 80% Coverage Threshold +- **Lücke:** Keine Controller-Tests, keine E2E Tests + +## Deployment (25/100) + +- **Nicht containerisiert** (kein Dockerfile) +- Nicht in docker-compose.macmini.yml +- Nicht deployed +- Env-Generation funktioniert ✓ + +## Top-3 Empfehlungen + +1. **Dockerfiles erstellen** - Backend + Web Multi-Stage Builds +2. **DTOs hinzufügen** - class-validator für alle Endpoints +3. **Production Deployment** - docker-compose.macmini.yml + Deploy-Script diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-manacore.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-manacore.md new file mode 100644 index 000000000..14ea0a4de --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-manacore.md @@ -0,0 +1,63 @@ +--- +title: 'ManaCore: Production Readiness Audit' +description: 'Multi-App Ecosystem Dashboard mit 33 Web-Routes, Mobile App, Landing Page - das Herzstück des Monorepos' +date: 2026-03-19 +app: 'manacore' +author: 'Till Schneider' +tags: ['audit', 'manacore', 'production-readiness', 'platform'] +score: 65 +scores: + backend: 20 + frontend: 82 + database: 55 + testing: 0 + deployment: 78 + documentation: 88 + security: 72 + ux: 75 +status: 'beta' +stats: + backendModules: 0 + webRoutes: 33 + components: 35 + dbTables: 5 + testFiles: 0 + testCount: 0 + languages: 2 +--- + +## Zusammenfassung + +ManaCore ist das **Herzstück des Monorepos** - das Multi-App Dashboard und die Landing Page. Kein eigenes NestJS Backend (nutzt Supabase direkt + mana-core-auth). Starkes Frontend, deployed auf Cloudflare Pages. + +## Backend (20/100) + +- **Kein NestJS Backend** - nutzt Supabase SSR direkt +- Server-Side Auth via @supabase/ssr Hooks +- API Routes in SvelteKit (+server.ts) +- **Lücke:** Kein dedizierter Backend-Service + +## Frontend (82/100) + +- 33 Web-Routes (meiste aller Apps) +- 35 Komponenten, 6 Stores +- Multi-Tenant: Dashboard, Organizations, Teams, Apps, Settings +- Mobile App (Expo) mit Drawer + Tabs Navigation +- **PWA aktiv** - Service Worker + Offline Page + +## Documentation (88/100) + +- 228 Zeilen CLAUDE.md - umfassend +- Landing Page mit Devlogs, Blueprints, Audits, Apps, Legal, Privacy + +## Deployment (78/100) + +- Landing deployed auf Cloudflare Pages +- Web Dockerfile vorhanden +- **Lücke:** Kein docker-compose.macmini.yml für Dashboard + +## Top-3 Empfehlungen + +1. **Tests** - Auth Flow E2E Tests, Multi-Tenant Routing Tests +2. **Dashboard Deployment** - Web-App auf mana.how deployen +3. **i18n erweitern** - Nur 2 Sprachen aktuell diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-manadeck.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-manadeck.md new file mode 100644 index 000000000..7e573ec71 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-manadeck.md @@ -0,0 +1,61 @@ +--- +title: 'ManaDeck: Production Readiness Audit' +description: 'Kartenmanagement-App mit Cloud Run Deployment, 5 Sprachen - aber kein CLAUDE.md, keine DTOs, keine DB-Schemas' +date: 2026-03-19 +app: 'manadeck' +author: 'Till Schneider' +tags: ['audit', 'manadeck', 'production-readiness'] +score: 48 +scores: + backend: 50 + frontend: 65 + database: 30 + testing: 18 + deployment: 80 + documentation: 25 + security: 55 + ux: 68 +status: 'alpha' +stats: + backendModules: 2 + webRoutes: 19 + components: 5 + dbTables: 0 + testFiles: 1 + testCount: 8 + languages: 5 +--- + +## Zusammenfassung + +ManaDeck hat als einzige App ein **Cloud Run Deployment** (CI/CD via GitHub Actions), aber die Codebasis ist die schwächste: keine DB-Schemas (Supabase direkt), kein CLAUDE.md, keine DTOs. + +## Backend (50/100) + +- Nur 2 Module (minimal) +- 4 Controller, aber keine DTOs +- ManaCoreModule Integration +- **Lücke:** Keine lokale DB-Schemas, kein Rate Limiting + +## Frontend (65/100) + +- 19 Routes, aber nur 5 Komponenten +- 7 Stores, 5 Sprachen (DE, EN, IT, FR, ES) +- Mobile App (Expo) vorhanden +- Landing Page (Astro, Cloudflare) +- **Lücke:** Wenige Komponenten für viele Routes + +## Database (30/100) + +- **Keine Drizzle Schemas** - nutzt Supabase direkt +- Kein lokales DB-Management + +## Documentation (25/100) + +- **Kein CLAUDE.md** - nur verstreute READMEs und Guides + +## Top-3 Empfehlungen + +1. **CLAUDE.md erstellen** +2. **Drizzle Schema Migration** - Von Supabase auf lokale DB wie alle anderen Apps +3. **DTOs hinzufügen** diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-matrix.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-matrix.md new file mode 100644 index 000000000..b913a5a4e --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-matrix.md @@ -0,0 +1,74 @@ +--- +title: 'Matrix (Manalink): Production Readiness Audit' +description: 'Dezentraler Chat-Client mit E2EE, VoIP, voller PWA - deployed auf link.mana.how, die Privacy-First App' +date: 2026-03-19 +app: 'matrix' +author: 'Till Schneider' +tags: ['audit', 'matrix', 'production-readiness', 'privacy', 'e2ee'] +score: 68 +scores: + backend: 10 + frontend: 78 + database: 20 + testing: 12 + deployment: 92 + documentation: 92 + security: 88 + ux: 82 +status: 'production' +stats: + backendModules: 0 + webRoutes: 7 + components: 18 + dbTables: 0 + testFiles: 2 + testCount: 5 + languages: 2 +--- + +## Zusammenfassung + +Manalink ist der **dezentrale Chat-Client** auf Basis des Matrix-Protokolls. Kein eigenes Backend (nutzt Matrix Homeserver). Deployed auf link.mana.how mit voller PWA, E2EE und VoIP. + +## Backend (10/100) + +- **Kein eigenes Backend** - Client-Only Architektur +- Nutzt Matrix Homeserver (matrix.mana.how) als Backend +- Alle Logik client-seitig (matrix-js-sdk) + +## Frontend (78/100) + +- 7 Routes, 18 Komponenten, 3 Stores +- ChatWindow, RoomList, MessageInput, VoipCall, E2EEVerification +- **Volle PWA** - Installierbar, Offline-fähig, Push + +## Security (88/100) + +- **End-to-End Encryption** (matrix-sdk-crypto-wasm) +- Privacy-First: Alle Encryption client-seitig +- Client-seitiges Rate Limiting (8 Refs) +- **Stärkste Security aller Apps** + +## UX (82/100) + +- **Volle PWA** - Service Worker, Offline, Installierbar +- Smart Caching: NetworkFirst für API, CacheFirst für Media +- VoIP via WebRTC +- **Lücke:** Nur 2 Sprachen, Mobile minimal + +## Documentation (92/100) + +- 259 Zeilen CLAUDE.md (umfangreichste Doku) +- Matrix SDK Integration, PWA Caching, Crypto dokumentiert + +## Deployment (92/100) + +- Deployed auf link.mana.how +- Docker + docker-compose.macmini.yml +- Matrix Homeserver (Synapse) konfiguriert + +## Top-3 Empfehlungen + +1. **Tests** - E2EE Setup, Room Management, Message Sending +2. **i18n** - Über 2 Sprachen hinaus +3. **Mobile App** - Expo Implementation für nativen Push diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-mukke.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-mukke.md new file mode 100644 index 000000000..5660aa1ca --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-mukke.md @@ -0,0 +1,143 @@ +--- +title: 'Mukke: Production Readiness Audit' +description: 'Bewertung der Musik-App - vollständiges Backend mit Library/Playlist/Export, Audio-Editor Web-App, aber neue App ohne Produktions-Erfahrung' +date: 2026-03-19 +app: 'mukke' +author: 'Till Schneider' +tags: ['audit', 'mukke', 'production-readiness'] +score: 71 +scores: + backend: 85 + frontend: 78 + database: 82 + testing: 45 + deployment: 85 + documentation: 80 + security: 68 + ux: 60 +status: 'beta' +stats: + backendModules: 11 + webRoutes: 16 + components: 10 + dbTables: 7 + testFiles: 3 + testCount: 35 + languages: 1 +--- + +## Zusammenfassung + +Mukke ist eine **feature-reiche Musik-App** mit vollständigem Backend (Library, Playlists, Projects, Beats, Markers, Lyrics, Export) und einer Web-App mit Audio-Editor basierend auf wavesurfer.js. Solide Basis, aber noch nicht in Produktion deployed. Hauptlücken: nur 1 Sprache, keine Rate Limiting, Mobile archiviert. + +## Backend (85/100) + +**Stärken:** + +- 11 Module: Song, Playlist, Project, Beat, Marker, Lyrics, Export, Library, STT, Database, Health +- 8 Controller mit vollständigem CRUD +- DTOs für alle Ressourcen (SongUploadDto, MarkerDto, PlaylistDto, etc.) +- Export-Service: LRC, SRT, JSON Formate +- S3 Presigned URLs für Uploads/Downloads +- BPM Detection, Waveform Data + +**Lücken:** + +- Kein Rate Limiting (ThrottlerModule fehlt) +- Keine Admin-Endpoints + +## Frontend (78/100) + +**Stärken:** + +- 16 Routes: Dashboard, Library (Albums/Artists/Genres), Playlists, Projects, Editor, Search, Upload +- wavesurfer.js Audio-Visualisierung +- Svelte 5 Runes: 8 Stores (player, playlist, library, editor, etc.) +- FullPlayer, MiniPlayer, QueuePanel Komponenten +- Karaoke-Preview, MarkerTimeline + +**Lücken:** + +- Nur 10 Komponenten (relativ wenige für die Komplexität) +- Kein Error Boundary +- Keine Skeleton Loading States + +## Database (82/100) + +**Stärken:** + +- 7 Tabellen: songs, playlists, playlist_songs, projects, beats, markers, lyrics +- Proper JSONB für Metadata (waveform, tags) +- Drizzle ORM mit Type Safety +- Seed-Daten vorhanden + +**Lücken:** + +- Keine Volltextsuche-Indexes +- lyrics/lyric_lines Schema könnte optimiert werden + +## Testing (45/100) + +**Stärken:** + +- 3 Service-Specs: song, playlist, library (678 LOC) +- Jest Config mit 80% Threshold +- Mock Factories vorhanden + +**Lücken:** + +- Keine Controller-Tests +- Keine Frontend-Tests +- Keine E2E Tests +- Coverage deutlich unter Threshold + +## Deployment (85/100) + +**Stärken:** + +- Multi-Stage Dockerfiles (Backend + Web) +- Health Checks konfiguriert +- Entrypoint Scripts mit DB-Readiness Check +- S3 Storage Bucket konfiguriert (MinIO) + +**Lücken:** + +- Noch nicht in Produktion deployed +- Kein docker-compose.macmini.yml Eintrag +- Kein CI/CD Pipeline + +## Security (68/100) + +**Stärken:** + +- JwtAuthGuard auf allen Endpoints +- CurrentUser Decorator +- ParseUUIDPipe für Input Validation +- CORS konfiguriert + +**Lücken:** + +- **Kein Rate Limiting** - kritisch für Upload-Endpoints +- Keine GDPR-Endpoints (Admin) +- Keine File-Size Validation im Backend + +## UX (60/100) + +**Stärken:** + +- Audio-Player mit Queue, Shuffle, Repeat +- Waveform-Editor +- PWA Dependencies vorhanden + +**Lücken:** + +- **Nur Englisch** - kein i18n konfiguriert +- Keine Offline-Funktionalität +- Mobile App archiviert +- Keine Accessibility-Features dokumentiert + +## Top-3 Empfehlungen + +1. **Rate Limiting hinzufügen** - ThrottlerModule besonders für Upload-Endpoints kritisch +2. **i18n einrichten** - Mindestens DE + EN wie alle anderen Apps +3. **Production Deployment** - docker-compose.macmini.yml Eintrag + CI/CD Job diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-nutriphi.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-nutriphi.md new file mode 100644 index 000000000..1a007972d --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-nutriphi.md @@ -0,0 +1,67 @@ +--- +title: 'NutriPhi: Production Readiness Audit' +description: 'Ernährungstracking mit Gemini AI Food-Analyse, 8 Backend-Modulen und 1.457 Test-Zeilen - aber nicht deployed' +date: 2026-03-19 +app: 'nutriphi' +author: 'Till Schneider' +tags: ['audit', 'nutriphi', 'production-readiness', 'ai'] +score: 63 +scores: + backend: 78 + frontend: 62 + database: 80 + testing: 58 + deployment: 40 + documentation: 85 + security: 68 + ux: 55 +status: 'beta' +stats: + backendModules: 8 + webRoutes: 10 + components: 5 + dbTables: 6 + testFiles: 8 + testCount: 45 + languages: 2 +--- + +## Zusammenfassung + +NutriPhi ist ein **AI-gestütztes Ernährungstracking** mit Google Gemini für Food-Analyse. Solides Backend mit guter Doku und Tests, aber nicht deployed und schwache Web-UI. + +## Backend (78/100) + +- 8 Module: Analysis, Favorites, Goals, Meal, Recommendations, Stats, Utils, Database +- 6 Controller, Gemini AI Integration +- 18 Auth Guard Usages +- **Lücke:** Keine DTOs, kein Rate Limiting + +## Frontend (62/100) + +- Nur 10 Routes, 5 Komponenten, 2 Stores +- Minimal für die Feature-Komplexität +- **Lücke:** Wenig State Management, kein PWA + +## Testing (58/100) + +- 8 Test-Files, 1.457 LOC Tests (~45 Tests) +- Gute Coverage für Backend Services +- **Lücke:** Keine E2E Tests + +## Documentation (85/100) + +- 368 Zeilen CLAUDE.md - sehr umfassend +- Gemini Integration, Schema, API alles dokumentiert + +## Deployment (40/100) + +- Dockerfiles vorhanden, aber **nicht deployed** +- Kein docker-compose.macmini.yml Eintrag +- Landing Page auf Cloudflare Pages + +## Top-3 Empfehlungen + +1. **Production Deployment** - docker-compose.macmini.yml + Deploy +2. **Rate Limiting** - ThrottlerModule für AI-Endpoints +3. **Web-UI ausbauen** - Mehr Komponenten, Stores, Interaktivität diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-photos.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-photos.md new file mode 100644 index 000000000..9a260d698 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-photos.md @@ -0,0 +1,60 @@ +--- +title: 'Photos: Production Readiness Audit' +description: 'Fotogalerie mit Alben, Tags, Favorites - deployed auf mana.how mit mana-media Integration, aber keine Tests' +date: 2026-03-19 +app: 'photos' +author: 'Till Schneider' +tags: ['audit', 'photos', 'production-readiness'] +score: 62 +scores: + backend: 82 + frontend: 65 + database: 72 + testing: 0 + deployment: 85 + documentation: 78 + security: 65 + ux: 55 +status: 'beta' +stats: + backendModules: 7 + webRoutes: 12 + components: 20 + dbTables: 5 + testFiles: 0 + testCount: 0 + languages: 3 +--- + +## Zusammenfassung + +Photos ist eine **Fotogalerie-App** mit Alben, Tags, Favorites und mana-media Proxy-Integration. Deployed auf mana.how (photos-api.mana.how, photos.mana.how). + +## Backend (82/100) + +- 7 Module: Album, Image, Favorite, Tag, Profile, Admin, Health +- 26 API-Endpoints (umfangreichste API) +- 3 DTOs, ServiceAuthGuard +- mana-media Integration für Medien-Storage +- **Lücke:** Kein Rate Limiting + +## Frontend (65/100) + +- 12 Routes, 20 Komponenten, 25 Stores (komplexer State) +- 3 Sprachen +- **Lücke:** Nur 2 direkte API-Calls (nutzt mana-media Proxy) + +## Testing (0/100) + +**Keine Tests.** + +## Deployment (85/100) + +- Deployed auf mana.how (Port 3039 Backend, 5019 Web) +- Dockerfiles + prod URLs dokumentiert + +## Top-3 Empfehlungen + +1. **Tests** - Album/Image Service Specs +2. **Rate Limiting** - Für Upload-Endpoints +3. **PWA** - Für Offline-Bildbetrachtung diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-picture.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-picture.md new file mode 100644 index 000000000..a7f7f30de --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-picture.md @@ -0,0 +1,64 @@ +--- +title: 'Picture: Production Readiness Audit' +description: 'AI-Bildgenerierung mit 11 Modulen, Replicate Integration, Credit-System, 5 Sprachen - deployed aber ohne Rate Limiting' +date: 2026-03-19 +app: 'picture' +author: 'Till Schneider' +tags: ['audit', 'picture', 'production-readiness', 'ai'] +score: 72 +scores: + backend: 85 + frontend: 80 + database: 85 + testing: 15 + deployment: 75 + documentation: 78 + security: 62 + ux: 78 +status: 'production' +stats: + backendModules: 11 + webRoutes: 19 + components: 25 + dbTables: 10 + testFiles: 2 + testCount: 5 + languages: 5 +--- + +## Zusammenfassung + +Picture ist die **AI-Bildgenerations-App** mit Replicate Integration, Boards, Explore-Feed und Credit-System. Deployed auf mana.how mit 5 Sprachen, aber kritische Sicherheitslücke: kein Rate Limiting. + +## Backend (85/100) + +- 11 Module: Generate, Image, Board, BoardItem, Model, Tag, Upload, Explore, Profile, Batch, Admin +- Replicate API Integration für AI-Bildgenerierung +- CreditClientService für Monetarisierung +- S3 Storage (MinIO/Hetzner) +- **Lücke:** Kein Rate Limiting (kritisch für AI-Endpoints) + +## Frontend (80/100) + +- 19 Routes, 25 Komponenten, 27 Stores (komplexeste State-Verwaltung) +- Canvas-Editor, Boards, Explore, Archive +- 5 Sprachen (DE, EN, IT, FR, ES) +- Mobile App (Expo) vorhanden +- **Lücke:** Kein PWA + +## Testing (15/100) + +- Nur 2 Test-Files mit ~5 Tests +- Minimale Coverage + +## Security (62/100) + +- Auth Guards ✓ (12 Usages) +- **KEIN Rate Limiting** - kritisch für kostenpflichtige AI-Generation +- Keine File-Size Validation + +## Top-3 Empfehlungen + +1. **Rate Limiting SOFORT** - ThrottlerModule, besonders für /generate Endpoint +2. **Test-Suite aufbauen** - Generate/Image Service Specs +3. **Web Dockerfile** - Nur Backend containerisiert diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-planta.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-planta.md new file mode 100644 index 000000000..4f30de749 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-planta.md @@ -0,0 +1,54 @@ +--- +title: 'Planta: Production Readiness Audit' +description: 'Pflanzentracker mit Gemini AI Analyse, Gießpläne - Early Stage ohne Tests und PWA' +date: 2026-03-19 +app: 'planta' +author: 'Till Schneider' +tags: ['audit', 'planta', 'production-readiness', 'ai'] +score: 50 +scores: + backend: 68 + frontend: 58 + database: 70 + testing: 0 + deployment: 45 + documentation: 62 + security: 55 + ux: 50 +status: 'alpha' +stats: + backendModules: 6 + webRoutes: 12 + components: 12 + dbTables: 4 + testFiles: 0 + testCount: 0 + languages: 3 +--- + +## Zusammenfassung + +Planta ist ein **Pflanzentracker** mit Gemini AI für Pflanzenerkennung/-analyse und Gießplänen. Frühe Phase mit funktionalem Backend aber ohne Tests. + +## Backend (68/100) + +- 6 Module: Plant, Photo, Analysis, WateringSchedule, Database, Health +- 4 Controller, 2 DTOs +- Gemini AI Integration +- **Lücke:** Kein Rate Limiting, wenig DTOs + +## Frontend (58/100) + +- 12 Routes, 12 Komponenten, 14 Stores +- 3 Sprachen +- **Lücke:** Kein PWA, kein Error Boundary + +## Testing (0/100) + +**Keine Tests.** + +## Top-3 Empfehlungen + +1. **Tests** - Plant/Analysis Service Specs +2. **Rate Limiting** - Für AI-Analyse Endpoints +3. **Deployment vorbereiten** diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-presi.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-presi.md new file mode 100644 index 000000000..c859fe3b0 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-presi.md @@ -0,0 +1,59 @@ +--- +title: 'Presi: Production Readiness Audit' +description: 'Präsentationstool mit Slides, Themes, Sharing - 6 Sprachen, starke Frontend-Architektur, aber keine Tests' +date: 2026-03-19 +app: 'presi' +author: 'Till Schneider' +tags: ['audit', 'presi', 'production-readiness'] +score: 55 +scores: + backend: 65 + frontend: 75 + database: 70 + testing: 0 + deployment: 55 + documentation: 80 + security: 55 + ux: 68 +status: 'beta' +stats: + backendModules: 7 + webRoutes: 16 + components: 18 + dbTables: 4 + testFiles: 0 + testCount: 0 + languages: 6 +--- + +## Zusammenfassung + +Presi ist ein **Präsentationstool** mit Decks, Slides, Themes und Sharing. Beste i18n (6 Sprachen) und stärkste Svelte 5 Adoption (66 Runes-Usages), aber keine Tests. + +## Backend (65/100) + +- 7 Module: Deck, Slide, Theme, SharedDeck, Admin, Database, Health +- 5 Controller, aber nur 1 DTO +- 2 Migrations vorhanden +- **Lücke:** Kein Rate Limiting, minimale DTOs + +## Frontend (75/100) + +- 16 Routes, 18 Komponenten, 23 Stores +- **6 Sprachen** (DE, EN, IT, FR, ES + 1) - meiste aller Apps +- 66 Svelte 5 Runes Usages (beste Adoption) +- Mobile App Scaffolding vorhanden (Expo) + +## Testing (0/100) + +**Keine Tests.** + +## Documentation (80/100) + +- 232 Zeilen CLAUDE.md (zweitbeste Doku) + +## Top-3 Empfehlungen + +1. **Tests** - Deck/Slide Service Specs +2. **Rate Limiting** +3. **Production Deployment** diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-questions.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-questions.md new file mode 100644 index 000000000..6670bd775 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-questions.md @@ -0,0 +1,61 @@ +--- +title: 'Questions: Production Readiness Audit' +description: 'AI Research Assistant mit 32 Endpoints, 11 DTOs, 95 Validatoren - feature-reichstes Backend, aber kein Docker' +date: 2026-03-19 +app: 'questions' +author: 'Till Schneider' +tags: ['audit', 'questions', 'production-readiness', 'ai'] +score: 48 +scores: + backend: 88 + frontend: 62 + database: 78 + testing: 0 + deployment: 10 + documentation: 72 + security: 55 + ux: 55 +status: 'alpha' +stats: + backendModules: 8 + webRoutes: 12 + components: 16 + dbTables: 5 + testFiles: 0 + testCount: 0 + languages: 3 +--- + +## Zusammenfassung + +Questions hat das **komplexeste Backend** aller Apps: 32 Endpoints, 11 DTOs (265 LOC), 95 Validation Decorators. Aber komplett ohne Docker/Deployment-Infrastruktur. + +## Backend (88/100) + +- 8 Module: Collection, Question, Research, Source, Answer, Admin, Database, Health +- 32 Endpoints (meiste aller Apps) +- 11 DTOs, 265 LOC (beste Validation) +- 95 class-validator Decorators +- AI Research mit mana-search + mana-llm Integration + +## Frontend (62/100) + +- 12 Routes, 16 Komponenten, 21 Stores +- 3 Sprachen +- **Lücke:** Kein PWA, wenig Komponenten + +## Deployment (10/100) + +- **Kein Dockerfile** - weder Backend noch Web +- Kein docker-compose Eintrag +- Nicht deployed + +## Testing (0/100) + +**Keine Tests** trotz komplexer Business-Logik. + +## Top-3 Empfehlungen + +1. **Docker-Support** - Backend + Web Dockerfiles erstellen +2. **Tests** - Research/Question Service Specs (kritisch bei AI-Logik) +3. **Rate Limiting** - ThrottlerModule für AI-Research Endpoints diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-skilltree.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-skilltree.md new file mode 100644 index 000000000..4602cd0e8 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-skilltree.md @@ -0,0 +1,63 @@ +--- +title: 'Skilltree: Production Readiness Audit' +description: 'Gamifiziertes Skill-Tracking mit Offline-First IndexedDB, PWA, 4 Sprachen - solides MVP aber nicht deployed' +date: 2026-03-19 +app: 'skilltree' +author: 'Till Schneider' +tags: ['audit', 'skilltree', 'production-readiness'] +score: 58 +scores: + backend: 65 + frontend: 68 + database: 72 + testing: 28 + deployment: 55 + documentation: 62 + security: 65 + ux: 72 +status: 'beta' +stats: + backendModules: 4 + webRoutes: 6 + components: 7 + dbTables: 6 + testFiles: 2 + testCount: 12 + languages: 4 +--- + +## Zusammenfassung + +Skilltree ist ein **gamifiziertes Skill-Tracking** mit Offline-First Architektur (IndexedDB). Einzige App neben Matrix mit echtem PWA-Support und 4 Sprachen. + +## Backend (65/100) + +- 4 Module: Skill, Activity, Database, Health +- 3 DTOs, Rate Limiting konfiguriert +- **Lücke:** Minimal (4 Module) + +## Frontend (68/100) + +- 6 Routes, 7 Komponenten, 2 Stores +- Offline-First mit IndexedDB +- **PWA aktiv** - Service Worker + Offline Page +- 4 Sprachen (DE, EN, FR, ES) + +## Testing (28/100) + +- 2 Test-Files, 1.114 LOC (aber hauptsächlich Fixture-Daten) +- ~12 tatsächliche Tests +- **Lücke:** Keine Unit Tests für Services + +## UX (72/100) + +- PWA ✓, Offline-First ✓ +- 4 Sprachen ✓ +- Gamification mit Levels, Branches +- **Lücke:** Kein Error Boundary + +## Top-3 Empfehlungen + +1. **Production Deploy** - docker-compose.macmini.yml Eintrag +2. **Service-Tests** - Skill/Activity Service Specs +3. **Mehr Komponenten** - UI für Gamification erweitern diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-storage.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-storage.md new file mode 100644 index 000000000..5b65d52f8 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-storage.md @@ -0,0 +1,58 @@ +--- +title: 'Storage: Production Readiness Audit' +description: 'Cloud Drive mit 10 Backend-Modulen, File/Folder/Share/Trash - feature-complete aber null Tests und nicht deployed' +date: 2026-03-19 +app: 'storage' +author: 'Till Schneider' +tags: ['audit', 'storage', 'production-readiness'] +score: 55 +scores: + backend: 85 + frontend: 70 + database: 82 + testing: 0 + deployment: 42 + documentation: 78 + security: 72 + ux: 55 +status: 'beta' +stats: + backendModules: 10 + webRoutes: 17 + components: 10 + dbTables: 7 + testFiles: 0 + testCount: 0 + languages: 2 +--- + +## Zusammenfassung + +Storage hat das **ausgereifteste Backend** (10 Module) mit vollständigem Cloud-Drive (Files, Folders, Shares, Trash, Tags, Versions, Search). Aber null Tests und nicht deployed. + +## Backend (85/100) + +- 10 Module: File, Folder, Share, Storage, Search, Tag, Trash, Admin, Database, Health +- 7 Controller, 4 DTOs (beste DTO-Coverage nach Todo) +- 22 Auth Guard Usages (höchste nach Contacts) +- S3 Storage Integration + +## Frontend (70/100) + +- 17 Routes, 10 Komponenten, 5 Stores +- **Lücke:** Wenig Komponenten, kein PWA + +## Testing (0/100) + +**Keine Tests.** Kritische Lücke für eine File-Management App. + +## Deployment (42/100) + +- Dockerfiles vorhanden +- Nicht deployed, kein docker-compose Eintrag + +## Top-3 Empfehlungen + +1. **Tests** - File/Folder/Share Service Specs (kritisch für Datenverlust-Prävention) +2. **Production Deployment** - docker-compose.macmini.yml +3. **PWA + Offline** - Für Cloud Drive essentiell diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-todo.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-todo.md new file mode 100644 index 000000000..d659d3142 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-todo.md @@ -0,0 +1,63 @@ +--- +title: 'Todo: Production Readiness Audit' +description: 'Aufgabenverwaltung mit Kanban, Projekten, Labels, 19 DTOs und 39 Tests - deployed auf mana.how' +date: 2026-03-19 +app: 'todo' +author: 'Till Schneider' +tags: ['audit', 'todo', 'production-readiness'] +score: 79 +scores: + backend: 90 + frontend: 82 + database: 88 + testing: 60 + deployment: 90 + documentation: 90 + security: 82 + ux: 68 +status: 'production' +stats: + backendModules: 7 + webRoutes: 13 + components: 30 + dbTables: 8 + testFiles: 8 + testCount: 39 + languages: 2 +--- + +## Zusammenfassung + +Todo ist eine **feature-reiche Aufgabenverwaltung** mit Kanban-Boards, Projekten, Labels, Reminders und die App mit den **meisten DTOs** (19). Deployed auf mana.how mit solidem Testing. + +## Backend (90/100) + +- 7 Module: Project, Task, Label, Reminder, Kanban, Network, Admin +- 19 DTOs (beste Validation aller Apps) +- Rate Limiting (ThrottlerModule) +- MetricsModule, ManaCoreModule +- GDPR Admin-Endpoints + +## Frontend (82/100) + +- 13 Routes, 30 Komponenten, 13 Stores +- Kanban-Board, Spiral-View, Projekt-Views +- **Lücke:** Nur 2 Sprachen, kein PWA + +## Testing (60/100) + +- 8 Test-Files mit 39 Tests +- Backend + Frontend Tests vorhanden +- **Lücke:** Coverage noch unter 80% Threshold + +## Deployment (90/100) + +- Deployed auf mana.how (todo.mana.how) +- Multi-Stage Dockerfiles +- docker-compose.macmini.yml konfiguriert + +## Top-3 Empfehlungen + +1. **Test-Coverage auf 80% bringen** - Controller-Tests fehlen +2. **i18n erweitern** - Mindestens 5 Sprachen +3. **PWA aktivieren** diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-traces.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-traces.md new file mode 100644 index 000000000..b82f26fb2 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-traces.md @@ -0,0 +1,63 @@ +--- +title: 'Traces: Production Readiness Audit' +description: 'GPS-Tracking mit AI City Guides - 7 Backend-Module, Expo Mobile App, aber kein Docker, keine Tests, kein i18n' +date: 2026-03-19 +app: 'traces' +author: 'Till Schneider' +tags: ['audit', 'traces', 'production-readiness', 'ai', 'mobile'] +score: 35 +scores: + backend: 72 + frontend: 10 + database: 70 + testing: 0 + deployment: 8 + documentation: 45 + security: 55 + ux: 35 +status: 'alpha' +stats: + backendModules: 7 + webRoutes: 0 + components: 18 + dbTables: 8 + testFiles: 0 + testCount: 0 + languages: 0 +--- + +## Zusammenfassung + +Traces ist eine **Mobile-First GPS-Tracking App** mit AI City Guides (mana-search + mana-llm). Nur Expo Mobile App, keine Web-App. Größte Infrastruktur-Lücken aller Apps. + +## Backend (72/100) + +- 7 Module: Location, City, Place, POI, Guide, Database, Health +- AI-Integration: mana-search für POI Discovery, mana-llm für Narrativ-Generierung +- Credit System (5 Base + 2 pro POI) +- 10 Auth Guard Usages +- **Lücke:** Kein Rate Limiting, keine DTOs + +## Frontend (10/100) + +- **Keine Web-App** - nur Mobile (Expo) +- 20 Mobile Screens, 18 Komponenten +- 5 Tabs: Tracking, Orte, Karte, Städte, Führungen + +## Deployment (8/100) + +- **Kein Docker** - weder Backend noch Web/Mobile +- Kein docker-compose Eintrag +- Nicht deployed + +## UX (35/100) + +- **Kein i18n** - Deutsch hardcoded +- Kein Offline-Support +- Keine Web-App + +## Top-3 Empfehlungen + +1. **Docker-Support** - Backend Dockerfile erstellen +2. **Tests** - Location/Guide Service Specs +3. **i18n** - Mindestens DE + EN diff --git a/apps/manacore/apps/landing/src/content/audits/2026-03-19-zitare.md b/apps/manacore/apps/landing/src/content/audits/2026-03-19-zitare.md new file mode 100644 index 000000000..1ecef2179 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/audits/2026-03-19-zitare.md @@ -0,0 +1,139 @@ +--- +title: 'Zitare: Production Readiness Audit' +description: 'Bewertung der Zitat-App - schlankes Backend, deployed auf mana.how, aber keine Tests und fehlende Dokumentation' +date: 2026-03-19 +app: 'zitare' +author: 'Till Schneider' +tags: ['audit', 'zitare', 'production-readiness'] +score: 62 +scores: + backend: 72 + frontend: 78 + database: 75 + testing: 0 + deployment: 92 + documentation: 20 + security: 70 + ux: 75 +status: 'beta' +stats: + backendModules: 5 + webRoutes: 13 + components: 2 + dbTables: 2 + testFiles: 0 + testCount: 0 + languages: 2 +--- + +## Zusammenfassung + +Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare.mana.how). Schlankes Backend mit Favorites + Lists, solide Web-App mit Svelte 5 und PWA. Aber: **Null Tests**, kein CLAUDE.md, und das einfachste Schema aller Apps. Die App profitiert von der statischen Quote-Content-Bibliothek (64 Zitate in 6 Sprachen). + +## Backend (72/100) + +**Stärken:** + +- 5 Module: Favorite, List, Admin, Database, Health +- Saubere NestJS-Architektur +- Admin-Endpoints für GDPR (getUserData, deleteUserData) +- ServiceAuthGuard für Admin-Zugriff +- Conflict-Detection bei Favorites + +**Lücken:** + +- Nur 3 Controller (minimal) +- Keine Metrics/Monitoring +- Kein ThrottlerModule (Rate Limiting fehlt) + +## Frontend (78/100) + +**Stärken:** + +- 13 Routes: Home, Categories, Favorites, Lists, Search, Settings, Feedback +- 7 Stores (Svelte 5 Runes) inkl. SSO-Support +- QuoteCard Komponente mit Share, Favorite Toggle +- Kategorie-Gradients (10 Farben) +- Token Auto-Refresh auf 401 + +**Lücken:** + +- Nur 2 eigene Komponenten (sehr wenige) +- Kein Error Boundary +- Keine Skeleton Loading States + +## Database (75/100) + +**Stärken:** + +- 2 Tabellen: favorites, user_lists +- Unique Constraint auf (user_id, quote_id) +- JSONB für flexible quote_ids in Listen +- Drizzle ORM konfiguriert + +**Lücken:** + +- Kein Seed-Script +- Nur 2 Tabellen - sehr minimal +- Keine Indexes auf user_id (Performance bei Scale) + +## Testing (0/100) + +**Keine Tests vorhanden.** Weder Unit, Integration noch E2E Tests. Kein Jest Config. Größte Schwachstelle der App. + +## Deployment (92/100) + +**Stärken:** + +- **Produktiv deployed** auf zitare.mana.how +- Multi-Stage Dockerfiles (Backend + Web) +- Health Checks (30s Interval, 3 Retries) +- docker-compose.macmini.yml vollständig konfiguriert +- Backend + Web Services mit Dependency Chain +- CORS für Production Domain + +**Lücken:** + +- Kein automatischer CI/CD Job (manuelles Deployment) + +## Documentation (20/100) + +**Kritische Lücke:** Kein `apps/zitare/CLAUDE.md` vorhanden. Keine API-Dokumentation. Kein README. Nur die Monorepo-Root-Doku referenziert Zitare. + +## Security (70/100) + +**Stärken:** + +- JwtAuthGuard auf User-Endpoints +- ServiceAuthGuard auf Admin-Endpoints (X-Service-Key) +- GDPR-compliant: User Data Export + Deletion +- CORS konfiguriert für Production + +**Lücken:** + +- Kein Rate Limiting +- Keine Input-Sanitization über DTOs hinaus + +## UX (75/100) + +**Stärken:** + +- 2 Sprachen (DE, EN) mit svelte-i18n +- PWA konfiguriert (@vite-pwa/sveltekit) +- Offline Fallback Page +- Dark/Light Theme +- 64 kuratierte Zitate in 6 Sprachen +- Kategorie-basierte Navigation + +**Lücken:** + +- Keine Offline-Sync für Favorites +- Keine Push-Notifications ("Zitat des Tages") +- Mobile App fehlt +- Landing Page fehlt + +## Top-3 Empfehlungen + +1. **Tests schreiben** - Mindestens FavoriteService + ListService Specs (schnell machbar, ~100 Zeilen pro Service) +2. **CLAUDE.md erstellen** - API-Endpoints, Schema, Commands dokumentieren +3. **Rate Limiting** - ThrottlerModule hinzufügen, besonders für POST-Endpoints diff --git a/apps/manacore/apps/landing/src/content/config.ts b/apps/manacore/apps/landing/src/content/config.ts index a5a760985..31fa83046 100644 --- a/apps/manacore/apps/landing/src/content/config.ts +++ b/apps/manacore/apps/landing/src/content/config.ts @@ -181,6 +181,46 @@ const devlogCollection = defineCollection({ }), }); +const auditsCollection = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + description: z.string(), + date: z.date(), + app: z.string(), + author: z.string().default('Till Schneider'), + tags: z.array(z.string()).optional(), + // Overall score (0-100) + score: z.number().min(0).max(100), + // Category scores (0-100) + scores: z.object({ + backend: z.number().min(0).max(100), + frontend: z.number().min(0).max(100), + database: z.number().min(0).max(100), + testing: z.number().min(0).max(100), + deployment: z.number().min(0).max(100), + documentation: z.number().min(0).max(100), + security: z.number().min(0).max(100), + ux: z.number().min(0).max(100), + }), + // Readiness level + status: z.enum(['prototype', 'alpha', 'beta', 'production', 'mature']), + // Stats + stats: z + .object({ + backendModules: z.number().optional(), + webRoutes: z.number().optional(), + components: z.number().optional(), + dbTables: z.number().optional(), + testFiles: z.number().optional(), + testCount: z.number().optional(), + languages: z.number().optional(), + linesOfCode: z.number().optional(), + }) + .optional(), + }), +}); + const blueprintsCollection = defineCollection({ type: 'content', schema: z.object({ @@ -217,5 +257,6 @@ export const collections = { mission: missionCollection, context: contextCollection, devlog: devlogCollection, + audits: auditsCollection, blueprints: blueprintsCollection, }; diff --git a/apps/manacore/apps/landing/src/pages/audits/[slug].astro b/apps/manacore/apps/landing/src/pages/audits/[slug].astro new file mode 100644 index 000000000..cf336bd0e --- /dev/null +++ b/apps/manacore/apps/landing/src/pages/audits/[slug].astro @@ -0,0 +1,238 @@ +--- +import Layout from '../../layouts/Layout.astro'; +import Navbar from '../../components/navigation/Navbar.astro'; +import Footer from '../../components/navigation/Footer.astro'; +import Section from '../../components/content/Section.astro'; +import Container from '../../components/layout/Container.astro'; +import { getCollection } from 'astro:content'; + +export async function getStaticPaths() { + const audits = await getCollection('audits'); + return audits.map((audit) => ({ + params: { slug: audit.slug }, + props: { audit }, + })); +} + +const { audit } = Astro.props; +const { Content } = await audit.render(); + +const statusLabels: Record = { + prototype: 'Prototyp', + alpha: 'Alpha', + beta: 'Beta', + production: 'Production', + mature: 'Ausgereift', +}; + +const statusColors: Record = { + prototype: 'bg-red-500/10 text-red-500', + alpha: 'bg-orange-500/10 text-orange-500', + beta: 'bg-yellow-500/10 text-yellow-500', + production: 'bg-green-500/10 text-green-500', + mature: 'bg-emerald-500/10 text-emerald-500', +}; + +const categoryLabels: Record = { + backend: 'Backend', + frontend: 'Frontend', + database: 'Database', + testing: 'Testing', + deployment: 'Deployment', + documentation: 'Doku', + security: 'Security', + ux: 'UX', +}; + +function getScoreColor(score: number): string { + if (score >= 85) return 'text-emerald-500'; + if (score >= 70) return 'text-green-500'; + if (score >= 50) return 'text-yellow-500'; + if (score >= 30) return 'text-orange-500'; + return 'text-red-500'; +} + +function getBarColor(score: number): string { + if (score >= 85) return 'bg-emerald-500'; + if (score >= 70) return 'bg-green-500'; + if (score >= 50) return 'bg-yellow-500'; + if (score >= 30) return 'bg-orange-500'; + return 'bg-red-500'; +} +--- + + + + +
+ +
+ {/* Back link */} + + ← Alle Audits + + + {/* Header */} +
+
+ + {statusLabels[audit.data.status]} + + + { + audit.data.date.toLocaleDateString('de-DE', { + day: '2-digit', + month: 'long', + year: 'numeric', + }) + } + + + von {audit.data.author} + +
+ +

{audit.data.title}

+

{audit.data.description}

+
+ + {/* Overall Score */} +
+
+
+

Gesamtscore

+

Gewichteter Durchschnitt aus 8 Kategorien

+
+
+ + {audit.data.score} + + /100 +
+
+
+ + {/* Category Scores */} +
+

Kategorie-Scores

+
+ { + Object.entries(audit.data.scores).map(([key, value]) => ( +
+ + {categoryLabels[key] || key} + +
+
+
+ + {value} + +
+ )) + } +
+
+ + {/* Stats */} + { + audit.data.stats && ( +
+

Metriken

+
+ {audit.data.stats.backendModules !== undefined && ( +
+ + {audit.data.stats.backendModules} + + Backend Module +
+ )} + {audit.data.stats.webRoutes !== undefined && ( +
+ + {audit.data.stats.webRoutes} + + Web Routes +
+ )} + {audit.data.stats.components !== undefined && ( +
+ + {audit.data.stats.components} + + Komponenten +
+ )} + {audit.data.stats.dbTables !== undefined && ( +
+ + {audit.data.stats.dbTables} + + DB Tabellen +
+ )} + {audit.data.stats.testCount !== undefined && ( +
+ + {audit.data.stats.testCount} + + Tests +
+ )} + {audit.data.stats.testFiles !== undefined && ( +
+ + {audit.data.stats.testFiles} + + Test Files +
+ )} + {audit.data.stats.languages !== undefined && ( +
+ + {audit.data.stats.languages} + + Sprachen +
+ )} +
+
+ ) + } + + {/* Tags */} + { + audit.data.tags && audit.data.tags.length > 0 && ( +
+ {audit.data.tags.map((tag: string) => ( + + {tag} + + ))} +
+ ) + } + + {/* Content */} +
+ +
+
+ +
+ +