Turbo Desktop apps are Tauri apps, so distribution means producing native installers per OS. This guide covers the easy path (a release workflow), local builds, and the optional-but-recommended signing/update setup.
This repo ships .github/workflows/release.yml. To release:
git tag v0.1.0
git push origin v0.1.0
CI then builds on three runners (Tauri can’t cross-compile) and attaches installers to a draft GitHub Release for you to review and publish:
| Platform | You get |
|---|---|
| macOS (universal) | .dmg + .app (runs on Intel and Apple Silicon) |
| Windows | .msi + NSIS .exe |
| Linux | .deb + .AppImage |
You can also run it manually from the Actions → Release → Run workflow button.
Turbo Desktop follows the Hotwire Native model: the shell loads server_url from
turbo-desktop.config.json, baked in at build time. So a distributed app is a thin native shell
pointing at your hosted Rails app — you ship the binary, your Rails app is the product. Set
server_url to your production URL before building for release.
npm run build # cargo tauri build — bundles for the current OS
npm run build:apple-silicon # arm64 macOS only
Output: src-tauri/target/release/bundle/.
npx turbo-desktop new myapp scaffolds a desktop/ project. To get the same one-tag releases,
copy release.yml into your app’s .github/workflows/ and adjust projectPath if your Tauri
project isn’t at the repo root. Everything else (matrix, deps, draft release) works as-is.
Unsigned builds trigger Gatekeeper (macOS) and SmartScreen (Windows) warnings. Builds are unsigned
by default so a first release just works. To sign, uncomment the signing block in
release.yml and set the matching repo secrets (don’t leave the env set to empty secrets — an
empty APPLE_CERTIFICATE makes Tauri try, and fail, to import an empty certificate).
APPLE_CERTIFICATE,
APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_PASSWORD,
APPLE_TEAM_ID.bundle.windows.certificateThumbprint (or a signing
command) in tauri.conf.json.See the Tauri signing guides: macOS · Windows.
tauri.conf.json includes the updater plugin, but endpoints and pubkey are empty — updates
are off until you configure them:
npx tauri signer generate.tauri.conf.json → plugins.updater.pubkey and add your update-server
endpoints.TAURI_SIGNING_PRIVATE_KEY /
TAURI_SIGNING_PRIVATE_KEY_PASSWORD secrets (the release workflow already passes them through).Details: Tauri updater.
More at the official site: turbo-desktop.dev.