# Map: WebSocket-Realtime-Layer + Voice-Signaling-Fundament **Status: abgeschlossen.** Alle elf Tickets sind aufgelöst; das Ziel — eine implementierbare Spec — ist erreicht. Dieses Verzeichnis ist die Begründungsschicht zum Realtime-Code: *warum* etwas so gebaut ist, samt der verworfenen Alternativen. Offene Arbeit steht nicht hier, sondern als Issue im GitLab. Der Effort umfasst beide Repos (`rustification-server` und `rustification-client`); die Dokumente liegen hier, weil das Gewicht der Spec serverseitig ist. Entstanden mit `/wayfinder`; Label dort: `wayfinder:map`. ## Destination Eine implementierbare Spec für einen WebSocket-Realtime-Layer **neben** dem bestehenden REST-API (Nachrichten-Push für alles Persistierte) plus das **Voice-Signaling-Fundament** (Room join/leave, Teilnehmerliste, SDP/ICE-Relay — kein Audio), zugeschnitten für den Tauri-Client auf Desktop und Mobile im Foreground. Fertig, wenn jemand die Spec ohne Rückfragen implementieren kann und der spätere E2EE-Effort sie nicht ungültig macht. **Dieser Effort plant, er baut nicht.** Jedes Ticket beantwortet eine Entscheidung. Die Umsetzung ist ein eigener Effort. ## Notes ### Produktkontext Rustification ist als Alternative zu Matrix gedacht, mit zwei erklärten Erfolgsfaktoren: 1. **Deployment-Simplizität** — wie leicht, schnell und reproduzierbar ist ein Server aufgesetzt und einsatzbereit? 2. **Nutzersicherheit** — Schutz vor Angriffen und Data-Leaks. Zielbild: Firmen, die mit sensiblen Daten umgehen (eigene Instanz), und eine öffentliche Discord-Alternative für Privatnutzer. Jeder Nutzer soll einen eigenen Server hosten können. **Bedrohungsmodell: der Serverbetreiber ist ein Angreifer.** Das ist der Grund, warum echtes E2EE gerechtfertigt ist und nicht bloß Verschlüsselung at rest. ### Codebases | | | |---|---| | `rustification-server` | Rust, Axum 0.8, SQLx 0.9 / PostgreSQL 17, JWT + Argon2, Tokio. Migrationen embedded. | | `rustification-client` | Tauri v2. Frontend React 18 + TS (Vite). Client-Backend Rust, ruft REST via `reqwest`. Ziele: Windows, Linux, Android, iOS. | Stand heute: **Polling.** `MessageList.tsx:33` fährt ein `setInterval(load, 3000)`, zusätzlich zählt `ChatPage.tsx` nach dem Senden einen `refreshKey` hoch. Beides wird ersetzt. (Der Client-README beschreibt darüber hinaus Member-Panel und Settings-Seite, die es im Code noch nicht gibt.) Weitere Bestandsfakten aus den Recherchen: `axum = "0.8.9"` ist **ohne `ws`-Feature** eingebunden, es gibt keinen Graceful Shutdown, und `Extension` wird nirgends gelesen. Auf Client-Seite existieren `src-tauri/gen/android` und `gen/apple` noch nicht — Mobile ist nie initialisiert worden, es gibt also nichts zu migrieren. Und es gibt weder WebRTC- noch WebSocket-Code: grüne Wiese. ### Feststehende Randbedingungen Diese sind **entschieden** und werden von den Tickets nicht neu aufgemacht: | Thema | Entscheidung | |---|---| | REST vs. WS | REST bleibt für Auth, CRUD und History. WS macht Push + Voice-Signaling. | | Protokollform | **Dumb Pipe** `{conversation, cursor}` für alles Persistierte; eigenes flüchtiges Format nur für Voice-Signaling. Die Naht verläuft entlang *persistiert vs. flüchtig*. | | Deployment | **Harte Regel: eine Binary + Postgres.** TURN ist optionale, extern konfigurierbare Abhängigkeit — ohne sie läuft Chat voll, Voice eingeschränkt. | | Zustellung | Best-effort + `?since`-Backfill nach Reconnect. Keine Server-Queue, keine ACKs — die DB *ist* die Queue. | | Fan-out | **Revidiert am 14.08.2026 durch *Fan-out-Architektur*:** kein Trait, keine zweite Implementierung — **immer** über `pg_notify`, auch bei einer Instanz. Ein Trigger auf `conversation_events` feuert, der Server hört sich per `PgListener` selbst zu. Ein Pfad für Ein- und Mehr-Instanz-Betrieb, der getestete Pfad ist der Produktionspfad. Kein Redis. *(Ursprünglich: In-Process hinter einem Trait, `NOTIFY` als zweite Impl — formuliert, bevor feststand, dass der Event 60 Byte groß ist und der Trigger ohnehin feuert.)* | | Server-Modell | **Keine Föderation.** Der *Client* hält N Verbindungen zu N unabhängigen Servern; kein Server-zu-Server-Protokoll. | | Krypto | Nachrichteninhalte sind im Protokoll undurchsichtige Blobs. Metadaten darf der Server sehen. Volles E2EE-Design ist ein Folge-Effort. | | Mobile | Foreground ja. Background-Delivery und Push out of scope. | | Bestandsdaten | Keine. Migrationen dürfen brechen. | | Client-Plattformen | Windows, Linux, Android, iOS — **Linux ist vollwertige Client-Plattform**, nicht nur Server-Host (bestätigt 14.08.2026). Das verbaut den billigen Ausweg bei *Voice auf Linux*. | | **Keine fremden Origins im WebView** | wry vergibt Mikrofonrechte ohne App-Beteiligung — auf iOS in 0.55.1 bedingungslos `Grant` für jeden Origin. Solange nur eigener gebündelter Code läuft, ist das harmlos; ein `