16d179f8e8
Previous commit had the command typed as Result<tauri::ipc::Response, String>. Turns out that forces Tauri to JSON-serialise the variant wrapper around the Response body — the frontend gets a JSON object instead of the raw ArrayBuffer, the runtime check for byteLength fails, and every thumbnail comes back as null. Changed the return type to `tauri::ipc::Response` directly. Bad source ids and capture failures now funnel into an empty byte buffer; the JS side still detects "no thumbnail" via `byteLength === 0` so the contract stays the same. Frontend also widens the invoke-result typing to ArrayBuffer | Uint8Array | number[] so an older WebView2 that happens to deserialise as an array still works, and normalises into a plain ArrayBuffer before constructing the Blob to sidestep a TS SharedArrayBuffer incompatibility. 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.