Open-source, local-only voice dictation for macOS. Hold a key, speak, release — your words appear wherever your cursor is. An alternative to Wispr Flow with no subscription, no cloud, and no audio ever leaving your Mac.
Website · Download for Mac · Releases
Hold the key, speak, release. The transcript lands right where your cursor is.
- System-wide dictation: works in any app — editors, browsers, chat, terminals
- Hold or toggle: hold
fn(default) and release to insert, or quick-tap to toggle hands-free;Esccancels - Live transcript: words pop up on screen while you are still speaking, so you can see the dictation land before you let go. Settled words stay put; the tail still being decided is dimmed. Optionally switch the preview to the Parakeet Unified streaming model (English, about 610 MB, Settings > Models) and words appear about a third of a second after you say them. Toggle in Settings.
- Two local engines, switchable in Settings:
- Parakeet TDT v3 (default): the fastest engine, best English accuracy, and it also covers 24 European languages. Via FluidAudio.
- Whisper Large v3 Turbo: the broad multilingual fallback, roughly 100 languages including Chinese, Japanese, Korean, Arabic, and Hindi. Via WhisperKit.
- Other languages: Parakeet handles English and 24 European languages automatically. For anything outside that set (Chinese, Japanese, Korean, Arabic, Hindi, and the rest), switch to Whisper Large v3 Turbo in the Models tab, then set your language in Settings. OpenFlow dictates one selected language at a time (no auto-detect yet).
- Read Aloud: select text in any app and press
⌃⌥R(works everywhere, configurable), or right-click and choose Read Aloud with OpenFlow (native apps and Chrome; Electron apps do not show Services). Speech starts after the first sentence andEscstops it. Uses the Kokoro 82M voice (Apache 2.0, English) on the Neural Engine via FluidAudio; about 330 MB, downloaded on first use. - Custom dictionary & snippets: teach it "cube cuddle" →
kubectl, or expand spoken triggers into whole blocks - Hallucination filtering: silence never injects "Thank you." into your editor
- Local history: searchable transcript log in SQLite, on your disk only
- Clipboard-safe: pastes via a transient clipboard entry (ignored by clipboard managers) and restores what you had copied
Lives in your menu bar. It shows the active engine and whether it is ready, with History and Settings a click away.
Settings: choose your hotkey and activation style, pick a language, toggle on-device cleanup, and set how text is inserted.
- Apple Silicon Mac, macOS 14+ (macOS 26+ for the Apple Intelligence cleanup pass)
- ~600 MB disk per model (downloaded on first run, cached locally)
- Optional: about 610 MB more for the streaming live preview model (English only)
- No Xcode required to build — Command Line Tools are enough
Grab OpenFlow.zip from the latest release, unzip, and drag OpenFlow.app to Applications.
First launch: this build isn't notarized by Apple yet, so macOS will block a normal double-click. Right-click OpenFlow.app → Open → Open. If macOS still refuses, approve it under System Settings → Privacy & Security → "Open Anyway", or clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/OpenFlow.appOnboarding then walks you through Microphone + Accessibility permissions and the model download. Hold fn, speak, release.
![]() |
![]() |
![]() |
![]() |
The first-run flow takes about two minutes: welcome, microphone access (audio stays on your Mac), the one-time model download, then a field to try it live.
make run # builds release, assembles dist/OpenFlow.app, opens it
make install # builds, quits the running app, replaces /Applications/OpenFlow.app, relaunches
make release # builds and zips dist/OpenFlow.zip for a GitHub release
make build # debug build
make test # runs the Swift Testing suite (swift run openflow-tests)
make cli # builds the openflow-cli spike toolOn first launch, onboarding walks through the required permissions:
| Permission | Why |
|---|---|
| Microphone | capture your voice while the hotkey is held |
| Accessibility | watch for the global hotkey and paste text into the focused app |
| Input Monitoring | only if macOS refuses the event tap with Accessibility alone |
Ad-hoc signing note: without a Developer ID the app is ad hoc signed.
make apppins the signature's designated requirement to the bundle identifier, so the Microphone and Accessibility grants survive rebuilds. If macOS does hold on to a grant from an older copy, setup clears it and asks again. SetCODESIGN_ID="Developer ID Application: …"when runningmake appif you have a signing identity.
System Settings, Privacy & Security, Accessibility. This grant lets OpenFlow watch for the hotkey and paste into the focused app.
If you use fn as the hotkey, set System Settings → Keyboard → Press 🌐 key to → Do Nothing so the emoji picker stays out of the way.
openflow-cli exercises the transcription stack without the app:
openflow-cli models # list model presets and download state
openflow-cli record 8 # record 8s from the mic, transcribe with Parakeet
openflow-cli compare 8 # record once, run BOTH engines head-to-head
openflow-cli file speech.wav both # transcribe an audio file with both engines
openflow-cli speak "Hello there" --play --out hello.wav # Kokoro TTS: per-sentence latency, WAV, playback
openflow-cli live hello.wav # replay a file as a live recording and print the partial transcripts
openflow-cli live-stream hello.wav 320 # same, through the Parakeet Unified streaming preview (downloads that tier once)hotkey (CGEventTap) ─► AudioCaptureEngine (16 kHz mono)
│
▼
TranscriptionEngine ◄─ protocol seam
├─ FluidAudioEngine (Parakeet TDT v3, CoreML)
└─ WhisperKitEngine (Whisper, CoreML)
│
▼
TranscriptPipeline
├─ HallucinationFilter (energy gate + no-speech prob + artifact list)
├─ LLMCleanerStage (Apple Intelligence, on-device; runs only when
│ the transcript contains disfluencies)
└─ DictionaryReplacer (word-boundary custom vocabulary)
│
▼
TextInjector (clipboard snapshot → ⌘V → restore, or keystroke typing)
Core logic lives in the OpenFlowCore library (UI-free, tested); the menu-bar app shell is Sources/OpenFlowApp.
MIT — see LICENSE.







