Plainsay is a free, MIT-licensed dictation app for Mac. Transcription runs on-device with Whisper or Parakeet — never in the cloud, never behind a login. An optional LLM cleanup pass uses a key you control. No subscription. No account required. plainsay.app
The free, open-source, on-device Wispr Flow. Hold a key, speak, release — cleaned-up written text lands in whatever app you're using.
Transcription runs entirely on your Mac. Choose Whisper via WhisperKit, or multilingual NVIDIA Parakeet TDT 0.6B v3 via FluidAudio. Both run as Core ML models on Apple silicon, accelerated by the Neural Engine. A Gemini Flash Lite pass then turns spoken language into written language: filler words out, punctuation in, your wording intact — see why on-device for exactly what that means, or how it works for the engine internals and the cleanup design.
The HUD, right where you're already typing
Setup Assistant — walks through everything on first run:
Settings — always one click away from the menu bar:
![]() Speech — model, live preview, languages |
![]() General — interface language, hotkey |
![]() Permissions |
Download the latest release
— a notarized, ready-to-run Plainsay.app. That link always resolves to
whatever Scripts/release.sh shipped most recently, so it never needs
updating by hand. The Releases page
is the changelog: every version's notes, oldest to newest.
Or via Homebrew:
brew tap conrader/plainsay
brew install --cask plainsayAlready running Plainsay? It checks for updates itself — no need to re-download. See Check for Updates… in the menu bar.
The Setup Assistant walks through all of this on its own — the steps below are just what it's actually doing.
- Pick how speech gets transcribed — Plainsay Cloud (no download, ≈$3/month), on-device Whisper or NVIDIA Parakeet (free, ~475–632 MB download, cached after the first run), or your own API key.
- Grant three permissions — Microphone to hear you, Accessibility to paste, Input Monitoring to notice the hotkey while another app is focused. macOS only applies a new grant after a restart, so quit and reopen afterwards.
- Optional: add a cleanup key in Settings › Speech, if you want filler words and punctuation cleaned up locally instead of through Plainsay Cloud. Get one at aistudio.google.com for Gemini. It's stored in your Keychain. Without one, Plainsay still works — it inserts the raw transcript.
Default hotkey is Right ⌘, in hybrid mode:
- Hold it and speak — recording ends when you let go.
- Tap it once — recording latches on; tap again to stop.
Settings › General switches to hold-only or toggle-only if the hybrid behavior gets in your way.
Add names and jargon under Settings › Speech › Vocabulary. Whisper and hosted models receive them as decoder conditioning; every model also uses them in the cleanup prompt. Parakeet itself does not currently accept decoder prompts.
key down ──► capture frontmost app, show HUD, start recording
AVAudioEngine → 16kHz mono float, lock-free ring buffer
key up ────► stop, discard anything under 300ms
WhisperKit or FluidAudio/Parakeet transcribe
Gemini cleanup (3s timeout → falls back to raw transcript)
pasteboard snapshot → set text → ⌘V → restore snapshot
Cleanup is best-effort by design. No key, no network, a timeout, an HTTP error — you still get the raw transcript, and the HUD says it fell back. A dictation is never lost to a failed API call.
Text is inserted by pasting rather than through the Accessibility API, which fails silently in Electron apps, web views, and terminals. Your clipboard is snapshotted and restored around the paste.
Sources/PlainsayCore— the pipeline. No UI, unit-testable.Sources/PlainsayApp— menu bar, HUD panel, settings.docs/superpowers/specs/— design document.
TranscriptionEngine and TextCleaning are protocols, so switching between
WhisperKit and Parakeet, or Gemini and another cleanup model, does not touch the
pipeline.
Building from source, and running the tests, are covered in CONTRIBUTING.md.
Word error rate and latency for both on-device engines, measured on a public dataset with published reference transcripts — reproducible with one command.
Bugs and feature requests: open an issue. Everything else: hi@plainsay.app.








