Press a shortcut โ speak โ text appears in the app you're using.
Fully offline. Built on Qt 6 Quick/QML, KDE Frameworks 6, and whisper.cpp.
One settings hub, a tactile "clay" design, and an AI Profile that learns how you speak - in dark and light.
DictaPulse is an early, actively-developed release - not the finished product. It works and it's daily-driver-usable, but expect rough edges as features land and stabilize across platforms. Found a bug or want a feature? Please open it on GitHub โ Issues for bugs, Discussions for ideas and feature requests. Your reports during beta directly shape what ships.
Voice dictation tools on Linux either depend on the cloud, lock you into a single desktop, or feel like 2008. DictaPulse is built on the simplest possible idea: a global shortcut, a beautiful floating overlay, a fast local Whisper model, and the transcribed text typed straight into whatever you're focused on - Slack, VS Code, your terminal, your browser. No upload. No account. No SaaS dependency.
The KDE Plasma 6 release is shipping first. The architecture is cleanly layered so future Windows / macOS / Android-IME / iOS-keyboard ports reuse the same engine.
| ๐๏ธ Global shortcut โ dictate anywhere | Registered with KGlobalAccel so it works in any focused window, even when DictaPulse is hidden in the tray. Toggle, push-to-talk, or auto-stop-on-silence modes. |
| ๐ Animated listening overlay | A small floating pill with a live waveform reacting to your voice. Position, size, opacity, sounds, and reduced-motion are all configurable. |
| โก Direct text insertion | Transcripts are typed into your active app via wtype (Wayland) or xdotool (X11). Clipboard is a fallback, not the default. |
| ๐ง Local Whisper transcription | whisper.cpp runs entirely on your machine. Audio never leaves the device. |
| โจ Transcript cleanup, your way | Pick your polish level: offline rules engine (instant, incl. Arabic punctuation), a local LLM via Ollama / LM Studio, or a remote API (Anthropic / OpenAI / any OpenAI-compatible endpoint). API keys live in your system keyring - never in config files. |
| ๐ค AI Profile that learns you | A Profile module - Refine (fillers, auto-punctuation, smart lists, spoken corrections), Personalize (dictionary, voice templates, tone, and a usage dashboard with animated glowing charts), and Devs Voice (syntax-aware dictation + your tech jargon). Everything you set is fed to whichever AI you've connected - Whisper's vocabulary bias and the cleanup LLM's instructions - so it gets more precise the more it knows you. |
| ๐ฏ Per-app output rules | Override the output mode per focused app - e.g. always copy + paste into your terminal. Active window detected via a tiny KWin script (Wayland) or xdotool (X11). |
| ๐๏ธ Built-in model manager | Browse, download, switch, and delete Whisper models from the GUI. Sizes from 75 MB (tiny) to 3 GB (large-v3). |
| ๐ 99 languages | English, Arabic, Italian, French, German, Spanish, Japanese, Chineseโฆ the full Whisper set, with constrained auto-detect so it never drifts to a wrong-but-similar language. |
| ๐ฅ๏ธ CPU / GPU / Hybrid | CPU works out of the box. Optional Vulkan, CUDA, and ROCm/HIP builds for GPU acceleration, with automatic hardware detection. |
| ๐ก๏ธ Privacy-first | No telemetry. No recordings on disk by default. Local-only by design - cloud cleanup is strictly opt-in. |
| ๐จ Tactile "clay" design | A custom QML design system: pillow-embossed surfaces, press physics on every button, serif display headlines, and matching dark & light themes that follow your system or your mood. |
| ๐งฉ Cross-platform-ready core | The engine is platform-agnostic; only the desktop adapter is KDE-specific. |
| Dark | Light |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
The Profile module - your AI personalization layer, with animated glowing usage charts:
| Usage dashboard | Refine |
|---|---|
![]() |
![]() |
DictaPulse is on the AUR in two flavours. Install with your favourite helper (paru, yay, โฆ):
paru -S dictapulse-bin # prebuilt Vulkan AppImage - no compiling, installs in seconds
# or
paru -S dictapulse # builds from source against your system's Qt/KF6dictapulse-bin- fastest path; ships the prebuilt Vulkan AppImage, unpacked to/opt.dictapulse- compileswhisper.cpp+ the app from source (Vulkan on). Pick this if you'd rather link against your exact system libraries.
They provides/conflicts each other, so install whichever suits you - not both.
Grab the latest DictaPulse-*-x86_64.AppImage from the Releases page:
chmod +x DictaPulse-*-x86_64.AppImage
./DictaPulse-*-x86_64.AppImageRuns unsandboxed on the host (so global shortcuts + injection work). Requires KDE Plasma 6 (Wayland), a running ydotoold, and host ffmpeg (present on most desktops). The Vulkan loader is bundled; a GPU driver enables acceleration, otherwise it falls back to CPU.
git clone https://github.com/Silverhairfx/DictaPulse.git
cd DictaPulse
./scripts/install.shThe installer:
- Checks Arch packages and offers to install anything missing.
- Configures CMake.
- Fetches & builds
whisper.cpp(first build only - grab a coffee). - Installs to
~/.local/bin/dictapulse+~/.local/share/applications/dictapulse.desktop.
Add ~/.local/bin to your PATH if it isn't already:
# fish
echo 'set -gx PATH $HOME/.local/bin $PATH' >> ~/.config/fish/config.fish
# bash / zsh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc./scripts/install.sh --vulkan # Cross-vendor GPU acceleration
./scripts/install.sh --cuda # NVIDIA only (requires CUDA toolkit)
./scripts/install.sh --rocm # AMD only (requires ROCm/HIP)GPU support is off by default so the first build stays fast and dependency-light.
- Launch DictaPulse from your KDE launcher (or run
dictapulse). - The settings window opens. Go to Models and click Download on
Base (multilingual)(~150 MB, fast, good quality). Tip: pick.envariants if you only dictate in English - they're a touch more accurate. - Go to Shortcuts. The default is
Ctrl+Alt+Space. Change it if you like - shortcuts apply instantly. - Close the settings window - it minimizes to the tray (microphone icon). The app keeps running.
- Anywhere - in Slack, VS Code, a Reddit comment box, your terminal - press the shortcut, watch the overlay appear, speak naturally, then either press the shortcut again or just stop talking (auto-stop kicks in after silence). Your transcript is typed straight into the field.
That's it.
The settings window has eleven pages. Quick map:
| Page | What it controls |
|---|---|
| Dashboard | Live status, mic level meter, the last transcript, quick info card. Start/stop manually from here too. |
| Shortcuts | Global hotkeys (KGlobalAccel) and dictation mode: toggle, push-to-talk, or auto-stop. |
| Models | Download, switch, and delete Whisper models. Shows size, speed, accuracy, RAM hint. |
| Language | Default language, enabled-languages set (constrains auto-detect), translate-to-English. |
| Output | Direct insertion vs clipboard vs copy+paste. Capitalization, filler-word removal, trailing space. |
| Cleanup | Transcript polish: rules engine, local LLM (Ollama / LM Studio), or remote API (Anthropic / OpenAI) with keyring-stored keys and a custom system prompt. |
| Backend | CPU/GPU/Hybrid mode, acceleration API picker, thread count. Detects your hardware automatically. |
| Overlay | Position (bottom/top/cursor), size with live preview, opacity, waveform, sound cues, reduce-motion. |
| Privacy | Recording storage, telemetry toggle (off by default and currently a no-op). |
| Advanced | VAD threshold, input gain & auto-normalize, silence-to-stop timing, max duration, autostart, tray behavior, reset-all. |
| About | Version, credits, license, repo link. |
The UI is a hand-built QML design language - no stock widget look:
- Clay surfaces - every card, button, and input is "molded" out of the canvas with an inset top sheen, a pillow shade, and a plush drop shadow (three depth tiers: raised, small, pressed).
- Press physics - buttons lift 1 px on hover and sink into the canvas on press; toggles slide with a spring; checkmarks pop.
- Two faces - a white tactile-pop light theme with vivid indigo, and a deep blue-slate dark theme with a luminous accent. Follows the system scheme or your explicit choice, switchable live from the sidebar.
- Serif display headlines - DM Serif Display for page titles and card headers, with atmospheric radial washes behind the canvas.
All tokens live in a single C++ Theme singleton (src/app/ThemeProvider.*), and the components (qml/components/Clay*.qml) are reusable drop-ins: ClayButton, ClaySwitch, ClayComboBox, ClaySlider, ClaySpinBox, ClayTextField, ClayDialog, and friends.
DictaPulse is laid out as a platform-agnostic core with a thin desktop adapter. The KDE Plasma adapter is the only one wired up today; Windows / macOS / Android-IME / iOS-keyboard adapters can slot in alongside without touching the engine.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Qt 6 / QML UI โ
โ Settings window ยท Floating overlay ยท Tray menu โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ signals / Q_PROPERTY
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Controller (C++) โ
โ Wires shortcuts โ audio capture โ whisper โ cleanup โ โ
โ injection โ
โโโโโโโฌโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
โ โ โ โ โ
โผ โผ โผ โผ โผ
โโโโโโโโโโ โโโโโโโโโ โโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ Audio โ โWhisperโ โ Model โ โCleanup โ โ Platform โ
โCapture โ โEngine โ โManagerโ โService โ โ Adapter โ
โ(Qt MM) โ โ(.cpp) โ โ(HTTP) โ โ+Keyringโ โ (KDE / wtype) โ
โโโโโโโโโโ โโโโโโโโโ โโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
Source tree:
DictaPulse/
โโโ CMakeLists.txt Top-level - finds Qt 6, optional KF6, fetches whisper.cpp
โโโ src/
โ โโโ main.cpp QApplication + QML engine + DI wiring
โ โโโ app/
โ โ โโโ Controller.{h,cpp} State machine, exposed to QML
โ โ โโโ Settings.{h,cpp} QSettings-backed preferences
โ โ โโโ ThemeProvider.{h,cpp} Clay design tokens (QML `Theme` singleton)
โ โโโ core/
โ โ โโโ audio/ 16 kHz mono PCM capture, VAD, auto-gain
โ โ โโโ transcription/ whisper.cpp wrapper (threaded)
โ โ โโโ models/ Catalog + downloader + ListModel
โ โ โโโ text/ Rules cleanup, capitalize, filler removal
โ โ โโโ cleanup/ LLM cleanup providers + keyring secret store
โ โ โโโ hardware/ CPU/GPU/RAM detection
โ โโโ platform/
โ โโโ PlatformAdapter.h Abstract surface (future-OS friendly)
โ โโโ linux/ KDE adapter: KGlobalAccel, wtype, KStatusNotifierItem
โโโ qml/
โ โโโ Main.qml Sidebar shell + page Loader
โ โโโ Overlay.qml Frameless transparent always-on-top pill
โ โโโ components/ Clay design kit: ClayButton, ClaySwitch, ClayDialogโฆ
โ โโโ pages/ Dashboard / Shortcuts / Models / Language / โฆ
โโโ resources/
โ โโโ icons/dictapulse.svg
โ โโโ fonts/ DM Serif Display (OFL)
โ โโโ sounds/ Overlay pop cues
โ โโโ desktop/dictapulse.desktop.in
โโโ scripts/install.sh
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
./build/src/dictapulseTo install system-wide instead of ~/.local:
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
sudo cmake --install build| Option | Default | What it does |
|---|---|---|
DICTAPULSE_ENABLE_VULKAN |
OFF |
Builds whisper.cpp with Vulkan acceleration |
DICTAPULSE_ENABLE_CUDA |
OFF |
Builds whisper.cpp with CUDA acceleration |
DICTAPULSE_ENABLE_HIP |
OFF |
Builds whisper.cpp with ROCm/HIP acceleration |
CMAKE_BUILD_TYPE |
Release |
Set to Debug for development |
| Package | Why |
|---|---|
| KDE Plasma 6 (Wayland or X11) | Target environment |
| Qt 6.9+ (Core, Gui, Widgets, Qml, Quick, QuickControls2, Multimedia, Svg, Network, DBus) | UI + audio (6.9 for the RectangularShadow the clay design uses) |
| KDE Frameworks 6 (KGlobalAccel, KStatusNotifierItem, KNotifications, KConfig, KColorScheme, KWindowSystem) | Native KDE integration |
| QtKeychain (Qt6) | Keyring storage for LLM-cleanup API keys |
| PipeWire / PulseAudio | Microphone capture |
| wtype (Wayland) or xdotool (X11) | Text injection - wtype is recommended |
| Package | Why |
|---|---|
| CMake 3.21+ | Build system |
| GCC 12+ / Clang 15+ | C++20 |
| git | Fetches whisper.cpp |
sudo pacman -S --needed \
qt6-base qt6-declarative qt6-multimedia qt6-svg qt6-wayland \
extra-cmake-modules qtkeychain-qt6 \
kglobalaccel kstatusnotifieritem knotifications kconfig \
kcolorscheme kwindowsystem \
cmake ninja gcc git wtypeDictaPulse uses Whisper, which supports 99 languages. The most common, ready to enable on the Language page:
๐ฌ๐ง English ยท ๐ธ๐ฆ Arabic ยท ๐ฎ๐น Italian ยท ๐ซ๐ท French ยท ๐ฉ๐ช German ยท ๐ช๐ธ Spanish ยท ๐ต๐น Portuguese ยท ๐ท๐บ Russian ยท ๐น๐ท Turkish ยท ๐ณ๐ฑ Dutch ยท ๐ต๐ฑ Polish ยท ๐ฏ๐ต Japanese ยท ๐จ๐ณ Chinese
Pick a multilingual model (base, small, medium, large-v3, large-v3-turbo) for non-English use. The .en variants are English-only but slightly faster and more accurate for English.
| Model | Size | Speed | Accuracy | Good for |
|---|---|---|---|---|
tiny.en |
75 MB | โกโกโกโกโก | Basic | Notes app on a Raspberry Pi |
base.en โญ |
150 MB | โกโกโกโก | Good | Default pick for English |
small.en |
480 MB | โกโกโก | Very good | Most laptops, professional notes |
base |
150 MB | โกโกโกโก | Good | Mixed-language users (EN + AR + IT) |
small |
480 MB | โกโกโก | Very good | Multilingual sweet spot |
medium |
1.5 GB | โกโก | Excellent | When you have a real GPU |
large-v3-turbo |
1.6 GB | โกโกโก | Excellent | GPU users wanting the best balance |
large-v3 |
3 GB | โก | Excellent | Maximum accuracy, GPU strongly advised |
- MVP - KDE Plasma 6 + tray + overlay + whisper.cpp + wtype + model manager + language picker + settings persistence
- LLM transcript cleanup - rules / local LLM / remote API providers with keyring-stored keys
- Clay design system - tactile dark & light themes, custom component kit
- Personal dictionary - case-sensitive replacements per language
- Live partial transcript in the overlay
- Per-app output rules (e.g., always paste in terminals)
- GNOME adapter via DBus + custom shortcut backend
- Windows adapter (
SendInput, Win32 hotkey, native tray) - macOS adapter (CGEvent, Carbon hotkey, NSStatusItem)
- Android IME (system-wide voice keyboard)
- iOS keyboard extension (within Apple's keyboard constraints)
- AppImage / Flatpak / AUR packages
Does any audio leave my machine?
No. Whisper runs locally via whisper.cpp. Models are downloaded from huggingface.co over HTTPS once, then everything is on-device. The only exception is the optional remote-API cleanup provider - if you enable it, the transcribed text (never audio) is sent to the provider you chose.
I press the shortcut but nothing happens.
- Check the shortcut on the Shortcuts page - capture fields apply instantly, but Re-apply shortcuts forces a re-register.
- Open KDE System Settings โ Shortcuts โ Global Shortcuts โ DictaPulse and confirm it's set there.
- Some Plasma versions block global shortcuts until the registering app has been seen once - try restarting Plasma or logging out/in.
Text doesn't appear in my app.
On Wayland, the Linux input model doesn't expose synthetic key events to every window. DictaPulse uses wtype, which works in most native apps. If it fails:
- Make sure
wtypeis installed (pacman -Q wtype). - In Output settings, switch to Copy + paste mode - DictaPulse will copy the text and send Ctrl+V.
- Enable clipboard fallback so you never lose a transcript.
How do I switch between English and Arabic on the fly?
Pick a multilingual model in the Models page. Then on the Language page enable both English and Arabic and turn on Auto-detect. Detection is constrained to your enabled set, so it can't drift to a wrong-but-similar language.
Can I use a GPU?
Yes. Rebuild with ./scripts/install.sh --vulkan (cross-vendor), --cuda (NVIDIA), or --rocm (AMD). After rebuilding, switch Backend โ Compute mode to GPU and pick the matching API.
What does the LLM cleanup send, and where are my API keys?
Cleanup sends your transcribed text plus your system prompt to the endpoint you configured - a local server (Ollama / LM Studio, nothing leaves your machine) or a remote API. Keys are stored in your system keyring (KWallet / libsecret) via QtKeychain, never in DictaPulse's config file.
Where are settings and models stored?
- Preferences:
~/.config/DictaPulse/DictaPulse.ini - Models:
~/.local/share/DictaPulse/models/
How is this different from nerd-dictation / Speech Note / Wispr Flow?
- nerd-dictation is a CLI/script tool - DictaPulse is a polished GUI/tray app with model management, overlay UX, and KDE-native integration.
- Speech Note is a great GTK app focused on the GNOME stack. DictaPulse is built around KDE Plasma idioms (KGlobalAccel, KStatusNotifierItem, Qt 6 Quick).
- Wispr Flow is a cross-platform SaaS that sends audio to the cloud. DictaPulse is fully local.
This is a beta - your feedback is the roadmap. Please use GitHub's own tools:
- ๐ Bugs โ open an Issue. Helpful to include:
- Output of
inxi -Fxz(oruname -a+plasmashell --version) - Whether you're on Wayland or X11
- The active model and backend mode
- A reproduction recipe
- Output of
- ๐ก Feature requests & ideas โ start a Discussion.
- ๐ Pull requests are welcome - by contributing you agree your changes are licensed under GPL-3.0 (see below).
Built by Tymour Kadry (@silverhairfx) and owned by ETK Technologies - https://etk-tech.com.
Licensed under GPL-3.0 (see also NOTICE). In plain terms:
- โ Free to use - personally and commercially, today and as it grows.
- โ Free to study, modify, and share - forks are welcome.
- ๐ Copyleft - no closed-source forks. Any distribution (including modified or rebranded versions, and anything sold) must ship the complete corresponding source under GPL-3.0. Re-licensing DictaPulse or a derivative as closed source / a paid proprietary product is a license violation and will be pursued.
- ๐ท๏ธ Attribution required - forks must preserve the original authorship and copyright (ETK Technologies / Tymour Kadry).
- ๐งฌ Provenance - the source and binary carry origin markers (see NOTICE);
scripts/detect-forks.pyscans public GitHub for copies.
As the sole copyright holder, ETK Technologies reserves the right to offer future versions, tiers, or modules under separate commercial terms. That does not affect your rights to this GPL-3.0 release.
Bundled dependencies retain their own licenses: whisper.cpp (MIT) ยท Qt 6 (LGPL-3.0 / commercial) ยท KDE Frameworks 6 (LGPL) ยท QtKeychain (BSD-3-Clause) ยท DM Serif Display (SIL OFL 1.1).
Built for KDE Plasma ยท Powered by Whisper ยท Made for people who'd rather talk than type.








