Dabri: Linux Speech-to-Text, the Unix Way
Backstory:
A year ago I built a speech-to-text assistant for myself, because on Linux this has always been a pain and there still was not really anything solid. And a system-wide “keyboard” for inserting voice into any window is a superpower, a productivity boost, and a daily necessity.
Today there are already many new STT projects, but Dabri still feels irreplaceable, because:
- Most voice-to-text tools are either cloud-first (↓no privacy), browser-first (not a native part of the desktop), or app-first (↑heavy, ↓poor automation).
- There are a lot of Python scripts in the field, which are good for glue and prototypes, but become fragile once they grow into a long-running service with packaging, hotkeys, audio, IPC, and native distribution.
Dabri’s answer: one small Go binary, a quiet user-space daemon, CLI commands, Unix socket IPC, and optional WebSocket for pipelines.
It is packaged as a cross-distro AppImage and also as native packages for Fedora (COPR) and Arch Linux (AUR).
Linux has great building blocks: shell, window managers, pipes, hotkeys, system services, clipboard tools. Voice input should feel like one more native building block, not like a separate product living outside the desktop.
A good STT tool should be quiet, invokable, scriptable, and easy to automate.
The simplest automation example:
Add this to ~/.config/autostart (XDG autostart) if you are on a DE like GNOME / KDE / XFCE:
[Desktop Entry]
Name=Dabri
Exec=dabri
Icon=io.github.ashbuk.dabri
Type=Application
Terminal=false
X-GNOME-Autostart-enabled=true
Or add this line to your Hyprland config:
exec-once = dabri
and Dabri will be available as soon as your computer starts.
Advanced automations
Save voice notes to a file:
dabri start
# speak...
dabri stop >> ~/voice-notes.md
Pipe transcript into any tool — translate, summarize, look something up:
text=$(dabri stop)
echo "$text" | wl-copy # copy to Wayland clipboard
# or: echo "$text" | xclip -sel clip # X11
Voice-controlled smart home — trigger Home Assistant actions by speaking:
transcript=$(dabri --json stop | jq -r '.data.transcript')
[[ "$transcript" == *"lights off"* ]] && curl -X POST http://homeassistant.local/api/lights/off
The WebSocket server opens localhost:8080 for remote integrations — useful for IoT pipelines and home automation hubs that prefer HTTP/WS over Unix sockets. Enable it in config:
web_server:
enabled: true
port: 8080
host: localhost
Binding a button for recording and choosing a model, like other settings, is available through the tray or CLI. The Whisper.cpp Large V3 Turbo model is basically state of the art right now. It works beautifully with multi-language input and is very accurate and fast on newer laptops.
Why the rename?
I rebranded my project from Speak-to-AI to Dabri… because with the AI boom, SEO became a real pain, the project was simply getting lost in search. A descriptive, domain-like name may look useful, but it mostly works only while the project is needed just by you. Warm references in blogs, mentions in online Linux magazines, and the first 100 ⭐ stars on GitHub pushed me to rename it - hopefully, the ship catches a new wind :)
Thanks for the attention, Asher