eac19823ea
The picker still felt frozen while thumbnails were streaming in because each result was both (a) large — PNG @ 320×180 landed at 60-150 KB base64 — and (b) triggering a high-priority React re-render of the whole grid. Three fixes together restore interactivity: - Thumbnails encoded as JPEG @ Q70 at 240×135 instead of PNG @ 320×180. Drops the typical payload from ~100 KB to ~20 KB, so IPC JSON-parsing on arrival is 5× faster. - SourceCard wrapped in React.memo so only the card whose thumbnail just landed re-renders. Previously one new thumbnail caused all ~20 cards to re-evaluate their props. - setSources updates run inside startTransition so scroll / click events stay on the high-priority lane while the grid backfills. Also: when the user enables "Sound mit übertragen" AND has a source picked, the picker now surfaces an inline amber note explaining that the OS picker will appear for the audio capture path. Matches the existing console info log but is visible pre-click so users don't experience it as a bug. 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.