Whispa
A local-first macOS dictation app. Hold a hotkey, speak into any app, and the words land as text. Transcription and cleanup run on-device, with no account, no telemetry, and no audio leaving the Mac.
- On-device
- transcription + cleanup
- System-wide
- dictate into any app
- Local-only
- no account, no telemetry
- Two ASR routes
- FluidAudio · MLX
A local-first Mac app for one job: speak into any app and get clean text, without sending audio anywhere.
A local dictation surface for the whole Mac.
Whispa turns push-to-talk speech into clean, inserted text without a cloud service: capture, transcription, cleanup, and insertion all run on the machine.



Capture
Hold the global hotkey and speak into whatever app is in front. AVAudioEngine records the audio locally; nothing uploads.
push-to-talk · any appTranscribe
On-device ASR turns speech into text. FluidAudio runs on the Neural Engine, with an MLX worker as the fallback route.
FluidAudio · MLXClean up
A local model fixes punctuation, dictionary terms, and code tokens, and validates risky edits before any text is inserted.
local model · validatedInsert
The cleaned text is pasted into the active app and the clipboard is restored, with a copy-only fallback when Accessibility is off.
frontmost app · clipboard-safeWhat's actually in the app.
The whole loop is local.
Mic capture, on-device transcription, local cleanup, and insertion all run on the Mac. The only network call is an optional one-time model download.
capture · ASR · cleanup · insertMore than a one-line dictation box.
It holds one to two minutes of speech using retained audio, then transcribes the full take for the final text. A command mode turns spoken instructions into edits and formatting instead of literal words.
retained audio · command modeA dictionary that fixes the hard words.
A personal dictionary and snippet library keep names, product terms, and code tokens correct through deterministic repair, rather than hoping the model guesses them.
deterministic repairYou whisper, it types.
The name is the act, not a model. You speak quietly, the text appears in place, and nothing leaves the room to make it happen.
quiet · local · on the hotkeyThe rules I held the build to.
- Audio, transcripts, dictionary, and history stay on the Mac; the only outbound call is an optional model download.
- Finalize for quality: reprocess the retained audio for the best final text before inserting it.
- Cleanup has to preserve meaning, so risky edits are validated before anything is pasted.
- Insertion restores the clipboard every time, and falls back to copy-only when Accessibility is not granted.
- Local builds are signed with a stable identity so microphone and Accessibility grants survive every rebuild.
- English-first: the model and settings normalize to one language instead of pretending to handle all of them.
The app, the build script, and the local engine. Private, nothing published.
The installed Mac app. Local and private, signed with a stable identity so microphone and Accessibility permissions persist across rebuilds.
local · signedOne command that compiles the SwiftPM target, stages dist/Whispa.app, signs the whole bundle, installs to Applications, and verifies launch.
SwiftPM → dist/Whispa.appA long-running on-device transcription worker. The Swift app owns capture, formatting, insertion, and permissions; the worker owns ASR and speaks newline-delimited JSON over stdio.
local engine · NDJSON over stdio

