* docs: Add distribution package mapping reference
Add a comprehensive YAML reference file documenting package names
across different Linux distributions. This serves as:
1. Documentation for manual installation on unsupported distros
2. Reference for adding support for new distributions
3. Auxiliary reference for the installer's embedded package mappings
Completes Task 6 from the cross-distribution compatibility fix plan.
Related to: #158, #159, #160, #161
* ci: Actually test install.sh distro detection in CI matrix
Previously, the distro-test-matrix.yml workflow only did syntax checks
on install.sh without actually testing the core cross-distribution
functionality that was added in phases 1-4.
This update adds proper tests for:
1. Distro Detection - Tests detect_distro() function logic across
different containers to verify proper identification of Ubuntu,
Debian, Fedora, etc.
2. Typelib Path Detection - Tests detect_typelib_path() function
which uses pkg-config and fallback paths for GI_TYPELIB_PATH
3. Virtual Environment Creation - Verifies Python venv can be
created with minimal system dependencies
4. Dependency Checker - Runs check-system-deps.sh to see what's
missing on each distro
5. Installer Help - Verifies install.sh --help works
This ensures the cross-distribution compatibility improvements
are actually tested by CI, not just syntax-checked.
Related to: #158, #159, #160, #161, #162
* ci: Fix distro test - avoid sourcing install.sh (root check fails)
The install.sh script has a root check that exits immediately when
running as root, which causes CI to fail when we try to source it.
Instead, we now test the distro detection logic directly without
sourcing install.sh. This gives us the same test coverage while
avoiding the root check issue.
Add testing infrastructure and documentation improvements.
**Task 12: Add pkg-config to Core Dependencies**
- Added pkg-config check at the start of install_system_dependencies()
- Added pkg-config to all distribution package lists
- Provides distro-specific install instructions if pkg-config is missing
- Critical for library detection (GI_TYPELIB_PATH, PortAudio, etc.)
**Task 13: Update README with Distro Info**
- Updated Requirements section with tested distributions
- Added link to DISTRO_COMPATIBILITY.md
- Listed officially supported distros: Ubuntu 22.04+, Debian 11+, Fedora 39+, Arch, openSUSE
- Mentioned experimental support for Gentoo, Alpine, Void, Solus
**Task 14: Create Test Matrix for CI**
- New workflow: .github/workflows/distro-test-matrix.yml
- Tests on multiple container images: Ubuntu 22.04, 24.04, Debian 12, Fedora 39
- Runs dependency checker on each distro
- Tests Python imports and bash syntax validation
- Uses continue-on-error for experimental distro support
**Task 15: Integration Testing Checklist**
- New file: tests/distro-testing-checklist.md
- Comprehensive checklist for testing on new distributions
- Covers: Pre-install, Installation, Post-install, Functionality, Performance, Cleanup
- Includes quick reference commands
- Desktop environment and application-specific testing sections
- Template for submitting test results
Part of cross-distribution compatibility improvements (Phase 4 of 5).
Related to #157
The unified-pipeline workflow was failing when commit messages contained
special characters (like quotes in 'won\'t be transcribed'). The shell
pattern matching was fragile and would break on various characters.
Fix:
- Replace fragile glob pattern matching with grep case-insensitive search
- Look for common website-related commit prefixes:
feat(website)
docs(website)
chore(website)
fix(website)
refactor(website)
- This is more robust and handles special characters gracefully
- Fix YAML formatting issue with blank line
This makes the CI workflow more reliable and less fragile.
* fix(website): update schema version and add structured data for SEO
- Fix softwareVersion from "0.0.0" to "0.4.1-alpha" in SoftwareApplication schema
- Add FAQPage schema for rich results in search engines
- Add HowTo schema for installation guide steps
- Update sitemap.xml lastmod date to 2026-02-05
Fixes#138
* ci: skip Python builds when only web/ folder changes
- Add path filters to detect changes in web/ vs Python files
- Make python-lint and python-test jobs depend on changes job
- Skip Python CI when only web files are modified
- Expand Python path filters to include common config files
Closes#138
- 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