Free, local, privacy-first dictation for macOS — powered by whisper.cpp
| FreeWispr | Wispr Flow | Apple Dictation | |
|---|---|---|---|
| Price | Free & open source | $8/month | Free |
| Privacy | 100% local, no network | Cloud-based | Cloud-based |
| Works in | Any app (terminals, editors, browsers) | Most apps | Limited app support |
| Models | Configurable (tiny → medium) | Proprietary | Fixed |
| Latency | Real-time on Apple Silicon | Network dependent | Network dependent |
| Open source | Yes | No | No |
Download the latest release — grab the .dmg, drag to Applications, done.
Signed with Apple Developer ID and notarized by Apple — no Gatekeeper warnings. Requires macOS 14+ on Apple Silicon or Intel.
- Hold Ctrl+Option (or Globe key) to record
- Release to transcribe
- Text is pasted into whatever app you're focused on
That's it. All processing happens locally on your Mac.
- Push-to-talk dictation into any app (terminals, editors, chat apps, browsers)
- Core ML acceleration on Apple Silicon for fast inference
- User-configurable model sizes — tiny (~75 MB), base (~142 MB), small (~466 MB), medium (~1.5 GB)
- Menu bar app — lives in your menu bar, no dock icon
- Auto-downloads models on first launch from Hugging Face
- macOS 14+
- Apple Silicon or Intel Mac
- Accessibility permission (for global hotkey)
- Microphone permission
cd FreeWispr
swift build
swift runOn first launch, FreeWispr will:
- Prompt for Accessibility permission (System Settings > Privacy > Accessibility)
- Download the base whisper model + Core ML encoder (~180 MB total)
- Appear as a mic icon in your menu bar
- Hold Ctrl+Option or Globe key — starts recording
- Release — stops recording and transcribes
- Click the menu bar icon to change model size or quit
- Swift / SwiftUI
- SwiftWhisper (whisper.cpp SPM wrapper)
- AVAudioEngine for audio capture
- CGEvent for global hotkey
- NSPasteboard for universal text injection via Cmd+V
FreeWispr keeps the whisper.cpp model loaded in memory for instant transcription. Measured on Apple Silicon (M4 Max) with the base model:
| Category | Baseline | During Inference | Notes |
|---|---|---|---|
| MALLOC_LARGE | ~330 MB | ~330 MB | GGML model weights + KV cache + Core ML encoder buffers |
| MALLOC_SMALL | ~27 MB | ~37 MB | General heap — audio buffers, Swift objects |
| Neural (ANE) | 72 MB clean | 111 MB peak | Core ML encoder on Apple Neural Engine; reclaimable by OS |
| Total footprint | ~375 MB | ~376 MB | Peak stays close to baseline |
Larger models use proportionally more RAM:
| Model | Disk Size | Approx. Footprint |
|---|---|---|
| tiny | ~75 MB | ~150 MB |
| base (default) | ~142 MB | ~375 MB |
| small | ~466 MB | ~700 MB |
| medium | ~1.5 GB | ~2 GB |
To prevent unbounded memory growth during long sessions:
- Whisper context recreation — The whisper.cpp context accumulates internal state (KV cache, intermediate buffers) across transcriptions (whisper.cpp #2605). FreeWispr recreates the context every 50 transcriptions to reclaim this memory.
- Audio buffer cap — Recording buffers release excess capacity after long recordings (>60s) to prevent the high-water mark from persisting.
- LanguageModelSession reuse — The AI Cleanup feature (macOS 26+) reuses a single on-device LLM session instead of creating one per correction.
To check memory usage of a running instance:
# Quick check
ps -o pid,rss,%mem,command -p $(pgrep FreeWispr)
# Detailed breakdown (requires sudo)
sudo footprint -p $(pgrep FreeWispr)
# VM region summary
vmmap --summary $(pgrep FreeWispr)Contributions are welcome! Please see the issue tracker for open issues, or open a new one to discuss your idea.
MIT

