dbf8030e93
Friend-DM "Nachricht nicht lesbar" recurred even after v0.21.3 because the proactive sweep called shareConvKeyToUser, which reads the module-level conv-key cache first. After a server-side cleanup the cache still held the stale locally-bootstrapped key, so each side wrapped its own different key for the peer and the bundles diverged anew. Switch the sweep to rotate_conv_key when any peer's user-id bundle is missing at the active version: a fresh symmetric key is generated, wrapped for every member at their CURRENT pubkey, and the active version is bumped under a row-level FOR UPDATE lock. Concurrent rotations are race-safe — the loser sees "new version must be greater" and bails; the winner's bundles propagate via realtime. Realtime conversation_keys subscription now invalidates the cache for the affected (conversationId, key_version) on any INSERT/UPDATE/DELETE — so admin cleanups, peer rotations, or device wraps can no longer leave a stale entry in this client's session cache. queueInsert now fires the first event of a quiet period immediately and only collapses follow-up bursts. BATCH_WINDOW_MS dropped 250 → 80 ms. This closes the ~250 ms gap between the notification sound and the message body appearing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@chat-app/desktop
Tauri v2 + React + Vite + Tailwind desktop client (macOS / Windows / Linux).
Prerequisites
- Node 22+, pnpm 9+
- Rust + Cargo (install via https://rustup.rs)
- Platform build deps:
- macOS: Xcode Command Line Tools
- Linux:
libwebkit2gtk-4.1-dev,build-essential,libssl-dev(Debian/Ubuntu) - Windows: Microsoft C++ Build Tools + WebView2
Dev
# from repo root
pnpm install
pnpm desktop:dev # tauri dev — launches Vite + native window
pnpm desktop:build # production bundle per platform
Layout
src/— React app (Vite bundles intodist/).src-tauri/— Rust backend.main.rswires Tauri plugins.vite.config.ts— port1420, HMR on1421, aliases to shared packages.
Secure Storage
Session tokens + user private keys live in Stronghold (tauri-plugin-stronghold).
Local message history lives in SQLite (tauri-plugin-sql), DB file encrypted at rest.