Prepares the first Voculinux release, v0.19.0 (xbps 0.19.0_1). The tag is v0.19.0, with no phase suffix. Three commits:
feat(model): the whisper.cpp ladder's free-memory thresholds are hard-coded per backend from the #19 installed-build measurement (Vulkan q8_0 1644 / q5_0 1359 MiB; CUDA q8_0 1690 / q5_0 1404 MiB).
feat(void): packaging/void/publish-release.sh publishes a built, verified out-dir to the Gitea release API. build-release.sh release now refuses an uncommitted checkout and records BUILT_FROM (tag and commit). The xbps workflow is manual dispatch only, because its only runner is ARM64 and cannot build the release. Docs describe the local sequence.
chore(release): version bump (version.py, Void template version and _tag, web, README, UPDATE, SECURITY), CHANGELOG entry, pyproject.toml project URLs on git.bongbetic.com.
Nothing here tags, builds or publishes. After merge, the maintainer creates and pushes the annotated tag on the verified origin/main commit (git push origin refs/tags/v0.19.0, never --tags), builds in a clean checkout of the tag, runs publish-release.sh --dry-run, then publishes. docs/RELEASE_PROCESS.md Step 7 and Step 8 and packaging/void/README.md "Releasing" have the exact sequence.
Related issue
Refs #16 (the Void spec) and #19 (the measured thresholds).
Type of change
Bug fix
New feature
Breaking change
Documentation
Refactor
Tests
Packaging / CI
Checklist
Code follows project style (Black, isort, flake8): checked with the pinned tool versions from requirements/dev.txt
Documentation updated when user-facing behavior or install steps change
Tests added or updated for the change
Local tests pass: the related files pass offline. Void, workflow, ladder, config and rename-sweep files: 406 passed. Packaging and version files: 689 passed, 4 skipped. The full suite is not run, as on main
Conventional commit message style
Notes for reviewers
Decision for the maintainer: CPU thresholds. CPU and unknown backends keep the Vulkan thresholds. Issue #19 proposes a separate RAM rule (1563 MiB) and a floor-first default for CPU-only machines. That is not implemented here.
Workflow publish step..gitea/workflows/xbps-release.yml still has its own publish step, which duplicates publish-release.sh. It stays inline because the workflow is dispatch-only and cannot run on the current runner. The two must change together until one is removed.
First-run default.config_manager now calls the GPU backend probe, which lazily imports recognition_manager and preloads the ggml libraries. The preload is idempotent and the engine does it anyway; it only runs on the unpinned first-run default.
CHANGELOG date is 2026-11-07. Adjust it when the tag is made.
main moved to 85cbc37 (#51, tray before the model loads) after this branch was cut. It touches main.py, recognition_manager.py, settings_dialog.py, tray_indicator.py and their tests, and none of this branch's files. The PR is mergeable.
Pre-existing, not from this PR:mypy src/ reports one error (ui/dictation_overlay.py:252) on origin/main with the same tooling. The settings GTK tests fail identically on origin/main (163 in both runs). Lock and export checks pass with uv 0.13.7.
## Description
Prepares the first Voculinux release, v0.19.0 (xbps `0.19.0_1`). The tag is `v0.19.0`, with no phase suffix. Three commits:
- `feat(model)`: the whisper.cpp ladder's free-memory thresholds are hard-coded per backend from the #19 installed-build measurement (Vulkan q8_0 1644 / q5_0 1359 MiB; CUDA q8_0 1690 / q5_0 1404 MiB).
- `feat(void)`: `packaging/void/publish-release.sh` publishes a built, verified out-dir to the Gitea release API. `build-release.sh release` now refuses an uncommitted checkout and records `BUILT_FROM` (tag and commit). The xbps workflow is manual dispatch only, because its only runner is ARM64 and cannot build the release. Docs describe the local sequence.
- `chore(release)`: version bump (`version.py`, Void template `version` and `_tag`, web, README, UPDATE, SECURITY), CHANGELOG entry, `pyproject.toml` project URLs on git.bongbetic.com.
Nothing here tags, builds or publishes. After merge, the maintainer creates and pushes the annotated tag on the verified `origin/main` commit (`git push origin refs/tags/v0.19.0`, never `--tags`), builds in a clean checkout of the tag, runs `publish-release.sh --dry-run`, then publishes. `docs/RELEASE_PROCESS.md` Step 7 and Step 8 and `packaging/void/README.md` "Releasing" have the exact sequence.
## Related issue
Refs #16 (the Void spec) and #19 (the measured thresholds).
## Type of change
- [x] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation
- [ ] Refactor
- [x] Tests
- [x] Packaging / CI
## Checklist
- [x] Code follows project style (Black, isort, flake8): checked with the pinned tool versions from `requirements/dev.txt`
- [x] Documentation updated when user-facing behavior or install steps change
- [x] Tests added or updated for the change
- [x] Local tests pass: the related files pass offline. Void, workflow, ladder, config and rename-sweep files: 406 passed. Packaging and version files: 689 passed, 4 skipped. The full suite is not run, as on `main`
- [x] Conventional commit message style
## Notes for reviewers
- **Decision for the maintainer: CPU thresholds.** CPU and unknown backends keep the Vulkan thresholds. Issue #19 proposes a separate RAM rule (1563 MiB) and a floor-first default for CPU-only machines. That is not implemented here.
- **Workflow publish step.** `.gitea/workflows/xbps-release.yml` still has its own publish step, which duplicates `publish-release.sh`. It stays inline because the workflow is dispatch-only and cannot run on the current runner. The two must change together until one is removed.
- **First-run default.** `config_manager` now calls the GPU backend probe, which lazily imports `recognition_manager` and preloads the ggml libraries. The preload is idempotent and the engine does it anyway; it only runs on the unpinned first-run default.
- **CHANGELOG date** is 2026-11-07. Adjust it when the tag is made.
- **`main` moved** to 85cbc37 (#51, tray before the model loads) after this branch was cut. It touches `main.py`, `recognition_manager.py`, `settings_dialog.py`, `tray_indicator.py` and their tests, and none of this branch's files. The PR is mergeable.
- **Pre-existing, not from this PR:** `mypy src/` reports one error (`ui/dictation_overlay.py:252`) on `origin/main` with the same tooling. The settings GTK tests fail identically on `origin/main` (163 in both runs). Lock and export checks pass with uv 0.13.7.
The whisper.cpp ladder keyed both GPU backends to one provisional pair of
thresholds. Issue #19 (comment 12913) measured each rung's transcribe-time
VRAM delta on the installed build. The thresholds are those deltas plus the
512 MiB desktop headroom:
- vulkan: q8_0 1644 MiB, q5_0 1359 MiB (was 1644 and 1358)
- cuda: q8_0 1690 MiB, q5_0 1404 MiB
select_ladder_rung and resolve_startup_rung take the installed build's
backend. CPU and unknown backends keep the Vulkan thresholds; the RAM rule
proposed in #19 is not implemented.
The first-run default in config_manager now reads the memory of the
installed build (VRAM for a GPU build, RAM otherwise). It used to read VRAM
whenever an NVIDIA card was present, even on a CPU build.
The release is built on the maintainer's x86_64 Void host, not in CI. The
bongbetic-ci runner is ARM64 and cannot build the glibc x86_64 package. A tag
push no longer starts the xbps workflow: it is manual dispatch only, and its
header says why.
- build-release.sh release refuses an uncommitted or untracked checkout before
any container starts. It writes BUILT_FROM (the tag and the commit it was
built from), which nothing recorded before.
- publish-release.sh TAG --out-dir DIR publishes a built out-dir to the Gitea
release API in the workflow's order. It refuses unless origin's tag peels to
the BUILT_FROM commit, the sdist digest matches, and the client key is the
committed one. --dry-run runs every check and prints the planned calls
without sending one. The token comes from GITEA_TOKEN or the tea login and is
never printed.
- Tests run both scripts offline against a local bare origin and a stateful
Gitea stand-in.
- docs/RELEASE_PROCESS.md and packaging/void/README.md describe the local
sequence: merge, annotated tag by ref, clean build, dry-run, publish, checksum.
The first Voculinux release. It has no phase suffix, so the tag is v0.19.0
and the xbps version is 0.19.0_1.
- src/vocalinux/version.py, the Void template (version and _tag), the web
softwareVersion and package version, the README badge and current-release
blurb
- docs/UPDATE.md: What's New in v0.19.0, and the source checkout tag
- CHANGELOG.md: v0.19.0 entry from v0.18.5..main, the fork's changes and the
upstream fixes carried after 0.18.5
- SECURITY.md: 0.19.x is the supported line
- pyproject.toml: project URLs point at git.bongbetic.com/xavierk/voculinux
- README: the current-release line links to the signed repository section.
- CHANGELOG: each (#N) matches its commit subject. #37 is the build from the
tag, #39 the pysocks template and its version floors. Internal tickets are
named as tickets.
- publish-release.sh: the gates-passed line names the commit the out-dir was
built from, and keeps the same gate wording.
xavierk
merged commit 731b919865 into main2026-11-06 20:23:15 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Description
Prepares the first Voculinux release, v0.19.0 (xbps
0.19.0_1). The tag isv0.19.0, with no phase suffix. Three commits:feat(model): the whisper.cpp ladder's free-memory thresholds are hard-coded per backend from the #19 installed-build measurement (Vulkan q8_0 1644 / q5_0 1359 MiB; CUDA q8_0 1690 / q5_0 1404 MiB).feat(void):packaging/void/publish-release.shpublishes a built, verified out-dir to the Gitea release API.build-release.sh releasenow refuses an uncommitted checkout and recordsBUILT_FROM(tag and commit). The xbps workflow is manual dispatch only, because its only runner is ARM64 and cannot build the release. Docs describe the local sequence.chore(release): version bump (version.py, Void templateversionand_tag, web, README, UPDATE, SECURITY), CHANGELOG entry,pyproject.tomlproject URLs on git.bongbetic.com.Nothing here tags, builds or publishes. After merge, the maintainer creates and pushes the annotated tag on the verified
origin/maincommit (git push origin refs/tags/v0.19.0, never--tags), builds in a clean checkout of the tag, runspublish-release.sh --dry-run, then publishes.docs/RELEASE_PROCESS.mdStep 7 and Step 8 andpackaging/void/README.md"Releasing" have the exact sequence.Related issue
Refs #16 (the Void spec) and #19 (the measured thresholds).
Type of change
Checklist
requirements/dev.txtmainNotes for reviewers
.gitea/workflows/xbps-release.ymlstill has its own publish step, which duplicatespublish-release.sh. It stays inline because the workflow is dispatch-only and cannot run on the current runner. The two must change together until one is removed.config_managernow calls the GPU backend probe, which lazily importsrecognition_managerand preloads the ggml libraries. The preload is idempotent and the engine does it anyway; it only runs on the unpinned first-run default.mainmoved to85cbc37(#51, tray before the model loads) after this branch was cut. It touchesmain.py,recognition_manager.py,settings_dialog.py,tray_indicator.pyand their tests, and none of this branch's files. The PR is mergeable.mypy src/reports one error (ui/dictation_overlay.py:252) onorigin/mainwith the same tooling. The settings GTK tests fail identically onorigin/main(163 in both runs). Lock and export checks pass with uv 0.13.7.