Local-first, push-to-talk dictation for macOS and Windows.
Hold a hotkey → speak → release → polished text is instantly pasted into any app.
No cloud. No subscription. No tokens. Everything runs on your machine.
FlowDesk turns your voice into clean, formatted text — in any app, instantly, with zero internet required. Think Wispr Flow but fully self-hosted.
Hold hotkey → speak → release → polished text appears wherever your cursor is
The entire pipeline runs locally:
| Step | What happens |
|---|---|
| 1. Key hook | Global hotkey detected (default: Right Option/Alt) |
| 2. Capture | Mic audio at 16kHz mono with pre-roll buffer (first word never clipped) |
| 3. Transcribe | whisper.cpp converts speech to text (Metal-accelerated on Mac) |
| 4. Clean up | Local LLM via Ollama removes filler words, fixes punctuation, applies per-app writing style |
| 5. Paste | Result pasted into the focused app via clipboard swap (clipboard restored after) |
If Ollama is too slow, FlowDesk falls back to the punctuated raw transcript automatically — you are never left waiting.
- Push-to-talk with a live HUD showing status and waveform
- 100% offline — whisper.cpp + Ollama, no API keys, no cloud
- Personal dictionary with transcriber biasing for custom words
- Custom replacements — plain text or regex, applied pre/post cleanup
- Voice snippets — say a trigger phrase to insert saved text (
{{date}},{{time}},{{clipboard}}supported) - Per-app writing styles — different tone and cleanup level for different apps
- Dictation history — searchable log with latency breakdown and retention controls
- System tray control and full settings UI
- SQLite storage — everything local, nothing in the cloud
1. whisper-server (speech-to-text)
- Build from whisper.cpp and place the binary in
resources/bin/<platform>-<arch>/- Mac Apple Silicon:
resources/bin/darwin-arm64/whisper-server - Mac Intel:
resources/bin/darwin-x64/whisper-server - Windows:
resources/bin/win32-x64/whisper-server.exe
- Mac Apple Silicon:
- Or put it on your PATH — FlowDesk will find it automatically
- Download a model (
base.en~142 MB) from the in-app setup checklist
2. Ollama (AI text cleanup — optional)
- Install from ollama.com
- Pull the default model:
ollama pull qwen2.5:3b-instruct - Without Ollama you still get clean punctuated transcripts — just no filler-word removal
# 1. Clone the repo
git clone https://github.com/highqualityhq/flowdesk.git
cd flowdesk
# 2. Install dependencies (also rebuilds native modules for Electron)
npm install
# 3. Run in development mode
npm run devFlowDesk needs three permissions — macOS will prompt for each on first use:
| Permission | Why |
|---|---|
| Microphone | To capture your voice |
| Accessibility | For the global hotkey and pasting |
| Automation → System Events | For clipboard paste |
Grant via System Settings → Privacy & Security if not prompted automatically.
npm run build # compile TypeScript
npm run dist:mac # builds .dmg + .zip for macOS
npm run dist:win # builds .exe installer for Windows
npm run typecheck # TypeScript type check (no emit)Place the
whisper-serverbinary for the target platform inresources/bin/<platform>-<arch>/before packaging.
flowdesk/
├── src/
│ ├── main/ # Electron main process
│ ├── preload/ # Preload bridge scripts
│ ├── renderer/ # React UI (HUD, settings, history)
│ └── shared/ # Types and utilities shared across processes
├── resources/
│ └── bin/ # whisper-server binaries (not committed — add your own)
├── out/ # Build output (gitignored)
└── dist/ # Packaged app output (gitignored)
| Layer | Technology |
|---|---|
| App framework | Electron 34 + electron-vite |
| UI | React 18 + TypeScript |
| Speech-to-text | whisper.cpp via whisper-server |
| LLM cleanup | Ollama (local, any instruct model) |
| Storage | SQLite via better-sqlite3 |
| Global hotkey | uiohook-napi |
FlowDesk is offline-first by design. The only network call that ever happens is the one-time download of a whisper model. Your voice, transcripts, and writing history never leave your machine.
MIT © highqualityhq