← Alle ManaScores
Ausgereift 19. März 2026
von Till Schneider
Presi: Production Readiness Audit
Präsentationstool mit Slides, Themes, Sharing - 6 Sprachen, Swagger API-Docs, DB-Indexes, 72 Tests, Rate Limiting, deployed auf mana.how
Gesamtscore
Gewichteter Durchschnitt aus 8 Kategorien
86 /100
Kategorie-Scores
Backend 90
Frontend 82
Database 85
Testing 82
Deployment 75
Doku 90
Security 85
UX 82
Metriken
7.086 Lines of Code
90 Source Files
0.7 MB (Source)
98 Commits
3 Contributors
2025-11-27 Erster Commit
18 API Endpoints
7 Backend Module
16 Web Routes
12 Stores
18 Komponenten
4 DB Tabellen
72 Tests
10 Test Files
6 Sprachen
48 TODOs/FIXMEs
675 Max File (LOC)
audit presi production-readiness
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). Swagger API-Docs, DB-Indexes auf allen Query-Pfaden, gehärtete DTO-Validation, 72 Tests und deployed auf mana.how.
Backend (90/100)
- 7 Module: Deck, Slide, Theme, SharedDeck, Admin, Database, Health
- 5 Controller mit DTOs für alle Entities (Deck, Slide, Share)
- Globaler ThrottlerGuard via APP_GUARD (100 Requests/60s)
- Swagger/OpenAPI-Dokumentation (
/api/docs) - ParseUUIDPipe auf allen ID-Parametern
- Admin-Endpoints mit ServiceAuthGuard (X-Service-Key)
- GDPR Data Export & Deletion Endpoints
- NestJS Exception Handling (NotFoundException, ForbiddenException)
Frontend (82/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)
- SvelteKit Error Boundary (+error.svelte)
- Presentation Mode mit Keyboard Navigation, Fullscreen, Timer, Speaker Notes
- PWA-Support via @vite-pwa/sveltekit
- Mobile App Scaffolding vorhanden (Expo)
Database (85/100)
- 4 normalisierte Tabellen mit Foreign Keys
- 7 Indexes auf allen Query-Pfaden:
decks_user_id_idx,decks_user_updated_idx,decks_theme_id_idxslides_deck_id_idx,slides_deck_order_idxshared_decks_deck_id_idxshare_codeUNIQUE
- Cascade Deletes (Slides, SharedDecks bei Deck-Löschung)
- JSONB Columns (SlideContent, ThemeColors, ThemeFonts)
- Timestamps with Timezone
- 2 Migrations vorhanden
Testing (82/100)
- 10 Test-Dateien, 72 Tests
- Service-Tests: Deck, Slide, Share, Theme, Admin (5 Specs)
- Controller-Tests: Deck, Slide, Share, Theme, Admin (5 Specs)
- Mock-Infrastruktur: Drizzle DB Mock, Service Mocks
- Error Cases: NotFoundException, ForbiddenException, Ownership-Checks
- Authorization Testing: verifyOwnership, ServiceAuthGuard
- Jest-Konfiguration mit ts-jest
Deployment (75/100)
- Multi-Stage Dockerfile mit node:20-alpine
- docker-compose.macmini.yml Konfiguration (Backend + Web)
- Health Checks (wget, 30s Interval)
- Environment-Konfiguration für Production
- Deployed auf presi.mana.how
Documentation (90/100)
- Swagger/OpenAPI Docs unter
/api/docs - ApiTags für alle 5 Controller (Decks, Slides, Share, Themes, Admin)
- ApiBearerAuth für authentifizierte Endpoints
- 232 Zeilen CLAUDE.md mit vollständiger API-Doku
- Environment Variables für alle Apps
Security (85/100)
- JwtAuthGuard auf allen User-Endpoints
- ServiceAuthGuard für Admin-Endpoints (X-Service-Key)
- Globaler ThrottlerGuard (Rate Limiting, 100 req/min)
- ParseUUIDPipe auf allen ID-Parametern (verhindert invalid UUID queries)
- Gehärtete DTO-Validation:
- String-Längen-Limits (title: 200, description: 2000, body: 5000)
- SlideContent:
@IsInfür type,@IsUrlfür imageUrl,@ArrayMaxSize(50)für bulletPoints @IsInt+@Min(0)für order-Felder@ArrayMaxSize(200)für Reorder-DTOs
- CORS konfiguriert
- GDPR Data Deletion Endpoint
- Ownership-Verification in allen mutierenden Services
UX (82/100)
- 6 Sprachen i18n (beste aller Apps)
- Error Boundary für graceful Error Handling
- PWA-Support
- Keyboard Navigation in Presentation Mode (Pfeiltasten, A/D, F, ESC)
- Fullscreen Presentation mit Timer und Speaker Notes
- Share via Link mit optionaler Expiration
Top-3 Empfehlungen
- E2E Tests - Playwright für kritische User Flows
- CI Pipeline - GitHub Actions für PR Checks
- Pagination - Deck-Listing mit Limit/Offset für große Datasets