Projekte / DeltaTauri

DeltaTauri

TauriRustTypeScript
Screenshot von Delta Chat Desktop (Tauri-Edition) mit einem Gruppenchat

Ü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:

Download-Größenvergleich zwischen Electron und Tauri über alle Plattformen. Windows NSIS: 122 MB vs 27 MB, macOS Universal: 213 MB vs 91 MB, macOS ARM: 153 MB vs 44 MB, Linux Debian: 102 MB vs 33 MB, Linux Flatpak Plattform: 1039 MB vs 675 MB, Linux Flatpak App: 548 MB vs 60 MB.
Installer-/Download-Größen in MB. Electron enthält Chromium, daher ist die App selbst groß, hat aber keine Plattform-Abhängigkeit. Tauri nutzt den System-Webview, was die App winzig macht - aber auf Linux Flatpak kommt eine größere Plattform-Runtime (GNOME + WebKitGTK) als Abhängigkeit dazu.

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:

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.


  1. 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.
  2. Nennenswerte fehlende Features sind Karten (Location-Streaming) und Anrufe.