Life OS
Zwei Menschen, ein Alltag – aber Aufgaben, Notizen, Termine und Einkaufsliste verteilt über ein halbes Dutzend Einzel-Apps: Life OS bündelt das in einem gemeinsamen Datenraum. Unter der Haube steckt eine SvelteKit-PWA mit Offline-Warteschlange und Supabase-Realtime-Sync, damit beide auch ohne Netz weiterarbeiten und sofort sehen, was die andere Person gerade geändert hat.
Zum Ausprobieren: Handy A auf „Offline“ stellen, bei „Jetzt“ auf „Erledigt“ tippen oder im Einkauf etwas ergänzen – dann wieder online gehen. Handy B bekommt die Änderungen erst jetzt.
Das Problem
Für zwei Menschen im selben Haushalt verteilt sich der Alltag auf ein halbes Dutzend Einzel-Apps – To-Do hier, Notizen dort, Einkaufsliste im Chat, Termine im Kalender. Das erzeugt Reibung und Doppelpflege. Life OS bündelt Aufgaben, Notizen, Gewohnheiten, Kalender sowie Einkauf in einem gemeinsamen, synchronisierten Datenraum – gebaut für genau zwei Personen.
Der Aufbau
Der Client ist eine SvelteKit-PWA mit Svelte 5 (Runes) und TypeScript, installierbar mit Service Worker und Offline-Shell. UI-Komponenten sprechen nie direkt mit der Datenbank, sondern nur über ein API-Modul pro Funktionsbereich. Jede Änderung landet zuerst optimistisch im UI-Zustand und zusätzlich in einer IndexedDB-Warteschlange; kommt das Gerät wieder online, spielt sie sich automatisch ab, der Sync-Status bleibt sichtbar. Live-Updates zwischen beiden Personen laufen über Supabase Realtime direkt auf Postgres-Ebene, nicht über eine eigene Server-Push-Verbindung. Backend ist eine selbst gehostete Supabase-Instanz (Postgres, Auth, Row-Level-Security, Realtime, Storage, Edge Functions) als einziges Managed-Backend; Edge Functions übernehmen nur serverseitige Regeln wie wiederkehrende Termine oder Erinnerungen.
Die harte Nuss
Bei Aufräumarbeiten am 27.07.2026 fiel auf, dass zwei Tabellen (Stimmung, Gesundheit) seit ihrer Migration nie in die Supabase-Realtime-Publication aufgenommen worden waren – Einträge synchronisierten sich zwischen den beiden Nutzern nicht live, und ohne eigene Offline-Warteschlange gingen Einträge beim erneuten Verbinden sogar verloren. Behoben mit einer Migration, die beide Tabellen in die Publication aufnimmt, plus der nachgerüsteten Warteschlange. Daraus wurde eine feste Regel fürs ganze Projekt: Jede neue Tabelle braucht von Anfang an volle Replikat-Identität und einen Eintrag in der Realtime-Publication, sonst kommen vor allem Lösch-Ereignisse nie an. Die Regel hält: Die im Oktober dazugekommene Tabelle für Tagesrituale bringt Row-Level-Security, Policy, volle Replikat-Identität und den Publication-Eintrag in derselben Migration mit.
Verworfen
- Directus als Backend: zu CMS-orientiert, hätte einen eigenen Docker-Host gebraucht (den es nicht gab), und ein schwächeres Rechte-Modell für den Mehrpersonen-Zugriff als Supabase mit Row-Level-Security.
- Server-Sent Events für Live-Updates, zugunsten von Supabase Realtime direkt auf Postgres-Ebene.
Qualität
- 1.165 automatisierte Tests in 130 Dateien laufen grün (Stand 13.10.2026).
- Die Typprüfung (svelte-check über 5.210 Dateien) meldet 0 Fehler und 0 Warnungen (Stand 13.10.2026).
- Das Start-Bundle der App ist in der CI auf 242 KB (gzip) begrenzt – wächst es darüber, schlägt der Build fehl.
- Beim Sicherheitscheck am 30.07.2026 hatten alle 31 Tabellen aktive Row-Level-Security mit mindestens einer Policy: geteilte Daten nur für Mitglieder desselben Haushalts, persönliche Einträge wie das Tagebuch ausschließlich für den eigenen Account. Die danach angelegte Tabelle für Tagesrituale ist ebenfalls nur für die eigene Person lesbar.
- Keine öffentlich lesbaren Tabellen, serverseitig rotierte Service-Tokens, HTTPS mit Rate-Limits und Audit-Log, verschlüsselte Backups mit geprüftem Restore.
Ergebnis und Gelerntes
Stand 13.10.2026 hat Life OS 15 Module – Heute, Aufgaben, Notizen, Routinen, Kalender, Einkauf, Ziele, Tagebuch, Fokus, Wochenrückblick, Stimmung, Gesundheit, Training, Einblicke und Verlauf –, läuft produktiv auf einer eigenen Supabase-Instanz und meldet sich per Passkey an.
Seit Oktober baue ich die Oberfläche unter dem Namen „Life OS 2027“ um: Heute zeigt eine Jetzt-Karte, den Tagesplan und die freie Zeit; Tag planen und Tag abschließen sind kurz und freiwillig; Regeln verbinden Module sichtbar, mit Verlauf und Rückgängig; dazu kommen eine Hilfe, die überall über das Fragezeichen erreichbar ist, und ein neues Erscheinungsbild mit harten Kanten. Sieben Module sind umgestellt (Aufgaben, Notizen, Routinen, Kalender, Einkauf, Ziele, Tagebuch), der Rest folgt. Die Überarbeitung liegt auf einem eigenen Branch und ist noch nicht ausgerollt.
Gelernt: Migrationen mussten nach fast jeder Ausbaustufe von Hand im Supabase-SQL-Editor nachgezogen werden, weil das Projekt nie per Supabase-CLI mit der Datenbank verlinkt war – das nächste Mal wird das von Anfang an eingerichtet.