e.V.
Lösungen · Architektur · Beta · geprüft 2026-05-21

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.

These
Das energie-effizienteste Rechenzentrum ist die CPU, die ohnehin schon in der Hosentasche liegt — und kein Konto ist die beste Privatsphäre.
Was wir tun

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.

Umsetzung

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.
Trade-offs

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.
Stand

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.

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.