Desktop Release Handoff
Audience: maintainers preparing native installer bundles for anolis-workbench.
Overview
Desktop packaging is split into two explicit layers:
- Python sidecar freeze (
scripts/freeze_server.py) -> onefile executable. - Tauri bundle build (
desktop/src-tauri) -> platform installers.
The desktop wrapper is a shell only: frontend still talks directly to http://127.0.0.1:3010 over localhost HTTP/SSE.
Required Inputs
- Version in
pyproject.toml(must match workflow input). - Built frontend assets at
anolis_workbench/frontend/dist/. - Rust + Node toolchains available in CI runners.
Version alignment rule:
desktop-release.ymlvalidates that the requested version exactly matches all of:pyproject.toml(project.version)desktop/package.json(version)desktop/src-tauri/Cargo.toml(package.version)desktop/src-tauri/tauri.conf.json(version)
Workflow
Use:
.github/workflows/desktop-release.yml
Job flow:
- Validate semver + cross-file version alignment.
- Freeze sidecar on Linux + Windows.
- Stage sidecar into Tauri
externalBinpath. - Build installers per target.
- Generate CycloneDX SBOM artifacts.
- Attach installers + SBOMs to GitHub Release tag.
Sidecar Freeze Guards
freeze_server.py enforces:
- Frontend dist presence check.
- Minimum executable size threshold check.
- Executable smoke checks (
--help,--version) unless explicitly skipped.
Manual Operations
- Verify desktop app identity in
desktop/src-tauri/tauri.conf.json:identifier: org.feastorg.anolis-workbenchproductName: Anolis Workbench
- Confirm port
3010is documented as reserved in user-facing release notes. - Confirm release assets include at minimum:
- Windows
.msi - Linux
.AppImageand/or.deb - CycloneDX SBOM JSON files
- Windows
Notes
- macOS packaging remains a stretch target and is intentionally not hard-gated.
- Desktop release is intentionally separate from PyPI publish to keep failure domains clear (installer build dependencies vs Python package publish path).
