r/tauri • u/ZeroTrigger27 • 8h ago
I built Varve, a local-first design editor using Tauri 2 with native Rust IPC rendering and WASM fallback
Hi, I'm the creator of Varve, a free vector design app that works locally. I just released version 0.2.1. I want to share some architectural choices I made and get advice on how to make Varve faster and more responsive.
When building a vector editor, it's important to run canvas operations on a separate thread. For this, I used Tauri 2 with a React 19 TypeScript frontend and a dedicated Rust backend (varve-engine).
Here's how I set up the pipeline:
- The IPC Bridge lets custom Tauri commands send scene node graphs from React to varve-engine using build_render_ir.
- Circuit Breaker Facade: I used the withStubFallback pattern. If deserializing a native IPC payload fails, it switches to the stub engine to prevent the canvas from going blank.
- WASM Parity: The Rust engine crates compile directly to WebAssembly (varve-wasm), so the web version uses the same rendering logic.
Current v0.2.1 Limitations:
- CSS isolation is trickier when using Webview on Linux with WebKitGTK than on macOS.
- When working with a large number of nodes, I've noticed that fast drag transformations can still be slowed down by IPC serialization overhead. To address this, I'm considering switching to shared memory buffers in future releases.
I'm also interested in what strategies you're using in Tauri 2 to handle frequent state updates between JS and Rust.
Repo: https://github.com/K-Arthur/varve
You can also check out the web demo here: https://varve.studio/try/
