Dictation for macOS that runs on your Mac and learns how you talk.
Hold Fn, talk, let go. The text lands in whatever field you were in: fillers gone, false starts fixed, "actually, make it Tuesday" applied. Speech-to-text never leaves your machine. No account.
Current builds are ad-hoc signed and not notarized. macOS will ask you to approve the app in System Settings → Privacy & Security on first launch. A notarized build and a Homebrew cask are next.
um so can you ask pria ramen to, uh, review the PG vector migration and and book it for Monday, actually Tuesday
Can you ask Priya Raman to review the pgvector migration and book it for Tuesday?
Names and terms are spelled right because you corrected them once. Flowstate picks vocabulary up from your projects folder, contacts and calendar, and learns from what you retype.
Local by default
Whisper or Parakeet on your Mac. On most Apple Silicon machines the cleanup model runs locally too. If it's slow, missing, or makes something up, you get the rule-cleaned text instead. You never lose a dictation.
Reads the room
It looks at the field you're typing into. Slack gets casual, Mail gets prose, the terminal gets exactly what you said. "Scratch that" drops the last sentence. "Send it" presses Return if you turn that on.
Notes and meetings
⌥Space opens a quick note bar. Meeting mode records mic and call audio, transcribes as you go, and writes a summary with decisions and action items. Audio isn't kept. A bundled MCP server lets your AI tools search your notes, read-only, local.
Download
Release v0.1.1
Published 3 Nov 2026
| Flowstate-0.1.1.dmg | 51 MB | Disk image |
| Flowstate-0.1.1.zip | 46 MB | App bundle |
| SHA256SUMS | 172 B | Checksums |
Requires an Apple Silicon Mac on macOS 14 or later. 16 GB of memory recommended for the local cleanup model; with 8 GB use your own API key, Cloud, or filter-only cleanup. All releases
Homebrew
brew install --cask rdewsnap/flowstate/flowstate
The tap goes live with the first notarized release. Until then, use the disk image above.
Build from source
scripts/fetch-models.sh
scripts/build-llama-server.sh
LLAMA_SERVER=build/llama-server scripts/build-mac.sh
open build/Flowstate.app
Rust (rustup), Xcode 16 and CMake. The first script fetches Whisper, Parakeet and a 4B cleanup model, about 3.7 GB.
First launch
- Approve the app in System Settings → Privacy & Security (unsigned build).
- Grant Microphone and Accessibility access when asked. Meetings also need Screen Recording.
- Flowstate picks a cleanup mode for your hardware. You can change it in Settings.
- If Fn opens the emoji picker: System Settings → Keyboard → "Press 🌐 key to" → Do Nothing.
| Fn hold | dictate while held |
| Fn double-tap | hands-free, press Fn again to stop |
| ⌃⌥Z | swap the last dictation for the raw transcript |
| ⌥Space | notes bar |
How it works
- Speech to textwhisper.cpp or sherpa-onnx Parakeet, with your vocabulary passed in as a prompt.
- Rule filterStrips um, uh,
I-I,the the. Instant, and the fallback if anything downstream fails. - Vocabulary matchMisheard names matched by sound against your words:
PG vector→pgvector. - Cleanup modelA small language model, run through llama.cpp as a local sidecar, handles like, you know, restarts, and corrections that reach back a few sentences.
- GuardrailRejects any rewrite that adds words you didn't say.
Cloud mode, if you choose it, sends text only, never audio. Dictations with no self-corrections go to a cheaper model.
Is it any good?
flowstate-bench scores the pipeline on word error rate, whether your vocabulary came out spelled right, fillers left behind, and whether self-corrections were applied. The numbers below are from the first training run of a small cleanup model, including the ones that aren't flattering. Run it on your own voice; the clips and manifests are in the repo.
Short version: the 4B baseline gets 1.1% word error rate on the 11 TTS clips. The 1.7B model I fine-tuned gets 2.2% at about half the latency (167 ms against 301 ms), and on the 200 held-out validation pairs it beats the 4B, which falls back to the rule filter 13 times. The validation set follows the training data's conventions, so take that second number with salt.
Full results table
The validation set's references follow the training data's conventions, so it favours the fine-tunes. 4B fallbacks are guardrail rejections. Source: training/RESULTS.md.
Your own recordings are never used for training.
Sync, teams and self-hosting
Everything above works with no account. If you want your notes on two Macs, a shared glossary with your team, or cleanup without running a model or managing a key, the app can sign in to a server. The server is in the repo: one binary, SQLite or Postgres, docker compose in deploy/. Run your own or use the hosted one. Either way audio never leaves your Mac; the server only sees text you choose to sync.
| Free | Cloud | Self-hosted | |
|---|---|---|---|
| Local dictation, vocabulary, context, notes, meetings, local MCP | yes | yes | yes |
| Hosted cleanup and summaries, no keys | no | yes | your server |
| Sync across Macs, hosted MCP endpoint | no | yes | your server |
| Shared glossary and notes (Teams) | no | yes | your server |
| Price | $0 | $6 / month | $0 + your infra |
Cloud costs what the servers cost. The free tier is the whole product for one person with a decent Mac, on purpose.
Connect an AI assistant
{"mcpServers":{"flowstate":{"command":"/Applications/Flowstate.app/Contents/MacOS/flowstate-mcp"}}}
Or for Claude Code: claude mcp add flowstate -- /Applications/Flowstate.app/Contents/MacOS/flowstate-mcp. Add --allow-write to let the assistant save notes.