Tauri Desktop Apps
Build lightweight cross-platform desktop apps with Tauri: Rust backend, web frontend, secure IPC, native APIs, and 10× smaller bundles than Electron.
Tauri is a Rust-based alternative to Electron for building cross-platform desktop apps. It uses the OS webview (WebKit on macOS, WebView2 on Windows) instead of bundling Chromium, resulting in app bundles 10× smaller than Electron. The backend is Rust; the frontend is any web framework.
Use Tauri for desktop apps where bundle size, memory usage, or security matters. Use Electron when you need a specific Chromium version or complex browser APIs. Tauri's security model (capability-based permissions) is strictly better than Electron.
Workflow
- Set up a Tauri project with a web frontendTauri wraps any web frontend - Vite+React, SvelteKit, or plain HTML - with a Rust backend.
- Write Rust commands for backend logicRust commands handle everything that requires OS access: file system, system info, native APIs.
- Configure capabilities and permissionsTauri 2.0's capability system restricts what each window can do - security by default.
- Access native OS APIsTauri plugins provide typed wrappers for file system, notifications, shell, system tray, and more.
- Package and distributeTauri produces small, native installers (.dmg, .exe, .deb/AppImage) without embedding a browser engine.
Output Format
Rust commands for backend logic, frontend using invoke API, capabilities configured, native plugins for OS features, signed and packaged for distribution.
Examples
Rust command: `#[tauri::command] async fn get_system_info() -> serde_json::Value { serde_json::json!({ "os": std::env::consts::OS, "arch": std::env::consts::ARCH }) }`Frontend invoke: `const info = await invoke<{ os: string; arch: string }>("get_system_info"); console.log(`Running on ${info.os} (${info.arch})`)`Tauri event: `import { listen } from "@tauri-apps/api/event"; const unlisten = await listen<string>("progress", (event) => setProgress(event.payload))`Edge Cases & Gotchas
- WebView differences: macOS uses WebKit, Windows uses WebView2 (Chromium-based) - CSS and JS behavior can differ; test on both platforms
- Rust compilation time: initial Rust build is slow (2-5 min); subsequent incremental builds are fast. Use `cargo` caching in CI
- IPC serialization: all invoke params and return values go through JSON serialization; avoid circular references and large binary data (use file paths instead)
When to Break These Rules
- If your web app depends on browser-specific APIs (WebGL2 extensions, specific codec support) that differ between OS webviews, Electron's consistent Chromium version is more predictable.
Reference Files
Tauri docs: https://tauri.app/guide/Tauri API reference: https://tauri.app/reference/v2/Tauri plugins: https://github.com/tauri-apps/plugins-workspaceTauri GitHub Action: https://github.com/tauri-apps/tauri-action