On-device voice dictation for Linux — speak anywhere, paste anywhere.
Press a global hotkey, an animated overlay appears with a live voice visualizer, you talk, and your words are pasted straight into whatever app you're using. Speech recognition runs locally by default. Configuring remote whisper.cpp or Ollama endpoints sends audio or text to those services.
curl -fsSL https://mrelmida.dev/scrybe/install.sh | bashThe installer detects your GPU and only pulls what your hardware needs — it
skips the Intel/OpenVINO stack on NVIDIA or AMD machines, for example. It builds
Scrybe and sets it up as a desktop app with a global hotkey and login autostart.
Then launch Scrybe from your app menu (it lives in the system tray) and press
Meta+Alt+D to dictate.
The online installer requires Git. It prefers the newest stable version tag
when available, otherwise main, and resolves the fetched revision to one
commit before building in a separate checkout. Set SCRYBE_REF to a tag or
commit, or SCRYBE_BRANCH=main to explicitly follow development. Existing dirty
or unrelated SCRYBE_SRC paths are refused; clean previous sources are retained
beside the checkout instead of deleted.
Executable, clipboard helper, and Python sidecar are published together under
~/.local/share/scrybe/runtime (SCRYBE_PREFIX/share/scrybe/runtime for a custom
prefix). A failed fetch/build keeps the current app active. Run
~/.local/bin/scrybe-rollback and restart Scrybe to restore the previous bundle.
Older bundles and source backups remain available until you remove them.
Rollback covers app files; system packages, shared Python environments, models,
and configuration are not reverted.
Supported distributions: Fedora, Arch, Debian/Ubuntu, openSUSE (KDE Plasma 6 / Wayland). Works on Intel, NVIDIA, AMD, or CPU-only machines.
- 🎙️ Push-to-talk dictation with a global hotkey (default
Meta+Alt+D). - 🏝️ Animated overlay — a translucent "island" with a live, audio-reactive voice visualizer, anchored to the top or bottom of the screen.
- 📝 Live transcription as you speak (optional).
- ⌨️ Enter to send · Esc to cancel.
- 📋 Clipboard paste into the focused app — no simulated keystrokes; your clipboard is restored afterward.
- 🧠 Optional LLM formatting (local, via Ollama) — clean-up, Markdown structuring, summarizing/shortening, or your own custom style presets.
- ⚙️ Settings window to pick the backend, model, language, and formatting style, and to create custom presets.
- 🔌 Runs on any hardware — Intel, NVIDIA, AMD/Vulkan GPUs, or CPU. The installer only builds the backend your machine needs, and you can add others later from Settings ▸ Hardware.
- ⬆️ Automatic updates — checks GitHub on launch and updates in place.
- 💤 Lightweight — the model loads on demand and unloads when idle.
- 🐧 Native C++/Qt 6 (QML) for KDE Plasma 6 / Wayland.
Scrybe has pluggable speech-to-text backends and picks the best one for your
machine automatically (stt/backend=auto):
| Backend | Best for | Engine | Installed by default on |
|---|---|---|---|
openvino |
Intel iGPU / Arc / NPU + CPU | OpenVINO GenAI | Intel GPUs |
faster-whisper |
NVIDIA (CUDA) + CPU | CTranslate2 | NVIDIA / CPU-only |
whispercpp |
Vulkan / AMD / any GPU + CPU | whisper.cpp | on request |
auto resolves to faster-whisper on NVIDIA, OpenVINO on Intel, and
faster-whisper on CPU elsewhere. The OpenVINO backend is compiled in only
when an Intel GPU is present (or forced with SCRYBE_WITH_OPENVINO=1), so the
app builds and runs on any machine. Any backend can be forced in the config, and
missing backends can be installed on demand from Settings ▸ Hardware (or
scripts/install-backend.sh openvino|faster-whisper|whispercpp).
- Launch Scrybe (app menu) — it runs in the tray and autostarts on login.
- Press
Meta+Alt+D. The island appears and starts listening. - Speak. With live preview on, the text fills in as you talk.
- Press Enter to finalize and paste, or Esc to cancel.
Open Settings from the tray (or scrybe --settings) to choose the backend,
model, language, and formatting style, and to manage custom presets. Rebind the
hotkey in System Settings → Shortcuts → Scrybe.
Settings live in ~/.config/scrybe/scrybe.conf and most are exposed in the tray.
| Key | Values | Default | Meaning |
|---|---|---|---|
stt/backend |
auto·openvino·faster-whisper·whispercpp |
auto |
recognition engine |
stt/model |
tiny·base·small·medium·turbo·large-v3·distil |
small |
model size |
stt/device |
AUTO:GPU,CPU·GPU·CPU·NPU·cuda·cpu |
AUTO:GPU,CPU |
compute device |
stt/language |
auto or a code (en, de, tr, …) |
auto |
dictation language |
stt/vad |
true·false |
true |
skip recordings without detected voice activity |
stt/autoSendSecs |
seconds; 0 disables |
0 |
finalize after detected speech followed by silence |
audio/device |
base64 device ID; empty for default | empty | microphone selected in Settings ▸ Microphone |
audio/gain |
1–25 |
9 |
meter/overlay display scale; does not change captured audio or VAD |
ui/preview |
true·false |
true |
live transcription preview |
island/position |
top·bottom |
top |
overlay anchor |
paste/restoreClipboard |
true·false |
true |
restore clipboard after paste |
paste/restoreDelayMs |
ms | 1000 |
grace period before restoring the clipboard |
paste/shortcut |
ctrl+v·ctrl+shift+v |
ctrl+v |
paste shortcut (ctrl+shift+v for terminals) |
llm/model |
Ollama model | qwen2.5:1.5b |
cleanup model |
llm/endpoint |
URL | http://localhost:11434 |
Ollama endpoint |
presetTemps/<name> |
0–1 |
0.3 |
custom formatting preset temperature |
whispercpp/endpoint |
URL | http://127.0.0.1:8080 |
whisper-server endpoint |
update/versionUrl |
URL | GitHub VERSION |
where to check for updates |
update/autoCheck |
true·false |
true |
check for updates on launch |
kwriteconfig6 --file ~/.config/scrybe/scrybe.conf --group stt --key model turboSpeech models download on first use (pick one in the tray → Speech model), or:
scripts/download-model.sh turbo # tiny|base|small|medium|turbo|large-v3|distil| Key | Model | Notes |
|---|---|---|
tiny |
whisper-tiny | fastest, least accurate |
base |
whisper-base | fast |
small |
whisper-small | balanced (default) |
medium |
whisper-medium | accurate |
turbo |
whisper-large-v3-turbo | best speed/accuracy |
large-v3 |
whisper-large-v3 | most accurate, slower |
distil |
distil-whisper-large-v3 | fast, English-focused |
The installer keeps Python packages in Scrybe's private venv at
~/.local/share/scrybe/venv, so it works on PEP 668 distributions such as Arch
without modifying the system Python.
kwriteconfig6 --file ~/.config/scrybe/scrybe.conf --group stt --key backend faster-whisper
kwriteconfig6 --file ~/.config/scrybe/scrybe.conf --group stt --key device cuda # or cpuBuild the server with your backend, then point Scrybe at it:
git clone https://github.com/ggml-org/whisper.cpp && cd whisper.cpp
cmake -B build -DGGML_VULKAN=ON # or -DGGML_CUDA=ON
cmake --build build -j --target whisper-server
./build/bin/whisper-server -m models/ggml-large-v3-turbo.bin --port 8080kwriteconfig6 --file ~/.config/scrybe/scrybe.conf --group stt --key backend whispercppEnable in Settings (or the tray). Before pasting, the transcript is processed by a local Ollama model. Pick a style:
- Clean formatting — fix punctuation, casing, and filler words.
- Markdown — structure into headings, lists, bold, and code blocks.
- Summarize & shorten — condense and remove duplication.
- Custom presets — write your own instruction (e.g. "Rewrite as a formal email."); saved presets appear in the style dropdown.
The prompt asks it to preserve meaning, but generated edits can still change
content. It falls back to raw text if Ollama fails. Pull a model with
ollama pull qwen2.5:1.5b. Settings includes connection testing, preset generation,
and a sample-text preview; review generated instructions before saving them.
Scrybe checks GitHub for a newer release a few seconds after launch (it reads a
plain VERSION file) and shows a tray notification when one is
available. Update any time from Settings ▸ Updates (or the tray → Check for
updates…) — it pulls the latest source and rebuilds in a terminal. To update
manually:
curl -fsSL https://mrelmida.dev/scrybe/install.sh | bashgit clone https://github.com/mrelmida/scrybe && cd scrybe
./build-and-setup.shOr manually (dependencies already installed):
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build buildCommon commands:
scrybe --help # all options
scrybe --version
scrybe --settings # open the settings window
scrybe --transcribe-file file.wav # self-test the recognizer (no mic)
make build | run | install | clean # dev convenience targetsscripts/uninstall.sh # remove the app (keeps your models + config)
scripts/uninstall.sh --purge # also remove models, config, and OpenVINO- Paste doesn't work — ensure
ydotooldis running and you're in theinputgroup (the installer configures this; log out/in once after the first install). For terminals, setpaste/shortcuttoctrl+shift+v. - Hotkey does nothing — check System Settings → Shortcuts → Scrybe.
- Quiet or immediate-start words are skipped — turn off Speech ▸ Skip silence. Energy VAD can recover immediate speech after a brief pause, but cannot reliably distinguish continuous speech from constant background noise. Abrupt noise changes can also trigger it. The microphone meter scale affects display only; adjust actual input volume in your system sound settings.
- First dictation shows "Loading speech model…" — normal; the model loads on demand and is cached afterward.
scrybe (C++/Qt6 daemon)
├── core/Controller state machine (Idle→Listening→Transcribing→Beautifying→Pasting)
├── audio/AudioCapture microphone capture + level metering
├── stt/ pluggable backends (OpenVINO · faster-whisper · whisper.cpp)
├── llm/LlmBeautifier Ollama client
├── paste/Paster clipboard + Ctrl+V injection
├── update/Updater GitHub version check + in-place update
└── qml/ overlay + settings window (sidebar, hardware, updates)
Global hotkeys use KDE's KGlobalAccel; the overlay is a Wayland layer-shell surface that returns focus to your app for pasting.
cmake -S . -B build -G Ninja -DBUILD_TESTING=ON && cmake --build build
ctest --test-dir build --output-on-failure # C++ unit tests + sidecar protocolCI (GitHub Actions) runs the unit tests on Ubuntu, the sidecar protocol test, and a full application build on Fedora.
- Settings UI (in place of editing the config file)
- Hardware-aware install + on-demand backend management in the UI
- Automatic updates
- Configurable paste shortcut (terminal support via
paste/shortcut) - Energy-based voice activity detection and optional silence auto-send
- Per-app paste shortcut overrides
MIT — see LICENSE.