Hold a key. Speak. Get polished writing.
A native macOS dictation app that turns your voice into clean, written text — anywhere on your Mac. Speech runs on-device via Whisper. Cleanup runs through your own LLM API key, so you control the model, the cost, and the data path.
macOS 14.0+ · Apple Silicon · Bring your own API key
Note
voxline is in active development. Expect rough edges. The transcription pipeline is solid; the surface around it is still maturing.
Most dictation tools dump a raw transcript with um, uh, half-finished sentences, and zero punctuation. voxline does the second step you actually want:
- Speech → text locally on your Mac via Whisper.
- Text → polished writing through a frontier LLM you choose (Claude or GPT).
Result: hold a hotkey, say what you mean — even messily — and watch clean prose appear in whatever field you're typing into.
- Hold to talk — press your hotkey, speak, release. Text appears in the focused field.
- Works in any text field — browser, email, IDE, terminal, Slack, Notes, Cursor, ChatGPT, anything that accepts a paste.
- On-device transcription — Whisper runs locally on Apple Neural Engine. Audio never leaves your Mac.
- AI cleanup, not raw dump — fillers, false starts, and rambling are smoothed out. Punctuation and capitalization are added automatically.
- Transform selected text by voice — highlight text anywhere, hold your hotkey, and say how to change it: "make this a bullet list", "make this cleaner", "make this shorter". voxline rewrites the selection in place and leaves it as a normal ⌘Z-undoable edit. No selection? It just dictates, as usual.
- Context-aware per-app formatting — voxline detects the frontmost app and tunes the output for it: terse Slack messages, structured email replies, code-comment style in your IDE, search-box one-liners. Ships with sensible defaults for 28 common apps out of the box.
- Dictation history — the last 25 cleaned dictations live in a menu-bar submenu; click any row to copy it back to the clipboard.
- Bring your own LLM key — Anthropic or OpenAI, your account, your model, your costs. Keys live in macOS Keychain.
- Menu-bar native — no Dock icon, no clutter. Configurable hotkey, mic, model, and provider.
- Privacy-aware feedback — clipboard is restored after paste; the system mic indicator turns off the moment you let go.
┌──────────────── ON YOUR MAC ─────────────────┐
│ 🎙 audio → Whisper (ANE) → transcript │
│ │
│ Context block, assembled at press time: │
│ • per-app mode prompt │
│ • focused-field AX (role, surroundings) │
│ • custom vocabulary (canonical spellings) │
└─────────────────────┬────────────────────────┘
│ transcript + context
▼
┌────────── CLAUDE or GPT (your key) ──────────┐
│ strip fillers · fix self-corrections · │
│ match register · snap to vocab │
└─────────────────────┬────────────────────────┘
│ polished writing
▼
┌──────────────── ON YOUR MAC ─────────────────┐
│ paste into focused field │
│ (clipboard restored; AX/typing fallback) │
└──────────────────────────────────────────────┘
| Model | Size | Best for |
|---|---|---|
| Whisper large-v3 turbo (default) | ~1.5 GB | Highest accuracy, multilingual |
| Whisper small.en | ~466 MB | Lightweight, English-only, fastest first run |
Models download on first use via WhisperKit and are cached locally. Switching models in Settings triggers an on-demand download — no app reinstall.
| Provider | Default model | Where to get a key |
|---|---|---|
| Anthropic | claude-haiku-4-5 | https://console.anthropic.com/settings/keys |
| OpenAI | gpt-4.1-nano | https://platform.openai.com/api-keys |
Why cloud cleanup instead of a local model? Because the gap between a frontier LLM and what fits on a laptop is still enormous for prose quality. voxline's bet: trust on-device for the audio (which is sensitive), and let you pick best-in-class for the cleanup (which only sees a transcript). You decide which provider.
| macOS | 14 (Sonoma) or later |
| Mac | Apple Silicon — M1, M2, M3, M4, or any variant. Intel Macs are not supported. |
| RAM | 8 GB minimum, 16 GB recommended (the default large-v3-turbo model is happier with headroom) |
| Disk | ~2 GB free for speech models (large-v3-turbo ~1.5 GB, small.en ~466 MB). Models cache inside the app container. |
| Network | Required on first launch to download the Whisper model, and at runtime for AI cleanup. Pure transcription works offline once the model is cached. |
| Microphone | Any input device macOS recognizes (built-in mic is fine). |
Apple Silicon is non-negotiable: voxline runs Whisper on the Apple Neural Engine via WhisperKit, and there is no ANE on Intel Macs.
Download a signed build from Releases — the DMG is notarized by Apple, and the app checks for updates automatically via Sparkle.
Or build from source:
git clone https://github.com/tfredricks/voxline.git
cd voxline
open voxline.xcodeprojBuild and run from Xcode (⌘R), or use ./scripts/build-local.sh to build Release and install straight to /Applications.
On first launch:
- Grant Microphone and Accessibility when prompted (the app will guide you).
- Pick your hotkey, mic, and Whisper model in the Settings window (⌘,). The default hotkey is Right Cmd + Right Option — change it if you'd rather use something else.
- Drop in an Anthropic or OpenAI API key in the Cleanup (AI) section.
- Hold the hotkey anywhere on your Mac and start talking.
| Permission | Why |
|---|---|
| Microphone | Capture your voice while the hotkey is held. Audio never leaves your Mac. |
| Accessibility | Detect the global hotkey and paste into the focused field. |
Input Monitoring is not required — Accessibility alone is enough for the global hotkey. macOS may still surface an Input Monitoring entry for voxline; you can leave it off. The Debug pane shows its status for diagnostics only.
What stays local:
- 🎙 Audio capture — held in memory only, never written to disk, dropped as soon as the transcript exists.
- 🧠 Speech-to-text — runs entirely on Apple Neural Engine via WhisperKit. No audio is sent anywhere.
- 🔑 API keys — stored in macOS Keychain. Not logged, not synced, not visible to other apps.
What goes to your LLM provider:
- ✍️ The transcript only — voxline sends a small text request to Anthropic or OpenAI for cleanup. Whatever provider's privacy policy applies (use enterprise tier or org-level keys if that matters to you).
- voxline has no telemetry, no analytics, and no first-party server. The only network traffic is to whichever LLM provider you choose and the Hugging Face model download on first use.
- Sandboxed app — voxline runs inside the macOS app sandbox, so model files live in the container, not your home folder.
- Settings live in one place — single-page Settings window with a status strip up top showing what's wired up. Switching providers keeps both keys around for fast toggling.
- Resilient hotkey — when permissions are revoked or restored, voxline reconciles automatically without a relaunch.
- Open source — read the code, audit the data path, file an issue, send a PR.
Built on the shoulders of:
- WhisperKit — on-device Whisper inference for Apple Silicon
- Whisper — the original model from OpenAI
- swift-transformers — model hub and inference utilities
- The macOS dictation tools that paved the way (Whispr Flow, Superwhisper, Ghost Pepper, and others) — voxline borrows the hold-to-talk UX they all converged on.
Maintainer notes — the steps to cut a tagged release.
Versioning. voxline uses SemVer for the marketing version (CFBundleShortVersionString — e.g. 0.2.1). Bump it manually when cutting a release:
- Patch (
0.2.0→0.2.1) — bugfixes only - Minor (
0.2.0→0.3.0) — new features, backwards-compatible - Major (
0.x→1.0.0) — first stable release, or breaking changes after that
The build number (CFBundleVersion) is the commit count on main and stamps itself at build time — never edit it by hand.
Release checklist.
- Update
MARKETING_VERSIONinvoxline.xcodeproj/project.pbxproj(one line). - In
CHANGELOG.md, move[Unreleased]items under a new[X.Y.Z] - YYYY-MM-DDheading. - Commit:
chore: release vX.Y.Z. - Tag and push:
git tag vX.Y.Z git push origin main --tags
- Create a GitHub Release from the tag; paste the CHANGELOG entry as the body.
That's the whole flow. Between releases, MARKETING_VERSION stays put — every dev build reports the last released version with a higher commit-count build number.
Bug reports, feature ideas, and pull requests are welcome. See CONTRIBUTING.md for build instructions, testing, the DCO sign-off requirement, and the Code of Conduct.
voxline is licensed under the Apache License, Version 2.0.
See NOTICE and THIRD-PARTY-NOTICES.md for required attributions. The "voxline" name and logo are reserved — see TRADEMARK.md.