Keep the dictation daemon config versioned with the rest of the setup.
The file carries no secrets (local backend), but if a cloud backend with
an API key is ever configured it must not be committed; whisrs accepts
WHISRS_GROQ_API_KEY-style env vars instead.
Manual re-application of the PKGBUILD edits is easy to forget after an
AUR update, which would silently bring back the five-second stock
build. The tracked rebuild script in ~/Projects/whisrs-local-build
does pull, patch, build, install and restart in one command.
wtype is not actually used by whisrs: injection happens through the
Wayland virtual-keyboard protocol with a uinput fallback, so listing
wtype as a dependency would send fresh installs down the wrong path.
pipewire-alsa on the other hand is essential and was missing: whisrs
captures through raw ALSA, and without the PipeWire bridge the default
PCM is the silent headset-jack mic.
Also document the hold-to-talk binding, the [audio] device setting, and
the local rebuild (-march=native plus the vulkan feature) that moved
decoding to the iGPU, since the stock AUR build is far too slow for
dictation.
Bind the Copilot key (SUPER+SHIFT+F23) to whisrs on press and release,
so holding it records and letting go transcribes. Injection uses wtype,
which works natively on Hyprland and reaches any focused window,
including TUIs running in the dockerized agent containers.
Decoding runs on the iGPU through the Vulkan feature of a locally
rebuilt whisrs-git: the stock AUR build is CPU-only and compiled with
generic -march, which made dictation take around five seconds. Requires
whisrs-git (AUR), wtype and pipewire-alsa; documented in the README
along with the config and model locations.
Logging in via a bare Hyprland session never activates
graphical-session.target, so the systemd xdg-desktop-portal units can't
start. The old script worked around this by killing and relaunching the
portals manually, but that delayed the portal past waybar/chromium
startup, so they intermittently came up in light mode.
Switch to the "Hyprland (uwsm-managed)" session: uwsm activates
graphical-session.target and systemd starts the portals in the right
order. The startup script now detects that target and bows out, falling
back to the manual launch only on a bare session (e.g. another machine
without uwsm). Document uwsm in the README.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mutes audio at 21:00 and unmutes at 07:00, but only when the
idle-inhibit toggle is active (PID file exists). This is useful
for leaving the computer running overnight for SSH access while
keeping it quiet for sleeping.
Also to start it, for some reason it needs to be killed and
there needs to be a sleep, etc. to avoid some race conditions.
Therefor I added this weird shell script to start it.