Native Mac dictation in a 12 MB download. Free Local mode with Whisper + Parakeet, reproducible benchmarks, optional Cloud. MIT-licensed client.
9
stars
75
commits
Swift
primary language
Sep 6, 2026
updated
Hold a key. Speak. Release. Get text at your cursor—or safely on the clipboard.
A native Mac dictation app in a 12 MB download, with Whisper and Parakeet running locally.
Star Plainsay on GitHub ★ · Download Plainsay.dmg · Homebrew · Website · Benchmark
12 MB native app · free Local mode · no account · no telemetry
Plainsay is free and MIT-licensed. With Local transcription and Polishing off or running on your Mac, dictation audio is not uploaded, no account or subscription is needed, and recognition works offline after the model download. Automatic checks for signed updates are enabled by default and can be disabled in Settings. Optional Plainsay Cloud provides hosted transcription and Polishing for US$4 gross/month (VAT included); Cloud speech sends recorded audio to the service and includes up to 900 transcription minutes in any rolling 30-day window. An active subscription also unlocks Auto-translate and automatic email layout for new dictations from any transcription source. In v0.2.29, those styles require a BYOK or compatible local Polishing provider; the built-in Plainsay Cloud Polishing request does not yet carry their instructions.
Requirements: macOS 14 or newer and an Apple-silicon Mac. The app is signed and notarized. Recommended multilingual models are separate one-time downloads of approximately 475–632 MB; smaller English-only options start at about 150 MB.
Download the latest notarized DMG and drag Plainsay to Applications. The stable link always points to the latest release; the release page has checksums and release notes.
brew install --cask conrader/plainsay/plainsay
Plainsay checks for signed updates automatically. You can also use Check for Updates… from its menu-bar menu.
If Plainsay earns a place in your menu bar, star the repository. It is the simplest way to help more Mac users find the project.
Plainsay is signed and notarised, then downloads a Core ML speech model at first run and executes it. Neither WhisperKit nor FluidAudio verifies a file it has just fetched, so until v0.2.27 nothing did. Expected digests for every supported model now ship inside the signed bundle. Before loading, Plainsay hashes the pinned files that were actually downloaded and refuses any present file whose contents differ. Repository paths absent because a library downloads only a subset are reported, not treated as tampering.
Nobody was checking the speech models — what the libraries actually guarantee, why verifying against a hash from the same server proves nothing, and what the fix does and does not buy.
Side-by-side pages for the alternatives, written to be useful rather than flattering — each one ends with the cases where the other app is the better buy.
All the main Mac dictation apps compared — price, what stays on your Mac, what needs an account.
vs Wispr Flow · vs superwhisper · vs VoiceInk · vs MacWhisper · vs Apple Dictation
One worth stating here: Plainsay dictates, and that is all it does. It has no file import, so if you have recordings to transcribe rather than words to speak, MacWhisper is the tool for that job.
| Configuration | Recorded audio | Transcript text | Account | Cost |
|---|---|---|---|---|
| Local transcription, Polishing off or running on your Mac | Stays on your Mac | Stays on your Mac | No | Free |
| Local transcription + hosted Polishing | Stays on your Mac | Sent to the provider you select | Depends on provider | Depends on provider |
| Plainsay Cloud | Sent to Plainsay Cloud | Returned by Cloud; sent onward if Cloud Polishing is enabled | Yes | US$4 gross/month, VAT included; 900 transcription minutes per rolling 30 days |
| Your own speech API | Sent directly to the provider you configure | Returned to Plainsay | Provider key | Provider pricing |
The hosted routes are explicit:
api.plainsay.app. Speech may be processed on a
Plainsay-operated transcription node or forwarded to deAPI. If Cloud
Polishing is enabled, transcript text and vocabulary terms are sent from
Plainsay Cloud to OpenRouter, using its configured Gemini model. The v0.2.29
Cloud cleanup request does not send the Auto-translate target or email-layout
instruction.Plainsay Cloud's application database stores account, authentication, subscription, and usage records: an email address and/or Apple account identifier, session records, Stripe customer/subscription identifiers and status, plus each operation's timestamp, type, audio duration, estimated cost, and Polishing token counts. It deliberately stores neither recorded audio nor transcript text. Stripe receives the account email and handles checkout and payment details; Apple handles Apple sign-in, and the configured email-delivery service receives the address and sign-in message.
API proxy access logging is disabled. Minimal application event logs contain only the method, matched route template, status, and elapsed time; they exclude network addresses, headers, query strings, and request bodies. Website and signed-update delivery can still produce ordinary web-server access records.
Local mode does not mean the app never uses the network: the selected model
must be downloaded once, and the default update check contacts
api.plainsay.app (it can be switched off). The Mac client sends no analytics
or telemetry. By default, History keeps up to 100 raw and final transcript
records on this Mac for 30 days. You can choose 7, 30, 90, or 365 days, clear the
records, or stop saving them; turning History off deletes saved transcripts.
Audio is staged in an owner-only local folder while a dictation is processed
and removed after a successful or completed attempt. Interrupted recordings
can remain for recovery. On each launch, Plainsay removes ones older than 7
days and keeps no more than the newest 20; clearing History purges them too.
These files are excluded from backups.
API keys and the Plainsay Cloud session token are stored in macOS Keychain. Local mode is the default choice on a new installation; cloud use requires an explicit choice.
⌃⌥⌘T translation toggle, and Escape while recording; it never records what
you type or includes keystrokes in a transcript. On the first request,
Plainsay brings the system prompt to the front. If you request the permission
again after macOS no longer has a prompt to show, Plainsay opens the correct
System Settings pane. macOS may quit Plainsay after a new grant takes effect;
reopen it and Setup resumes at the same step.Each dictation can run for up to 10 minutes. At the boundary, Plainsay stops recording automatically, shows a notice, and processes the captured audio.
The shortcut, languages, vocabulary, model, and hold/toggle behavior can all be changed later in Settings.
⌃⌥⌘T) anywhere to toggle the last target.
Translation is off by default and requires Polishing to be enabled and
configured.key down ──► remember frontmost app → show HUD → record 16 kHz mono audio
key up ────► transcribe locally, in Plainsay Cloud, or through your API
optional Polishing, translation, and email layout
(bounded timeout or truncated reply → raw-transcript fallback)
snapshot clipboard → paste text → attempt clipboard restore
The local engines run as Core ML models accelerated on Apple silicon. Polishing asks the selected model to turn spoken language into written language while preserving wording, meaning, and tone; by default it also preserves the language. With Auto-translate enabled and a style-aware BYOK or compatible local provider selected, it renders each new result in the target language instead. Review important text. Polishing can use Plainsay Cloud, your provider, a compatible local endpoint, or remain off; the current Cloud request performs ordinary cleanup without the translation or email-layout style. It is also instructed not to invent an ending for a transcript cut off mid-sentence; if a provider reports that its own reply hit an output limit, Plainsay keeps the raw transcript instead of inserting partial edited text.
Read How it works for the pipeline and Why on-device for the privacy trade-offs.
| Local engine | Word error rate | Average latency | Real-time factor |
|---|---|---|---|
| Parakeet TDT 0.6B v3 | 2.50% | 0.10 s | 0.014 |
| Whisper large-v3-turbo | 2.89% | 0.68 s | 0.095 |
These are prepared-model results on a disclosed 50-utterance sample from
LibriSpeech test-clean; the first inference is included and no hidden
transcription warm-up is subtracted. They are not a claim about every language
or noisy real-world dictation. The exact Mac, source commit, dependency pins,
methodology, limitations, raw results, and one-command harness are in
BENCHMARK.md.
The listening HUD stays beside the text cursor while a dictation is active.
Settings › About shows the installed version and has a one-click Copy Diagnostics Command action. Run the copied command in Terminal when a dictation, permission, model, or provider problem needs a detailed report. Its audio diagnostics compare how long recording was active with how much audio was actually captured, making an early microphone cut-off visible.
Bug reports, small fixes, tests, documentation improvements, and focused feature proposals are welcome. Start with CONTRIBUTING.md, which covers the development build, tests, and how to propose a change.
swift build
swift test
For security issues, please follow SECURITY.md instead of opening a public issue.
Swift
91.9%
Rust
3.2%
Shell
3.1%
Native Mac dictation in a 12 MB download. Free Local mode with Whisper + Parakeet, reproducible benchmarks, optional Cloud. MIT-licensed client.
9
stars
75
commits
Swift
primary language
Sep 6, 2026
updated
Hold a key. Speak. Release. Get text at your cursor—or safely on the clipboard.
A native Mac dictation app in a 12 MB download, with Whisper and Parakeet running locally.
Star Plainsay on GitHub ★ · Download Plainsay.dmg · Homebrew · Website · Benchmark
12 MB native app · free Local mode · no account · no telemetry
Plainsay is free and MIT-licensed. With Local transcription and Polishing off or running on your Mac, dictation audio is not uploaded, no account or subscription is needed, and recognition works offline after the model download. Automatic checks for signed updates are enabled by default and can be disabled in Settings. Optional Plainsay Cloud provides hosted transcription and Polishing for US$4 gross/month (VAT included); Cloud speech sends recorded audio to the service and includes up to 900 transcription minutes in any rolling 30-day window. An active subscription also unlocks Auto-translate and automatic email layout for new dictations from any transcription source. In v0.2.29, those styles require a BYOK or compatible local Polishing provider; the built-in Plainsay Cloud Polishing request does not yet carry their instructions.
Requirements: macOS 14 or newer and an Apple-silicon Mac. The app is signed and notarized. Recommended multilingual models are separate one-time downloads of approximately 475–632 MB; smaller English-only options start at about 150 MB.
Download the latest notarized DMG and drag Plainsay to Applications. The stable link always points to the latest release; the release page has checksums and release notes.
brew install --cask conrader/plainsay/plainsay
Plainsay checks for signed updates automatically. You can also use Check for Updates… from its menu-bar menu.
If Plainsay earns a place in your menu bar, star the repository. It is the simplest way to help more Mac users find the project.
Plainsay is signed and notarised, then downloads a Core ML speech model at first run and executes it. Neither WhisperKit nor FluidAudio verifies a file it has just fetched, so until v0.2.27 nothing did. Expected digests for every supported model now ship inside the signed bundle. Before loading, Plainsay hashes the pinned files that were actually downloaded and refuses any present file whose contents differ. Repository paths absent because a library downloads only a subset are reported, not treated as tampering.
Nobody was checking the speech models — what the libraries actually guarantee, why verifying against a hash from the same server proves nothing, and what the fix does and does not buy.
Side-by-side pages for the alternatives, written to be useful rather than flattering — each one ends with the cases where the other app is the better buy.
All the main Mac dictation apps compared — price, what stays on your Mac, what needs an account.
vs Wispr Flow · vs superwhisper · vs VoiceInk · vs MacWhisper · vs Apple Dictation
One worth stating here: Plainsay dictates, and that is all it does. It has no file import, so if you have recordings to transcribe rather than words to speak, MacWhisper is the tool for that job.
| Configuration | Recorded audio | Transcript text | Account | Cost |
|---|---|---|---|---|
| Local transcription, Polishing off or running on your Mac | Stays on your Mac | Stays on your Mac | No | Free |
| Local transcription + hosted Polishing | Stays on your Mac | Sent to the provider you select | Depends on provider | Depends on provider |
| Plainsay Cloud | Sent to Plainsay Cloud | Returned by Cloud; sent onward if Cloud Polishing is enabled | Yes | US$4 gross/month, VAT included; 900 transcription minutes per rolling 30 days |
| Your own speech API | Sent directly to the provider you configure | Returned to Plainsay | Provider key | Provider pricing |
The hosted routes are explicit:
api.plainsay.app. Speech may be processed on a
Plainsay-operated transcription node or forwarded to deAPI. If Cloud
Polishing is enabled, transcript text and vocabulary terms are sent from
Plainsay Cloud to OpenRouter, using its configured Gemini model. The v0.2.29
Cloud cleanup request does not send the Auto-translate target or email-layout
instruction.Plainsay Cloud's application database stores account, authentication, subscription, and usage records: an email address and/or Apple account identifier, session records, Stripe customer/subscription identifiers and status, plus each operation's timestamp, type, audio duration, estimated cost, and Polishing token counts. It deliberately stores neither recorded audio nor transcript text. Stripe receives the account email and handles checkout and payment details; Apple handles Apple sign-in, and the configured email-delivery service receives the address and sign-in message.
API proxy access logging is disabled. Minimal application event logs contain only the method, matched route template, status, and elapsed time; they exclude network addresses, headers, query strings, and request bodies. Website and signed-update delivery can still produce ordinary web-server access records.
Local mode does not mean the app never uses the network: the selected model
must be downloaded once, and the default update check contacts
api.plainsay.app (it can be switched off). The Mac client sends no analytics
or telemetry. By default, History keeps up to 100 raw and final transcript
records on this Mac for 30 days. You can choose 7, 30, 90, or 365 days, clear the
records, or stop saving them; turning History off deletes saved transcripts.
Audio is staged in an owner-only local folder while a dictation is processed
and removed after a successful or completed attempt. Interrupted recordings
can remain for recovery. On each launch, Plainsay removes ones older than 7
days and keeps no more than the newest 20; clearing History purges them too.
These files are excluded from backups.
API keys and the Plainsay Cloud session token are stored in macOS Keychain. Local mode is the default choice on a new installation; cloud use requires an explicit choice.
⌃⌥⌘T translation toggle, and Escape while recording; it never records what
you type or includes keystrokes in a transcript. On the first request,
Plainsay brings the system prompt to the front. If you request the permission
again after macOS no longer has a prompt to show, Plainsay opens the correct
System Settings pane. macOS may quit Plainsay after a new grant takes effect;
reopen it and Setup resumes at the same step.Each dictation can run for up to 10 minutes. At the boundary, Plainsay stops recording automatically, shows a notice, and processes the captured audio.
The shortcut, languages, vocabulary, model, and hold/toggle behavior can all be changed later in Settings.
⌃⌥⌘T) anywhere to toggle the last target.
Translation is off by default and requires Polishing to be enabled and
configured.key down ──► remember frontmost app → show HUD → record 16 kHz mono audio
key up ────► transcribe locally, in Plainsay Cloud, or through your API
optional Polishing, translation, and email layout
(bounded timeout or truncated reply → raw-transcript fallback)
snapshot clipboard → paste text → attempt clipboard restore
The local engines run as Core ML models accelerated on Apple silicon. Polishing asks the selected model to turn spoken language into written language while preserving wording, meaning, and tone; by default it also preserves the language. With Auto-translate enabled and a style-aware BYOK or compatible local provider selected, it renders each new result in the target language instead. Review important text. Polishing can use Plainsay Cloud, your provider, a compatible local endpoint, or remain off; the current Cloud request performs ordinary cleanup without the translation or email-layout style. It is also instructed not to invent an ending for a transcript cut off mid-sentence; if a provider reports that its own reply hit an output limit, Plainsay keeps the raw transcript instead of inserting partial edited text.
Read How it works for the pipeline and Why on-device for the privacy trade-offs.
| Local engine | Word error rate | Average latency | Real-time factor |
|---|---|---|---|
| Parakeet TDT 0.6B v3 | 2.50% | 0.10 s | 0.014 |
| Whisper large-v3-turbo | 2.89% | 0.68 s | 0.095 |
These are prepared-model results on a disclosed 50-utterance sample from
LibriSpeech test-clean; the first inference is included and no hidden
transcription warm-up is subtracted. They are not a claim about every language
or noisy real-world dictation. The exact Mac, source commit, dependency pins,
methodology, limitations, raw results, and one-command harness are in
BENCHMARK.md.
The listening HUD stays beside the text cursor while a dictation is active.
Settings › About shows the installed version and has a one-click Copy Diagnostics Command action. Run the copied command in Terminal when a dictation, permission, model, or provider problem needs a detailed report. Its audio diagnostics compare how long recording was active with how much audio was actually captured, making an early microphone cut-off visible.
Bug reports, small fixes, tests, documentation improvements, and focused feature proposals are welcome. Start with CONTRIBUTING.md, which covers the development build, tests, and how to propose a change.
swift build
swift test
For security issues, please follow SECURITY.md instead of opening a public issue.
Swift
91.9%
Rust
3.2%
Shell
3.1%