docs: add devlog for morning session 2026-03-24

Credits cost tab, dashboard grid fix, PostgreSQL backup, port exhaustion
debugging, SkillTree achievements, Calendar i18n, CityCorners features.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-24 19:28:31 +01:00
parent c8686506ca
commit 233a3c0732

View file

@ -0,0 +1,246 @@
---
title: 'Credits-Kostenübersicht, Dashboard Fix, Infrastruktur-Hardening & CityCorners'
description: 'Neue Kosten-Tab für alle Mana-Credit-Operationen, Dashboard-Grid-Layout gefixt, PostgreSQL-Backup mit pgBackRest, Port-Exhaustion-Fix, SkillTree Achievements, Calendar i18n und CityCorners Features.'
date: 2026-03-24
author: 'Till Schneider'
category: 'feature'
tags:
[
'credits',
'dashboard',
'infrastructure',
'postgresql',
'backup',
'monitoring',
'citycorners',
'skilltree',
'calendar',
'i18n',
'docker',
'cloudflare',
'accessibility',
]
featured: true
commits: 48
readTime: 14
stats:
filesChanged: 248
linesAdded: 12998
linesRemoved: 2376
contributors:
- name: 'Till Schneider'
handle: 'Till-JS'
commits: 48
workingHours:
start: '2026-03-24T06:00'
end: '2026-03-24T12:00'
---
Intensive Vormittags-Session mit **48 Commits** über **248 Dateien** und netto **+10.622 Zeilen**:
- **Credits-Kostenübersicht** — Neuer "Kosten"-Tab zeigt alle 40+ Credit-Operationen nach App gruppiert
- **Dashboard-Layout gefixt** — Grid-Bug behoben + Layout-Polish (gleiche Höhen, bessere Gaps)
- **PostgreSQL-Backup** — pgBackRest für Point-in-Time Recovery eingerichtet
- **Port-Exhaustion-Fix** — 25.000 TIME_WAIT-Connections auf dem Server gelöst
- **SkillTree Achievements** — 26 Achievements mit Fortschritts-Tracking und Monetarisierung
- **Calendar i18n** — Komplette Lokalisierung aller Toast-Messages und Settings-Seiten
- **CityCorners** — Photo Gallery, Collections, Clustering, Soft Deletes, Rate Limiting
---
## 1. Credits: Kosten-Tab für alle Mana-Operationen
Die Credits-Seite unter `/credits` hatte bisher drei Tabs: Übersicht, Transaktionen und Credits kaufen. Was fehlte: Eine transparente Darstellung, **was wie viel kostet**.
### Neuer Tab "Kosten"
Der neue vierte Tab zeigt alle 40+ Credit-Operationen des gesamten Mana-Ökosystems, gruppiert nach App:
| App | Beispiel-Operationen | Kosten |
|-----|---------------------|--------|
| **Chat** | GPT-4 Message, Claude Message, Ollama (lokal) | 5, 5, 0.1 |
| **Picture** | Bild generieren, Upscale | 10, 5 |
| **ManaDeck** | Deck generieren, Karte generieren | 20, 2 |
| **Todo** | Task erstellen, Smart Scheduling | 0.02, 2 |
| **Calendar** | Event erstellen, CalDAV Sync | 0.02, 0.5 |
### Features
- **Kategorie-Filter** — Buttons zum Filtern nach "Alle", "KI-Features", "Erstellen", "Premium"
- **Farbkodierte Badges** — Grün (kostenlos), Gelb (Micro-Credits < 1), Blau (Standard)
- **Info-Hinweis** — Lesen/Bearbeiten/Löschen ist immer kostenlos
- **URL-Parameter** — Direkt erreichbar via `?tab=costs`
- **TypeScript-Source-Exports**`@manacore/credit-operations` exportiert jetzt TS direkt statt nur `dist/`, damit Vite es ohne vorherigen Build-Step bundlen kann
### Deployment-Challenges
Das Deployment erforderte mehrere Iterationen:
1. `credit-operations` Package fehlte im Web-Dockerfile → hinzugefügt
2. Package brauchte Build-Step vor Web-Build → auf Source-Exports umgestellt
3. Vorbestehende Syntax-Fehler in `LandingEditor.svelte` und `ContextDocsWidget.svelte` → gefixt
4. `shared-llm` fehlte im Auth-Dockerfile → hinzugefügt
---
## 2. Dashboard-Grid: Layout-Bug & Polish
### Der Bug
Das Dashboard zeigte alle Widgets in einer einzigen schmalen Spalte — Text war abgeschnitten, Cards nur ~100px breit.
**Ursache:** `svelte-dnd-action` wrappte jedes Widget in einem `<div animate:flip>`. Die `col-span-*` Klassen (z.B. `col-span-6`) waren auf dem **inneren** WidgetContainer-Div, nicht auf dem Wrapper-Div, das direkt am CSS-Grid teilnimmt. Ergebnis: Jedes Widget bekam implizit `col-span-1`.
**Fix:** `WIDGET_SIZE_CLASSES` auf den äußeren `animate:flip`-Wrapper verschoben.
### Layout-Polish
| Verbesserung | Vorher | Nachher |
|---|---|---|
| Grid-Gap | `gap-4` (16px) | `gap-5` (20px) |
| Zeilen-Höhe | Ungleichmäßig | `auto-rows-fr` (gleich hoch) |
| Widget min-height | Keine | `min-h-[10rem]` |
| Wrapper-Div | Unnötiges `<div>` | Direkt `<Card>` |
| Default-Layout | 2×medium + 1×large (Lücke) | 3×small (gleichmäßig) |
---
## 3. Infrastruktur: PostgreSQL-Backup & Port-Exhaustion
### pgBackRest für Point-in-Time Recovery
Neues Backup-System für die Produktions-Datenbank:
- **pg_dumpall** — Tägliche logische Full-Backups
- **pg_basebackup** — Wöchentliche physische Backups
- Konfiguration über `docker/postgres/pgbackrest.conf` und `docker/postgres/postgresql.conf`
- Dokumentation in `docs/POSTGRES_BACKUP.md`
### Port-Exhaustion: 25.000 TIME_WAIT-Connections
Beim Deployment wurde festgestellt, dass der Mac Mini Server **keine ausgehenden TCP-Verbindungen** aufbauen konnte — weder zu GitHub noch zu Docker Registry.
**Diagnose:**
- `netstat` zeigte 25.383 Connections im `TIME_WAIT`-Status
- Hauptverursacher: Cloudflare-Tunnel-Endpoints (188.114.96/97.x)
- Ephemeral Ports erschöpft → "Can't assign requested address"
**Fix:** n8n-Container entfernt (aggressive Health-Checks), Health-Check-Intervalle erhöht. Kurzfristige Workarounds: Git-Bundles via SCP statt `git pull`.
### Weitere Infra-Fixes
- **GlitchTip-DSNs** intern geroutet statt über Cloudflare-Roundtrip
- **Nginx-Healthchecks** auf `127.0.0.1` statt `localhost` (Alpine resolves zu IPv6)
- **PostgreSQL-Config** über `-c` Flags statt `config_file` Override
---
## 4. SkillTree: Achievement-System
Komplett neues Achievement-System mit **26 Achievements** in mehreren Kategorien:
- **Lern-Achievements** — Erste Skill, 10/50/100 Skills, Skill-Streaks
- **Fortschritts-Achievements** — Level-Meilensteine, XP-Schwellen
- **Soziale Achievements** — Geteilte Skills, Community-Beiträge
- **Konsistenz-Achievements** — Tägliche/wöchentliche Streaks
Backend-seitig mit Fortschritts-Tracking und Frontend mit Celebration-Animationen und Achievement-Karten.
---
## 5. Calendar & Todo: i18n & Accessibility
### Calendar: Komplette Lokalisierung
Alle Toast-Nachrichten und Settings-Seiten in 5 Sprachen (DE, EN, FR, ES, IT):
- **Toast Messages** — Erstellt, Aktualisiert, Gelöscht, Fehler-Meldungen
- **Settings Hauptseite** — Kalender-Einstellungen, Ansicht, Benachrichtigungen
- **Sync-Settings** — CalDAV, Google Calendar, Cloud Sync
- **Sharing-Settings** — Kalender teilen, Einladungen
### Focus Trapping für Modals
Neues `focusTrap` Action in `@manacore/shared-ui`:
- Tab-Navigation bleibt innerhalb des Modals
- Escape schließt das Modal
- Automatischer Fokus auf erstes interaktives Element
- Angewendet auf alle Modals in Calendar und Todo
### Auth Race Condition Fix
`appReady`-Gate für alle Web-Apps: Verhindert, dass Komponenten rendern bevor die Auth-Initialisierung abgeschlossen ist. Löst sporadische Redirects zum Login bei bereits eingeloggten Usern.
---
## 6. CityCorners: Feature-Sprint
Massive Erweiterungen für die Konstanz-Stadtführer-App:
### Backend
- **Slugs** — SEO-freundliche URLs für alle Locations
- **Collections** — Kuratierte Location-Sammlungen (z.B. "Altstadt-Tour")
- **Soft Deletes** — Locations werden als `deletedAt` markiert statt gelöscht
- **Rate Limiting** — API-Schutz gegen Missbrauch
- **Clustering** — Nahegelegene Locations werden auf der Karte gruppiert
- **Owner Tracking** — Locations haben einen Ersteller
### Web
- **Photo Gallery** — Bildergalerie pro Location
- **Nearby Locations** — "In der Nähe"-Vorschläge
- **Search History** — Letzte Suchen werden gespeichert
- **Edit/Delete UI** — Locations bearbeiten und löschen (nur für Owner)
- **Pagination** — Locations-Liste mit Seitennavigation
---
## 7. Monitoring & Observability
### LLM Grafana Dashboard
Neues Dashboard für den zentralen LLM-Service (`mana-llm`):
- Request-Rate pro Provider (OpenRouter, Gemini, Ollama)
- Latenz-Verteilung (p50, p95, p99)
- Token-Verbrauch und Kosten-Tracking
- Error-Rate mit Alerts
### Prometheus Alerting
Neue Alert-Regeln:
- LLM Error Rate > 5% → Warning
- LLM Latency p95 > 10s → Warning
- Provider Fallback aktiviert → Info
### ManaScore: Erweiterte Metriken
- **Lighthouse Score Integration** — Performance, Accessibility, Best Practices, SEO
- **Score Trend Visualization** — Sparkline-Charts für Score-Verlauf über Zeit
- **API Conformity Checks** — Einheitliche API-Patterns über alle Backends
- **Cross-App Consistency** — Konsistenz-Prüfung über alle Apps
---
## 8. Weitere Änderungen
| Bereich | Änderung |
|---------|----------|
| **Picture** | Lokale Bildgenerierung via `mana-image-gen` Service |
| **Project Doc Bot** | Migration auf `@manacore/shared-llm`, OpenAI-Dependency entfernt |
| **it.mana.how** | Neue Landing Page für europäische Tech-Souveränität |
| **Audits → ManaScore** | Rename von `/audits` zu `/manascore` + Methodology-Seite |
| **Cloudflare** | Fallback-Plan für Self-Hosted Landing Pages dokumentiert |
---
## Statistiken
| Metrik | Wert |
|--------|------|
| Commits | 48 |
| Dateien geändert | 248 |
| Zeilen hinzugefügt | 12.998 |
| Zeilen entfernt | 2.376 |
| Netto | +10.622 |
| Betroffene Apps | 15+ |
| Neue Packages | — |
| Docker-Rebuilds | 6 |
| Port-Exhaustion-Debugging | 1 (hoffentlich letzte) |