From 6545e4ea66dea05243769b1b914a4f62716e201e Mon Sep 17 00:00:00 2001 From: Jatin K Malik Date: Tue, 14 Jul 2026 23:41:31 -0700 Subject: [PATCH] feat(packaging): add AUR release package and CI publish (#518) * feat(packaging): add AUR release package and CI publish Ship packaging/aur/vocalinux for yay installs of tagged releases, wire AUR publish into the release workflow (skipped until secrets are set), and document one-time maintainer setup. Fixes #116 * refactor(packaging): slim AUR PR to PKGBUILD + CI Drop systemd unit, install script, website edits, and long docs. Keep release PKGBUILD, minimal publish job, and short AUR setup notes. --- .github/workflows/release.yml | 48 ++++++++++++++++++++++ README.md | 8 ++++ docs/AUR.md | 33 ++++++++++++++++ docs/INSTALL.md | 6 +++ packaging/aur/vocalinux/PKGBUILD | 68 ++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 docs/AUR.md create mode 100644 packaging/aur/vocalinux/PKGBUILD diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4db14f1..7ee2bcf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,6 +98,11 @@ jobs: desktop integration, and model setup, use the Quick Install command above. See docs/INSTALL.md for distro-specific PyPI prerequisites. + ### Arch Linux (AUR) + ```bash + yay -S vocalinux + ``` + --- See [CHANGELOG](https://github.com/jatinkrmalik/vocalinux/releases) for detailed changes. @@ -140,6 +145,49 @@ jobs: run: | twine upload dist/* --skip-existing + publish-aur: + name: Publish to AUR + needs: build-and-release + runs-on: ubuntu-latest + # Secrets: AUR_SSH_PRIVATE_KEY, AUR_USERNAME, AUR_EMAIL — see docs/AUR.md + steps: + - name: Check for AUR credentials + id: aur + env: + AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }} + run: | + if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then + echo "configured=false" >> "$GITHUB_OUTPUT" + echo "AUR_SSH_PRIVATE_KEY not set; skipping (docs/AUR.md)" + else + echo "configured=true" >> "$GITHUB_OUTPUT" + fi + + - name: Checkout code + if: steps.aur.outputs.configured == 'true' + uses: actions/checkout@v4 + + - name: Bump PKGBUILD version + if: steps.aur.outputs.configured == 'true' + run: | + set -euo pipefail + TAG="${GITHUB_REF#refs/tags/v}" + PKGBUILD=packaging/aur/vocalinux/PKGBUILD + sed -i "s/^pkgver=.*/pkgver=${TAG//-/}/; s/^_tag=.*/_tag=${TAG}/; s/^pkgrel=.*/pkgrel=1/" "$PKGBUILD" + grep -E '^(pkgver|_tag|pkgrel)=' "$PKGBUILD" + + - name: Publish AUR package + if: steps.aur.outputs.configured == 'true' + uses: KSXGitHub/github-actions-deploy-aur@v4.2.0 + with: + pkgname: vocalinux + pkgbuild: packaging/aur/vocalinux/PKGBUILD + updpkgsums: 'true' + commit_username: ${{ secrets.AUR_USERNAME }} + commit_email: ${{ secrets.AUR_EMAIL }} + ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} + commit_message: 'Release ${{ github.ref_name }}' + deploy-website: name: Deploy Website runs-on: ubuntu-latest diff --git a/README.md b/README.md index 8df5bd4..c648b45 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,14 @@ curl -fsSL raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh -o / ``` Lightweight option (~40MB), works on systems with 4GB RAM. +### Arch Linux (AUR) + +```bash +yay -S vocalinux +``` + +See [docs/AUR.md](docs/AUR.md). + ### Alternative: Install from Source ```bash diff --git a/docs/AUR.md b/docs/AUR.md new file mode 100644 index 0000000..e44941b --- /dev/null +++ b/docs/AUR.md @@ -0,0 +1,33 @@ +# AUR + +## Users + +```bash +yay -S vocalinux # latest release tag +yay -S vocalinux-git # community package, tracks main +``` + +`vocalinux` and `vocalinux-git` conflict. Install only one. + +## Maintainers (one-time) + +Release tags auto-push `packaging/aur/vocalinux/PKGBUILD` 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 "vocalinux-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/vocalinux.git + +# 3. Next v* tag runs Publish to AUR (skipped if secret missing) +``` + +Sources: `packaging/aur/vocalinux/PKGBUILD`. Community git package: https://aur.archlinux.org/packages/vocalinux-git diff --git a/docs/INSTALL.md b/docs/INSTALL.md index f1b2e36..48781f8 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -67,6 +67,12 @@ vocalinux **Arch Linux:** +```bash +yay -S vocalinux +``` + +See [AUR.md](AUR.md). Or via PyPI: + ```bash sudo pacman -S --needed \ python python-virtualenv python-gobject gtk3 libappindicator-gtk3 \ diff --git a/packaging/aur/vocalinux/PKGBUILD b/packaging/aur/vocalinux/PKGBUILD new file mode 100644 index 0000000..0fd7aae --- /dev/null +++ b/packaging/aur/vocalinux/PKGBUILD @@ -0,0 +1,68 @@ +# Maintainer: Jatin K Malik +# Updated by .github/workflows/release.yml on v* tags. Setup: docs/AUR.md + +pkgname=vocalinux +# AUR pkgver cannot contain hyphens (v0.14.0-beta -> 0.14.0beta). +pkgver=0.14.0beta +_tag=0.14.0-beta +pkgrel=1 +pkgdesc="Free, offline voice dictation for Linux" +arch=('any') +url="https://github.com/jatinkrmalik/vocalinux" +license=('GPL-3.0-only') +depends=( + 'python>=3.9' + 'python-gobject' + 'gtk3' + 'libappindicator-gtk3' + 'ibus' + 'gobject-introspection' + 'python-cairo' + 'python-pynput' + 'python-pywhispercpp-cpu' + 'python-pyaudio' + 'portaudio' + 'python-numpy' + 'python-requests' + 'python-tqdm' + 'python-psutil' + 'python-lxml' + 'python-pydub' + 'python-evdev' + 'python-xlib' + 'xclip' + 'wl-clipboard' + 'wtype' + 'hicolor-icon-theme' +) +makedepends=( + 'python-build' + 'python-installer' + 'python-wheel' + 'python-setuptools' +) +optdepends=( + 'python-pywhispercpp-cuda: NVIDIA GPU (replace python-pywhispercpp-cpu)' + 'python-onnxruntime: Silero VAD' + 'xdotool: X11 injection fallback' +) +conflicts=('vocalinux-git') +source=("${pkgname}-${_tag}.tar.gz::https://github.com/jatinkrmalik/vocalinux/archive/refs/tags/v${_tag}.tar.gz") +sha256sums=('030dfe1ddbc51672c7bfb0f471c256a998fe871bd190028dd882e4507d00af58') + +build() { + cd "${pkgname}-${_tag}" + python -m build --wheel --no-isolation +} + +package() { + cd "${pkgname}-${_tag}" + python -m installer --destdir="${pkgdir}" dist/*.whl + + install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" + install -Dm644 vocalinux.desktop "${pkgdir}/usr/share/applications/vocalinux.desktop" + + for icon in resources/icons/scalable/*.svg; do + install -Dm644 "$icon" "${pkgdir}/usr/share/icons/hicolor/scalable/apps/$(basename "$icon")" + done +}