Die Entwicklung einer Notizen-App mag für viele Entwickler eine klassische Übung sein, doch für mich wurde daraus ein spannendes Experiment: Wie lässt sich eine Anwendung lokal-first gestalten, die vollständig offline nutzbar ist und gleichzeitig höchsten Datenschutz bietet? Mein Ziel war es, eine Notizen-App zu schaffen, die nicht nur funktional überzeugt, sondern auch technisch innovative Lösungen für Synchronisation und Verschlüsselung vorweist.
Das Ergebnis dieser Arbeit ist Annota, eine Notizen-App mit Fokus auf Sicherheit. Die Anwendung ist als Desktop-Version für macOS und Windows mit Tauri umgesetzt, während die mobilen Versionen auf React Native und Expo basieren. Eine Android-Version ist bereits in Planung.
Modulare Architektur für langfristige Wartbarkeit
Ein zentrales Anliegen war es, die Architektur von Beginn an so zu gestalten, dass sie auch mit wachsender Komplexität noch handhabbar bleibt. Annota ist in klar abgegrenzte Pakete unterteilt, die jeweils spezifische Verantwortlichkeiten übernehmen. So existieren beispielsweise separate Module für den Editor und die Synchronisationslogik. Diese Trennung verhindert enge Kopplungen und erleichtert die Weiterentwicklung einzelner Komponenten unabhängig voneinander.
Ende-zu-Ende-Verschlüsselung als Grundpfeiler
Für eine App, die den Schutz privater Daten in den Vordergrund stellt, war es entscheidend, dass der Server möglichst wenig über die Inhalte der Notizen erfährt. Der gesamte Verschlüsselungsprozess beginnt direkt auf dem Gerät des Nutzers:
- Zunächst wird ein 12-Wörter-BIP39-Passwort verwendet, um einen Master Seed zu generieren.
- Dieser Seed wird anschließend mit Argon2id verarbeitet, um einen 256-Bit-Master Key abzuleiten.
- Mittels HKDF-SHA256 wird der Master Key in separate Schlüssel für Notizen und Dateianhänge aufgeteilt.
- Alle Notizeninhalte und Metadaten werden lokal mit AES-256-GCM verschlüsselt, bevor sie synchronisiert werden.
Auf diese Weise bleibt der Inhalt der Notizen selbst für den Server unsichtbar. Selbst im Falle eines Datenlecks bleiben die Informationen geschützt.
Synchronisation: Balance zwischen Effizienz und Zuverlässigkeit
Die Umsetzung einer Synchronisationslogik für eine lokal-first-App erwies sich als eine der größten Herausforderungen. Es galt, ein System zu schaffen, das responsiv, zuverlässig und gleichzeitig ressourcenschonend arbeitet. Hier einige der zentralen Maßnahmen:
- Debouncing der Synchronisation: Nach der letzten Bearbeitung einer Notiz wird die Synchronisation für 10 Sekunden verzögert, um unnötige Netzwerkanfragen zu vermeiden.
- Sicherheitsmechanismus: Alle zwei Minuten wird eine erzwungene Synchronisation ausgelöst, um sicherzustellen, dass Änderungen nicht dauerhaft lokal verbleiben.
- Tombstone-Verwaltung: Gelöschte Notizen werden als Tombstones markiert, sodass Löschungen korrekt über alle Geräte hinweg propagiert werden.
- Effiziente Dateisynchronisation: Dateianhänge werden nur dann heruntergeladen, wenn sie auf dem jeweiligen Gerät noch nicht vorhanden sind.
Das Ziel ist klar: Eine nahtlose Synchronisation, die weder Bandbreite noch Akku verschwendet.
Öffentliches Teilen von Notizen bei vollständiger Verschlüsselung
Eine besondere Herausforderung stellte die Möglichkeit dar, ausgewählte Notizen öffentlich zugänglich zu machen. Da alle Notizen standardmäßig verschlüsselt sind, musste eine Lösung gefunden werden, die es Nutzern ermöglicht, Inhalte zu teilen, ohne die Verschlüsselung der Hauptdatenbank aufzuheben.
- Öffentliche Notizen werden in einer separaten Datenbanktabelle gespeichert.
- Datenbankseitige Beschränkungen verhindern Missbrauch.
- Der öffentliche Zugriff erfolgt über eine Supabase Edge Function, die als Schnittstelle dient.
- Next.js bietet durch ISR (Incremental Static Regeneration) schnelle Ladezeiten, während Webhooks die Cache-Invalierung bei Änderungen oder Löschungen sicherstellen.
Diese Herangehensweise ermöglicht es Nutzern, ausgewählte Inhalte zu teilen, ohne die grundlegende Verschlüsselungsstrategie der App zu gefährden.
Ausblick: Integration von MCP-Servern für erweiterte Funktionen
Die Entwicklung von Annota war für mich eine wertvolle Lektion in lokal-first-Architektur, Synchronisation und praktischer Ende-zu-Ende-Verschlüsselung. Es bleibt jedoch noch viel Raum für Verbesserungen und neue Funktionen. Aktuell arbeite ich an der Integration von MCP-Servern, um die Funktionalität der App zu erweitern. Ein besonderes Augenmerk liegt dabei auf der Wahrung der Datenschutzprinzipien – etwa durch die Implementierung eines BYOK-Systems (Bring Your Own Key), das nur ausgewählte Notizen als Kontext für MCP-Server bereitstellt.
Für Entwickler, die sich ebenfalls mit lokal-first-, offline-first- oder datenschutzorientierten Projekten beschäftigen, wäre ein Austausch über Herausforderungen und Lösungsansätze sehr wertvoll. Feedback und Diskussionen zu architektonischen Entscheidungen sind stets willkommen.
KI-Zusammenfassung
Annota projesiyle yerel odaklı mimariyi uçtan uca şifrelemeyle birleştiren bir not alma uygulamasının mimari detayları ve karşılaşılan zorluklar.