- Adds scheduled daily builds at 2 AM UTC
- Builds Python packages and uploads as artifacts
- 7-day retention to keep storage minimal
- No release tab pollution - artifacts only
* Fix Python 3.13 and Wayland compatibility
This commit addresses installation failures on modern Linux distributions
(Ubuntu 25.10+) with Python 3.13 and Wayland-only sessions.
Changes:
1. **Add Python 3.13 support** (pyproject.toml)
- Add Python 3.13 to classifiers
- Update black target versions to include py312, py313
- No code changes needed - already compatible
2. **Use system site-packages for PyGObject** (install.sh)
- Change venv creation to use --system-site-packages flag
- Avoids PyGObject build failures with Python 3.13
- System PyGObject (python3-gi) is already installed as dependency
- Building from source is unnecessary and fragile with new Python versions
3. **Improve Wayland text injection support** (install.sh)
- Install ydotool as fallback (wtype doesn't work with GNOME Wayland)
- Add user to 'input' group for uinput device access
- Install udev rule for /dev/uinput permissions
- Provide clear warning about logout requirement
Technical details:
- wtype uses Wayland virtual keyboard protocol (not supported by GNOME)
- ydotool uses Linux uinput kernel module (works with all compositors)
- System PyGObject 3.50.0+ supports Python 3.13
- Building PyGObject 3.54.5 from source fails with Python 3.13 build tools
Fixes installation on:
- Ubuntu 25.10 (Questing Quokka) - Wayland-only, Python 3.13
- Arch Linux with Python 3.13
- Fedora 41+ with Python 3.13
Tested on: Ubuntu 25.10 with Python 3.13.7, GNOME 49 Wayland
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Prioritize ydotool over wtype for universal Wayland compatibility
wtype uses the virtual-keyboard Wayland protocol which is not supported
by GNOME/Mutter compositors. ydotool uses the Linux uinput kernel module
which works with all Wayland compositors including GNOME.
This change swaps the priority order to check ydotool first, ensuring
text injection works on GNOME Wayland (Ubuntu 25.10+) while still
falling back to wtype for compositors that support it.
Tested on Ubuntu 25.10 with GNOME 49 Wayland - text injection now works
perfectly with ydotool.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* ci: trigger workflow run
* ci: run lint/tests on python 3.13
---------
Co-authored-by: ACT900 <179795730+ACT900@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
The commit message was being directly inserted into the bash comparison,
which broke when the message contained special characters like parentheses.
Fix by assigning to a variable first before the comparison.
The website displays the software version from source code in its
JSON-LD structured data. Previously, when version bumps occurred
(changing only src/vocalinux/version.py), the website was not rebuilt
or deployed because the path filter only detected 'python' changes,
not 'web' changes.
Changes:
- unified-pipeline.yml: Deploy website when either web OR python files
change (for version updates)
- unified-pipeline.yml: Add version sync step to copy version from
src/vocalinux/version.py to web/src/app/layout.tsx during build
- release.yml: Always deploy website as part of release workflow
This ensures the website's displayed version stays in sync with the
actual package version.
The v0.3.0-alpha release was created before the --tag feature was
added to install.sh, so installing from that tag fails with "Unknown
option: --tag=v0.3.0-alpha".
Solution: Always download install.sh from main (which has --tag support)
and pass the release tag as a parameter. This ensures users get a working
installer that can install the specific stable release.
Changes:
- web/src/app/page.tsx: Download from main instead of ${latestRelease}
- README.md: Update install commands to download from main
- docs/INSTALL.md: Update install command
- .github/workflows/release.yml: Update release notes
* fix: Use latest release tag for install commands instead of main branch
The web install commands previously pointed to install.sh from the main branch,
which could be unstable/untested code. Now they dynamically fetch the latest
release tag from GitHub API and use that for the install script URLs.
Changes:
- Add getInstallCommands() function that takes a release tag
- Add latestRelease state that fetches from GitHub releases API
- Update all install commands to use the fetched release tag
- Fallback to 'main' if GitHub API fails
* docs: Update README and docs to use latest release tag
Also update GitHub release workflow to use the release tag dynamically.
Changes:
- README.md: Update install commands to use v0.3.0-alpha tag
- docs/INSTALL.md: Update install command to use v0.3.0-alpha tag
- .github/workflows/release.yml: Use ${{ github.ref_name }} for install URL
- Add note pointing to GitHub Releases for latest version
---------
Co-authored-by: Claude Opus <noreply@anthropic.com>
- Build website when files in web/ directory are modified
- Deploy website on workflow_dispatch without requiring [web] tag
- Keep backward compatibility with [web] commit message trigger
- Added publish-pypi job to release workflow
- Builds, verifies, and uploads package to PyPI after GitHub release
- Uses PYPI_API_TOKEN secret for authentication
- Added id-token permission for trusted publishing support
- Package verification with twine check before upload
* feat: prepare for v0.2.0-alpha release
* feat: prepare for v0.2.0-alpha release
* chore: remove CHANGELOG.md, use GitHub Releases instead
* refactor: use existing About dialog instead of Settings section
* style: enhance About dialog UI readability
* style: fix formatting with black and isort
* feat: show VAD and silence timeout settings for Whisper engine
- Renamed 'VOSK Settings' to 'Recognition Settings'
- VAD Sensitivity and Silence Timeout now apply to both engines
- Added tooltips explaining each setting
- VOSK-specific model info only shown when VOSK selected
* fix: resolve overlapping UI elements in settings dialog
* fix: save VAD and silence timeout settings for both engines
Previously these settings were only saved when VOSK was selected.
Now they persist correctly for Whisper as well.
* fix: show download progress when selecting undownloaded model
Previously when auto-applying settings, models would download silently
in the background without showing the progress dialog. Now:
- Download progress dialog appears for undownloaded models
- Model icons update correctly after download completes
* feat: add download progress, speed, ETA and cancel button
- Show real download progress percentage for VOSK models
- Display download speed (MB/s) and estimated time remaining
- Add Cancel button to abort downloads
- Update status during extraction phase
- Whisper downloads still pulse (uses internal downloader)
* fix: defer model download until needed, don't block startup
- App now starts instantly even if models aren't downloaded
- Models are downloaded on-demand when selected in Settings
- If user tries to dictate without a model, plays error sound
- Added model_ready property to check if engine is usable
* fix: improve first-run UX without downloaded models
- Settings dialog now defaults to smallest available model, not saved config
- Only show saved model if it's actually downloaded
- Add desktop notification when trying to dictate without a model
- Prevents auto-downloading large models on first launch
* feat: add download progress tracking for Whisper models
- Implement custom Whisper model download with progress/speed/ETA
- Uses OpenAI's CDN URLs directly instead of whisper.load_model()
- Progress callback works the same as VOSK downloads
- Supports cancellation during download
* fix: enable download progress callback for Whisper models
Progress callback was only being set for VOSK downloads, not Whisper.
Now both engines show real-time progress, speed, and ETA.
* fix: update tests for defer_download and config manager mocking
- test_main: Mock ConfigManager to prevent saved config from overriding test values
- test_settings_dialog: Mock ModelDownloadDialog to prevent GTK init errors
- test_speech_recognition: Use proper MockVoskModule class instead of MagicMock, pass defer_download=False for download test
- test_whisper_support: Pass defer_download=False to trigger model loading in test
* fix: resolve test failures for CI
- test_main: Fix ConfigManager patch path to use source module
- test_settings_dialog: Mock _is_vosk_model_downloaded and _is_whisper_model_downloaded to skip download flow, add missing dialog attributes
- test_speech_recognition: Replace recognizer with properly configured mock that returns valid JSON, fixing test isolation issues when running all tests together
* fix: mock _download_whisper_model in whisper test to avoid requests exception handling issue
* fix: add gir1.2-girepository-2.0 dep for PyGObject on Ubuntu 24.04
- Add missing girepository-2.0 package for newer Ubuntu runners
- Use --no-build-isolation for PyGObject to use system packages
* fix: skip PyGObject pip install, use system python3-gi package
- Use --no-deps for editable install to skip PyGObject
- Install other deps explicitly without PyGObject
- Add python3-gi-cairo for complete GTK support
- Removes problematic girepository-2.0 build requirement
* fix: install PyGObject via pip with proper build deps
- Remove python3-gi/python3-gi-cairo (doesn't work with setup-python)
- Install PyGObject from pip after installing build dependencies
- Simplify venv setup without --system-site-packages hack
* Fix GObject
* fix: set GI_TYPELIB_PATH for pip-installed PyGObject to find AppIndicator3
- Allow web/package-lock.json in .gitignore for npm caching
- Add package-lock.json to enable GitHub Actions dependency caching
- This fixes the 'unable to cache dependencies' error in CI
- Added complete Next.js single-page website for Vocalinux
- Configured static export with proper GitHub Pages deployment
- Added GitHub Actions workflow for automated deployment to gh-pages branch
- Configured custom domain (vocalinux.com) with CNAME file
- Added comprehensive build script with npm support
- Responsive design with dark/light theme toggle
- Modern UI components with Tailwind CSS and shadcn/ui
- Proper SEO metadata and accessibility features
* Add GitHub Actions CI/CD workflows and status badges
* Fix CI workflow dependency installation
* Fix CI workflow: remove pip caching and add explicit requirements.txt
* Fix CI workflow: add system dependencies for PyGObject and pycairo
* Refactor code for improved readability and consistency
- Cleaned up whitespace and formatting in audio_feedback.py, config_manager.py, keyboard_shortcuts.py, tray_indicator.py, run_basic_tests.py, and test_basic.py.
- Enhanced the structure of the code by aligning comments and ensuring consistent indentation.
- Updated function definitions and calls to maintain a uniform style across the codebase.
- Improved logging messages for better clarity during debugging.
- Ensured all files end with a newline for better compatibility with various tools.
* Refactor imports for consistency and clarity across multiple modules
* Fix test imports by setting PYTHONPATH and adding conftest.py
* Update CI workflow to use Python 3.12 and ensure proper import path in tests
* Fix CI: Add GObject Introspection development dependencies
* Update CI: Use virtual environment like local setup
* Fix CI
* Update README and setup.py: Change Python version to 3.8 and correct author email
* Restructure tests for better organization and maintainability
* Fix formatting
* Update CI workflow to remove redundant test step
* Fix CI tests by properly mocking VOSK model loading
* Update CI and Tests
* Simplify