Local-First + Login-Optional
Wo es geht, rechnet die App auf dem Gerät, speichert auf dem Gerät und funktioniert ohne Konto. Ein Login ist nur dann nötig, wenn die Nutzerin tatsächlich Geräte-übergreifend syncen oder Mana-Aktionen ausführen möchte.
Die übliche Web-Architektur kommt mit einer impliziten Annahme: dass jede Aktion eine Server-Anfrage ist, jeder Datensatz eine Server- Zeile, und jedes Konto eine Server-Identität. Daraus folgt, dass jede Nutzung einer App eine Spur auf einem Server hinterlässt, auch wenn der Anbieter ehrlich vorhat, nichts damit zu tun.
Local-First dreht diese Grundannahme um. Die App ist zuerst eine Anwendung auf dem Gerät, mit ihrer eigenen Datenbank, ihrer eigenen Suche, ihrer eigenen KI-Inferenz, soweit Apple- und Open-Source-Modelle das leisten. Sync ist eine zusätzliche Funktion für Leute, die zwei Geräte haben — kein Default-Verhalten. Konto ist eine zusätzliche Funktion für Leute, die syncen oder mit Mana zahlen wollen — kein Eintritt für die App.
Daraus fällt eine ungewöhnliche Eigenschaft ab: man kann viele unserer Apps benutzen, ohne dass irgendwo am Verein eine Zeile über die Nutzerin existiert. Keine Statistik, kein Profil, kein „last seen”. Wir wissen, dass die App existiert und runtergeladen wurde — sonst nichts. Das ist nicht „Privacy by Marketing”, das ist „Privacy by absence of data”.
Die Kehrseite hängt mit der Architektur zusammen: Local-First- Datenmodelle sind anspruchsvoller als CRUD-Server, Sync-Konflikte muss man lösen, und einige Komfort-Features (z.B. Cross-App- Suggestions, Geräte-übergreifende Recall) funktionieren ohne Sync-Aktivierung nicht. Wir bauen das so, dass die Bequemlichkeit ein Knopf ist, den die Nutzerin drückt — nicht ein Default, der sie ohne ihr aktives Zutun erwischt.
Wie genau das funktioniert
- Apps speichern primär in lokalem SQLite (Native) oder IndexedDB (Web). Server-Sync ist opt-in.
- Suche, Filter, Sortierung laufen client-seitig auf den lokalen Daten — keine Server-Round-Trips für UI-Operationen.
- KI-Inferenz (`mana-swift-llm`) bevorzugt geräte-lokale Modelle (FoundationModels, Gemma 4 MLX) bevor sie auf den GPU-Server rüber routet. App-Group teilt Modelle zwischen Apps.
- Anonyme Nutzung als Default-Pfad: die App startet, ohne dass irgendwo ein Konto angelegt wird. Erst wer syncen oder Mana ausgeben will, meldet sich an.
- Wenn ein Login erfolgt, ist es Single-Sign-On über alle Vereins-Apps via `QP3GLU8PH3.ev.mana.session` Keychain-Group — nicht 12 separate Konten.
Was uns das kostet
Jeder Lösung hat einen Preis. Diese hier zahlen wir bewusst — weil das, was wir damit erreichen, mit nachgelagerten Tricks nicht ehrlich zu bauen ist.
- Local-First verschiebt Konflikte aus dem Server in den Client. Für komplexe Datenmodelle ist das anspruchsvoll — wir lösen das mit Event-Sourcing, aber nicht ohne UI-Aufwand.
- Login-Optional bedeutet, dass die App auch ohne Verein-Konto eine vollständige UX liefern muss. Das schließt Empfehlungs- Features aus, die ein Profil bräuchten.
- Geräte-Wechsel ohne Konto ist kein automatischer Sync, sondern ein expliziter Export-Import. Bequemer mit Konto, aber wir erzwingen es nicht.
Welche Probleme dieser Lösung adressiert
Diagnose ohne Antwort ist Lamentation; Antwort ohne Diagnose ist Ingenieurs-Spielerei. Hier verbindet sich beides.
- Cloud-Energiehunger als SelbstzweckCloud-Wachstum dient zunehmend sich selbst — mehr Strom, um besser zu überwachen, um besser zu monetarisieren, um mehr Cloud rechtfertigen zu können.
- Daten-Monetarisierung — du bist nicht die Kundin, du bist die WareWenn das Produkt kostenlos ist, ist nicht selten dein Verhalten das eigentliche Produkt — und dein Profil wird in Echtzeit versteigert.
Welche Grundsätze er trägt
Offene Punkte
- `public-feed-standard` für Apps, die anonym auch fremde Inhalte lesen wollen, ist konzipiert aber nicht implementiert.
- Nicht alle Apps unterstützen die anonyme Variante voll — Migration läuft, Stand pro App in MIGRATIONS_BOOTSTRAP.md.
Weitere Lösungen dieser Art
Wie die Daten fließen — strukturelle Entscheidungen.
- Event-Sourcing als Daten-ArchitekturStatt aktuelle Zustände in einer App-Datenbank zu mutieren, schreiben unsere Apps jede Änderung als unveränderliches Event in einen zentralen, signierten Ledger. Daraus folgt vieles, was sich sonst nicht bauen lässt: Audit-Trail, Cross-App-Timeline, vollständige Lösch- und Export-Pfade, transparente KI-Aktionen.
- Cross-App-Timeline — jede Änderung ist sichtbar, auch KI-ÄnderungenEine zentrale Zeitleiste über alle Vereins-Apps zeigt in Echtzeit, was sich in den eigenen Daten geändert hat — von wem, wann, in welcher App, und ob ein Mensch oder eine KI sie geschrieben hat.
- Föderation statt Lock-InDaten gehen über App-Grenzen hinweg über offene Plattform- Protokolle (Share, Links, Events, MCP, Search), nicht über hauseigene Vendor-APIs. Jede App kann zur Allmende beitragen, jede App kann fortgehen — der Export ist gleichwertig zur internen API.
- PWA vor Native — Web-App, wo es gehtWo der Plattform-Vorteil einer nativen App nicht zwingend gebraucht wird, liefern wir eine progressive Web-App statt. Das spart den App-Store-Tribut, verkürzt die Update-Schleife und hält die Installation in der Hand der Nutzerin.
Lösungen sind die strukturellen Antworten des Vereins. Werte sagen, wonach wir uns ausrichten; Probleme sagen, wogegen; Lösungen sagen, was wir daraus baulich machen.