---
name: optimizing-tauri-binary-size
description: "Tauri binary size optimization to produce small, efficient desktop bundles via Cargo profile settings and build configuration. USE WHEN a Tauri production build is larger than expected and you want to shrink it with release profile tuning, stripping, LTO, or dependency trimming."
cluster: tauri
version: 1.0.0
---

# Tauri Binary Size Optimization

This skill provides guidance on optimizing Tauri application binary sizes for production releases.

## Why Tauri Produces Small Binaries

Tauri is designed from the ground up to produce minimal binaries:

1. **Native Webview**: Uses the operating system's native webview instead of bundling Chromium (unlike Electron)
2. **Rust Backend**: Compiles to efficient native code with no runtime overhead
3. **Tree Shaking**: Only includes code that is actually used
4. **No V8 Engine**: Leverages existing system components rather than bundling a JavaScript engine

### Size Comparison

| Framework | Minimum Binary Size |
|-----------|---------------------|
| Tauri     | ~3-6 MB             |
| Electron  | ~120-180 MB         |
| NW.js     | ~80-100 MB          |

The dramatic size difference comes from Tauri's architectural decision to use native system webviews rather than bundling a full browser engine.

## Cargo.toml Optimization Settings

Configure release profile settings in `src-tauri/Cargo.toml` to minimize binary size.

### Recommended Stable Toolchain Configuration

```toml
[profile.release]
codegen-units = 1    # Compile crates one at a time for better LLVM optimization
lto = true           # Enable link-time optimization across all crates
opt-level = "s"      # Optimize for binary size (alternative: "z" for even smaller)
panic = "abort"      # Remove panic unwinding code
strip = true         # Strip debug symbols from final binary
```

### Configuration Options Explained

| Option | Values | Description |
|--------|--------|-------------|
| `codegen-units` | `1` | Reduces parallelism but allows LLVM to perform better whole-program optimization |
| `lto` | `true`, `"thin"`, `"fat"` | Link-time optimization; `true` or `"fat"` produces smallest binaries |
| `opt-level` | `"s"`, `"z"`, `"3"` | `"s"` balances size/speed, `"z"` prioritizes size, `"3"` prioritizes speed |
| `panic` | `"abort"` | Removes panic handler code, reducing binary size |
| `strip` | `true`, `"symbols"`, `"debuginfo"` | Removes symbols and debug information from binary |

### Nightly Toolchain Options

For projects using the nightly Rust toolchain, additional optimizations are available:

```toml
[profile.release]
codegen-units = 1
lto = true
opt-level = "s"
panic = "abort"
strip = true
trim-paths = "all"    # Remove file path information from binary

[profile.release.build-override]
opt-level = "s"       # Also optimize build scripts
```

You can also set rustflags for additional control:

```toml
[profile.release]
rustflags = ["-Cdebuginfo=0", "-Zthreads=8"]
```

## Tauri Build Configuration

### Remove Unused Commands (Tauri 2.4+)

Tauri 2.4 introduced the ability to automatically remove code for commands not permitted in your Access Control List (ACL). Add this to `tauri.conf.json`:

```json
{
  "build": {
    "removeUnusedCommands": true
  }
}
```

This feature:
- Analyzes your ACL configuration
- Removes Tauri command handlers that are not allowed
- Reduces binary size without changing functionality
- Works automatically during release builds

### Minimal Feature Set

Only enable Tauri features you actually need in `src-tauri/Cargo.toml`:

```toml
[dependencies]
tauri = { version = "2", features = ["macos-private-api"] }
# Avoid enabling unnecessary features like:
# - "devtools" in production
# - "protocol-asset" if not serving local assets
# - "tray-icon" if not using system tray
```

## Frontend Optimization

While this skill focuses on Rust/Tauri optimization, frontend bundle size also affects the final application:

1. **Use a bundler**: Vite, webpack, or similar with tree shaking
2. **Code splitting**: Load features on demand
3. **Minimize dependencies**: Audit and remove unused npm packages
4. **Compress assets**: Optimize images and other static assets

## Build Commands

### Standard Release Build

```bash
cd src-tauri
cargo tauri build --release
```

### Using Nightly Toolchain

```bash
cd src-tauri
cargo +nightly tauri build --release
```

### Check Binary Size

After building, check your binary size:

```bash
# macOS
ls -lh src-tauri/target/release/bundle/macos/*.app/Contents/MacOS/*

# Linux
ls -lh src-tauri/target/release/bundle/appimage/*.AppImage

# Windows
dir src-tauri\target\release\bundle\msi\*.msi
```

## Complete Example Configuration

Here is a complete `src-tauri/Cargo.toml` optimized for minimal binary size:

```toml
[package]
name = "my-tauri-app"
version = "0.1.0"
edition = "2021"

[dependencies]
tauri = { version = "2", features = [] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"

[build-dependencies]
tauri-build = { version = "2", features = [] }

[profile.release]
codegen-units = 1
lto = true
opt-level = "s"
panic = "abort"
strip = true

[profile.release.package."*"]
opt-level = "s"
```

And corresponding `tauri.conf.json`:

```json
{
  "productName": "my-tauri-app",
  "version": "0.1.0",
  "identifier": "com.example.my-tauri-app",
  "build": {
    "removeUnusedCommands": true,
    "beforeBuildCommand": "npm run build",
    "frontendDist": "../dist"
  },
  "bundle": {
    "active": true,
    "targets": "all",
    "icon": ["icons/icon.png"]
  }
}
```

## Optimization Trade-offs

| Setting | Size Impact | Build Time | Runtime Performance |
|---------|-------------|------------|---------------------|
| `codegen-units = 1` | Smaller | Slower | Better |
| `lto = true` | Smaller | Much slower | Better |
| `opt-level = "s"` | Smaller | Similar | Slightly slower |
| `opt-level = "z"` | Smallest | Similar | Slower |
| `panic = "abort"` | Smaller | Faster | No unwinding |
| `strip = true` | Smaller | Similar | No impact |

## Troubleshooting

### Binary Still Large

1. Check for debug builds: Ensure you are using `--release` flag
2. Audit dependencies: Run `cargo tree` to see dependency graph
3. Check for duplicate dependencies: Different versions of same crate
4. Verify strip is working: Use `file` command to check for debug symbols

### Build Failures with LTO

If `lto = true` causes build failures:
- Try `lto = "thin"` as a fallback
- Ensure sufficient memory (LTO is memory-intensive)
- Update Rust toolchain to latest version

### Nightly Features Not Working

Ensure nightly is installed and active:

```bash
rustup install nightly
rustup default nightly
# Or use +nightly flag with cargo commands
```

## References

- [Tauri Size Documentation](https://v2.tauri.app/concept/size)
- [Cargo Profile Settings](https://doc.rust-lang.org/cargo/reference/profiles.html)
- [Rust Performance Book](https://nnethercote.github.io/perf-book/)
