Local voice dictation for macOS — hold a key, speak, release, text appears.
Why Sabbel • Install • How It Works • Configuration • Custom Dictionary • Development
Speaking is 3-4x faster than typing. Sabbel turns your voice into text anywhere on your Mac — powered by Whisper on Apple Silicon, fully offline.
|
|
Compared to paid alternatives:
| Sabbel | Wispr Flow | Superwhisper | |
|---|---|---|---|
| Price | Free | $15/month | $8/month |
| Processing | Local (Apple Silicon GPU) | Cloud | Local |
| Open Source | Yes | No | No |
| Custom Dictionary | Yes | Yes | Yes |
| Privacy | Audio never leaves your Mac | Audio sent to cloud | Local option |
curl -fsSL https://raw.githubusercontent.com/kenodressel/sabbel/main/install.sh | shInstall without autostart:
curl -fsSL https://raw.githubusercontent.com/kenodressel/sabbel/main/install.sh | sh -s -- --no-autostartNo dependencies, no Python, no package manager. The script downloads Sabbel.app and puts it in ~/Applications.
On first launch:
- macOS asks for Accessibility and Microphone permissions
- The Whisper model (~1.5GB) downloads automatically in the background
| Action | What happens |
|---|---|
| Hold Right Option (⌥) | Recording starts |
| Release Right Option (⌥) | Speech is transcribed and pasted into the focused app |
The menu bar icon shows the current state:
| Icon | State |
|---|---|
| 🎙 | Idle — ready to record |
| 🔴 | Recording |
| ◐ | Processing / transcribing |
| Error (auto-clears after 2s) |
Click the menu bar icon to cycle the language: Auto → Deutsch → English
Create ~/.config/sabbel/config.toml to override defaults:
[general]
language = "de" # "de", "en", or omit for auto-detect
hotkey = "alt_r" # Right Option key. Other options: f5, ctrl_r, cmd_r, ...
[model]
repo = "mlx-community/whisper-large-v3-turbo"
[audio]
min_duration_seconds = 0.5
[history]
enabled = false # Seed value. The menu toggle is the primary control
# and overrides this once flipped.
max_bytes = 1000000 # Rotate log to .1 once it grows beyond this.Toggle from the menu bar: open the Sabbel menu → History → Save history. The checkmark persists across restarts (stored in ~/.config/sabbel/preferences.json), so you don't need to edit TOML. Use History → Open log and History → Clear log to view or wipe it.
⚠️ Privacy note: History is off by default because transcriptions can include anything you dictate — including passwords, private notes, or confidential work data. Enable it only if you're comfortable with that trade-off. The log stays on your machine; nothing is uploaded.
Click the Sabbel menu → Microphone to pick which input device Sabbel records from. The list refreshes every time you open the menu, so plugging in a USB mic or docking station is reflected immediately. The choice persists across restarts.
If the saved device is offline (e.g., dock unplugged), Sabbel falls back to the system default and shows a notification on the next recording. When the device comes back, it's used again automatically — no need to re-pick.
Edit ~/.config/sabbel/dictionary.toml to improve recognition for domain-specific terms:
[initial_prompt]
# Bias Whisper toward your vocabulary. Write natural sentences.
text = "Im Sprint-Planning haben wir die OKRs und KPIs reviewed."
[replacements]
# Post-transcription find-and-replace (case-insensitive).
"kay pee eye" = "KPI"
"oh kay are" = "OKR"Changes are picked up on the next dictation — no restart needed.
If you build from source, you can set up Sabbel as a login item:
make autostart # Start now + on every login
make stop # Stop
make restart # Restart
make reinstall-app # Reinstall app bundle after packaging changes
make autostart-remove # Disable
make status # Check if runningFor normal Python code changes, prefer make restart. Reinstalling the app bundle can cause macOS to treat it like a fresh app for Accessibility and Microphone permissions, so make reinstall-app should only be used after bundle or packaging changes.
- macOS 14+ (Sonoma)
- Apple Silicon (M1 or later)
git clone https://github.com/kenodressel/sabbel
cd sabbel
uv run sabbel # Run from source
uv run pytest # Run tests
make build-app # Build standalone .app with py2app
make install-app # Build + install + reset permissions
make restart # Reload the already installed app during normal dev
make reset-permissions # Reset Accessibility + Microphone permissions manuallyNote: make install-app automatically resets TCC permissions because each build has a new ad-hoc signature. macOS will prompt for Accessibility and Microphone permissions again on launch.
Contributors are very welcome.
Check the open issues for things to work on. If you pick something up, mention it in the issue so work doesn't overlap.
Sabbel is a Python menu bar app built with rumps. Speech recognition runs locally via mlx-whisper on Apple Silicon GPU. The app is packaged as a self-contained .app bundle using py2app — Python runtime and all dependencies are embedded, so end users don't need Python installed.
Releases are built automatically on GitHub Actions (Apple Silicon runner) and published as GitHub Releases.
tail -f /tmp/sabbel-runtime.logMIT