Zum Hauptinhalt springen

Zurück zum Devlog

Dienstag, 24. März 2026

Feature

41 Commits

12 min Lesezeit

PWA-Icons für alle Apps, Todo UX-Overhaul, Port-Exhaustion-Fix & Dashboard Widget

PWA-Icons und Offline-Prerender für 20 Apps, Todo-App mit Inline-Edit und Drag-Fix, Mac Mini Port-Exhaustion behoben, Dockerfile-Validator, Dashboard-Widget zeigt alle Tasks.

T

Till Schneider

Autor

Intensive Abend-Session mit 41 Commits über 302 Dateien und netto +14.112 Zeilen:

  • PWA für alle Apps — Icons, Meta-Tags und Offline-Prerender für 20 Web-Apps
  • Mac Mini Port-Exhaustion — 25.000 stuck TIME_WAIT Sockets → 3 nach Reboot + sysctl-Tuning
  • Todo UX-Overhaul — Inline Title Edit, Drag-Handle-Fix, vereinfachte Sections, Long Press
  • Dashboard Widget — Zeigt jetzt alle offenen Tasks statt nur heute
  • Dockerfile-Validator — Automatische Erkennung fehlender COPY-Statements
  • Auth-Verbesserungen — Session-Expired-Banner, lokaler JWKS-Cache, Auth-Race-Condition-Fix

1. PWA: Icons & Offline-Prerender für alle Apps

Das Problem

Beim Versuch, die Calendar-App als PWA zu installieren, fehlten die Icons (pwa-192x192.png, pwa-512x512.png, apple-touch-icon.png) und die PWA-Meta-Tags in app.html. Chrome zeigte keinen Install-Button.

Zusätzlich hatten alle 20 Web-Apps einen Service-Worker-Fehler: non-precached-url :: [{"url":"/offline"}] — die /offline-Route war nicht prerendered, weshalb Workbox sie nicht cachen konnte.

Die Lösung

Calendar & Todo & Storage: SVG-Favicon designed, generate-icons.mjs Script erstellt, alle PWA-Icons generiert (32px, 180px, 192px, 512px), app.html mit vollständigen PWA-Meta-Tags.

Alle 20 Apps: +page.ts mit export const prerender = true in jeder /offline-Route hinzugefügt.

Commits

  • 8bc52f42 — Calendar: PWA Icons, Meta-Tags, app.html
  • 61c23d5e — Todo: PWA Icons, Meta-Tags, Offline-Prerender (+ 8 weitere Dockerfiles)
  • 91daba06 — Storage: PWA Icons und Meta-Tags (Build-Fix)

2. Mac Mini: Port-Exhaustion Fix

Das Problem

Der Mac Mini konnte keine ausgehenden TCP-Verbindungen mehr aufbauen — git pull, docker pull, curl — alles scheiterte mit “Can’t assign requested address”. Diagnose: 25.156 Sockets im TIME_WAIT bei nur 16.384 verfügbaren Ephemeral-Ports (49152-65535).

Ursachen

VerursacherSocketsGrund
GlitchTip DSNs via Cloudflare~6.000Alle 13 Backends schickten Error-Reports über glitchtip.mana.how → Cloudflare → Tunnel → zurück zum Server
Localhost Health-Checks~8.80052 Health-Checks alle 30 Sekunden
n8n Automation~3.000Workflows die ständig externe APIs pollten
Diverse externe APIs~7.000GitHub, AWS, etc.

Die Lösung

  1. n8n entfernt — nicht mehr benötigt
  2. Health-Check-Intervalle — 30s → 120s (Apps), 10s → 30s (Infra)
  3. GlitchTip DSNs intern geroutetglitchtip.mana.howglitchtip:8020 (Docker-intern, kein Cloudflare-Roundtrip)
  4. sysctl-Tuningnet.inet.tcp.msl=5000 (TIME_WAIT von 30s auf 10s), net.inet.ip.portrange.first=10000 (55k statt 16k Ports)
  5. Server-Reboot — Einziger Weg die stuck Sockets zu clearen
  6. SSH Deploy Key — Neuer Ed25519-Key für GitHub-Zugriff nach Reboot

Ergebnis: 25.000 TIME_WAIT → 3. Alle 72 Container healthy.

Commits

  • 6cab9a3c — n8n entfernt, Health-Checks 30s → 120s
  • 124b4f7c — GlitchTip DSNs intern geroutet

3. Todo: UX-Overhaul

Drag & Drop Fix

Das Reordering war komplett kaputt: Items verschwanden nach dem Ziehen, weil handleDndFinalize nie tasksStore.reorderTasks() aufrief. Zusätzlich fehlte ein ReorderTasksDto im Backend — die globale ValidationPipe mit forbidNonWhitelisted lehnte den Request Body ab (“property taskIds should not exist”).

VorherNachher
Hamburger-Icon (2 Linien)6-Punkte Grip-Icon (Standard)
16px Icon20px Icon + größere Klickfläche
Reorder nicht persistiertOptimistic Update + API-Call
Kein DTO → 400 ErrorReorderTasksDto mit Validation

Inline Title Edit

Klick auf den Task-Titel öffnet jetzt direkt ein Inline-Input statt den kompletten Expanded-Bereich. Enter speichert, Escape bricht ab, Blur speichert.

Long Press (Mobile)

500ms Long Press auf einem Task öffnet den Expanded-Bereich mit allen Feldern — die einzige Möglichkeit auf Touch-Geräten, da der Expanded-Bereich nicht mehr über ein Chevron erreichbar ist.

Vereinfachte Sections

Sections (Heute, Morgen, Überfällig, etc.) sind jetzt immer offen. Kein Chevron, kein Count, kein Collapse — nur Icon + Titel als schlichte Überschrift.

UI-Anpassungen

  • Reihenfolge: Drag-Handle → Checkbox → Priority-Dot → Content (vorher: Priority → Checkbox)
  • Priority-Dot vergrößert (0.5rem → 0.625rem)
  • Chevron-Icon rechts entfernt

Commits

  • c9644798 — Drag-Handle Grip-Icon + Reorder-Persistence-Fix
  • f42f9ce8 — Checkbox/Priority-Swap, Priority-Dot größer, Chevron entfernt
  • 4b4cdd8c — Inline Title Editing
  • ea37288f — Long Press für Mobile
  • 10df359f — Vereinfachte Section-Headers
  • d6eacc1c — ReorderTasksDto Backend-Fix

4. Dashboard: Tasks-Widget zeigt alle offenen Tasks

Das Problem

Das “Aufgaben heute”-Widget auf mana.how zeigte “Keine Aufgaben”, obwohl Tasks existierten — weil es nur GET /tasks/today aufrief, das nach dueDate = heute filtert. Tasks ohne Datum waren unsichtbar.

Die Lösung

Neuer getAllOpenTasks() Service-Call, der GET /tasks nutzt und alle offenen Tasks holt, sortiert nach Datum (heute/überfällig zuerst, dann Zukunft, dann ohne Datum). Das Widget zeigt jetzt das Due-Date neben dem Titel mit Overdue-Highlighting.

Commits

  • 47dbe00d — Widget zeigt alle offenen Tasks
  • 5c2a8d07 — date-fns Dependency für Docker-Build

5. Dockerfile-Fixes & Validator

Fehlende Packages in Dockerfiles

9 Web-App-Dockerfiles fehlte das COPY packages/shared-app-onboarding Statement, was zu Build-Fehlern führte. Betroffen: Chat, Clock, Mukke, Photos, Picture, Presi, Skilltree, Storage, Zitare.

Dockerfile Dependency Validator

Neues Script scripts/validate-dockerfiles.mjs das automatisch alle package.json-Imports analysiert und prüft, ob die entsprechenden COPY-Statements in den Dockerfiles vorhanden sind. Wird auch als GitHub Actions Workflow bei PRs ausgeführt.

Zusätzlich: scripts/generate-dockerfile-copies.mjs das automatisch korrekte COPY-Statements generiert.

Commits

  • 61c23d5e — shared-app-onboarding in 9 Dockerfiles
  • a2605e88 — Dockerfile Dependency Validator + 16 fehlende COPYs gefixt
  • 90c438e2 — Auto-Generate Dockerfile COPY Statements
  • decd79d5 — Docker Build Validation CI Workflow

6. Auth-Verbesserungen

  • Session-Expired-Banner — Wenn Token-Refresh fehlschlägt, erscheint ein nicht-blockierender Banner mit Re-Login-Button statt einer Endlos-Ladeschleife (d6440664, bf7517d2)
  • Lokaler JWKS-Cache — Backend cached JWKS-Keys lokal statt HTTP-Self-Call bei jedem Request (5b5849ea, 8356ac63)
  • Auth-Race-ConditionappReady Gate verhindert, dass Widgets API-Calls machen bevor SSO abgeschlossen ist (000b74af)
  • Single Fetch Interceptor — Auth-Interceptor für mehrere Backend-URLs konsolidiert (d0802362)

7. Weitere Änderungen

  • Seenplatte Observatory — Interaktive Visualisierung des ManaCore-Ökosystems als See-Metapher mit Tooltips, Detail-Panel und Radar-Chart (76484377, 23dac327)
  • Landing Mega-Footer — Rich Footer mit App-Links, Social-Links und Branding (04f5afe6)
  • Intelligent Quick-Create Parsers — NLP-Parser für 6 Apps mit mehrsprachiger Unterstützung (52864041)
  • Help System Hardening — XSS-Schutz, i18n, Type Safety (42dd7d2a)
  • Workspace Dependency Audit — Script zur Erkennung veralteter/fehlender Workspace-Dependencies (f2488f86)
  • ManaScores aktualisiert — Storage 82→84, Todo und Calendar PWA dokumentiert (9431af65)

Zusammenfassung

BereichÄnderung
PWA20 Apps mit Offline-Prerender, 3 Apps mit neuen Icons
InfrastructurePort-Exhaustion behoben, n8n entfernt, Health-Checks optimiert
TodoInline Edit, Drag-Fix, Long Press, vereinfachte Sections
DashboardTasks-Widget zeigt alle offenen Tasks
DockerValidator, Auto-Generate, 16+ fehlende COPYs gefixt
AuthSession-Banner, JWKS-Cache, Race-Condition-Fix
Server72 Container healthy, 3 TIME_WAIT Sockets

Tags

#pwa #todo #drag-and-drop #infrastructure #docker #port-exhaustion #dashboard #inline-edit #offline #sysctl #glitchtip #devops