diff --git a/AGENTS.md b/AGENTS.md
index 8aedd2e..690961a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -5,7 +5,7 @@ Guidelines for AI agents working on this codebase.
## Project Overview
Vocalinux is a voice dictation system for Linux. It uses:
-- **Python 3.8+** for the main application
+- **Python 3.9+** for the main application
- **GTK 3** (via PyGObject) for the desktop UI and system tray
- **whisper.cpp** (default), **OpenAI Whisper**, and **Vosk** for speech recognition
- **Next.js/TypeScript** for the website (in `web/`)
diff --git a/README.md b/README.md
index 9e898c8..79bea54 100644
--- a/README.md
+++ b/README.md
@@ -32,38 +32,39 @@ It's a free, GPLv3-licensed desktop app that lets you dictate text into *any* ap
No internet required. No data leaves your machine. Just speak and type.
-## ๐ What's New in v0.9.0-beta
+## ๐ What's New in v0.10.0-beta
-> ๐ **Release: Left/Right modifier keys, sound effects toggle, Wayland clipboard fallback, and more.**
+> ๐ **Release: reliability hardening across keyboard/audio/tray handling, stronger IBus activation, and better CI/testing quality.**
-### ๐ Highlights (v0.8.0 โ v0.9.0)
+### ๐ Highlights (v0.9.0 โ v0.10.0)
| Feature | Description |
|---------|-------------|
-| **โจ๏ธ Left/Right Modifier Keys** | Choose Left Ctrl vs Right Ctrl (etc.) as your shortcut trigger |
-| **๐ Sound Effects Toggle** | Enable or disable audio feedback from the Settings dialog |
-| **๐ Wayland Clipboard Fallback** | Automatic clipboard copy when virtual keyboard injection isn't available |
-| **๐ ๏ธ Installation Polish** | Better pipx/Debian guidance and headless display detection |
+| **โจ๏ธ Keyboard Robustness** | Better modifier alias matching across layouts and SYN_DROPPED recovery in evdev |
+| **๐๏ธ Audio Compatibility** | Device channel probing now validates supported sample rates for safer defaults |
+| **๐ฅ๏ธ IBus + Tray Stability** | IBus activation uses `register_component`; tray updates use icon names reliably |
+| **๐งช Quality & CI Upgrades** | Test coverage rose to 80%+, with Node 24 and path-filtered CI pipelines |
-### โจ New Features (v0.9.0)
+### โจ New in v0.10.0-beta
-- **Left/Right Modifier Key Distinction** - Shortcuts now support `Left Ctrl`, `Right Alt`, etc., with grouped UI in Settings
-- **Sound Effects Toggle** - New Audio Settings toggle to silence start/stop/error sounds
-- **Clipboard Fallback for Wayland** - Auto-copies text via `wl-copy`/`xclip` when injection unavailable (KDE Plasma etc.)
-- **Display Availability Check** - Graceful error message when running in headless environments
+- **IBus registration flow improvements** - Text injection now uses explicit component registration for more reliable engine activation
+- **Expanded IBus test coverage** - Launch mode and main entrypoint paths are now covered in tests
+- **Improved project defaults** - Minimum supported Python version is now 3.9+
-### ๐ Bug Fixes (v0.9.0)
+### ๐ Bug Fixes (v0.10.0)
-- **#308**: Distinguish left vs right modifier keys (evdev + pynput backends)
-- **#307**: Remove unwanted leading space when starting a new transcription session
-- **#305**: Pass configured shortcut mode to `KeyboardShortcutManager` on startup
-- **#299**: Add clipboard fallback for Wayland compositors without virtual keyboard support
-- **#289**: Improve Debian/pipx installation error messages and cross-distro dependency guidance
+- **#342**: Generalized pynput modifier alias matching across keyboard layouts
+- **#341**: Channel probing now verifies sample-rate support for selected audio devices
+- **#339**: evdev backend now handles `SYN_DROPPED` to avoid stale modifier state
+- **#333**: Settings dialog now forces window decorations to fix missing-titlebar scenarios
+- **#330**: Tray icon updates now use icon names for AppIndicator compatibility
+- **#304**: IBus activation now uses `register_component` for more reliable startup behavior
### ๐ง Improvements
-- **Grouped shortcut selector** - Settings dropdown now organises shortcuts by Either/Left/Right side
-- **pipx documentation** - New `DISTRO_COMPATIBILITY.md` section for pipx users
+- **Installation fallback hardening** - Installer now resolves latest tag via GitHub API and improves piped-shell behavior
+- **CI runtime modernization** - Deploy workflow upgraded to Node.js 24 with smarter path-based workflow filtering
+- **Repo cleanup** - Removed stale `setup.py` and legacy website build script
---
@@ -367,7 +368,7 @@ Vocalinux is part of a family of privacy-first, offline voice dictation tools. S
| Platform | Project | Website | GitHub | Status |
|----------|---------|---------|--------|--------|
-| ๐ง Linux | **VocaLinux** | [vocalinux.com](https://vocalinux.com) | [jatinkrmalik/vocalinux](https://github.com/jatinkrmalik/vocalinux) | โ
Beta v0.9.0 |
+| ๐ง Linux | **VocaLinux** | [vocalinux.com](https://vocalinux.com) | [jatinkrmalik/vocalinux](https://github.com/jatinkrmalik/vocalinux) | โ
Beta v0.10.0 |
| ๐ macOS | **VocaMac** | [vocamac.com](https://vocamac.com) | [jatinkrmalik/vocamac](https://github.com/jatinkrmalik/vocamac) | ๐ Beta |
| ๐ช Windows | **VocaWin** | [vocawin.com](https://vocawin.com) | [jatinkrmalik/vocawin](https://github.com/jatinkrmalik/vocawin) | ๐ Planned |
diff --git a/SECURITY.md b/SECURITY.md
index a46b573..dc13d35 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -4,10 +4,10 @@
| Version | Supported |
| ------- | ------------------ |
-| 0.9.x | :white_check_mark: |
+| 0.10.x | :white_check_mark: |
+| 0.9.x | :x: |
| 0.8.x | :x: |
-| 0.7.x | :x: |
-| < 0.7 | :x: |
+| < 0.8 | :x: |
## Reporting a Vulnerability
diff --git a/docs/RELEASE_PROCESS.md b/docs/RELEASE_PROCESS.md
index afa7656..ffcb4ed 100644
--- a/docs/RELEASE_PROCESS.md
+++ b/docs/RELEASE_PROCESS.md
@@ -328,6 +328,7 @@ git push origin v0.5.1-beta
| 0.7.0-beta | 2026 | Beta | Autostart, tabbed settings, Intel GPU support, single instance |
| 0.8.0-beta | 2026-03-01 | Beta | Push-to-talk mode, optional voice commands, input/audio compatibility fixes |
| 0.9.0-beta | 2026-03-14 | Beta | Left/right modifier keys, sound effects toggle, Wayland clipboard fallback, leading-space fix |
+| 0.10.0-beta | 2026-03-25 | Beta | Keyboard/audio reliability hardening, IBus/tray stability fixes, CI + test coverage improvements |
## Questions?
diff --git a/docs/UPDATE.md b/docs/UPDATE.md
index bf01ceb..f5855c4 100644
--- a/docs/UPDATE.md
+++ b/docs/UPDATE.md
@@ -2,6 +2,42 @@
This guide explains how to update Vocalinux to the latest version.
+## What's New in v0.10.0-beta
+
+### ๐ Highlights
+
+| Feature | Description |
+|---------|-------------|
+| **โจ๏ธ Keyboard Robustness** | Better modifier alias handling across layouts and evdev `SYN_DROPPED` recovery |
+| **๐๏ธ Audio Compatibility** | Audio channel probing now validates sample-rate support per device |
+| **๐ฅ๏ธ IBus + Tray Stability** | IBus activation is more reliable and tray icon refresh is more consistent |
+| **๐งช Testing & CI Upgrades** | Coverage increased to 80%+, with modernized Node 24 CI workflows |
+
+### โจ New Features
+
+- **IBus registration improvements** โ Text injection activation now uses `register_component`
+- **Expanded IBus test coverage** โ Added launch-mode and main-entrypoint test paths
+- **Python baseline update** โ Minimum supported Python version is now 3.9+
+
+### ๐ Bug Fixes
+
+- **#342**: Generalize pynput modifier alias matching across layouts
+- **#341**: Probe audio channels using device-supported sample rates
+- **#339**: Handle evdev `SYN_DROPPED` to prevent stale modifier state
+- **#333**: Force window decorations in settings dialog
+- **#330**: Use icon names for AppIndicator tray updates
+- **#304**: Use `register_component` for IBus engine activation
+
+### ๐ง Improvements
+
+- Installer fallback now resolves latest tag through GitHub API and better handles piped shell execution
+- CI now uses Node.js 24 for website deployment and path-based filtering to skip unnecessary workflows
+- Removed stale `setup.py` and legacy `build-website.sh`
+
+See the [full changelog](https://github.com/jatinkrmalik/vocalinux/releases/tag/v0.10.0-beta).
+
+---
+
## What's New in v0.9.0-beta
### ๐ Highlights
@@ -93,7 +129,7 @@ The installer will:
```bash
cd vocalinux
git fetch origin
-git checkout v0.9.0-beta
+git checkout v0.10.0-beta
./install.sh
```
diff --git a/install.sh b/install.sh
index 27ca0dd..dbada3d 100755
--- a/install.sh
+++ b/install.sh
@@ -235,7 +235,7 @@ resolve_install_tag() {
return
fi
fi
- INSTALL_TAG="v0.9.0-beta"
+ INSTALL_TAG="v0.10.0-beta"
}
resolve_install_tag
diff --git a/scripts/check-system-deps.sh b/scripts/check-system-deps.sh
index 47d66df..705f36d 100755
--- a/scripts/check-system-deps.sh
+++ b/scripts/check-system-deps.sh
@@ -9,14 +9,14 @@ check_deps() {
echo "Checking Vocalinux system dependencies..."
echo ""
- # Check for Python 3.8+
+ # Check for Python 3.9+
if command -v python3 >/dev/null 2>&1; then
PY_VERSION=$(python3 -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")
echo "โ Python $PY_VERSION"
if [ "$(echo "$PY_VERSION" | cut -d. -f1)" -lt 3 ] || \
- [ "$(echo "$PY_VERSION" | cut -d. -f2)" -lt 8 ]; then
- echo " โ Python 3.8+ required, found $PY_VERSION"
+ [ "$(echo "$PY_VERSION" | cut -d. -f2)" -lt 9 ]; then
+ echo " โ Python 3.9+ required, found $PY_VERSION"
MISSING=1
fi
else
@@ -127,7 +127,7 @@ check_deps() {
echo " sudo zypper install -y python3-gobject python3-gobject-cairo gtk3 gobject-introspection-devel portaudio-devel python3-devel python3-virtualenv pkg-config xdotool wtype"
elif [[ "$DETECTED_DISTRO" == "gentoo" ]]; then
echo "Gentoo:"
- echo " sudo emerge dev-python/pygobject:3 x11-libs/gtk+:3 dev-libs/libappindicator:3 media-libs/portaudio dev-lang/python:3.8 xdotool wtype"
+ echo " sudo emerge dev-python/pygobject:3 x11-libs/gtk+:3 dev-libs/libappindicator:3 media-libs/portaudio dev-lang/python:3.9 xdotool wtype"
elif [[ "$DETECTED_DISTRO" == "alpine" ]]; then
echo "Alpine Linux:"
echo " sudo apk add py3-gobject3 py3-pip gtk+3.0 py3-cairo portaudio-dev py3-virtualenv pkgconf xdotool wtype"
diff --git a/scripts/distro-package-map.yaml b/scripts/distro-package-map.yaml
index 95280d8..d909b62 100644
--- a/scripts/distro-package-map.yaml
+++ b/scripts/distro-package-map.yaml
@@ -48,7 +48,7 @@ system_packages:
fedora: ["python3-devel", "python3-virtualenv"]
arch: ["python"] # Arch includes venv by default
opensuse: ["python3-devel", "python3-virtualenv"]
- gentoo: ["dev-lang/python:3.8"]
+ gentoo: ["dev-lang/python:3.9"]
alpine: ["py3-virtualenv"]
void: ["python3-devel"]
solus: ["python3-virtualenv"]
@@ -196,7 +196,7 @@ distribution_notes:
gentoo:
general: "Gentoo compiles packages from source. Installation will take longer."
- python: "Ensure Python 3.8+ is set as the active version"
+ python: "Ensure Python 3.9+ is set as the active version"
alpine:
general: "Alpine uses musl libc. Some Python packages may not have pre-built wheels."
diff --git a/src/vocalinux/version.py b/src/vocalinux/version.py
index 115acec..81a2f0d 100644
--- a/src/vocalinux/version.py
+++ b/src/vocalinux/version.py
@@ -2,8 +2,8 @@
Version information for Vocalinux.
"""
-__version__ = "0.9.0-beta"
-__version_info__ = (0, 9, 0, "beta")
+__version__ = "0.10.0-beta"
+__version_info__ = (0, 10, 0, "beta")
__author__ = "Jatin K Malik"
__email__ = "jatinkrmalik@gmail.com"
__license__ = "GPL-3.0"
diff --git a/web/package-lock.json b/web/package-lock.json
index 7cd7e20..3cc86b2 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "vocalinux-website",
- "version": "0.8.0",
+ "version": "0.10.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "vocalinux-website",
- "version": "0.8.0",
+ "version": "0.10.0",
"dependencies": {
"@types/node": "^20.14.10",
"@types/react": "^18.3.3",
diff --git a/web/package.json b/web/package.json
index 7b64dfa..484f7af 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "vocalinux-website",
- "version": "0.9.0",
+ "version": "0.10.0",
"private": true,
"type": "module",
"scripts": {
diff --git a/web/src/app/changelog/page.tsx b/web/src/app/changelog/page.tsx
index 30cfd96..564c00b 100644
--- a/web/src/app/changelog/page.tsx
+++ b/web/src/app/changelog/page.tsx
@@ -5,6 +5,21 @@ import { SeoSubpageShell } from "@/components/seo-subpage-shell";
import { absoluteUrl, buildPageMetadata } from "@/lib/seo";
const releases = [
+ {
+ version: "v0.10.0-beta",
+ date: "2026-03-25",
+ type: "beta",
+ highlights: [
+ "Generalized keyboard modifier alias matching across layouts for more reliable shortcuts",
+ "Audio channel probing now validates device-supported sample rates before selection",
+ "evdev now handles SYN_DROPPED to prevent stale modifier state",
+ "IBus engine activation now uses register_component for stronger text-injection startup",
+ "Settings dialog forces window decorations to prevent missing-titlebar behavior",
+ "Tray icon refresh now uses icon names for better AppIndicator compatibility",
+ "Coverage increased to 80%+ with additional IBus launch/main-entry tests",
+ "Installer and CI polish: latest-tag fallback via GitHub API, Node 24 deploy, and path-filtered workflows",
+ ],
+ },
{
version: "v0.9.0-beta",
date: "2026-03-14",
@@ -175,7 +190,7 @@ export default function ChangelogPage() {
headline: "Vocalinux Changelog - Release History",
description:
"Complete release history for Vocalinux, the offline voice dictation software for Linux.",
- dateModified: "2026-03-14",
+ dateModified: "2026-03-25",
author: {
"@type": "Person",
name: "Jatin K Malik",
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx
index 66f6b21..7eb8418 100644
--- a/web/src/app/page.tsx
+++ b/web/src/app/page.tsx
@@ -64,7 +64,7 @@ const homeJsonLd = [
},
description:
"Offline voice dictation and speech-to-text for Linux with whisper.cpp and VOSK.",
- "softwareVersion": "0.9.0-beta",
+ "softwareVersion": "0.10.0-beta",
author: {
"@type": "Person",
name: "Jatin K Malik",
@@ -290,7 +290,7 @@ export default function HomePage() {
/>
Vocalinux
- v0.9.0 Beta
+ v0.10.0 Beta