From 40a3c89852d411ce0475c99eeb9341cd9a14cee0 Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Sat, 14 Feb 2026 00:02:53 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20docs(devlog):=20add=20devlogs=20?= =?UTF-8?q?for=20Feb=2012=20and=20Feb=2013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Feb 12: GDPR Self-Service, Matrix Mobile UX, Mac Mini Stability - Feb 13: Gift Codes, Stripe Integration, Zitare Deployment Co-Authored-By: Claude Opus 4.5 --- .../devlog/2026-02-12-gdpr-matrix-mac-mini.md | 426 +++++++++++ .../2026-02-13-gift-codes-stripe-zitare.md | 719 ++++++++++++++++++ 2 files changed, 1145 insertions(+) create mode 100644 apps/manacore/apps/landing/src/content/devlog/2026-02-12-gdpr-matrix-mac-mini.md create mode 100644 apps/manacore/apps/landing/src/content/devlog/2026-02-13-gift-codes-stripe-zitare.md diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-02-12-gdpr-matrix-mac-mini.md b/apps/manacore/apps/landing/src/content/devlog/2026-02-12-gdpr-matrix-mac-mini.md new file mode 100644 index 000000000..412f8472e --- /dev/null +++ b/apps/manacore/apps/landing/src/content/devlog/2026-02-12-gdpr-matrix-mac-mini.md @@ -0,0 +1,426 @@ +--- +title: 'GDPR Self-Service, Matrix Mobile UX & Mac Mini Stability' +description: 'Neue GDPR Self-Service Endpoints für Nutzer-Daten, Matrix Web Mobile-Navigation mit FAB und Room Restoration, Mac Mini Stability-Improvements mit Health Checks und Container Recovery' +date: 2026-02-12 +author: 'Till Schneider' +category: 'feature' +tags: + [ + 'gdpr', + 'dsgvo', + 'matrix', + 'mobile', + 'mac-mini', + 'stability', + 'monitoring', + 'docker', + 'admin', + 'health-checks', + ] +featured: true +commits: 22 +readTime: 10 +stats: + filesChanged: 102 + linesAdded: 9395 + linesRemoved: 126 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 22 +workingHours: + start: '2026-02-12T11:00' + end: '2026-02-13T11:00' +--- + +**22 Commits** mit Fokus auf DSGVO-Compliance, Mobile UX und Server-Stabilität: + +- **GDPR Self-Service** - Neue Endpoints für User Data Export +- **Matrix Mobile UX** - FAB für Sidebar, Room Restoration +- **Mac Mini Stability** - Health Checks, Container Recovery, LaunchD Fixes +- **Monitoring** - Alerting Stack mit Maintenance Scripts +- **Admin API Fixes** - Controller Route Prefix Korrekturen + +--- + +## GDPR Self-Service Endpoints + +Neue Self-Service Endpoints für Nutzer, um ihre Daten einzusehen und zu exportieren. + +### Architektur + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ GDPR Data Aggregation │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────┐ │ +│ │ User Request │ │ +│ │ /me/data │ │ +│ └────────┬────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────┐ ┌─────────────────────────────────────┐│ +│ │ mana-core-auth │────>│ Backend Services (parallel fetch) ││ +│ │ │ │ ││ +│ │ /me/data │ │ Calendar │ Todo │ Contacts │ ... ││ +│ └─────────────────┘ └─────────────────────────────────────┘│ +│ │ │ +│ ▼ │ +│ ┌─────────────────┐ │ +│ │ Aggregated │ │ +│ │ User Data │ │ +│ │ (JSON/ZIP) │ │ +│ └─────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### Neue Endpoints + +```typescript +// mana-core-auth: Self-Service Data +GET /me/data // Aggregierte Daten aller Services +GET /me/data/export // ZIP-Download für DSGVO-Auskunft +DELETE /me/data // Account und alle Daten löschen (Art. 17) + +// Backend Services: GDPR Endpoints +GET /admin/gdpr/users/:userId/data +DELETE /admin/gdpr/users/:userId/data +``` + +### Implementierung + +```typescript +// auth: me.controller.ts +@Get('data') +@UseGuards(JwtAuthGuard) +async getUserData(@CurrentUser() user: CurrentUserData) { + const services = ['calendar', 'todo', 'contacts', 'photos', 'clock', 'storage']; + + const dataPromises = services.map(async (service) => { + const url = this.configService.get(`${service.toUpperCase()}_BACKEND_URL`); + return this.fetchServiceData(url, user.userId); + }); + + const results = await Promise.allSettled(dataPromises); + return this.aggregateResults(results, services); +} +``` + +### Backend Integration + +Neue GDPR Endpoints zu Photos, Clock und Storage Backends hinzugefügt: + +| Backend | Endpoint | Daten | +| ------- | ---------------------------- | ------------------ | +| Photos | `/admin/gdpr/users/:id/data` | Fotos, Alben, EXIF | +| Clock | `/admin/gdpr/users/:id/data` | Timer, Sessions | +| Storage | `/admin/gdpr/users/:id/data` | Dateien, Ordner | + +--- + +## Matrix Web Mobile UX + +Verbesserte Mobile-Navigation für die Matrix PWA. + +### FAB für Sidebar + +```svelte + + + + +``` + +### Room Restoration + +Automatische Wiederherstellung des zuletzt ausgewählten Chats: + +```typescript +// Beim App-Start: Letzten Room wiederherstellen +onMount(() => { + const lastRoomId = localStorage.getItem('matrix:lastRoom'); + if (lastRoomId && rooms.find((r) => r.roomId === lastRoomId)) { + selectRoom(lastRoomId); + } +}); + +// Bei Room-Wechsel: Speichern +function selectRoom(roomId: string) { + currentRoomId = roomId; + localStorage.setItem('matrix:lastRoom', roomId); +} +``` + +### Message Interface Fix + +Fehlende Props zur Message.svelte Interface hinzugefügt: + +```typescript +interface MessageProps { + message: MatrixMessage; + isOwn: boolean; + showAvatar: boolean; + // Neu hinzugefügt: + onReply?: (msg: MatrixMessage) => void; + onReact?: (msg: MatrixMessage, emoji: string) => void; +} +``` + +--- + +## Mac Mini Stability Improvements + +Umfangreiche Verbesserungen für die Server-Stabilität. + +### Health Check Updates + +```yaml +# docker-compose.macmini.yml +services: + mana-core-auth: + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3001/health'] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + zitare-backend: + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health'] + # Korrigierter Pfad (vorher /api/health) +``` + +### Container Recovery Script + +```bash +#!/bin/bash +# scripts/mac-mini/container-recovery.sh + +UNHEALTHY=$(docker ps --filter "health=unhealthy" --format "{{.Names}}") + +for container in $UNHEALTHY; do + echo "Restarting unhealthy container: $container" + docker restart "$container" + + # Warte auf Health Check + sleep 30 + + # Prüfe Status + STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$container") + if [ "$STATUS" != "healthy" ]; then + echo "WARNING: $container still unhealthy after restart" + fi +done +``` + +### LaunchD Plist Fix + +```xml + + + + Label + com.mana.container-recovery + ProgramArguments + + /Users/till/projects/manacore-monorepo/scripts/mac-mini/container-recovery.sh + + StartInterval + 300 + StandardOutPath + /var/log/mana/container-recovery.log + + +``` + +### Disabled Services + +Temporär deaktivierte Services (fehlende Deployments): + +```yaml +# Auskommentiert bis Deployment fertig +# inventory-backend: +# nutriphi-backend: +# wisekeep-backend: +``` + +--- + +## Monitoring: Alerting Stack + +Neues Alerting-System mit Prometheus und Discord Notifications. + +### Alert Rules + +```yaml +# prometheus/alerts.yml +groups: + - name: service_alerts + rules: + - alert: ServiceDown + expr: up == 0 + for: 2m + labels: + severity: critical + annotations: + summary: '{{ $labels.job }} is down' + + - alert: HighMemoryUsage + expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9 + for: 5m + labels: + severity: warning + annotations: + summary: 'Memory usage above 90%' + + - alert: DiskSpaceLow + expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.1 + for: 10m + labels: + severity: critical + annotations: + summary: 'Disk space below 10%' +``` + +### Maintenance Scripts + +```bash +# scripts/mac-mini/maintenance.sh + +# 1. Docker Cleanup +docker system prune -f --volumes + +# 2. Log Rotation +find /var/log/mana -name "*.log" -mtime +7 -delete + +# 3. Health Report +./scripts/mac-mini/health-report.sh | tee /var/log/mana/daily-health.log +``` + +--- + +## Admin API Fixes + +Korrekturen für Controller Route Prefixes. + +### Problem + +Doppelte API-Prefixes führten zu 404-Fehlern: + +``` +GET /api/v1/api/v1/admin/users → 404 +``` + +### Lösung + +```typescript +// VORHER (falsch) +@Controller('api/v1/admin') // + Global Prefix = /api/v1/api/v1/admin +export class AdminController {} + +// NACHHER (korrekt) +@Controller('admin') // + Global Prefix = /api/v1/admin +export class AdminController {} +``` + +### Betroffene Controller + +| Service | Controller | Route | +| ------- | --------------- | ---------- | +| Auth | MeController | `/me/*` | +| Storage | AdminController | `/admin/*` | + +--- + +## Docker Fixes + +Mehrere Docker-Build Korrekturen. + +### mana-search Symlink Fix + +```dockerfile +# VORHER: Symlinks funktionieren nicht im Docker Context +COPY packages/shared-types ./packages/shared-types + +# NACHHER: pnpm deploy für korrekte Dependencies +RUN pnpm --filter @mana-search/service deploy --prod ./deploy + +FROM node:20-slim +COPY --from=build /app/deploy ./ +``` + +### Local Builds auf Mac Mini + +Weitere Services auf lokale Builds umgestellt: + +```yaml +presi-backend: + build: + context: . + dockerfile: apps/presi/apps/backend/Dockerfile + # Statt: image: ghcr.io/till-js/presi-backend + +skilltree-web: + build: + context: . + dockerfile: apps/skilltree/apps/web/Dockerfile + +mana-search: + build: + context: . + dockerfile: services/mana-search/Dockerfile +``` + +### Shared Packages in ManaCore Web + +```dockerfile +# Fehlende Packages hinzugefügt +COPY packages/shared-stores ./packages/shared-stores +COPY packages/shared-api-client ./packages/shared-api-client +COPY packages/shared-vite-config ./packages/shared-vite-config +``` + +--- + +## Calendar Database Fix + +User ID Felder zu Text geändert: + +```typescript +// VORHER (UUID) +userId: uuid('user_id').references(() => users.id); + +// NACHHER (Text für externe Auth) +userId: text('user_id').notNull(); +``` + +**Grund:** mana-core-auth verwendet String-basierte User IDs, nicht UUIDs. + +--- + +## Zusammenfassung + +| Bereich | Commits | Highlights | +| ---------------------- | ------- | --------------------------- | +| **GDPR Self-Service** | 4 | User Data Endpoints, Export | +| **Matrix Mobile** | 4 | FAB, Room Restore, Props | +| **Mac Mini Stability** | 5 | Health Checks, Recovery | +| **Monitoring** | 1 | Alerting Stack | +| **Admin API** | 3 | Route Prefix Fixes | +| **Docker** | 5 | Symlinks, Local Builds | + +--- + +## Nächste Schritte + +1. **GDPR Export UI** - Download-Button im mana.how Dashboard +2. **Matrix E2EE** - Ende-zu-Ende Verschlüsselung aktivieren +3. **Alertmanager** - Discord Webhook Integration +4. **Service Deployments** - Inventory, NutriPhi, WiseKeep diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-02-13-gift-codes-stripe-zitare.md b/apps/manacore/apps/landing/src/content/devlog/2026-02-13-gift-codes-stripe-zitare.md new file mode 100644 index 000000000..15eca9020 --- /dev/null +++ b/apps/manacore/apps/landing/src/content/devlog/2026-02-13-gift-codes-stripe-zitare.md @@ -0,0 +1,719 @@ +--- +title: 'Gift Codes, Stripe Integration & Zitare Deployment' +description: 'Neues Gift Code System mit Credit-Gutscheinen, Stripe Integration für Subscriptions und Credit-Käufe, Zitare Production Deployment mit multilingualer Quote-Datenbank, sowie Calendar Drag-to-Create und Matrix WhatsApp-Style Navigation' +date: 2026-02-13 +author: 'Till Schneider' +category: 'feature' +tags: + [ + 'gift-codes', + 'stripe', + 'subscriptions', + 'credits', + 'zitare', + 'calendar', + 'matrix', + 'avatar', + 'onboarding', + 'docker', + 'pwa', + ] +featured: true +commits: 55 +readTime: 18 +stats: + filesChanged: 287 + linesAdded: 20500 + linesRemoved: 5752 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 55 +workingHours: + start: '2026-02-13T11:00' + end: '2026-02-14T11:00' +--- + +Ein massiver Tag mit **55 Commits** und mehreren Major Features: + +- **Gift Codes** - Credit-Gutscheine mit Code-Einlösung +- **Stripe Integration** - Subscriptions und Credit-Käufe +- **Zitare Deployment** - Production-Ready mit multilingualer Quote-DB +- **Calendar UX** - Drag-to-Create, Resize Handles, Live Preview +- **Matrix Mobile** - WhatsApp-Style Navigation für PWA +- **Avatar Upload** - S3/MinIO Integration mit Onboarding +- **ManaCore Dashboard** - Profile, Subscriptions, Credits UI + +--- + +## Gift Codes & Credit System + +Neues Geschenkkarten-System für Credit-Gutscheine. + +### Architektur + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Gift Code System │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ Admin erstellt Code User löst Code ein │ +│ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ POST /gifts │ │ POST /gifts/ │ │ +│ │ │ │ redeem │ │ +│ │ code: MANA-XXX │ │ code: MANA-XXX │ │ +│ │ credits: 100 │ │ │ │ +│ │ maxUses: 10 │ └────────┬────────┘ │ +│ └─────────────────┘ │ │ +│ ▼ │ +│ ┌─────────────────┐ │ +│ │ Credit Balance │ │ +│ │ += 100 Credits │ │ +│ └─────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### API Endpoints + +```typescript +// Gift Codes verwalten +POST /api/v1/gifts // Code erstellen (Admin) +GET /api/v1/gifts // Alle Codes auflisten +GET /api/v1/gifts/:code // Code-Details abrufen +POST /api/v1/gifts/redeem // Code einlösen (User) +DELETE /api/v1/gifts/:code // Code löschen + +// Request Body: Code einlösen +{ + "code": "MANA-WELCOME-2026" +} + +// Response +{ + "success": true, + "credits": 100, + "message": "100 Credits wurden deinem Konto gutgeschrieben!" +} +``` + +### Database Schema + +```typescript +// auth.schema.ts +export const giftCodes = authSchema.table('gift_codes', { + id: text('id').primaryKey(), + code: text('code').notNull().unique(), + credits: integer('credits').notNull(), + maxUses: integer('max_uses').default(1), + currentUses: integer('current_uses').default(0), + expiresAt: timestamp('expires_at'), + createdBy: text('created_by').references(() => users.id), + createdAt: timestamp('created_at').defaultNow(), +}); + +export const giftRedemptions = authSchema.table('gift_redemptions', { + id: text('id').primaryKey(), + codeId: text('code_id').references(() => giftCodes.id), + userId: text('user_id').references(() => users.id), + redeemedAt: timestamp('redeemed_at').defaultNow(), +}); +``` + +### Matrix Bot Integration + +Gift Codes können auch via Matrix eingelöst werden: + +``` +User: !redeem MANA-WELCOME-2026 +Bot: ✅ Code eingelöst! Du hast 100 Credits erhalten. + Aktuelles Guthaben: 250 Credits +``` + +--- + +## Stripe Integration + +Vollständige Stripe-Anbindung für Payments. + +### Subscription Plans + +```typescript +// Subscription Tiers +const SUBSCRIPTION_PLANS = { + free: { + name: 'Free', + price: 0, + credits: 50, // monatlich + features: ['Basic Apps', '50 Credits/Monat'], + }, + plus: { + name: 'Plus', + price: 4.99, + stripePriceId: 'price_plus_monthly', + credits: 500, + features: ['Alle Apps', '500 Credits/Monat', 'Priority Support'], + }, + pro: { + name: 'Pro', + price: 14.99, + stripePriceId: 'price_pro_monthly', + credits: 2000, + features: ['Alle Apps', '2000 Credits/Monat', 'API Zugang', 'Priorität'], + }, +}; +``` + +### Credit Purchases + +```typescript +// Einmal-Käufe +POST /api/v1/credits/purchase +{ + "package": "credits_500" // 500 Credits für 4.99€ +} + +// Verfügbare Pakete +const CREDIT_PACKAGES = { + credits_100: { credits: 100, price: 0.99, stripePriceId: '...' }, + credits_500: { credits: 500, price: 4.99, stripePriceId: '...' }, + credits_1000: { credits: 1000, price: 8.99, stripePriceId: '...' }, + credits_5000: { credits: 5000, price: 39.99, stripePriceId: '...' }, +}; +``` + +### Webhook Handler + +```typescript +// stripe.controller.ts +@Post('webhook') +async handleWebhook(@Req() req: Request) { + const event = this.stripe.webhooks.constructEvent( + req.body, + req.headers['stripe-signature'], + this.webhookSecret, + ); + + switch (event.type) { + case 'checkout.session.completed': + await this.handleCheckoutComplete(event.data.object); + break; + case 'customer.subscription.updated': + await this.handleSubscriptionUpdate(event.data.object); + break; + case 'invoice.paid': + await this.handleInvoicePaid(event.data.object); + break; + } +} +``` + +--- + +## Zitare Production Deployment + +Zitare ist jetzt live auf zitare.mana.how! + +### Docker Infrastructure + +```yaml +# docker-compose.macmini.yml +zitare-backend: + build: + context: . + dockerfile: apps/zitare/apps/backend/Dockerfile + ports: + - '3007:3007' + environment: + DATABASE_URL: ${ZITARE_DATABASE_URL} + MANA_CORE_AUTH_URL: http://mana-core-auth:3001 + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health'] + +zitare-web: + build: + context: . + dockerfile: apps/zitare/apps/web/Dockerfile + ports: + - '5018:5018' + depends_on: + - zitare-backend +``` + +### @zitare/content Package + +Neues Package für shared Quotes: + +```typescript +// packages/zitare-content/src/quotes.ts +export interface Quote { + id: string; + text: string; + author: string; + source?: string; + year?: number; + language: 'de' | 'en'; + category: QuoteCategory; + tags: string[]; +} + +export const quotes: Quote[] = [ + { + id: 'goethe-001', + text: 'Es ist nicht genug zu wissen, man muss auch anwenden...', + author: 'Johann Wolfgang von Goethe', + source: 'Wilhelm Meisters Wanderjahre', + year: 1829, + language: 'de', + category: 'wisdom', + tags: ['wissen', 'handeln', 'motivation'], + }, + // ... 500+ Zitate +]; +``` + +### Multilingual Support + +```typescript +// Backend: Sprache aus Header +@Get('quote/daily') +getDailyQuote(@Headers('accept-language') lang: string) { + const language = lang?.startsWith('de') ? 'de' : 'en'; + return this.quoteService.getDailyQuote(language); +} + +// Frontend: i18n Integration +const { t, locale } = useTranslation(); +const quote = await fetchDailyQuote($locale); +``` + +### Quote Metadata + +Alle Zitate mit vollständigen Metadaten: + +| Feld | Beschreibung | +| ---------- | ----------------------------------- | +| `author` | Vollständiger Name | +| `source` | Buch/Werk/Rede | +| `year` | Entstehungsjahr | +| `category` | wisdom, motivation, love, life, ... | +| `tags` | Suchbare Schlagwörter | + +--- + +## Calendar UX Improvements + +Mehrere UX-Verbesserungen für den Kalender. + +### Drag-to-Create + +Events können jetzt durch Drag & Drop erstellt werden: + +```svelte + +``` + +### Live Time Preview + +Beim Ziehen wird die neue Zeit live angezeigt: + +```svelte +{#if dragStart && dragEnd} +
+ {formatTime(dragStart.hour)} - {formatTime(dragEnd.hour)} +
+{/if} +``` + +### Resize Handles + +Größere Resize-Handles für bessere Touch-Bedienbarkeit: + +```css +.event-resize-handle { + height: 12px; /* Vorher: 6px */ + cursor: ns-resize; + touch-action: none; +} + +/* Mobile: Noch größer */ +@media (max-width: 768px) { + .event-resize-handle { + height: 20px; + } +} +``` + +### Mobile UX + +- Tasks standardmäßig ausgeblendet +- Auto-Scroll zur aktuellen Stunde +- Mikrofon-Button in der Input Bar integriert +- Padding für Bottom-UI Sichtbarkeit + +--- + +## Matrix WhatsApp-Style Navigation + +Neue Mobile-Navigation für die Matrix PWA. + +### Navigation Pattern + +``` +┌─────────────────────────────────────────┐ +│ ← Rooms Matrix Settings│ ← Header +├─────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────┐ │ +│ │ General > │ │ +│ ├─────────────────────────────────┤ │ +│ │ Development > │ │ +│ ├─────────────────────────────────┤ │ +│ │ @user:mana.how > │ │ +│ └─────────────────────────────────┘ │ +│ │ +│ │ ← Room List +│ │ +│ │ +│ ┌─────────────────────────────────┐ │ +│ │ + New Chat │ │ +│ └─────────────────────────────────┘ │ +└─────────────────────────────────────────┘ + + ↓ Tap on Room ↓ + +┌─────────────────────────────────────────┐ +│ ← General ⋮ │ ← Room Header +├─────────────────────────────────────────┤ +│ │ +│ Alice: Hey, wie geht's? │ +│ │ +│ Bob: Gut, danke! │ +│ │ +│ Alice: Hast du das Feature gesehen? │ +│ │ +├─────────────────────────────────────────┤ +│ [Message input...] Send │ +└─────────────────────────────────────────┘ +``` + +### iOS PWA Swipe-Back + +```svelte + + +
+ +
+``` + +### Mobile Web App Meta Tags + +```html + + + +``` + +--- + +## Avatar Upload & Onboarding + +Neues Avatar-System mit S3/MinIO. + +### Upload Flow + +```typescript +// POST /api/v1/me/avatar +@Post('avatar') +@UseInterceptors(FileInterceptor('avatar')) +async uploadAvatar( + @UploadedFile() file: Express.Multer.File, + @CurrentUser() user: CurrentUserData, +) { + // Resize und optimieren + const optimized = await sharp(file.buffer) + .resize(256, 256) + .webp({ quality: 80 }) + .toBuffer(); + + // Upload zu S3/MinIO + const key = `avatars/${user.userId}.webp`; + await this.storageService.upload(key, optimized, { + contentType: 'image/webp', + public: true, + }); + + // URL speichern + await this.userService.updateAvatar(user.userId, key); + + return { avatarUrl: this.storageService.getPublicUrl(key) }; +} +``` + +### Onboarding Wizard + +Neuer Wizard für neue Nutzer: + +``` +┌─────────────────────────────────────────┐ +│ Welcome to ManaCore! │ +├─────────────────────────────────────────┤ +│ │ +│ ┌───────────────┐ │ +│ │ 📷 │ ← Avatar │ +│ │ Upload Photo │ │ +│ └───────────────┘ │ +│ │ +│ Display Name: [________________] │ +│ │ +│ Language: [Deutsch ▼] │ +│ │ +│ Theme: ○ Light ● Dark ○ Auto │ +│ │ +│ [ Continue → ] │ +│ │ +└─────────────────────────────────────────┘ +``` + +--- + +## ManaCore Dashboard + +Neues Dashboard auf mana.how. + +### Profile Section + +```svelte +
+ +

