A modern Matrix protocol desktop chat client built with Tauri 2, React 19, and TypeScript. Weave focuses on a clean multi-account experience with end-to-end encryption, spaces, and native desktop integration.
Identifier:
com.antigravity.weave· Version0.1.0
- Multi-account — sign in to multiple Matrix accounts and switch between them instantly.
- End-to-end encryption — E2EE backed by the matrix-js-sdk Rust/WASM crypto stack, with secret storage, key backup, and device verification.
- OS keychain integration — recovery keys are stored securely in the native OS keychain, keyed by Matrix user ID so they survive token refresh and re-login.
- Spaces — browse and filter rooms by Matrix spaces, with a dedicated space switcher.
- Rich timeline — message edits, reactions, redactions, late decryption, local echo, emoji picker, encrypted image rendering, typing indicators, and date separators.
- Members & profiles — member lists, user profile modals, and room info modals.
- Native desktop integration — system tray with unread tooltip, desktop notifications, and minimize-to-tray.
- Theming — light/dark theming with global design tokens.
| Layer | Technology |
|---|---|
| UI & state | React 19, TypeScript 5.8, React Router 7, Zustand 5, Lucide React |
| Matrix | matrix-js-sdk 41 (Rust crypto via WASM) |
| Desktop shell | Tauri 2 (Rust) with plugins: notification, store, keyring, opener |
| Build | Vite 7, vite-plugin-node-polyfills, vite-plugin-wasm, vite-plugin-top-level-await |
Three layers communicate via Tauri IPC:
React + TypeScript (UI + state)
↕ Tauri IPC
Tauri / Rust (notifications, tray, OS keychain, persistent store)
↕ HTTP / WSS
Matrix homeserver (via matrix-js-sdk)
Zustand drives three stores:
accountsStore— accounts list, active account, per-account sync state, E2EE unlock flags.roomsStore— room summaries per account, active space filter, and the space → children mapping.timelineStore— messages per room (capped at 500), typing indicators, and reactions.
AccountManager is the central hub. It creates and holds the matrix-js-sdk client instances, registers all SDK event listeners, and drives the three Zustand stores. A single instance is shared across the app (initialized in App.tsx).
| What | Where |
|---|---|
| Account configs (userId, deviceId, access token reference) | Tauri plugin-store (accounts.json) |
| E2EE recovery keys | OS keychain via the keyring plugin, keyed by Matrix userId |
| Message cache, sync tokens, crypto state | IndexedDB (managed by matrix-js-sdk) |
Defined in src-tauri/src/lib.rs:
send_notification— show a native desktop notification.update_tray_tooltip— update the tray tooltip with the current unread count.
Permissions are declared in src-tauri/capabilities/default.json.
- Node.js (LTS)
- Rust toolchain
- Platform-specific Tauri dependencies — see the Tauri prerequisites guide
npm install# Frontend dev server only (Vite on port 1420)
npm run dev
# Full Tauri desktop app (spawns Vite internally)
npm run tauri devnpm run build # TypeScript check + Vite bundle
npm run tauri build # Full desktop app bundlenpx tsc --noEmitThe Rust crypto runs as WASM and requires
public/matrix_sdk_crypto_wasm_bg.wasmto be present.
src/
accounts/ AccountManager + credential store
components/ UI components (timeline, member list, dialogs, modals, pickers)
contexts/ Theme context
hooks/ useTraySync and other hooks
store/ Zustand stores (accounts, rooms, timeline)
styles/ Global theme tokens
types/ Matrix type definitions
utils/ Reaction/message builders, user color helpers
views/ AppLayout, LoginPage, RoomView, SettingsPage
src-tauri/ Rust backend (commands, tray, plugins)
No license has been specified for this project yet.