---
title: 'Presi: Production Readiness Audit'
description: 'Präsentationstool mit Slides, Themes, Sharing - 6 Sprachen, Swagger API-Docs, DB-Indexes, 72 Tests, Rate Limiting, deployed auf mana.how'
date: 2026-03-19
app: 'presi'
author: 'Till Schneider'
tags: ['audit', 'presi', 'production-readiness']
score: 86
scores:
  backend: 90
  frontend: 82
  database: 85
  testing: 82
  deployment: 75
  documentation: 90
  security: 85
  ux: 82
status: 'mature'
version: '0.2.0'
stats:
  backendModules: 7
  webRoutes: 16
  components: 18
  dbTables: 4
  testFiles: 10
  testCount: 72
  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). 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_idx`
  - `slides_deck_id_idx`, `slides_deck_order_idx`
  - `shared_decks_deck_id_idx`
  - `share_code` UNIQUE
- 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: `@IsIn` für type, `@IsUrl` fü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

1. **E2E Tests** - Playwright für kritische User Flows
2. **CI Pipeline** - GitHub Actions für PR Checks
3. **Pagination** - Deck-Listing mit Limit/Offset für große Datasets
