Local, privacy-first voice dictation for macOS.
No cloud. No telemetry. No nonsense.
Dexter approves.
Barely.
DexDictate is a local-first macOS menu-bar dictation app for Apple Silicon Macs. It records from your microphone, transcribes on-device with Whisper, applies local post-processing such as voice commands and vocabulary correction, and then saves or inserts the result according to your output settings.
This is not a cloud wrapper.
It does not "phone home."
Use the newest release artifact first. Current latest release: v1.5.2
Release page: v1.5.2
Download one of these Apple Silicon artifacts:
DexDictate-1.5.2-macos-arm64.dmgDexDictate-1.5.2-macos-arm64.zipDexDictate-1.5.2-macos-arm64-SHA256SUMS.txt
Standard .dmg flow:
- Open the disk image.
- Drag
DexDictate.appinto/Applications. - Launch the app and complete onboarding.
git clone https://github.com/westkitty/DexDictate_MacOS.git
cd DexDictate_MacOS
./build.sh./build.sh will:
- fetch and verify the bundled Whisper model if it is missing
- build the app and the
VerificationRunnerhelper - sign the bundle
- install into
/Applicationswhen writable, otherwise~/Applications
Useful variants:
./build.sh --user
./build.sh --system
INSTALL_DIR=/Applications ./build.sh- macOS 14 or later
- Apple Silicon (
arm64) - Xcode 15 or Command Line Tools (for source builds)
Intel Macs are not supported. The build script rejects x86_64 environments.
On first run, macOS will ask for:
- Microphone
- Accessibility
- Input Monitoring
Grant them.
If you skip them, it won't work.
This is macOS, not a suggestion.
- Menu-bar utility with four-step onboarding flow
- Local Whisper transcription via SwiftWhisper
- Bundled default model:
tiny.en - Global trigger capture from keyboard shortcuts or mouse buttons
- Trigger modes:
Hold to TalkandClick to Toggle - Input device selection with system-default fallback
- Live microphone level feedback
- Silence timeout and utterance-end tuning controls
- Optional floating HUD while recording/transcribing
- Optional sound cues
- Auto-paste output into the active app
- Clipboard-only fallback for likely secure fields
- Optional Accessibility API insertion path
- Per-app insertion overrides by bundle identifier
- Save-only behavior mode
- Launch-at-login support through
SMAppService
- Built-in voice commands for editing and formatting
- Bundled vocabulary packs
- User vocabulary layering and correction rules
- Custom
Dex <keyword>commands - Optional profanity filtering
- Local-only runtime transcription (no cloud path)
- Safe handling for likely password/secure fields
Safe Modepreset for stricter behavior- No telemetry and no speech analytics pipeline
- Detachable transcription history window
- Quick settings popover
- Help content backed by repository-owned assets
VerificationRunnerexecutable for verification checks- Benchmark scripts and sample corpus
- Release packaging for
.zipand.dmg - Release validation for bundle integrity, architecture, signing, entitlements, and hashes
- GitHub Actions CI for
swift buildandswift testonmainpushes and pull requests
- Launch the app
- Trigger dictation via shortcut (default configured in-app)
- Speak
- Text appears where your cursor is
That's the entire point.
- All audio is processed locally
- No network calls for transcription
- No analytics, tracking, or logging of user speech
- No hidden services
If something leaves your machine it's because you explicitly added it.
./scripts/fetch_model.sh
swift build
swift test
swift run VerificationRunner
./build.shUseful commands:
./build.sh [--user|--system] [--release]./scripts/setup_dev_env.sh./scripts/fetch_model.sh./scripts/run_quality_paths.sh./scripts/verify_audio_route_recovery.sh./scripts/benchmark.sh --audio <wav>python3 scripts/benchmark.py --corpus-dir <dir>./scripts/benchmark_regression.sh <wav> [baseline_ms]./scripts/trim_benchmark_corpus.sh <input_dir> [output_dir]./scripts/validate_release.sh [path_to_app_bundle]
.
├── Sources/
│ ├── DexDictate/ # menu-bar app target
│ ├── DexDictateKit/ # transcription, settings, permissions, output, resources
│ └── VerificationRunner/ # verification and benchmark helper executable
├── Tests/DexDictateTests/ # unit and integration tests
├── scripts/ # build, benchmark, setup, and validation tooling
├── docs/ # feature inventory, help content, and long-form project docs
├── assets/ # artwork, marketing images, icons, and source visuals
├── sample_corpus/ # benchmark sample audio and transcripts
├── templates/ # Info.plist template used during bundle assembly
├── build.sh # canonical build, install, and release entry point
└── Package.swift # Swift Package Manager manifest
Issues and pull requests are welcome, but review and merge are not guaranteed. Keep changes specific, test-backed and realistic about current project scope.
DexDictate is not trying to be everything.
It is:
- Local
- Fast
- Private
- Minimal
If you want cloud AI orchestration this is the wrong tool.
This repository is released under the Unlicense as public domain. You could use it in a mutual aid project. You could use it as a custom accessibility tool like I do. Or you could even sell it if you felt like embarrassing yourself in public. You can do whatever you want with it and you are encouraged to do so.
Remain ungovernable so Dexter approves.
See LICENSE.
Dexter does not celebrate features.
Dexter tolerates correctness.
This passes.
Dexter is a small, tricolor Phalène dog with floppy ears and a perpetually unimpressed expression... ungovernable, sharp-nosed and convinced he is the quality bar. Alert, picky, dependable, and devoted to doing things exactly his way: if he is staring at you, assume you made a mistake. If he approves, it works.
Thanks to the Whisper team for developing such a useful tool.

