This runbook covers the signed Tauri release pipeline. Python CLI publication
remains independent in pypi-publish.yml.
- Desktop version values in
desktop/package.json,desktop/src-tauri/Cargo.toml, anddesktop/src-tauri/tauri.conf.jsonmust match. - The Git tag must be
desktop-v<version>. - Each platform builds its PyInstaller sidecar on the same operating system and CPU architecture as the Tauri host. PyInstaller output is not cross-platform.
- A release build can execute only the bundled
app-server/resource. It never falls back to source, a system Python, or an adjacent executable. - Update packages are signed with the Tauri updater key. Automatic downgrade is disabled.
- Releases are created as drafts. They are published only after bundle, signature, notarization, install, launch, update, and uninstall checks pass.
Create a protected GitHub environment named desktop-release. Require review
before jobs can access its credentials.
Repository variables:
TAURI_UPDATER_PUBLIC_KEY: public key generated bynpm run tauri signer generate. This value is compiled into release builds.TAURI_UPDATER_ENDPOINT(optional): absolute HTTPS endpoint. When omitted, the workflow useshttps://github.com/<owner>/<repo>/releases/latest/download/latest.json.
Repository or environment secrets:
TAURI_SIGNING_PRIVATE_KEYTAURI_SIGNING_PRIVATE_KEY_PASSWORDAPPLE_CERTIFICATE(base64 PKCS#12 Developer ID Application certificate)APPLE_CERTIFICATE_PASSWORDAPPLE_IDAPPLE_PASSWORD(app-specific password)APPLE_TEAM_IDWINDOWS_CERTIFICATE(base64 PFX code-signing certificate)WINDOWS_CERTIFICATE_PASSWORDLINUX_GPG_PRIVATE_KEYLINUX_GPG_KEY_IDAPPIMAGETOOL_SIGN_PASSPHRASE
The updater private key is a long-lived release root of trust. Back it up offline and never commit it. Losing it prevents existing installations from accepting future updates. Rotating it requires a deliberately staged release signed by the old trust chain.
| Product target | GitHub runner | Bundle |
|---|---|---|
| macOS arm64 | macos-15 |
notarized DMG + updater archive |
| macOS x64 | macos-15-intel |
notarized DMG + updater archive |
| Windows x64 | windows-2022 |
Authenticode-signed NSIS + updater signature |
| Linux x64 | ubuntu-22.04 |
deb + GPG-signed AppImage + updater signature |
The release action also generates latest.json for the signed updater. Asset
names include platform and architecture so the two macOS builds cannot
overwrite one another.
- Run all local verification gates and ensure the worktree contains only the intended release changes.
- Update the three Desktop version files together.
- Create and push
desktop-v<version>. - Approve the
desktop-releaseenvironment when GitHub requests it. - Wait for every matrix job. Missing credentials, incomplete runtime imports, sidecar RPC startup, code-signing, notarization, updater signing, or required resources fail the release.
- Download each workflow artifact onto a clean matching platform.
- Verify first launch with an isolated test account:
- no existing DeepCode Sessions are imported accidentally;
- project selection and trust work;
- Agent startup and shutdown leave no orphan sidecar;
- TXT, HTML, DOCX, Markdown, and PDF inputs reach
paper.md; - diagnostics export contains no prompts, credentials, file contents, or environment variables.
- Publish the draft only after a previous signed version successfully updates to the candidate.
- Test uninstall. User projects, central Session JSONL, and user configuration must remain intact.
The updater intentionally rejects lower versions. Do not enable automatic downgrades: an older application may not understand a newer SQLite schema.
For a bad unpublished draft, delete or replace the draft assets. For a bad published release:
- stop advertising it by restoring a known-good release as the GitHub
latestrelease or replacing the update manifest; - publish a higher-version hotfix whenever possible;
- if a manual binary rollback is unavoidable, quit DeepCode, preserve the current state directory, restore the validated pre-migration SQLite backup, then install the older signed bundle;
- never modify or roll back canonical Session JSONL as part of a Desktop database rollback.
Migration backups live under the Desktop state backups/ directory with
owner-only permissions. A backup is created and validated before any existing
database version transition.
security-ci.ymlscans Git history for new secrets, audits npm/Python/Rust advisories, creates Python/Node SBOMs, and audits all resolved licenses.- A clean
cargo auditblocking result is required. The current Tauri 2 Linux dependency graph also reports informational upstream maintenance/unsound warnings in the GTK3/glib chain; these are recorded in CI and must be re-evaluated on Tauri upgrades, but are not silently classified as fixed. - Historical secret findings listed in
.gitleaksignoreare acknowledgements, not proof of revocation. Their credentials must be rotated before release. THIRD_PARTY_NOTICES.mdandPRIVACY_AND_DIAGNOSTICS.mdare embedded in every application bundle.- Official reference material: Tauri updater, macOS signing, Windows signing, and Linux signing.