Files
voculinux/docs/AUR.md
T
soubarnak ea7be5f111 feat(identity): rename user-visible identity to voculinux with one-time legacy import
The fork takes its own name everywhere a user can see it: binaries
(voculinux, voculinux-gui), desktop entry, autostart, tray, D-Bus
namespace (com.voculinux.Voculinux, no alias for the old name),
config/data/cache dirs, single-instance lock, IBus engine identity,
tray icons, resource prefixes, VOCULINUX_* environment names, and the
update-checker user agent. The internal Python module stays vocalinux
and the distribution metadata keeps the upstream URLs as provenance.

On first run a previous Vocalinux install's config.json, custom
dictionary, and portal restore token are copied once into the new
locations (new config always wins, no merge, no write-back); models
re-resolve through the pinned-checksum download path. An offline
naming-sweep test proves no old-name strings remain on user-visible
surfaces outside the allowlist.

Refs #18
2026-11-06 01:29:39 +05:30

117 lines
6.0 KiB
Markdown

# Arch User Repository (AUR)
## Users
```bash
yay -S voculinux # canonical release sdist, built against Arch dependencies
yay -S voculinux-git # community package; tracks main
```
`voculinux`, `voculinux-bin` and `voculinux-git` conflict; install only one.
`packaging/aur/voculinux-bin/` builds a `-bin` variant that installs the
prebuilt AppImage from the release — no Python, engine, or GPU dependency
builds, since the bundle carries them (#817). Its publication waits only for
release creation and both AppImages, not the source-package gate or other
packaging jobs. It first pins the per-arch AppImage digests in the PKGBUILD,
then pushes to AUR in the `Publish AUR -bin package` step.
## Maintainers (one-time setup)
Release tags prepare and test the source PKGBUILD from
`packaging/aur/voculinux/PKGBUILD`, then auto-push the verified file when these
secrets exist:
| Secret | Value |
|--------|--------|
| `AUR_SSH_PRIVATE_KEY` | Private key whose public half is on your AUR account |
| `AUR_USERNAME` | AUR username (git author) |
| `AUR_EMAIL` | AUR account email |
```bash
# 1. AUR account + SSH pubkey: https://aur.archlinux.org/register
ssh-keygen -t ed25519 -C "voculinux-aur" -f ./aur_ed25519 -N ""
# upload aur_ed25519.pub on AUR; put aur_ed25519 in AUR_SSH_PRIVATE_KEY
# 2. Create empty package once
git clone ssh://aur@aur.archlinux.org/voculinux.git
# 3. Next v* tag runs Publish to AUR (skipped if secret missing)
```
Sources: `packaging/aur/voculinux/PKGBUILD`. Community git package: https://aur.archlinux.org/packages/voculinux-git
## Source archive and trust model
The source package consumes the **canonical sdist attached to the GitHub release**,
the same bytes published to PyPI, not GitHub's automatically generated tag archive.
The sdist is produced by the locked reproducible-wheel gate. Only wheels are
compared for reproducibility; sdists are built and validated, not compared.
`scripts/prepare_aur_source.py` verifies the downloaded sdist against the published
`SHA256SUMS` and runs `gh attestation verify`, requiring the VocaHQ/vocalinux
repository, `.github/workflows/release.yml` signer, exact tag ref, and expected
source commit. Missing hashes, mismatches, rejected provenance, or mismatched
tag/package versions stop preparation. It preserves the original archive bytes
and pins their digest in the prepared PKGBUILD. `_tag` retains the release tag;
`_version` is the PEP 440-normalized sdist version, including for prereleases.
This verification is a **maintainer publication gate**. An AUR user's `makepkg`
checks the pinned SHA-256; it does not independently verify GitHub provenance.
Arch still owns the dependency/toolchain versions: this does not claim that AUR
builds use our Python lock or reproduce the PyPI wheel byte-for-byte.
## CI gates
### PR and local source gate
Python/AUR changes and changes to the source manifest, README or license build the
canonical sdist from the current checkout's reproducible-wheel gate, then prepare
an explicitly `--local-unattested` fixture. The `Build AUR package (gate)` job in
`unified-pipeline.yml` builds and installs its PKGBUILD on `archlinux:latest`.
Run `just aur-gate` locally (needs uv and Docker); it includes the reproducible-wheel
build and uses a fresh temporary directory for the distributions, diagnostics,
tooling and prepared fixture. Existing `dist/`, `build/reproducible-wheel/` and
the developer environment are untouched, so other packaging commands can run
before or after it. Successful runs clean the temporary directory; failed runs
retain it and print its path for diagnosis.
### Release gate
After the release checksum/provenance job succeeds, `aur-source-test` downloads
the **published** sdist and manifest, verifies them, and prepares the PKGBUILD.
The same Arch gate makes `makepkg` download the actual source URL afresh
(`AUR_FETCH_SOURCE=1`) and verify its checksum, runs `namcap` on the recipe and
package, installs the package, checks the installed distribution version, and
runs the import smoke. It does not rewrite the source URL or disable source
checksum checks. The tested recipe and downloaded archive must match the
prepared PKGBUILD and provenance-verified sdist byte-for-byte.
Only after this succeeds is `aur-source-pkgbuild` uploaded for `publish-aur`.
Publication downloads that exact file; there is no version rewrite or
`updpkgsums` afterwards. The gate runs even without AUR credentials; only the
final push is secret-gated. This intentionally makes source publication wait
for the release's checksums and attestations. `voculinux-bin` uses a separate
AppImage publication path independent of this source gate and the global
checksum job; its PR smoke still uses a stub AppImage.
Both gates deliberately use rolling `archlinux:latest`: #757 was Arch's
setuptools moving underneath us. `python-pywhispercpp` (virtual, provided by the
AUR backends) and `python-pynput` (AUR) cannot come from the repos, so the gate
satisfies them with a stub for dependency resolution and pip-installs their
pinned versions from `requirements/runtime.txt` for the import smoke. It does
not test those AUR providers or prove dependency completeness in a minimal host.
What those providers actually ship remains a separate monitoring question.
## Troubleshooting
**`ERROR Missing dependencies: setuptools<82`**
The AUR package builds with `python -m build --wheel --no-isolation`, so it uses Arch extra `python-setuptools` (currently 84). Voculinux 0.16.1 drops the `<82` cap in `pyproject.toml`. Rebuild 0.16.1 or later.
**`'_pywhispercpp.whisper_full_params' object has no attribute 'context_params'`**
AUR `python-pywhispercpp-cpu` / `-cuda` / `-rocm` are still 1.4.x. Those wheels accept `context_params` in Python and then crash in the native object. 0.16.1 skips that argument on pywhispercpp older than 1.5 and still loads the model (default GPU, no device picker). PyPI and `install.sh` already use 1.5.0.
There is no AUR `python-pywhispercpp-vulkan` package. GPU Vulkan 1.5 is the `install.sh` / AppImage path, not the AUR python backends.