Development Workflow
Running in Development Mode
The development server provides hot reload for both frontend and backend:- Starts Vite dev server on
http://localhost:5173 - Compiles Rust backend in debug mode
- Launches the Tauri app window
- Watches for file changes
Development Tips
The dev build is significantly slower than production. Use it for development only.
Opening DevTools
To inspect the frontend or debug JavaScript:- macOS
- Linux
- Windows
Press
Cmd+Option+I or right-click and select “Inspect Element”Rust Logging
Tauri logs Rust backend output to the terminal. Use standard Rust debugging:log and env_logger crates.
Frontend-Only Development
If you’re only working on UI components that don’t require backend features, you can run Vite standalone:bun tauri dev but won’t have access to Tauri APIs.
Production Builds
Build Command
To create a production build:- Runs
bun run buildto compile the frontend - Compiles Rust in release mode with optimizations
- Bundles everything into a platform-native installer
- Outputs the installer to
src-tauri/target/release/bundle/
Build Artifacts
- macOS
- Linux
- Windows
.dmgdisk image installer.appbundle intarget/release/bundle/macos/
Build Options
Debug Build (Faster, Larger)
Release Build (Optimized)
bun tauri build uses.
Configuration
Tauri Config
Location:src-tauri/tauri.conf.json
Key settings:
beforeDevCommand: Runs before dev mode (starts Vite)beforeBuildCommand: Runs before production build (builds frontend)devUrl: Dev server URLfrontendDist: Production build output directory
Version Bumping
Update the version in three places:package.json(frontend)src-tauri/Cargo.toml(backend)src-tauri/tauri.conf.json(Tauri config)
Cross-Platform Builds
Building for Multiple Platforms
Tauri requires native builds on each platform. You cannot cross-compile from macOS to Windows, for example. To build for all platforms:- Build on macOS for macOS (ARM + Intel via universal binary)
- Build on Linux for Linux
- Build on Windows for Windows
Universal macOS Binaries
To build a universal binary (ARM + Intel):Sidecar Binaries
Handhold bundles the Kokoro TTS binary as a sidecar. The binary must match the target platform:- macOS ARM:
koko-aarch64-apple-darwin - macOS Intel:
koko-x86_64-apple-darwin - Linux:
koko-x86_64-unknown-linux-gnu - Windows:
koko-x86_64-pc-windows-msvc.exe
src-tauri/binaries/
Bundled Resources
The following resources are packaged into the installer:src-tauri/resources/models/- TTS voice modelssrc-tauri/resources/espeak-ng-data/- Phoneme data
tauri.conf.json:
Testing Builds Locally
After building, test the installer:- macOS
- Linux
- Windows
Open the
.dmg and drag the app to Applications. Then run it from Applications.If unsigned, macOS will block it. Right-click the app and select “Open” to bypass Gatekeeper.Continuous Integration
The project includes a GitHub Actions workflow that:- Runs on every push to
main - Builds on macOS, Linux, and Windows runners
- Runs tests (when available)
- Uploads build artifacts
.github/workflows/ci.yml
Release Process
To trigger a release build:
Release workflow:
.github/workflows/release.yml
The workflow builds:
.dmgfor macOS (ARM + Intel universal).AppImageand.debfor Linux.msiand.exefor Windows
Troubleshooting
Build fails with “Cargo.lock is out of date”
Frontend build fails
Clear Vite cache:Sidecar binary not found
Ensure the TTS binary exists:Rust compilation is slow
Enable faster linking (Linux/macOS):~/.cargo/config.toml:
Next Steps
Contributing
Learn how to contribute to Handhold
Frontend
Explore the React frontend
Backend
Dive into the Rust backend
Architecture
Understand the system design