WHISRSD(1)
π WHISRSD β the whisrs dictation daemon, bestie edition
okay so you're looking at the whisrsd(1) page and honestly? this one's the main character. it's the background daemon for the whisrs dictation system, and by the end of this you're gonna know it like the back of your hand. periodt.
β¨ SYNOPSIS β¨
whisrsd [OPTIONS]
that's it. that's the whole vibe. well β the invocation vibe, anyway. keep reading π«Ά
πΈ DESCRIPTION πΈ
whisrsd is the background daemon for the whisrs dictation system. it's the one doing all the actual work behind the scenes: managing audio capture, transcription, window tracking, and text injection via a virtual keyboard. lowkey the backbone of the whole operation π
the daemon listens on a Unix domain socket for commands from the whisrs(1) CLI client. it runs as a long-lived process β either standalone, or as a systemd user service. no cap, it just sits there being reliable.
On startup, the daemon:
- Loads configuration from
~/.config/whisrs/config.toml - Checks
/dev/uinputaccess for virtual keyboard - Resolves the
[audio]device input and logs which device it will record from - Auto-detects the active window manager/compositor
- Initializes the selected transcription backend
- Binds the Unix domain socket and begins accepting commands
like a little checklist queen. she does all six every single time she wakes up π
π OPTIONS π
-h,--helpβ Print a short help message and exit. (short and sweet, we love a concise icon)-V,--versionβ Print version information and exit. (so you know exactly which era of whisrs you're in β¨)
π¦ STATE MACHINE π¦
the daemon maintains one of five states. five! she contains multitudes:
idleβ Waiting for a toggle command. No audio is being captured. just vibing, not recording, minding her business πrecordingβ Audio is being captured from the microphone. A second toggle or a cancel command transitions out of this state. (yes bestie, it's listening β say it with your chest π€)transcribingβ Audio has been sent to the transcription backend. The daemon is waiting for results. Text is typed at the cursor as it becomes available. (the way it types live as it goes?? iconic)synthesizingβ Read-aloud: generating speech from the selected text. π£οΈspeakingβ Read-aloud: playing synthesized speech; a second speak or a cancel stops it. (a second speak OR a cancel β both work, no gatekeeping)
π₯ TRANSCRIPTION BACKENDS π₯
pick your fighter:
groqβ Groq Whisper API. Free tier available. Audio is chunked at silence boundaries and sent as HTTP POST requests. Timestamp-based deduplication prevents repeated text. (the dedup is doing the lord's work, fr fr)openai-realtimeβ OpenAI Realtime API via WebSocket. Provides true streaming transcription with the lowest latency. Recommended for the best experience. π lowkey the crowned favoriteopenaiβ OpenAI REST API. Simple HTTP POST, non-streaming fallback. (the "if all else fails" bestie, and we respect her)asr-sidecarβ Generic local HTTP ASR sidecar. Sends WAV audio as multipart form data and expects a JSON response with atextfield.localβ Local transcription via whisper.cpp (requires thelocalfeature flag at compile time). Fully offline. π no internet required, she's self-sufficient
π§ SOCKET π§
the daemon creates a Unix domain socket at:
$XDG_RUNTIME_DIR/whisrs.sock
If XDG_RUNTIME_DIR is not set, it falls back to:
/tmp/whisrs-<uid>.sock
The protocol uses length-prefixed JSON messages (4-byte big-endian length header followed by a JSON body). so: length first, then the JSON body. in that order. always. don't get cute with it π
On startup, the daemon checks for and removes stale sockets from previous instances. If another daemon is already running, it exits with an error. (no duplicate daemons allowed β there can only be one main character π )
π SIGNALS π
SIGINTβ Graceful shutdown. The socket file is removed before exit. (she cleans up after herself, obviously β¨)SIGTERMβ Graceful shutdown (when run as a systemd service).
π ENVIRONMENT π
RUST_LOGβ Controls log verbosity. Examples:info,debug,whisrs=debug. Default isinfo.WHISRS_GROQ_API_KEYβ Groq API key. Overrides the config file value.WHISRS_OPENAI_API_KEYβ OpenAI API key. Overrides the config file value.XDG_RUNTIME_DIRβ Socket directory.XDG_CONFIG_HOMEβ Configuration directory.WAYLAND_DISPLAYβ Used to detect Wayland session for clipboard operations.HYPRLAND_INSTANCE_SIGNATUREβ Used to detect Hyprland compositor for window tracking.SWAYSOCKβ Used to detect Sway compositor for window tracking.XDG_SESSION_TYPEβ Used to detect X11 session for window tracking.
env vars: the original influencers of the config world. set them, and they override. iykyk π
π FILES π
~/.config/whisrs/config.tomlβ Configuration file.$XDG_RUNTIME_DIR/whisrs.sockβ IPC socket.~/.cache/whisrs/recovery/β Audio recovery files saved on transcription failure. (your safety net when the transcribe gods say no π)$XDG_DATA_HOME/whisrs/recordings/β Recordings and their transcripts, one folder per recording. Override with[recording]dirinconfig.toml.
β EXAMPLES β
Run the daemon in the foreground with debug logging:
RUST_LOG=debug whisrsd
Run the daemon in the background:
whisrsd &
Enable as a systemd user service:
systemctl --user enable --now whisrs.service
Enable as an OpenRC user service:
rc-update --user add whisrs default && rc-service --user whisrs start
(all four of these are literally copy-paste ready. go off π«Ά)
π¦ SEE ALSO π¦
whisrs(1)β the CLI client bestie herself π
π AUTHORS π
whisrs contributors
π LICENSE π
MIT
gentle reminder before you go: this is whisrs version 0.1.30, dated 2026-10-20 β so if your build says something else, you're on a different era and that's valid too πΈ
okay bye bestie, go dictate something iconic β¨ππ
π¦ where this page comes from
- nixpkgs unstable: whisrs 0.1.30
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms