Free and open source alternative to Wispr Flow, Superwhisper, and Monologue.
⬇ Download OmniFlow.dmg ·
⬇ Download OmniFlow.exe
macOS (Apple Silicon + Intel) · Windows 10/11 x64 — one project, one repository
Thank you to @marcbodea for maintaining OmniFlow!
OmniFlow is a free dictation app inspired by Wispr Flow, Superwhisper, and Monologue. It gives you fast AI transcription, context-aware cleanup, and voice-driven text editing without a monthly subscription.
- macOS — this repository root (Swift/AppKit,
Sources/) - Windows —
windows/(C#/.NET 8 WinForms tray app; spec inwindows/README.md)
- Download the app from above or click here
- Get a free Gemini API key from aistudio.google.com — or a Groq key from groq.com
- Hold
Fnto talk, or tapCommand-Fnto start and stop dictation, and have whatever you say pasted into the current text field
- Custom shortcuts: Customize both hold-to-talk and toggle dictation shortcuts. If your toggle shortcut extends your hold shortcut, you can start in hold mode and press the extra modifier keys to latch into tap mode without stopping the recording.
- Explicit provider choice: pick Google Gemini or a Groq / OpenAI-compatible endpoint in Settings — the fields, key validation and Processing options adapt. With Gemini there is no separate cleanup step: the provider returns polished text directly.
- Context-aware cleanup: OmniFlow can read nearby app context so names, terms, and phrases are spelled correctly when you dictate into email, terminals, docs, and other apps.
- Custom vocabulary: Add names, jargon, and project-specific words that OmniFlow should preserve during cleanup.
- OpenAI-compatible providers: Use Groq by default, or configure a custom model and API URL in settings.
- Gemini Live streaming:
gemini-*-transcribe-livestreams the interim transcript into the overlay while you speak; the adaptive finish waits for the server-side tail refinement and falls back to file transcription when the live session produced nothing but the microphone heard speech. Transcription retries transient failures (3 attempts) before giving up. - Paste Last Recording: if transcription fails, the recording is kept — a menu-bar item re-transcribes and pastes it.
- Dictation overlay card: a compact dark card (Windows-parity design) with an animated equalizer, the live transcript on two lines and the paste destination, top-center under the menu bar.
- Redesigned settings & onboarding: a 7-tab settings window (General / Dictation / AI Provider / Processing / Macros / History, plus a dev-only Debug tab), a trimmed quick-action menu-bar menu, and a 7-step setup wizard instead of 14.
Edit Mode lets you highlight existing text and transform it with a spoken instruction, like "make this shorter" or "turn this into bullets." Enable it in settings, then use your normal dictation shortcut on selected text, or choose Manual mode to require an extra modifier key.
Significant architecture and product decisions are recorded as short ADRs in docs/adr/ — from the cleanroom rewrite and the Gemini Live adaptive finish to the provider fork (no LLM cleanup for Gemini) and the 0.5.0 settings redesign. The decision tree in docs/adr/decision-tree.md maps every runtime branch to its ADR. Detailed behavior lives in the numbered specs under docs/spec/.
There is no OmniFlow server, so OmniFlow does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.
If you'd rather keep cleanup more literal and less context-aware, you can paste this simpler prompt into the custom system prompt setting:
Simple post-processing prompt
You are a dictation post-processor. You receive raw speech-to-text output and return clean text ready to be typed into an application.
Your job:
- Remove filler words (um, uh, you know, like) unless they carry meaning.
- Fix spelling, grammar, and punctuation errors.
- When the transcript already contains a word that is a close misspelling of a name or term from the context or custom vocabulary, correct the spelling. Never insert names or terms from context that the speaker did not say.
- Preserve the speaker's intent, tone, and meaning exactly.
Output rules:
- Return ONLY the cleaned transcript text, nothing else. So NEVER output words like "Here is the cleaned transcript text:"
- If the transcription is empty, return exactly: EMPTY
- Do not add words, names, or content that are not in the transcription. The context is only for correcting spelling of words already spoken.
- Do not change the meaning of what was said.
Example:
RAW_TRANSCRIPTION: "hey um so i just wanted to like follow up on the meating from yesterday i think we should definately move the dedline to next friday becuz the desine team still needs more time to finish the mock ups and um yeah let me know if that works for you ok thanks"
Then your response would be ONLY the cleaned up text, so here your response is ONLY:
"Hey, I just wanted to follow up on the meeting from yesterday. I think we should definitely move the deadline to next Friday because the design team still needs more time to finish the mockups. Let me know if that works for you. Thanks."Google's Gemini transcription models are available alongside the Whisper options. They are not OpenAI-compatible, so OmniFlow talks to Google directly rather than through the provider URL. Both transcribe in smart mode, which removes filler words and false starts and repairs punctuation as part of transcription, and both accept your custom vocabulary as recognition biasing.
There are two models, and the difference that matters for daily dictation is quota, not quality:
| Model | API | Free-tier quota |
|---|---|---|
gemini-3.5-transcribe |
file upload after recording | ~25 requests per day |
gemini-3.5-transcribe-live |
streams while you speak | limited by tokens per minute |
At roughly one request per dictation, the batch model's daily allowance runs out quickly. The live model is limited by audio throughput instead, which a single speaker will not reach, so prefer it unless you have a paid tier. Check your own limits in AI Studio.
To use the live model, open settings and:
- Set the transcription API key to a Google AI Studio key. Leave the transcription API URL empty; OmniFlow routes Gemini to Google for you.
- Enable realtime streaming and set the realtime model to
gemini-3.5-transcribe-live. - Optionally set the transcription model to
gemini-3.5-transcribe, which is then used only as the fallback if the socket fails mid-dictation.
To use the batch model on its own, set the transcription model to
gemini-3.5-transcribe and leave realtime streaming off.
Because the transcript arrives already cleaned, you can turn on preserve exact wording to skip the separate cleanup model entirely and get a one-call dictation. Leave it off if you still want the cleanup pass to adapt the text to the app you are dictating into.
One limit is worth knowing: the language is auto-detected rather than pinned, because pinning a language drops both models out of smart mode. The transcription-language setting therefore has no effect on the Gemini paths.
OmniFlow can use OpenAI-compatible local or self-hosted providers instead of Groq. In settings, configure the API base URL and model IDs for your local LLM provider, such as Ollama, LM Studio, or another OpenAI-compatible server. If your transcription backend uses a different endpoint from your LLM backend, set the transcription API URL separately.
Local models are often slower than hosted providers, especially on cold start, long recordings, or busy hardware.
Configure longer timeouts for local models
OmniFlow keeps the default network timeout at 20 seconds, but you can extend it with macOS defaults:
defaults write com.nick8cyber.omniflow transcription_timeout_seconds -float 120
defaults write com.nick8cyber.omniflow post_processing_timeout_seconds -float 120
defaults write com.nick8cyber.omniflow context_request_timeout_seconds -float 120The timeout keys are:
transcription_timeout_seconds: audio transcription requestspost_processing_timeout_seconds: transcript cleanup and edit mode requestscontext_request_timeout_seconds: nearby app context requests
Only positive values are used. Remove a custom timeout to return to the 20-second default:
defaults delete com.nick8cyber.omniflow transcription_timeout_seconds
defaults delete com.nick8cyber.omniflow post_processing_timeout_seconds
defaults delete com.nick8cyber.omniflow context_request_timeout_secondsLicensed under the MIT license.