{user.name}

+

{user.email}

+ +
+ + + +
+
+``` + +### Subscription Management + +```svelte + +``` + +### Credits Frontend + +```svelte + + + + + +``` + +### Storage Usage Widget + +```svelte + +``` + +### API Keys Management + +```svelte + +``` + +--- + +## Settings Stores + +Neue Settings-Stores für Zitare und Todo. + +### Pattern + +```typescript +// stores/settings.store.ts +import { persisted } from 'svelte-persisted-store'; + +export interface AppSettings { + theme: 'light' | 'dark' | 'auto'; + language: string; + notifications: boolean; + // App-spezifische Settings +} + +export const settings = persisted('app-settings', { + theme: 'auto', + language: 'de', + notifications: true, +}); +``` + +### Zitare Settings + +```typescript +interface ZitareSettings extends AppSettings { + dailyNotificationTime: string; // "09:00" + favoriteCategories: string[]; + showAuthorInfo: boolean; +} +``` + +### Todo Settings + +```typescript +interface TodoSettings extends AppSettings { + defaultPriority: Priority; + showCompletedTasks: boolean; + sortOrder: 'priority' | 'dueDate' | 'created'; +} +``` + +--- + +## Devlog Activity Grid + +Neue Activity-Seite für Devlogs. + +### Features + +- GitHub-Style Contribution Grid +- Commit-Statistiken pro Tag +- Hover-Details mit Commit-Count +- Link zu Devlog-Einträgen + +### Implementation + +```svelte + +``` + +--- + +## Weitere Änderungen + +### Shared UI Refactoring + +LoginPage und InputBar Komponenten verbessert: + +```typescript +// Bessere Props-Struktur +interface LoginPageProps { + locale: string; + onLogin: (credentials: LoginCredentials) => Promise; + onRegister?: () => void; + onForgotPassword?: () => void; + showRememberMe?: boolean; + allowSocialLogin?: boolean; +} +``` + +### Matrix Bot Enhancements + +- Stats Bot: Detailliertere Statistiken +- Todo Bot: Cleaner Response Messages +- Offline Mode entfernt - Login erforderlich + +### Docker Local Builds + +Weitere Services auf lokale Builds umgestellt: + +| Service | Grund | +| ------------------- | -------------------- | +| matrix-todo-bot | Native Dependencies | +| matrix-calendar-bot | Native Dependencies | +| presi-backend | Schnellere Iteration | +| mana-web | Shared Packages | + +--- + +## Zusammenfassung + +| Bereich | Commits | Highlights | +| --------------------- | ------- | ------------------------------- | +| **Gift Codes** | 4 | Code-System, Matrix Integration | +| **Stripe** | 3 | Subscriptions, Credit Purchases | +| **Zitare** | 10 | Docker, Quotes, i18n | +| **Calendar** | 6 | Drag-Create, Resize, Mobile UX | +| **Matrix** | 8 | WhatsApp-Nav, PWA, Swipe | +| **ManaCore** | 8 | Profile, Credits, Storage | +| **Avatar/Onboarding** | 3 | S3 Upload, Wizard | +| **Settings** | 2 | Zitare, Todo Stores | +| **Auth/Docker** | 8 | Healthchecks, Builds | +| **Devlog** | 3 | Activity Grid | + +--- + +## Nächste Schritte + +1. **Stripe Webhooks** - Production Webhook Secret konfigurieren +2. **Gift Code UI** - Admin-Panel für Code-Erstellung +3. **Subscription Emails** - Bestätigungen und Erinnerungen +4. **Matrix E2EE** - Verschlüsselung für DMs aktivieren +5. **Zitare Push** - Daily Quote Notifications