Skip to content

Commit b36b909

Browse files
authored
Merge branch 'main' into feature/plasma-shortcut-activation
2 parents 4323afa + 8a92315 commit b36b909

11 files changed

Lines changed: 438 additions & 30 deletions

File tree

.github/workflows/nightly.yml

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ jobs:
1212
nightly:
1313
name: Build and Publish Nightly
1414
runs-on: ubuntu-latest
15+
outputs:
16+
version: ${{ steps.version.outputs.version }}
17+
release_tag: ${{ steps.create_release.outputs.tag }}
1518

1619
steps:
1720
- name: Checkout code
@@ -33,7 +36,13 @@ jobs:
3336
portaudio19-dev \
3437
python3-dev \
3538
libgirepository1.0-dev \
36-
pkg-config
39+
libgirepository-2.0-dev \
40+
pkg-config \
41+
libcairo2-dev \
42+
gobject-introspection \
43+
gir1.2-gtk-3.0 \
44+
gir1.2-appindicator3-0.1 \
45+
gir1.2-ibus-1.0
3746
3847
- name: Install build dependencies
3948
run: |
@@ -80,6 +89,11 @@ jobs:
8089
done
8190
ls -la dist/
8291
92+
- name: Build AppImage (x86_64)
93+
run: |
94+
bash packaging/appimage/build.sh dist/*.whl "${{ steps.version.outputs.version }}" dist
95+
ls -la dist/*.AppImage
96+
8397
- name: Cleanup old nightly releases
8498
env:
8599
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -166,6 +180,14 @@ jobs:
166180
curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh | bash
167181
\`\`\`
168182
183+
#### AppImage (no install, no root)
184+
Download the \`.AppImage\` matching your CPU (\`x86_64\` or \`aarch64\`) below:
185+
\`\`\`bash
186+
chmod +x Vocalinux-${{ steps.version.outputs.version }}-x86_64.AppImage
187+
./Vocalinux-${{ steps.version.outputs.version }}-x86_64.AppImage
188+
\`\`\`
189+
Requires \`xdotool\`/\`wtype\`/\`ydotool\` on the host for text injection, same as the PyPI install path.
190+
169191
---
170192
171193
### Build Information
@@ -184,6 +206,8 @@ jobs:
184206
185207
- **\`vocalinux-${{ steps.version.outputs.version }}-py3-none-any.whl\`** - Python wheel (recommended)
186208
- **\`vocalinux-${{ steps.version.outputs.version }}.tar.gz\`** - Source distribution
209+
- **\`Vocalinux-${{ steps.version.outputs.version }}-x86_64.AppImage\`** - Self-contained, no install (Intel/AMD)
210+
- **\`Vocalinux-${{ steps.version.outputs.version }}-aarch64.AppImage\`** - Self-contained, no install (ARM64, added shortly after this release is published)
187211
188212
---
189213
@@ -202,26 +226,85 @@ jobs:
202226
echo "notes_file=/tmp/release_notes.md" >> $GITHUB_OUTPUT
203227
204228
- name: Create nightly release
229+
id: create_release
205230
env:
206231
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
207232
run: |
208233
# Create release with dated tag: nightly-2025-02-11
209234
RELEASE_TAG="nightly-$(date +%Y-%m-%d)"
210-
235+
211236
# If a release for today already exists, delete it first
212237
gh release delete "$RELEASE_TAG" --yes --repo ${{ github.repository }} 2>/dev/null || true
213238
git push origin :refs/tags/"$RELEASE_TAG" 2>/dev/null || true
214239
git tag -d "$RELEASE_TAG" 2>/dev/null || true
215-
240+
216241
gh release create "$RELEASE_TAG" \
217242
--title "Nightly Build - ${{ steps.version.outputs.version }}" \
218243
--notes-file ${{ steps.release_notes.outputs.notes_file }} \
219244
--prerelease \
220245
dist/*
221246
247+
echo "tag=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"
248+
222249
- name: Upload artifacts (backup)
223250
uses: actions/upload-artifact@v4
224251
with:
225252
name: vocalinux-nightly-${{ steps.version.outputs.version }}
226253
path: dist/
227254
retention-days: 7
255+
256+
nightly-appimage-arm64:
257+
name: Build and Attach Nightly AppImage (aarch64)
258+
runs-on: ubuntu-24.04-arm
259+
needs: nightly
260+
if: needs.nightly.result == 'success'
261+
262+
steps:
263+
- name: Checkout code
264+
uses: actions/checkout@v4
265+
with:
266+
ref: main
267+
268+
- name: Set up Python
269+
uses: actions/setup-python@v5
270+
with:
271+
python-version: '3.10'
272+
cache: 'pip'
273+
274+
- name: Install system dependencies
275+
run: |
276+
sudo apt-get update
277+
sudo apt-get install -y \
278+
portaudio19-dev \
279+
python3-dev \
280+
libgirepository1.0-dev \
281+
libgirepository-2.0-dev \
282+
pkg-config \
283+
libcairo2-dev \
284+
gobject-introspection \
285+
gir1.2-gtk-3.0 \
286+
gir1.2-appindicator3-0.1 \
287+
gir1.2-ibus-1.0
288+
289+
- name: Install build dependencies
290+
run: |
291+
python -m pip install --upgrade pip setuptools wheel build
292+
293+
- name: Build package
294+
run: |
295+
python -m build
296+
ls -la dist/
297+
298+
- name: Build AppImage (aarch64)
299+
run: |
300+
bash packaging/appimage/build.sh dist/*.whl "${{ needs.nightly.outputs.version }}" dist
301+
ls -la dist/*.AppImage
302+
303+
- name: Attach to nightly release
304+
env:
305+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
306+
run: |
307+
gh release upload "${{ needs.nightly.outputs.release_tag }}" \
308+
dist/*.AppImage \
309+
--repo ${{ github.repository }} \
310+
--clobber

.github/workflows/release.yml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ jobs:
2929
python-version: ${{ env.PYTHON_VERSION }}
3030
cache: 'pip'
3131

32+
- name: Install system dependencies
33+
run: |
34+
sudo apt-get update
35+
sudo apt-get install -y \
36+
portaudio19-dev \
37+
python3-dev \
38+
libgirepository1.0-dev \
39+
libgirepository-2.0-dev \
40+
pkg-config \
41+
libcairo2-dev \
42+
gobject-introspection \
43+
gir1.2-gtk-3.0 \
44+
gir1.2-appindicator3-0.1 \
45+
gir1.2-ibus-1.0
46+
3247
- name: Install build dependencies
3348
run: |
3449
python -m pip install --upgrade pip
@@ -59,13 +74,19 @@ jobs:
5974
echo "Built packages:"
6075
ls -la dist/
6176
77+
- name: Build AppImage (x86_64)
78+
run: |
79+
bash packaging/appimage/build.sh dist/*.whl "${{ steps.get_version.outputs.VERSION }}" dist
80+
ls -la dist/*.AppImage
81+
6282
- name: Create Release
6383
id: create_release
6484
uses: softprops/action-gh-release@v2
6585
with:
6686
files: |
6787
dist/*.whl
6888
dist/*.tar.gz
89+
dist/*.AppImage
6990
generate_release_notes: true
7091
draft: false
7192
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
@@ -103,9 +124,77 @@ jobs:
103124
yay -S vocalinux
104125
```
105126
127+
### AppImage (no install, no root)
128+
Download the `.AppImage` matching your CPU (`x86_64` or `aarch64`, the latter attached
129+
shortly after this release is published) below:
130+
```bash
131+
chmod +x Vocalinux-${{ steps.get_version.outputs.VERSION }}-x86_64.AppImage
132+
./Vocalinux-${{ steps.get_version.outputs.VERSION }}-x86_64.AppImage
133+
```
134+
Still requires `xdotool`/`wtype`/`ydotool` on the host for text injection, same as the PyPI path.
135+
106136
---
107137
See [CHANGELOG](https://github.com/jatinkrmalik/vocalinux/releases) for detailed changes.
108138
139+
build-appimage-arm64:
140+
name: Build and Attach AppImage (aarch64)
141+
needs: build-and-release
142+
runs-on: ubuntu-24.04-arm
143+
steps:
144+
- name: Checkout code
145+
uses: actions/checkout@v4
146+
147+
- name: Set up Python
148+
uses: actions/setup-python@v5
149+
with:
150+
python-version: ${{ env.PYTHON_VERSION }}
151+
cache: 'pip'
152+
153+
- name: Install system dependencies
154+
run: |
155+
sudo apt-get update
156+
sudo apt-get install -y \
157+
portaudio19-dev \
158+
python3-dev \
159+
libgirepository1.0-dev \
160+
libgirepository-2.0-dev \
161+
pkg-config \
162+
libcairo2-dev \
163+
gobject-introspection \
164+
gir1.2-gtk-3.0 \
165+
gir1.2-appindicator3-0.1 \
166+
gir1.2-ibus-1.0
167+
168+
- name: Install build dependencies
169+
run: |
170+
python -m pip install --upgrade pip
171+
pip install build wheel setuptools
172+
173+
- name: Extract version from tag
174+
id: get_version
175+
run: |
176+
VERSION=${GITHUB_REF#refs/tags/v}
177+
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
178+
179+
- name: Build package
180+
run: |
181+
python -m build
182+
ls -la dist/
183+
184+
- name: Build AppImage (aarch64)
185+
run: |
186+
bash packaging/appimage/build.sh dist/*.whl "${{ steps.get_version.outputs.VERSION }}" dist
187+
ls -la dist/*.AppImage
188+
189+
- name: Attach to release
190+
env:
191+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
192+
run: |
193+
gh release upload "${{ github.ref_name }}" \
194+
dist/*.AppImage \
195+
--repo ${{ github.repository }} \
196+
--clobber
197+
109198
publish-pypi:
110199
name: Publish to PyPI
111200
needs: build-and-release

.github/workflows/unified-pipeline.yml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,69 @@ jobs:
170170
files: coverage.xml
171171
fail_ci_if_error: false
172172

173+
appimage-smoke-test:
174+
name: 📦 Build AppImage (smoke test, ${{ matrix.arch }})
175+
runs-on: ${{ matrix.runner }}
176+
needs: changes
177+
if: needs.changes.outputs.python == 'true'
178+
strategy:
179+
fail-fast: false
180+
matrix:
181+
include:
182+
- arch: x86_64
183+
runner: ubuntu-latest
184+
- arch: aarch64
185+
runner: ubuntu-24.04-arm
186+
steps:
187+
- uses: actions/checkout@v4
188+
189+
- name: Set up Python
190+
uses: actions/setup-python@v5
191+
with:
192+
python-version: '3.10'
193+
cache: 'pip'
194+
195+
- name: Install system dependencies
196+
run: |
197+
sudo apt-get update
198+
sudo apt-get install -y \
199+
xdotool \
200+
gir1.2-appindicator3-0.1 \
201+
gir1.2-ibus-1.0 \
202+
libcairo2-dev \
203+
pkg-config \
204+
python3-dev \
205+
libgirepository1.0-dev \
206+
gobject-introspection \
207+
libcairo-gobject2 \
208+
gir1.2-gtk-3.0 \
209+
portaudio19-dev
210+
211+
- name: Install GObject introspection dependencies
212+
run: |
213+
sudo apt-get update
214+
sudo apt-get install -y gir1.2-glib-2.0 libgirepository-2.0-dev pkg-config
215+
216+
- name: Build wheel
217+
run: |
218+
python -m pip install --upgrade pip build
219+
python -m build
220+
ls -la dist/
221+
222+
- name: Build AppImage
223+
run: |
224+
VERSION=$(grep -oP '__version__\s*=\s*"\K[^"]+' src/vocalinux/version.py)
225+
WHEEL=$(ls dist/*.whl)
226+
bash packaging/appimage/build.sh "$WHEEL" "$VERSION" dist
227+
ls -la dist/*.AppImage
228+
229+
- name: Upload AppImage artifact
230+
uses: actions/upload-artifact@v4
231+
with:
232+
name: vocalinux-appimage-${{ matrix.arch }}
233+
path: dist/*.AppImage
234+
retention-days: 7
235+
173236
web-build:
174237
name: 🌐 Build Website
175238
runs-on: ubuntu-latest

docs/INSTALL.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -629,11 +629,30 @@ Model names with more language and size variety can be found in [VOSK Models](ht
629629
**Symptom:** Tray icon missing or generic
630630
631631
**Solution:**
632+
633+
On GNOME (including Fedora Workstation and Ubuntu), AppIndicator support is often
634+
disabled until you install and enable the tray extension:
635+
632636
```bash
633-
# Refresh icon cache
634-
gtk-update-icon-cache -f -t ~/.local/share/icons/hicolor
637+
# Debian/Ubuntu
638+
sudo apt install gnome-shell-extension-appindicator
639+
640+
# Fedora
641+
sudo dnf install gnome-shell-extension-appindicator
642+
643+
# Arch
644+
sudo pacman -S gnome-shell-extension-appindicator
635645
636-
# Restart the application
646+
# Then enable (Extensions app, or):
647+
gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com
648+
# Log out and back in if the icon still does not appear
649+
```
650+
651+
Also refresh the icon cache and restart Vocalinux:
652+
653+
```bash
654+
gtk-update-icon-cache -f -t ~/.local/share/icons/hicolor
655+
vocalinux --debug
637656
```
638657
639658
## Uninstallation

install.sh

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,11 +1484,17 @@ install_system_dependencies() {
14841484
fi
14851485

14861486
# Define package names for different distributions
1487-
# Determine the correct GObject Introspection dev package for Ubuntu-family distros
1488-
# Ubuntu 24.04+ and Pop!_OS Cosmic+ ship libgirepository-2.0-dev instead of 1.0
1487+
# GObject Introspection / GLib headers for building PyGObject and friends.
1488+
# Prefer libgirepository-2.0-dev when available (Ubuntu 24.04+, Pop!_OS Cosmic+,
1489+
# Debian 13+). When both 1.0 and 2.0 packages exist, install both: 2.0 provides
1490+
# the modern GLib GI headers that pip builds need, while 1.0 still pulls
1491+
# gobject-introspection tooling. Older distros that only ship 1.0 keep that.
1492+
# See #571 (installer previously kept 1.0 whenever apt-cache still listed it).
14891493
local GI_DEV_PKG="libgirepository1.0-dev"
14901494
if apt-cache show libgirepository-2.0-dev &>/dev/null 2>&1; then
1491-
if ! apt-cache show libgirepository1.0-dev &>/dev/null 2>&1; then
1495+
if apt-cache show libgirepository1.0-dev &>/dev/null 2>&1; then
1496+
GI_DEV_PKG="libgirepository-2.0-dev libgirepository1.0-dev"
1497+
else
14921498
GI_DEV_PKG="libgirepository-2.0-dev"
14931499
fi
14941500
fi

0 commit comments

Comments
 (0)