Releases & Distribution

How a Yumii release is produced: PyPI wheel + a small shell exe, glued by one install command.

Yumii isn't distributed as a fat installer. A release is two small artifacts plus a live install script:

PieceWhatBuilt by
yumii on PyPIThe Python backend as a normal wheeluv build + trusted publishing (no tokens)
Yumii.exe (~9 MB)The Tauri shell, attached to the GitHub releasecargo tauri build on a Windows runner
install.ps1Served live from master via yumii.me— it's just a file in the repo

The install command wires them together: it installs uv → the backend from PyPI → downloads the exe from the latest GitHub release → Start Menu shortcut. Local models aren't bundled anywhere — the app downloads them on first launch (Whisper from Yumii's own model mirror release, Kokoro from its upstream release).

Cutting a release

Bump the version everywhere

pyproject.toml, desktop/src-tauri/tauri.conf.json, and desktop/src-tauri/Cargo.toml must agree — python .github/scripts/check_versions.py enforces it in CI. Also: Cargo.lock, uv.lock (uv lock), the README badge, and a CHANGELOG.md entry.

Commit and tag
git tag v0.X.Y && git push origin master v0.X.Y
CI does the rest

The tag triggers release.yml: it builds Yumii.exe, publishes the wheel to PyPI via trusted publishing, and creates the GitHub release marked latest — which is what the install command serves from that moment on.

Users update by re-running the install command — uv tool install --upgrade pulls the new wheel, and the exe is re-downloaded from the latest release.

The model mirror

Local Whisper models are mirrored on a permanent, non-latest release (whisper-models-v1) because HuggingFace's CDN is blocked or throttled on some networks. The one-time publish-models.yml workflow (manual dispatch) repackages the upstream Systran models (MIT) as zips; the backend downloads and verifies completeness before ever using one. If you add a model size, re-run that workflow — never point it at the app's v* releases.

Code signing (the missing stage)

Yumii.exe is unsigned, so some machines show SmartScreen warnings on first run. Signing needs a paid certificate — deferred until traction justifies it. The install script clears the Mark-of-the-Web on the exe it downloads, which covers the common case.

Testing a release like a stranger

The only honest test is a machine with nothing on it: no Python, no repo, no ~/.yumii. Run the install command, launch, watch the first-run downloads, paste one key, talk. Everything else is testing your dev environment by accident.