MCPcopy Index your code
hub / github.com/AshBuk/dabri

github.com/AshBuk/dabri @v2.2.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v2.2.0 ↗ · + Follow
1,223 symbols 4,973 edges 139 files 794 documented · 65%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Dabri

🗣️ Linux speech-to-text, the Unix way

Go Reference Go Report Card Go Version

CI Release AppImage AUR COPR

Dabri is a minimalist, privacy-first application for offline voice recognition directly into any active window (editors, browsers, IDEs, AI assistants).

Written in pure Go, it leverages whisper.cpp for fast, offline transcription. The architecture is built from the ground up with a minimal set of dependencies, featuring a custom dependency injection factory, ensuring lean and maintainable design.

https://github.com/user-attachments/assets/b798f350-c6a8-4408-83eb-51eef392a731

Features

Privacy Security gosec

aemon: Dabri runs quietly in the background and integrates into the system tray for convenient management.

Terminal: it can also be invoked as a CLI tool (see CLI Usage Guide) for scripting purposes.

▸ For integration enthusiasts, a WebSocket server is available at localhost:8080. Enable it in your config with web_server enabled: true (disabled by default).

  • Offline speech-to-text, privacy-first: all processing happens locally
  • Portable: AppImage package
  • Cross-platform support for X11 and Wayland
  • Linux DEs: native integration with GNOME, KDE, and others
  • GPU + CPU support: Vulkan backend for faster transcription (auto-fallback to CPU)
  • Voice typing or clipboard mode
  • Flexible audio recording: arecord (ALSA) or ffmpeg (PulseAudio/PipeWire), see audio pipeline
  • Multi-language support, custom hotkey binding, visual notifications
  • Model management: switch between base, small, medium, large-v3-turbo, and large-v3 whisper models via tray or CLI

Beyond Minimalism

Intuitive minimalist UX, robust STT infrastructure. A foundation for voice-controlled automation:

  • Dual API: Unix socket IPC + WebSocket — script locally or integrate remotely
  • Interface-driven: focused contracts — swap STT engines, add I/O methods, extend hotkey providers
  • Daemon + CLI: background hub + stateless commands — perfect for IoT pipelines
  • Graceful degradation: provider fallbacks, optional components, no crashes
# Voice command → smart home action
transcript=$(dabri --json stop | jq -r '.data.transcript')
[[ "$transcript" == *"lights off"* ]] && curl -X POST http://hub/lights/off

✦ Installation

AppImage

Download the latest AppImage from Releases:

# Download the file, then:
chmod +x dabri-*.AppImage
./dabri-*.AppImage

Arch Linux AUR:

yay -S dabri

Fedora COPR:

sudo dnf copr enable ashbuk/dabri
sudo dnf install dabri

Desktop Environment Compatibility

OS Display

📋 Desktop Environment Support Guide - help us test different desktop environments!

For system tray integration on GNOME — install the AppIndicator extension

KDE and other DEs have built-in system tray support out of the box

Automatic typing and clipboard modes both work out of the box — details & options

For issues and bug reports: GitHub Issues

See changes: Releases

System Requirements

Category Requirement
OS Linux with glibc 2.35+
Desktop X11 or Wayland
Audio Microphone capability
Storage ~54MB + model (57MB–1.1GB)
Memory ~300MB RAM
CPU AVX-capable (Intel/AMD 2011+)

📋 Supported Distributions

Family Distributions
Ubuntu-based Ubuntu 22.04+, Linux Mint 21+, Pop!_OS 22.04+, Elementary OS 7+, Zorin OS 17+
Debian-based Debian 12+
Fedora Fedora 36+
Rolling release Arch Linux, Manjaro, EndeavourOS, openSUSE Tumbleweed

For Developers

Start onboarding with:

✦ Acknowledgments

  • whisper.cpp for the excellent C++ implementation of OpenAI Whisper
  • fyne.io/systray for cross-platform system tray support
  • ydotool and wtype for Wayland-compatible input automation
  • OpenAI for the original Whisper model

✦ MIT LICENSE

If you use this project, please link back to this repo and ⭐ it if it helped you. - Consider contributing back improvements


Sharing with the community for privacy-conscious Linux users


Sponsor

Sponsor PayPal

Please consider supporting development

Extension points exported contracts — how you extend this code

Outputter (Interface)
Defines the contract for text output operations [5 implementers]
output/interfaces/outputter.go
KeyboardEventProvider (Interface)
KeyboardEventProvider defines the contract for a keyboard event source [4 implementers]
hotkeys/interfaces/provider.go
Logger (Interface)
Logger defines the contract for structured logging across the application All logging must go through this interface to [2 …
internal/logger/logger.go
AudioServiceInterface (Interface)
AudioServiceInterface defines the contract for audio-related operations [2 implementers]
internal/services/interfaces.go
AudioController (Interface)
AudioController exposes recording actions to WebSocket handlers. [2 implementers]
websocket/server.go
HotkeyManager (Interface)
HotkeyManager defines the interface that MockHotkeyManager implements [2 implementers]
tests/mocks/hotkey_manager.go
AudioRecorder (Interface)
Defines the contract for an audio recorder [1 implementers]
audio/interfaces/recorder.go
ModelManager (Interface)
Defines the contract for managing the lifecycle of Whisper models [1 implementers]
whisper/interfaces/model_manager.go

Core symbols most depended-on inside this repo

Error
called by 359
internal/logger/logger.go
Info
called by 147
internal/logger/logger.go
Run
called by 136
internal/ui/window/window.go
NewMockLogger
called by 109
internal/testutils/mock_logger.go
Unlock
called by 107
internal/utils/lockfile.go
Warning
called by 54
internal/logger/logger.go
Close
called by 54
whisper/interfaces/model_manager.go
NewTempFileManager
called by 41
audio/processing/tempfile_manager.go

Shape

Method 639
Function 482
Struct 76
Interface 19
FuncType 4
TypeAlias 3

Languages

Go100%

Modules by API surface

tests/mocks/services.go59 symbols
internal/services/interfaces.go52 symbols
hotkeys/mocks/mock_provider.go30 symbols
internal/services/audio_service.go27 symbols
output/outputters/mock_outputter.go26 symbols
audio/recorders/base_recorder.go24 symbols
tests/mocks/hotkey_manager.go22 symbols
websocket/server_test.go21 symbols
internal/ui/tray/settings_menu.go21 symbols
internal/services/factory_wirer.go20 symbols
audio/mocks/mock_recorder.go20 symbols
internal/services/io_service.go19 symbols

For agents

$ claude mcp add dabri \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact