"Dev points your window at a living server. Build freezes everything into one binary. Know which world you're in."
Two Commands, Two Worlds
tauri dev is your inner loop. It runs beforeDevCommand to start your frontend dev server, waits until devUrl responds, then compiles the Rust core in debug mode and launches a native window pointed at that dev server. You get HMR on the frontend and recompile-on-save on the Rust side. Edit a component — it updates live. Edit a command — Rust rebuilds and relaunches.
tauri build is the shipping path. It runs beforeBuildCommand to produce your static frontend, compiles the Rust core in release mode (optimized, slower to compile), embeds the frontendDist files into the binary, and then runs the bundler to produce installers for your targets. No dev server is involved; the app is fully self-contained.
Debug vs Release Is a Real Difference
The debug binary from tauri dev is large and unoptimized — great for fast iteration, terrible to ship. The release binary from tauri build is optimized and stripped, which is why it's small and fast but takes longer to compile. Never benchmark performance or binary size against a debug build; measure the release output.
Where the Output Lands
After tauri build, your installers appear under src-tauri/target/release/bundle/, organized by type — dmg/ and macos/ on a Mac, msi/ and nsis/ on Windows, deb/ and appimage/ on Linux. The raw executable is in target/release/; the bundle folder is what you hand to users. We'll go deep on this in the ship track.