Projekte / DeltaTauri
DeltaTauri
Über dieses Projekt
Dieser NLnet-geförderte Prototyp umfasste die Umstrukturierung der Delta Chat Desktop-Codebasis in ein modulares Monorepo und den Bau eines neuen Tauri-basierten Runtime-Targets. Warum Tauri? Die üblichen Gründe: kleinere Downloads, geringerer Ressourcenverbrauch und bessere Sicherheit durch Rusts Memory Safety - plus eine gehörige Portion Electron-Müdigkeit aus der Community.
Monorepo-Reorganisation
Bevor die Tauri-Portierung beginnen konnte, musste die Codebasis von Electron entkoppelt werden. Ich habe das Repository in ein modulares Monorepo mit pnpm Workspaces umorganisiert und UI, geteilte Logik und Plattform-Targets in separate Pakete aufgeteilt. Das ermöglichte auch eine Browser Edition, die bewies, dass das Frontend unabhängig von Electron laufen kann, und ließ uns End-to-End-UI-Testing mit Playwright wiedereinführen - etwas, das auf Electron zu buggy gewesen war.1
Für das Monorepo-Management wählte ich pnpm, was sich als
zweischneidiges Schwert erwies: Sein Content-Addressable Store ist
großartig für Speichereffizienz, verursachte aber Reibung mit
electron-builder (der Workarounds brauchte) und mit Flathubs Offline-Build-System, das damals nur yarn
und npm unterstützte.
Webxdc-Sandboxing
Delta Chat unterstützt webxdc-Apps. Das sind kleine Web-Apps, die man direkt in Chat-Gruppen verwenden kann. Das Sicherheitsmodell verlangt, dass diese Apps keinen Internetzugriff haben und nur über die vom Host-Messenger bereitgestellte API kommunizieren können. Da webxdc-Apps nicht vertrauenswürdige, nutzergenerierte Inhalte sind, müssen System-APIs und Delta-Chat-Interna unzugänglich sein, um Schaden durch bösartige Apps zu verhindern.
Tauris Capability-basiertes Berechtigungssystem war dafür wie gemacht.
Wir haben das Sandboxing so gestaltet, dass jeder Fenstertyp
unterschiedliche Berechtigungen bekommt, und Custom-URL-Schemes wie
dcblob:// eingeführt, um Anhänge bereitzustellen, ohne das
Dateisystem offenzulegen. Zusammen mit WofWca haben wir eine umfangreiche Liste von Schutzmaßnahmen durchgearbeitet: Dummy-SOCKS-Proxys zum Blockieren des
Netzwerkzugangs, WebRTC-Deaktivierung, DNS-Blocking, strikte CSP,
MIME-Sniffing-Schutz und Deaktivierung aller Tauri-Commands
standardmäßig für gesandboxte Fenster.
Herausforderungen & Upstream-Beiträge
Tauris Ökosystem war jünger als das von Electron, und wir stießen unterwegs auf fehlende Features und Bugs. Wo Electron eine einzige konsistente Chromium-Runtime bietet, setzt Tauri auf Plattform-Webviews - WebKit auf macOS und Linux, Chromium-basiertes WebView2 auf Windows. Das bedeutete den Umgang mit Rendering-Unterschieden, inkonsistenter API-Unterstützung und plattformspezifischen Bugs über alle drei Zielplattformen.
Wenn wir auf fehlende Features stießen, haben wir zum Tauri-Ökosystem beigetragen. Der wichtigste Beitrag war das user-notify-Crate - eine plattformübergreifende Benachrichtigungs-Bibliothek, die wir gebaut haben, weil Tauris eingebaute Lösung für Delta Chats Anforderungen nicht ausreichte.
Ergebnisse
Die Tauri-Edition erreichte nahezu vollständige Feature-Parität2 mit Electron und lieferte signifikante Reduzierungen der Download-Größe auf allen Plattformen:
Einige Features wurden sogar zuerst in der Tauri-Edition umgesetzt: Autostart, sofortiges Laden von webxdc-Apps und macOS-Benachrichtigungsantworten.
Nutzen für Upstream
Über die Tauri-Edition hinaus hat dieses Projekt die Delta-Chat-Desktop-Codebasis in mehrfacher Hinsicht verbessert:
- Die Monorepo-Reorganisation machte die Codebasis modularer und weniger an Electron als Runtime gekoppelt
- End-to-End-UI-Testing wurde über die Browser Edition und Playwright wiedereingeführt
- Ein NLnet-gefördertes Accessibility-Audit deckte UI-Probleme auf, die in der gemeinsamen UI behoben wurden - davon profitierte automatisch auch die offizielle Electron-Version
- Features wie Autostart wurden später auch von der Electron-Version übernommen
Aktueller Status
Die Tauri-Edition ist funktionsfähig und wird als experimenteller Download neben jedem Electron-Release veröffentlicht. Sie wird von der Community gepflegt; das Core-Team konzentriert sich auf Electron als offizielles Target. Einige Linux-spezifische Probleme (Benachrichtigungs-Bugs, GPU-Abstürze, Performance-Probleme, fehlende Kamera-/Mikrofon-Unterstützung) bleiben Blocker für einen vollständigen Ersatz der Electron-Version.
Was ich gelernt habe
Das Projekt war technisch breit gefächert - von plattformnativen
APIs über das objc2-Crate für macOS bis hin zu
Webview-Sandboxing und Security-Hardening. Die
Verwaltung eines Multi-Package-Monorepos mit pnpm hat mir viel über
Dependency-Management in größerem Maßstab beigebracht, und die
Unterstützung dreier Plattformen mit zwei verschiedenen
Browser-Engines gab mir eine tiefe Wertschätzung für
Cross-Browser-Testing und plattformspezifisches Debugging.
Weiterführende Links
Es ist auch ein Blogpost für den Delta Chat Blog in Arbeit, aber es ist unklar, wann er veröffentlicht wird. Wer sich traut, kann den Entwurf ansehen.
- Das vorherige Test-Framework (TestCafe) hatte einen Electron-spezifischen Crash-Bug, den ich nie aufspüren konnte. Test-Frameworks wie Playwright und TestCafe sind primär für Websites gebaut, daher ist es sowieso besser, die UI direkt im Browser zu testen als über einen Adapter für Electron.
- Nennenswerte fehlende Features sind Karten (Location-Streaming) und Anrufe.