* feat: add Wayland support for keyboard shortcuts using evdev backend This commit adds multi-backend support for keyboard shortcuts, enabling them to work on Wayland sessions where pynput does not work. **Changes:** - New `keyboard_backends/` package with modular backend system - `base.py`: Abstract base class for keyboard backends - `pynput_backend.py`: Existing pynput implementation (X11/XWayland) - `evdev_backend.py`: New evdev implementation (X11 & Wayland) - `__init__.py`: Backend factory with auto-detection - Updated `keyboard_shortcuts.py`: - Refactored to use backend system - Auto-detects session type (X11 vs Wayland) - Selects appropriate backend automatically - Provides helpful error messages when shortcuts unavailable - Added `evdev>=1.6.0` to dependencies (Linux only) - Comprehensive test updates: - 21 tests pass covering all backends - Tests for session detection - Tests for backend factory - Tests for permission hints **User Impact:** - Keyboard shortcuts now work on Wayland when user is in 'input' group - Clear error messages guide users to fix permission issues - Backward compatible with X11 (pynput backend) **Setup for Wayland:** ```bash sudo usermod -a -G input $USER # Log out and log back in ``` Related to #80 * style: fix flake8 issues in evdev_backend.py - Remove unused import 'categorize' - Remove unused variable 'dev' * style: fix remaining flake8 issues in tests - Remove unused 'time' import - Remove unused 'result' variable - Remove unused 'backend_cls' variable - Break long line to stay under 100 characters * style: apply black and isort formatting to pass CI * feat: auto-configure Wayland keyboard shortcuts during installation Automatically detect Wayland sessions during installation and add the user to the 'input' group required for evdev-based keyboard shortcuts. This eliminates the need for users to manually configure permissions after installation on Wayland systems. * fix: escape commit message in Detect Changes step to handle special characters 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. * chore: drop unrelated installer/web changes * fix: fall back to evdev backend * style: format keyboard shortcut imports
Vocalinux Website
This is the official website for Vocalinux, a voice-to-text application for Linux systems. The website is built with Next.js and can be deployed as a static site to GitHub Pages.
🚀 Quick Start
Development
npm install
npm run dev
Building for Production
npm install
npm run build
The static files will be generated in the out/ directory.
📦 Deployment to GitHub Pages
Automatic Deployment (Recommended)
- Push your changes to the
mainormasterbranch - GitHub Actions will automatically build and deploy your site to the
gh-pagesbranch - Custom Domain: The site is configured for
vocalinux.com - The site will be available at https://vocalinux.com
Manual Deployment
If you prefer to deploy manually:
-
Build the static site:
cd web npm install npm run deploy -
The build includes:
- Static HTML, CSS, and JavaScript files in
out/ .nojekyllfile for GitHub Pages compatibilityCNAMEfile pointing tovocalinux.com
- Static HTML, CSS, and JavaScript files in
Local Testing
To test the built site locally:
cd web/out
python3 -m http.server 3000
Then visit http://localhost:3000 in your browser.
🛠️ Build Scripts
npm run dev- Start development servernpm run build- Build static site for productionnpm run deploy- Build and prepare for GitHub Pages (adds .nojekyll and CNAME)npm run lint- Run ESLintnpm run typecheck- Run TypeScript type checking
📁 Project Structure
web/
├── src/
│ ├── app/
│ │ ├── layout.tsx # Root layout
│ │ └── page.tsx # Homepage
│ ├── components/
│ │ ├── dictation-overlay.tsx
│ │ ├── theme-toggle.tsx
│ │ └── ui/ # Reusable UI components
│ ├── hooks/
│ └── lib/
├── public/ # Static assets
├── out/ # Generated static files (after build)
└── package.json
🎨 Features
- Responsive Design - Works on desktop and mobile
- Dark/Light Theme - Automatic theme switching
- Modern UI - Built with Tailwind CSS and Framer Motion
- SEO Optimized - Proper meta tags and structure
- Fast Loading - Optimized static generation
🔧 Configuration
Custom Domain
If you want to use a custom domain:
-
Update the
deployscript inpackage.jsonto include your domain:"deploy": "next build && touch out/.nojekyll && echo 'yourdomain.com' > out/CNAME" -
Configure your domain's DNS to point to GitHub Pages
Base Path
If deploying to a subdirectory, update next.config.js:
const config = {
basePath: '/your-subdirectory',
// ... other config
}
🐛 Troubleshooting
Build Issues
- "Module not found": Run
npm installto ensure all dependencies are installed - TypeScript errors: Run
npm run typecheckto see detailed type errors - ESLint errors: Run
npm run lint:fixto automatically fix common issues
Deployment Issues
- 404 on GitHub Pages: Ensure
.nojekyllfile exists in theout/directory - Assets not loading: Check that
basePathis correctly configured innext.config.js - Blank page: Check browser console for JavaScript errors
📝 License
This project is licensed under the same license as the main Vocalinux project.