# Architecture Decision Record: Use Tauri with Embedded Node for Cross-Platform App **Date:** 2025-08-15 **Status:** Accepted **Decision Makers:** \[Team/Project Name] **Context:** Desktop + Mobile App Development --- ## **Context** We are building a cross-platform application targeting **desktop (Windows, macOS, Linux)** and **mobile (Android, iOS)** using **SvelteKit + TailwindCSS** for the UI. Key goals: * Maintain **fast development iteration** with hot reload for both frontend and backend logic. * Allow backend logic to be written in **TypeScript** for developer familiarity and speed. * Support writing **performance-critical features in Rust** if needed. * Deploy the **same codebase** across desktop and mobile with minimal divergence. * Avoid security limitations of browser-only apps (e.g., CORS, sandbox restrictions). * Provide direct access to **Node APIs** and/or **Rust commands** for native capabilities. --- ## **Decision** We will use **Tauri v2** with an **embedded Node runtime** alongside the SvelteKit frontend. ```mermaid graph LR %% "Tauri + Node + SvelteKit + Tailwind Architecture" subgraph "Frontend (UI)" SvelteKit["SvelteKit
(TS + TailwindCSS)"] WebView["WebView
(Tauri Runtime)"] SvelteKit --> WebView end subgraph "Backend Logic" NodeJS["Embedded Node.js Runtime
(TypeScript backend)"] Rust["Rust Commands
(Tauri APIs / Native modules)"] end subgraph "Platforms" Desktop["Desktop
(Windows, macOS, Linux)"] Mobile["Mobile
(Android, iOS)"] end WebView -->|IPC / API calls| NodeJS WebView -->|Tauri Commands| Rust NodeJS -->|FFI / API bridge| Rust Rust -->|Native APIs| Desktop Rust -->|Native APIs| Mobile WebView --> Desktop WebView --> Mobile ``` **Why Tauri**: * Small runtime compared to Electron for desktop builds (\~5–20 MB without Node). * Native integration with OS features (system tray, notifications, file access, etc.). * Built-in support for **mobile (Android/iOS)** in Tauri v2. * Strong security model and long-term community backing. **Why embed Node**: * Node.js runtime allows full access to existing npm ecosystem and built-in modules (`fs`, `crypto`, `net`, etc.). * Enables backend logic to be written entirely in TypeScript during early development. * Hot reload with tools like `nodemon` or `ts-node` for fast iteration. * Flexibility to migrate specific logic to Rust incrementally without losing productivity. **Workflow**: * **Development**: * Run SvelteKit dev server for UI (`npm run dev`) * Run Node backend with hot reload * Tauri shell points to `localhost` dev server for instant updates * **Production**: * Bundle SvelteKit output with `adapter-static` or `adapter-node` * Include Node runtime for backend logic * Optionally replace parts of backend with compiled Rust commands for performance-critical paths --- ## **Alternatives Considered** 1. **Capacitor** * ✅ Mature mobile ecosystem and simpler dev workflow for mobile * ❌ No built-in Node runtime; would require rewriting backend logic as plugins or browser-safe code * ❌ We would lose direct access to Node APIs without extra complexity 2. **Electron** * ✅ First-class Node integration * ❌ Larger desktop build size (50–150 MB) * ❌ Heavier memory footprint compared to Tauri 3. **Pure Tauri (Rust backend only)** * ✅ Smallest build sizes, fastest runtime * ❌ Slower development for backend logic without TS hot reload * ❌ Would require Rust expertise for all backend features from day one --- ## **Consequences** **Positive:** * Full-stack TypeScript possible in early development → faster MVP delivery. * Incremental migration path to Rust for performance-sensitive features. * Single codebase for desktop & mobile. * Rich native API access via both Node and Tauri’s Rust plugins. * Security benefits from Tauri’s isolation model. **Negative:** * Larger mobile builds (\~25–40 MB vs. Capacitor’s \~10–20 MB). * More complex tooling setup (Rust + Node + mobile SDKs). * Slightly slower startup time on mobile due to Node runtime initialization. --- ## **References** * [Tauri v2 Documentation](https://v2.tauri.app/) * [Node.js Documentation](https://nodejs.org/en/docs) * [SvelteKit Documentation](https://kit.svelte.dev/) * [TailwindCSS Documentation](https://tailwindcss.com/) --- I can also add a **diagram showing the architecture** — frontend, embedded Node backend, and optional Rust modules — so stakeholders can visually understand how the stack fits together across platforms. Do you want me to make that diagram next?