There was a typo in the gir1.2-ayatanaappindicator3-0.1 .deb package referred
to in apt commands, submitted in commit 27ebbfe417f178eaabcf2ac10af63f37bc819fac
gir1.2-ayatana-appindicator3 (typo) replaced with gir1.2-ayatanaappindicator3-0.1
per Debian package list at
https://packages.debian.org/search?keywords=gir1.2-ayatanaappindicator3-0.1
Will be backwards compatible with Debian 11 (bullseye), 12 (bookworm), and current
13 (trixie).
Changes:
- install.sh: gir1.2-ayatana-appindicator3 (typo) replaced with gir1.2-ayatanaappindicator3-0.1
- docs/INSTALL.md: gir1.2-ayatana-appindicator3 (typo) replaced with gir1.2-ayatanaappindicator3-0.1
- src/vocalinux/main.py: gir1.2-ayatana-appindicator3 (typo) replaced with gir1.2-ayatanaappindicator3-0.1
- CONTRIBUTING.md: gir1.2-ayatana-appindicator3 (typo) replaced with gir1.2-ayatanaappindicator3-0.1
* feat: improve SEO with favicons, optimized OG image, and enhanced schema
- Add favicon PNG assets (16x16, 32x32, 96x96) for better browser/Search display
- Add apple-touch-icon (180x180) for iOS devices
- Add PWA icons (192x192, 512x512) with maskable support
- Optimize OG image from 6.8MB to 279KB (1200x630px)
- Update web manifest with correct icons and theme color (#3CB371)
- Enhance JSON-LD with Organization and WebSite schemas
- Remove hardcoded version from SoftwareApplication schema
- Update sitemap lastmod to 2026-01-29 and changefreq to monthly
* fix: add back softwareVersion for CI sync
* feat: regenerate favicons with high-res transparent image
* feat: replace vocalinux.svg with vocalinux.png in web
* fix: improve wtype error reporting with stderr output
When wtype fails on Wayland systems, the error message didn't include
the stderr output from the command, making debugging difficult. This
change captures and logs stderr to help users understand why text
injection is failing.
Related to #97
* style: apply black formatting
Release preparation for v0.4.1-alpha with the following updates:
Features:
- Language selector UI with 10 languages and auto-detection support
Bug Fixes:
- App drawer launch fix when installing from local repo (absolute path for VENV_DIR)
- Escape commit message in Detect Changes step
- Correct git fetch syntax for tag-based updates
Updated Files:
- src/vocalinux/version.py: 0.4.0-alpha → 0.4.1-alpha
- install.sh: Default tag v0.3.0-alpha → v0.4.1-alpha
- README.md: Install command version updates
- docs/INSTALL.md: Install command version updates
- docs/UPDATE.md: New v0.4.1-alpha section, moved v0.4.0-alpha to Previous Versions
- web/src/app/layout.tsx: Software version update
When installing from within the git repository, VENV_DIR remained as
the relative path "venv", which caused wrapper scripts in ~/.local/bin/
to fail when executed from any directory other than the repo root.
This broke launching from app drawers/desktop entries since they don't
set the working directory to the repo location.
Fix: Convert VENV_DIR to an absolute path ($INSTALL_DIR/$VENV_DIR) when
running from local repository, ensuring wrapper scripts work regardless
of current working directory.
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.
* feat: add language selector UI with auto-detection support
This commit implements a comprehensive language selector for the GUI,
extending support from 4 to 10 languages and adding Whisper auto-detect.
Changes:
- Add SUPPORTED_LANGUAGES constant with 10 languages (auto, en-us, hi, es, fr, de, it, pt, ru, zh)
- Each language includes display name, Whisper code, VOSK model name, and optional warning
- Extend VOSK_MODEL_INFO to include Hindi, Spanish, Italian, Portuguese, and Chinese models
- Add language dropdown in Settings dialog with status indicators (✓ downloaded, ↓ needs download, ⚠ warning)
- Add language warning label for auto-detect and engine compatibility messages
- Update default language from "en-us" to "auto" for Whisper auto-detection
- Handle "auto" language in Whisper (passes None for auto-detect)
- Handle "auto" language in VOSK (falls back to "en-us" since VOSK doesn't support auto-detect)
- Update CLI --language argument to include all supported languages
Fixes the issue where Hindi speech was being transcribed as English
because the language was hardcoded to "en-us" which Whisper interpreted
as "force English transcription" rather than auto-detect.
Related PRs:
- #72 - Feature: Add language auto-detection and GUI selector (supersedes)
- #71 - Feature: Add multi-language support for FR, DE, RU (builds upon)
- #52 - Feature: 3 more languages for Whisper and VOSK (extends)
- #68 - Comment out language parameter in transcribe call (addresses)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* style: format main.py with black
* fix: use venv python and set GI_TYPELIB_PATH for verification
* fix: create wrapper scripts that set GI_TYPELIB_PATH
Problem: The symlinks in ~/.local/bin pointed to venv scripts that
failed because PyGObject couldn't find the system typelib files
(AppIndicator3 namespace not available).
Solution: Create wrapper scripts in ~/.local/bin that:
1. Set GI_TYPELIB_PATH=/usr/lib/girepository-1.0
2. Execute the venv's vocalinux scripts
This fixes the issue where vocalinux-gui would fail to start with:
ValueError: Namespace AppIndicator3 not available
* fix: set GI_TYPELIB_PATH in desktop entry Exec line
When launching from the app drawer, the environment variables from the
wrapper script weren't being inherited properly. By adding GI_TYPELIB_PATH
directly in the desktop entry's Exec line, the app can now find the
AppIndicator3 typelib files.
* fix: always create wrapper scripts, not just for remote installs
The wrapper scripts were only created when CLEANUP_ON_EXIT=yes, which
is only set for remote (curl-based) installations. When running from
a local repository, the wrapper scripts were never created, causing
the desktop entry and launch commands to fail.
* fix: prevent recursion in LoggingHandler when processing log records
The custom LoggingHandler was triggering logging from within the logging
system itself, causing infinite recursion when formatting log records.
This could happen when the logging formatter or any operation during
record processing triggered additional log messages.
Fix: Add _emitting flag to prevent recursive calls to emit().
* fix: prevent infinite loop in settings dialog when changing language
Add guard flags to prevent recursive event handler calls:
- _populating_models: blocks _on_model_changed during model population
- _processing_language_change: blocks recursive language change handling
- _applying_settings: blocks recursive settings application
These guards prevent the infinite loop that occurred when selecting a
language whose VOSK model wasn't downloaded yet.
Fixes issue where "Model small needs download" logged repeatedly.
* fix: handle language parameter in reconfigure and improve UX
- Fix reconfigure() to properly handle language parameter changes
- Remove _processing_language_change check from _auto_apply_settings
to allow settings to be applied when language changes
- Hide unsupported languages in dropdown based on selected engine
* VOSK: only show languages with available models (no "auto")
* Whisper: show all supported languages including "auto"
- Remove duplicate _auto_apply_settings call in _on_engine_changed
- Set active language in combo after repopulating options
This fixes:
1. Whisper continuing to use old language after switching (e.g.,
still transcribing in Hindi after switching to en-us)
2. Potential infinite loop when selecting languages for VOSK
3. User confusion by showing incompatible language options
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The website was displaying an outdated version (0.3.0-alpha) instead of
the current version (0.4.0-alpha) from src/vocalinux/version.py.
Updated version references in:
- web/src/app/page.tsx (header badge)
- web/src/app/layout.tsx (structured data)
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.
* Fix: Handle deprecated appindicator package on Debian 13+
Fixes#69
The gir1.2-appindicator3-0.1 package was deprecated in Debian 13 (trixie)
and replaced with gir1.2-ayatana-appindicator3. This change adds fallback
logic to try the new package if the old one is not available.
Changes:
- install.sh: Try old package first, fall back to ayatana-appindicator
- docs/INSTALL.md: Document both package options
- src/vocalinux/main.py: Update error message with Debian 13+ note
- CONTRIBUTING.md: Update dev setup instructions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: clean up whitespace in filtered package list
---------
Co-authored-by: Claude Opus <noreply@anthropic.com>
Fixes#66
The --system-site-packages flag causes the virtual environment to inherit
system packages, which can include versions incompatible with newer Python
versions. On Arch/EndeavourOS with Python 3.12, an old coverage package
from the system causes Whisper to fail with:
module 'coverage.types' has no attribute 'Tracer'
By creating an isolated virtual environment, all dependencies are installed
at compatible versions within the venv, avoiding such conflicts.
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
* docs: Clarify VOSK and Whisper dependency installation in README (#67)
- VOSK: installs the vosk Python package from PyPI
- Whisper: installs openai-whisper package from PyPI, which also pulls in PyTorch
Closes#67
* chore: Add Claude workflow rules to gitignore
Problem: Even though the website fetched install.sh from a specific release tag,
the script itself would clone the repository from main branch, installing
potentially unstable/untested code.
Solution:
- Add --tag parameter to install.sh to specify which release to install
- Default to v0.3.0-alpha (latest stable) instead of main
- Clone the specific tag using 'git clone --branch <tag>'
- Update website to pass --tag parameter with fetched release
Changes:
- install.sh: Add --tag parameter, default to v0.3.0-alpha, clone specific tag
- web/src/app/page.tsx: Pass --tag=<version> to install script
This ensures users install the exact release version they intended, not
whatever code is currently on main branch.
Co-authored-by: Claude Opus <noreply@anthropic.com>
* 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>
* fix: Update tests to include language parameter
- Add language to parse_arguments tests
- Update mock expectations for SpeechRecognitionManager to include language
- Fixes test failures after language support merge
* fix: Update tests for language support and fix None argument handling
- Fix test_parse_arguments_defaults to expect None for model/engine/language
- Add language_combo mock to settings_dialog tests
- Add language attribute to dialog mock setup
- Include language in get_selected_settings mock return values
- Update mock_config_manager to include language in return value
Add support for French, German, and Russian languages in both VOSK and Whisper engines.
- Adds language configuration to config system
- Adds --language command-line argument
- Creates vosk_model_info.py utility for model mapping
- Supports en-us, fr, de, ru languages
- Merged with latest main including PR #70 (Debian 13+ appindicator fix)
Co-Authored-by: Artem Lytvynov <violog@users.noreply.github.com>
- Add vosk_model_size and whisper_model_size to config to track model
selection independently for each engine
- Update config manager with get_model_size_for_engine() and
set_model_size_for_engine() methods for per-engine model tracking
- Add automatic migration for existing configs without per-engine model sizes
- Update settings dialog to use engine-specific model sizes when populating
model options
- Update install.sh to include new per-engine model fields in default config
- Fix: Previously, switching from VOSK to Whisper would incorrectly try to
download the recommended model instead of the previously used model
Fixes the issue where switching back to Whisper after using VOSK would
start downloading the medium model instead of remembering the tiny model
that was configured during installation.
* fix: VOSK-only install and CLI arg handling for low-memory systems
Fixes several issues reported by users on low-memory systems (8GB RAM):
1. Install script: Don't auto-install Whisper in non-interactive mode
- Previously, running 'curl | bash' would install Whisper by default
- Now requires explicit --with-whisper flag to install Whisper
- Prevents OOM errors on systems with limited RAM
2. CLI arguments: Command-line flags now properly override saved config
- --engine vosk now works even if config file has whisper set
- --model flag also properly overrides saved model setting
- Checks sys.argv to detect if user explicitly provided arguments
3. Default engine: Changed from 'whisper' to 'vosk'
- VOSK works on low-memory systems without OOM issues
- Users can still install and use Whisper with --with-whisper flag
- Existing configs with 'whisper' engine are still respected
Reported issues:
- OOM during installation on 8GB RAM system
- vocalinux --engine vosk being ignored
- Config file not respected when trying to force VOSK
* fix: keep whisper as default engine, improve test robustness
- Reverted default engine back to 'whisper' for better accuracy
- Install script still defaults to VOSK-only install (--with-whisper for Whisper)
- CLI args still properly override saved config
- Improved test_config_manager tests to handle module caching issues
* fix: default to Whisper install, --no-whisper for VOSK-only on low-RAM systems
Updated install behavior:
- Default (curl|bash): Installs Whisper for best experience
- --no-whisper flag: Skips Whisper AND creates config with VOSK as default engine
This allows low-RAM users (8GB) to run:
curl -fsSL .../install.sh | bash -s -- --no-whisper
Which will:
1. Skip installing torch/whisper (avoids OOM)
2. Create ~/.config/vocalinux/config.json with engine='vosk'
3. App will use VOSK by default without needing CLI flags
* docs: clarify --no-whisper is for low-RAM systems (8GB or less)
Updated README and website to explain that --no-whisper flag:
- Is intended for systems with 8GB RAM or less
- Avoids out-of-memory errors during installation
- Configures VOSK as the default speech recognition engine
* feat: add --whisper-cpu flag for CPU-only PyTorch installation
New installation option for users without NVIDIA GPU or with limited RAM:
Install script changes:
- Added --whisper-cpu flag: Installs CPU-only PyTorch (~200MB vs ~2.3GB)
- Uses https://download.pytorch.org/whl/cpu index for smaller torch package
- Interactive mode now offers 3 options: GPU, CPU-only, or skip Whisper
- Updated help text to explain all Whisper installation options
Documentation updates:
- README: Added --whisper-cpu example with explanation
- Website: Added new 'Whisper CPU-only' install option section
Installation options summary:
- Default (curl|bash): Whisper + GPU/CUDA support (~2.3GB, 5-10 min)
- --whisper-cpu: Whisper + CPU-only PyTorch (~200MB, 3-4 min)
- --no-whisper: VOSK only, no Whisper (~2-3 min)
* Fix audio detection issues (#34)
This commit addresses the audio detection issues reported in GitHub issue #34
where users on various Linux distributions (Fedora, Ubuntu with Wayland)
were unable to get voice recognition working despite their microphones
functioning in other applications.
Changes:
- Add audio input device enumeration and selection
- New get_audio_input_devices() function lists all available input devices
- Users can now select which microphone to use in Settings
- Add audio diagnostics and testing
- New test_audio_input() function for testing microphone input
- Test Mic button in Settings to verify audio is being captured
- Audio level bar shows real-time input levels
- Improve audio debugging/logging
- Log available audio devices on startup
- Log which device is being used
- Periodic audio level logging during recording
- Warning when no speech detected and max level is very low
- Log when speech is first detected with threshold info
- Add audio device configuration
- Audio device selection persisted to config file
- Device loaded on startup from saved config
- Better error handling
- Graceful handling of audio stream open failures
- Clear error messages when audio devices are unavailable
The root cause for many users was that PyAudio's default device selection
may not match the system's default input, especially on systems using
PipeWire or complex audio routing. Users can now explicitly select their
microphone and test it before using voice recognition.
* Fix circular import in speech_recognition module
Move lazy imports for get_audio_input_devices and test_audio_input
to avoid circular dependency when settings_dialog imports from
speech_recognition at module load time.
* Fix audio detection issues with device selection
- Add audio device enumeration and selection in Settings
- Add microphone test button with audio level indicator
- Improve VAD logging with periodic audio level output
- Add warning when no speech detected with low audio levels
- Store audio device preference in config
Fixes#34
* Fix linting issues - remove unused imports, fix module-level imports, format code
* Fix remaining linting issues - add type hints back, fix whitespace, add noqa comments
* Fix final linting issue - break long line in config_manager
* Fix formatting - use black formatting, align flake8 line-length with black (100)
* Fix CI test failures: Update mocks and assertions
* Fix audio feedback mock tests for CI
- Move audio feedback imports to top of recognition_manager.py (remove lazy imports)
- Add shared mock_audio_feedback in conftest.py for consistent mocking across tests
- Update test_recognition_manager.py and test_speech_recognition.py to use shared mock
- Fixes test_start_stop_recognition, test_start_recognition, test_stop_recognition
* Add Google Analytics tracking to website
- Add GA script tags to layout.tsx head section
- Remove @next/third-parties dependency from package.json
- Use measurement ID G-7NBBNJNNQ7 for tracking
* Fix Google Analytics integration for static export
- Use Next.js Script component instead of inline scripts
- Add 'afterInteractive' strategy for optimal loading
- GA scripts now properly included in static build output
* Fix: Prevent horizontal scrolling on mobile for code blocks [web]
- Wrap SyntaxHighlighter components in overflow-x-auto containers
- Add customStyle prop with maxWidth and overflowX for proper mobile handling
- Add min-w-0 to parent cards to prevent grid overflow
- Wrap uninstall command pre tag in overflow container
- Ensures code blocks scroll within their containers on mobile devices
* Style: Match uninstall command box with install sections [web]
- Use SyntaxHighlighter for uninstall command (consistent with install sections)
- Add red icon background to distinguish from install commands
- Add descriptive subtitle 'Clean removal in one command'
- Extract uninstallCommand as constant like install commands
- Maintain responsive overflow handling for mobile
- Replace <a href='/'> with <Link href='/'> in header logo
- Replace <a href='/'> with <Link href='/'> in footer logo
- Fixes ESLint no-html-link-for-pages errors
- 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
* feat(web): Complete website overhaul for beta release
Major updates to make the website beta-ready:
## Content & Design
- Completely rewritten homepage with modern, catchy design
- Prominent one-click installation command in hero section
- Clear value proposition: 'Voice Dictation for Linux, Finally Done Right'
- Trust indicators (100% Offline, Privacy First, Open Source, X11/Wayland)
- Interactive demo section encouraging users to try double-tap Ctrl
- Feature cards highlighting key benefits
- Detailed installation section with both full and quick install options
- Voice commands reference section
- Speech engines comparison (Whisper AI vs VOSK)
- Comprehensive FAQ section
- Modern CTA section and footer
## SEO Improvements
- Added comprehensive meta tags with proper descriptions
- Open Graph and Twitter Card meta tags with proper images
- JSON-LD structured data for SoftwareApplication schema
- Added robots.txt for search engine crawling
- Added sitemap.xml for better indexing
- Added site.webmanifest for PWA support
- Proper canonical URL and meta keywords
- Author attribution and GPL-3.0 license info
## Technical
- Removed unused creatr-devtools dependency
- Real GitHub stars fetching from API
- Improved responsive design
- Better accessibility with proper aria labels
- Clean, maintainable component structure
The website now properly reflects the v0.2.0-alpha release features
and provides a clear path for users to install and use Vocalinux.
* feat(web): Add live demo, improve logo and install UX
Changes:
- Use actual app logo SVG image for consistent branding
- Added live browser-based speech recognition demo using Web Speech API
- Allows users to try voice-to-text directly in their browser
- Clear indication that the demo uses cloud-based Web Speech API
- Prominent call-to-action to install Vocalinux for offline experience
- Redesigned one-click install box with better visual hierarchy
- Left-aligned layout with clear instructions
- Terminal-style command display with copy button
- Added compatibility info and install time estimates
- Improved footer and feature section with consistent logo usage
* feat(web): Add double-tap Ctrl to trigger live demo
- Added keyboard detection for double-tap Ctrl (same as the real app)
- Shows visual hint 'Tap Ctrl again to start!' on first Ctrl press
- Instructions updated to highlight Ctrl+Ctrl as primary activation
- Click still works as alternative method
- Double-tap Ctrl also stops recording when active
* fix(web): Remove duplicate DictationOverlay that conflicted with LiveDemo
The old DictationOverlay was still responding to double-tap Ctrl alongside
the new LiveDemo component, causing two overlays to appear simultaneously.
Removed the page-level useDoublePress hook and DictationOverlay since the
LiveDemo now handles double-tap Ctrl detection internally.
* fix(web): Improve Quick Install section layout and readability
- Changed to stacked vertical layout for cleaner appearance
- Command now wraps with break-all instead of horizontal scroll
- Simplified compatibility text to fit better
- Better spacing and padding throughout
- Responsive bottom info section
* fix(web): Make Quick Install box wider for better text fit
Changed max-w-4xl to max-w-5xl and added horizontal padding so the
curl command doesn't wrap as much on medium-sized screens.
* Website beta v2: UI polish and improvements
- Reorder nav links to match page section order (Demo, Features, Install)
- Split install commands into 3 lines for better readability
- Fix button contrast in dark mode (Install Now, Install Vocalinux)
- Improve live demo mic icon and Ctrl text readability
- Add gradient/border styling to version tag in header
- Hide scrollbars on code blocks globally
- Add favicon using vocalinux.svg
- Add copy button to uninstall command
- Left-align Quick Install header text
- Update footer author link to X/Twitter profile
- Reorder nav links to match page section order (Demo, Features, Install)
- Split install commands into 3 lines for better readability
- Fix button contrast in dark mode (Install Now, Install Vocalinux)
- Improve live demo mic icon and Ctrl text readability
- Add gradient/border styling to version tag in header
- Hide scrollbars on code blocks globally
- Add favicon using vocalinux.svg
- Add copy button to uninstall command
- Left-align Quick Install header text
- Update footer author link to X/Twitter profile
- Changed to stacked vertical layout for cleaner appearance
- Command now wraps with break-all instead of horizontal scroll
- Simplified compatibility text to fit better
- Better spacing and padding throughout
- Responsive bottom info section
The old DictationOverlay was still responding to double-tap Ctrl alongside
the new LiveDemo component, causing two overlays to appear simultaneously.
Removed the page-level useDoublePress hook and DictationOverlay since the
LiveDemo now handles double-tap Ctrl detection internally.
- Added keyboard detection for double-tap Ctrl (same as the real app)
- Shows visual hint 'Tap Ctrl again to start!' on first Ctrl press
- Instructions updated to highlight Ctrl+Ctrl as primary activation
- Click still works as alternative method
- Double-tap Ctrl also stops recording when active
Changes:
- Use actual app logo SVG image for consistent branding
- Added live browser-based speech recognition demo using Web Speech API
- Allows users to try voice-to-text directly in their browser
- Clear indication that the demo uses cloud-based Web Speech API
- Prominent call-to-action to install Vocalinux for offline experience
- Redesigned one-click install box with better visual hierarchy
- Left-aligned layout with clear instructions
- Terminal-style command display with copy button
- Added compatibility info and install time estimates
- Improved footer and feature section with consistent logo usage
Major updates to make the website beta-ready:
## Content & Design
- Completely rewritten homepage with modern, catchy design
- Prominent one-click installation command in hero section
- Clear value proposition: 'Voice Dictation for Linux, Finally Done Right'
- Trust indicators (100% Offline, Privacy First, Open Source, X11/Wayland)
- Interactive demo section encouraging users to try double-tap Ctrl
- Feature cards highlighting key benefits
- Detailed installation section with both full and quick install options
- Voice commands reference section
- Speech engines comparison (Whisper AI vs VOSK)
- Comprehensive FAQ section
- Modern CTA section and footer
## SEO Improvements
- Added comprehensive meta tags with proper descriptions
- Open Graph and Twitter Card meta tags with proper images
- JSON-LD structured data for SoftwareApplication schema
- Added robots.txt for search engine crawling
- Added sitemap.xml for better indexing
- Added site.webmanifest for PWA support
- Proper canonical URL and meta keywords
- Author attribution and GPL-3.0 license info
## Technical
- Removed unused creatr-devtools dependency
- Real GitHub stars fetching from API
- Improved responsive design
- Better accessibility with proper aria labels
- Clean, maintainable component structure
The website now properly reflects the v0.2.0-alpha release features
and provides a clear path for users to install and use Vocalinux.
- 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: Make Whisper tiny the default engine and download during install
- Changed default engine from 'vosk' to 'whisper' in config_manager.py
- Changed default model_size from 'small' to 'tiny' in config_manager.py
- Added install_whisper_model() function to install.sh that downloads
the Whisper tiny model (~75MB) during installation
- Whisper model is downloaded when Whisper package is installed
(in non-interactive mode or with --with-whisper flag)
- Updated installation summary to show Whisper model status
- Updated documentation (README.md, INSTALL.md, SECURITY.md, USER_GUIDE.md)
to reflect Whisper tiny as the default engine
This provides a better out-of-box experience: users can install and
immediately use Vocalinux without any additional downloads or prompts.
* test: Update test to reflect whisper as default engine
- INSTALL.md: Add curl install as recommended, add --no-whisper flag
- CONTRIBUTING.md: Fix activation instructions for source installs
- README.md: Fix development setup to use venv/bin/activate
All docs now reflect:
- curl | bash installs Whisper by default
- --no-whisper for faster VOSK-only install
- Correct venv activation paths
* fix: install/uninstall scripts for curl | bash usage
Install script improvements:
- Detect non-interactive mode (curl | bash) automatically
- Skip interactive prompts in non-interactive mode
- Add --no-whisper and -y/--yes flags for explicit control
- Continue with defaults when stdin is not a tty
Uninstall script improvements:
- Clean up curl-installed files:
- ~/.local/share/vocalinux-install (cloned repo)
- ~/.local/share/vocalinux/venv (virtual environment)
- ~/.local/bin/vocalinux (symlink)
- ~/.local/bin/activate-vocalinux.sh
- Add -y/--yes flag for non-interactive mode
- Verify all curl-installed components are removed
README updates:
- Document curl installation with --with-whisper option
- Add uninstall instructions for both methods
- Clarify what gets installed where
* feat: install Whisper by default in non-interactive mode
- curl | bash now installs both VOSK and Whisper out of the box
- Users can freely switch between engines in settings
- Add --no-whisper flag for faster install (VOSK only)
- Update README to reflect new default behavior
* chore: remove install-whisper.sh (now part of install.sh)
Whisper is installed by default via install.sh, making this
separate script redundant.
* chore: remove activate-vocalinux.sh (generated by install.sh)
This file is dynamically created by install.sh based on the
venv location, so the static template is not needed.