Skip to main content
Auto-memory
Retell + Twilio
MCP ecosystem
Founder Pres.
Obsidian + QMD
Review pass
Claude / Codex
Convex
75K+ sold
SwiftUI CloudKit
Next.js + Vercel
1,350+ locations
Shopify
Session notes
Founder
MCP forks
<60s response
Operator chapters
Founder & CEO
121+ skills
Six figures raised
Founder office
back to grid
Projects2026

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
§01The workLive system

A local-first Mac app for one job: speak into any app and get clean text, without sending audio anywhere.

Whispa
SwiftUI · on-device ASR

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.

Whispa's Home view with the headline 'Speak anywhere. Stays on your Mac.', a live transcription preview card, monthly stats, and a local-only footer.
Whispa's Insights dashboard with dictation counts, WPM, a 30-day activity heatmap, top apps, and most-corrected terms.
Whispa's Settings Engine tab with on-device ASR and cleanup models, a cleanup strength slider, and FluidAudio/CoreML runtime status.
The workHome. Push-to-talk entry point, live preview card, and monthly usage stats. / Insights. Local-only usage metrics computed from history — no account, no telemetry. / Engine settings. On-device model selection, cleanup strength, and the active FluidAudio/CoreML runtime.
§02The pipelineEnd-to-end flow
01

Capture

Hold the global hotkey and speak into whatever app is in front. AVAudioEngine records the audio locally; nothing uploads.

push-to-talk · any app
02

Transcribe

On-device ASR turns speech into text. FluidAudio runs on the Neural Engine, with an MLX worker as the fallback route.

FluidAudio · MLX
03

Clean up

A local model fixes punctuation, dictionary terms, and code tokens, and validates risky edits before any text is inserted.

local model · validated
04

Insert

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-safe
§03What I builtPieces that compound

What'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 · insert

More 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 mode

A 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 repair

You 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 hotkey
§04Build rulesLocal-first · macOS 14

The rules I held the build to.

Selected rulesworking set · macOS 14
  1. Audio, transcripts, dictionary, and history stay on the Mac; the only outbound call is an optional model download.
  2. Finalize for quality: reprocess the retained audio for the best final text before inserting it.
  3. Cleanup has to preserve meaning, so risky edits are validated before anything is pasted.
  4. Insertion restores the clipboard every time, and falls back to copy-only when Accessibility is not granted.
  5. Local builds are signed with a stable identity so microphone and Accessibility grants survive every rebuild.
  6. English-first: the model and settings normalize to one language instead of pretending to handle all of them.
§05StackEvery tool earns its line
SwiftUI / UIAppKit / Hotkey + insertionAVFoundation / Mic captureFluidAudio (CoreML / ANE) / On-device ASRParakeet TDT 0.6B v2 / ASR modelMLX worker / Fallback ASROllama · LFM2.5 / Local cleanupSwift Package Manager / BuildmacOS 14+ / Target
§06ArtifactsReceipts and public proof

The app, the build script, and the local engine. Private, nothing published.

Whispa.app

The installed Mac app. Local and private, signed with a stable identity so microphone and Accessibility permissions persist across rebuilds.

local · signed
build_and_run.sh

One command that compiles the SwiftPM target, stages dist/Whispa.app, signs the whole bundle, installs to Applications, and verifies launch.

SwiftPM → dist/Whispa.app
Local ASR worker

A 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