Releases: goodroot/hyprwhspr
Release list
v1.35.0
v1.35.0
Headline feature: first-class Noctalia support. Also includes native VAD for the pywhispercpp backend, a more robust wheel pipeline, and a handful of correctness fixes.
Added
- Noctalia (v5+) integration. (or
hyprwhspr setup, which now
Headline feature: first-class Nocnative VAD for the pywhispercppbackend, a more robust wheel pipeline, and a handful of correctness fixes.
Added
- Noctalia (v5+) integration.
hyprwhspr noctalia install(orhyprwhspr setup, which now offers it automatically when Noctalia is detected) sets up:- A bar widget (
noctwhspr) that mirrors the Waybar module's service/recording state as a glyph — left-click records, right-click restarts. - Automatic mic-OSD theme sync: the recording overlay renders in your live Noctalia palette via an app-theming template, and follows theme switches live.
hyprwhspr noctalia status/removeround out the command, and reinstalling migrates any earlier plugin/template names automatically.
- A bar widget (
- Opt-in native VAD for the pywhispercpp backend (
pywhispercpp_use_vad, default off). Bumpspywhispercppto 1.5.0 (whisper.cpp 1.8.4), which exposes whisper.cpp's native Silero VAD. The VAD model auto-downloads on first use; a stale pre-1.5.0 install falls back gracefully with upgrade guidance instead of erroring.
Fixed
- Audio ducking no longer moves your speaker volume. Ducking now lowers each playing application's stream volume (PulseAudio/PipeWire sink inputs) instead of the output device's master volume — so desktop-shell volume OSDs (Noctalia, swayosd, GNOME) don't fire on every recording, and your speaker setting is never touched. Restoration is now identity-checked per stream to avoid mis-restoring an unrelated app if a sink-input index gets reused mid-recording.
- Model lookup now respects a cservice, not just theinstaller/CLI — previously a non- the CLI could download a modelthe running service then couldn't find.
- Model download hash validation is now keyed per model file instead of one shared key, so validation actually checks the model you just downloaded rather than whatever was downloaded last. The minimum valid-download 100MB to 20MB so
model downloadtiny(~31MB quantized) stops re-downloading itself every time.
Changed
- Wheel publishing is now automatic. CI derives the pinned
pywhispercppcommit straight from the installer (no more hand-maintained SHA fallbacks to forget) and only builds when the pinned version's wheels are actually missing fromwheels-v2— closing the drift that caused two silent CUDA source-build outages this cycle. - Tests now fail loudly on real network access. A guard on
tests/catches any mispatched mock that would otherwise reach out to HuggingFace mid-test-run, across both direct-network and proxied environments.
Full Changelog: https://githuare/v1.34.2...v1.35.0
v1.34.2
v1.34.2
Bug-fix release hardening the Waybar tray and the mic-OSD overlay.
Fixed
-
Tray no longer flashes a false
ERRunder load. The Waybar module polls
every 2s and re-derived system health via timeout-guarded probes, so a single
slow tick — common while transcribing — could be misread as a mic/service
fault. Three changes close this:- The probe helper now uses a non-login shell (a login shell re-sourced
/etc/profile+~/.bash_profileon every call, adding ~100–250ms) and a
wider timeout, so load jitter can't expire an otherwise-fast probe. - Backend availability checks (
onnx-asr,faster-whisper) use
importlib.util.find_specinstead of a full import (~18ms vs ~250–490ms
under load). - Error states are now debounced: a fault must persist across consecutive
polls before the tray showsERR. Recovery and click-action feedback stay
immediate. - Thanks to @Sandruin for the detailed report and measurements.
- The probe helper now uses a non-login shell (a login shell re-sourced
-
Mic-OSD overlay now works on Debian/Ubuntu. The
gtk4-layer-shell
LD_PRELOADsearch missed Debian's multiarch library path
(/usr/lib/x86_64-linux-gnu/, etc.), so the overlay silently fell back to
notifications even when layer-shell was installed and supported. The search
now matches any multiarch triplet. Verified on Linux Mint 22 / KWin.
Thanks to @mitchell-wallace (#199, follow-up to #145 .
pywhispercpp wheels (v2 pipeline)
Rolling storage for prebuilt CUDA wheels, consumed by the installer (WHEEL_BASE_URL).
v1.34.1
1.34.1
What's Changed
-
Reworked the pywhispercpp wheel pipeline for
pywhispercpp1.4.1.- CUDA wheels now use the new
wheels-v2release path. - CUDA 12 installs use a single
cuda12wheel variant. - CPU installs now rely on PyPI's manylinux CPU wheels instead of self-hosted CPU wheels.
- CI now verifies that produced wheel filenames match what the installer will request.
- CUDA wheels now use the new
-
Improved default local Whisper performance.
threadsnow defaults tomin(8, CPU count)instead of a fixed4.- Added a default word override for
hyper whisper->hyprwhspr.
Full Changelog: v1.34.0...v1.34.1
v1.34.0
1.34.0
Highlights
- Added an opt-in GNOME Shell waveform OSD extension for GNOME/Mutter users - thanks @ninyawee!
- Added per-application paste rules, including custom paste chords and app-level injection disable.
{
"applications": {
"emacs": { "auto_paste": "ctrl+y" }, // custom paste chord
"some-app": { "auto_paste": false } // disable: nothing pasted, clipboard untouched
}
}Find your active window class easily with:
sleep 3; hyprwhspr config focused-window # then click into the app you want- Improved paste injection reliability across GNOME, non-QWERTY layouts, custom chords, and misconfigured paste settings.
- Fixed native audio sample-rate handling for capture and realtime streaming backends.
- Refreshed README, configuration docs, and homepage copy for current features.
Fixed
- Capture streams now use the resolved input device’s native sample rate instead of assuming 16 kHz.
- Realtime clients now track the actual capture input rate and resample to provider-required rates when needed.
- Local transcription paths that require 16 kHz audio now resample from the native capture rate.
- ONNX-ASR receives the actual sample rate for recognition.
- Paste injection now skips expensive focused-window lookup when explicit paste settings make the result unused.
- Invalid or unusable configured paste chords now warn clearly instead of failing silently.
- App-specific disabled injection now leaves the target app untouched and avoids writing dictated text to the clipboard.
- GNOME AT-SPI window detection is isolated in a child process and negative-cached when unavailable.
- GNOME accessibility setup now reports when the gsettings change cannot be applied automatically.
PRs
Full Changelog: v1.33.0...v1.34.0
v1.33.0
v1.33.0
Added
- Added
keyboard_hotplug, enabled by default, so keyboards connected after startup can be attached automatically without restarting the service. - Added support for using PulseAudio/PipeWire source names from
pactl list short sourcesinaudio_device_idandaudio_device_name.
Fixed
- Fixed audio device selection when configs use PulseAudio/PipeWire source names instead of PortAudio device indexes.
- Fixed paste injection on GNOME with non-Latin keyboard layouts such as Thai, Russian, Arabic, Greek, and Hebrew by temporarily switching to a Latin input source for the paste chord.
- Fixed keyboard hotplug behavior so docked, Bluetooth, and USB keyboards can work without explicitly listing every device name.
- Fixed installs where optional visualizer GUI dependencies failed to build, especially PyGObject on Ubuntu 24.04. Core runtime dependencies now install independently of the visualizer.
- Fixed website dependency vulnerabilities.
Changed
keyboard_device_namesis now an optional allowlist only. Leaving it unset keeps the default behavior of attaching any valid keyboard, including hotplugged keyboards.- Visualizer-only Python dependencies moved into
requirements-visualizer.txtand are installed best-effort.
Pull requests
- support keyboard hotplug without listing device names by @zeldovich in #194
- fix(install): optional visualizer deps shouldn't abort core install (PyGObject build failure on Ubuntu 24.04) by @ninyawee in #192
- fix(paste): restore paste on non-Latin keyboard layouts (Thai, Russian, …) on GNOME by @ninyawee in #191
New Contributors
- @zeldovich made their first contribution in #194
Full Changelog: v1.32.1...v1.33.0
v1.32.1
v1.32.1
Some small but crucial maintenance fixes improve startup in more conditions and prevent conditions for races to occur.
Fixed
- Recover
WAYLAND_DISPLAYat startup when systemd did not import it, by falling back to the newestwayland-*socket inXDG_RUNTIME_DIR. - Reattach global shortcut keyboard devices after suspend/resume, including a delayed second resync pass for devices that reappear late.
- Clear stale held-key shortcut state during keyboard resync so combinations do not remain wedged after resume.
- Refresh audio capture when the PulseAudio default source changes even if it maps to the same PortAudio device.
- Fall back cleanly to the PortAudio default input when the current PulseAudio default source has no concrete PortAudio match, avoiding stale microphone bindings.
- Improve default microphone recovery around stream-open retries and default input changes.
Documentation
- Documented the startup
WAYLAND_DISPLAYfallback and kept compositor environment export as the recommended systemd-wide fix.
v1.32.0
v 1.32.0
Thanks to @calebdw for the reports that led to a series of solid improvements.
Highlights
- Improved microphone handling when using the system default input device.
- Fixed ONNX-ASR VAD routing so short dictations avoid unnecessary VAD trimming.
- Added a configurable ONNX-ASR VAD duration threshold.
Configuration
New setting:
{
"onnx_asr_vad_min_duration": 30
}This is the minimum recording duration, in seconds, before ONNX-ASR routes audio through Silero VAD. Set it lower to use VAD more often, or higher to keep more recordings on direct recognition.
Audio Device Management
- hyprwhspr now re-checks the current PulseAudio/PipeWire default microphone right before opening a recording stream when no explicit audio device is configured.
- Changing the system default microphone no longer requires restarting hyprwhspr for the next recording to use the new input.
- Stream startup retries now refresh the default input once before retrying, helping recover from transient PulseAudio/PipeWire host errors after a device change.
- The keepalive stream now moves to the refreshed default microphone when the default input changes.
- Explicitly configured audio devices remain sticky. If
audio_device_idoraudio_device_nameis configured, hyprwhspr does not silently convert the setup into "follow system default" mode after a fallback. - Device validation now rejects output-only devices when resolving defaults.
- Sounddevice default input updates now preserve the output device instead of overwriting the whole default device tuple.
Hotplug Handling
- Audio hotplug events are now queued and dispatched serially through a worker thread.
- This keeps callback ordering predictable during noisy USB plug/unplug sequences.
- Device monitor startup failure now cleans up observer and worker state more completely.
- Device monitor shutdown now stops the dispatch worker cleanly.
ONNX-ASR / Parakeet
- ONNX-ASR now keeps the direct model and VAD-wrapped model separate.
- Short recordings use direct recognition by default, avoiding aggressive speech-boundary trimming on normal dictation.
- Long recordings still use Silero VAD when
onnx_asr_use_vadis enabled. - Added
onnx_asr_vad_min_duration, defaulting to30seconds, to control when ONNX-ASR switches from direct recognition to VAD-assisted recognition. - Invalid VAD duration values fall back to
30seconds, and negative values clamp to0. - Model unload now clears the cached ONNX-ASR VAD model as well as the direct model.
v1.31.0
1.31.0
Thanks to community member @sqonde for a PR which greatly improves base GNOME/Mutter support. Cheers!
Also many other fixes and QoL improvements.
Added
- Added legacy setup default handling so pywhispercpp maps to Whisper CPU instead of Parakeet.
- Added Mutter detection for GNOME/Mutter Wayland injection behavior.
- Added short TTL caching for active keyboard layout detection.
- Added GNOME input-source parsing for active mru-sources, including non-XKB IME detection.
- Added notification ID fallback via direct gdbus org.freedesktop.Notifications.Notify when notify-send -p is unavailable.
- Added the same notification fallback behavior to the Hyprland tray script.
- Added setup/runtime diagnostics for:
- Keyboard allowlist entries that match no visible devices.
- Layer-shell fallback on wlroots-like sessions.
- GNOME direct typing vs. clipboard-manager behavior.
- Retired ydotool.service migration.
- Added Hyprland config reload after setup writes compositor bindings.
- Added setup summary clarity when Mic-OSD is enabled but dependencies are still missing.
Fixed
- Fixed NotificationPresenter(active_timeout_ms=0) being ignored.
- Fixed clipboard restore fallback delay to use 5.0s, matching config defaults.
- Fixed notification presenter imports in the Mic-OSD daemon path.
- Fixed Mic-OSD startup failures leaving users with no recording indicator by falling back to desktop notifications.
- Fixed backend reinstall logic so missing installed_backend no longer forces reinstall when requirements and imports are valid.
- Fixed setup printing Configuration loaded from ... twice.
- Fixed Hyprland bindings setup to use the configured install root instead of hardcoded /usr/lib/hyprwhspr.
- Fixed local setup behavior so Hyprland OSD/binding changes take effect immediately after setup where possible.
New Contributors
Full Changelog: v1.30.1...v1.31.0
v1.30.1
v1.30.1
Fixed
-
Added
wl-clipboardas a required Arch/AUR dependency.- hyprwhspr relies on
wl-copy/wl-pastefor clipboard-based injection and clipboard restoration. - This fixes fresh Arch installs where dictation completed but paste injection failed until users manually installed
wl- clipboard.
- hyprwhspr relies on
-
wl-clipboard is now a required package within the AUR instead of optional
Thanks to #178 @sp3nx0r and #179 @madebymlai for the reports 🙏