Local Whisper is easiest to install with Homebrew. You paste one command, follow the permission prompts, then use the Right Option key to dictate into any Mac app. Requirements:
  • Apple Silicon Mac
  • macOS with Microphone and Accessibility permission
  • Enough free disk space for the app plus local models
Copy this into Terminal:
curl -fsSL https://gabrimatic.github.io/local-whisper/install.sh | bash
That installer does three things:
StepWhat happens
HomebrewInstalls Homebrew if it is missing, then installs Local Whisper from the Homebrew tap.
Local modelRuns wh setup, downloads the default Parakeet-TDT v3 speech model, and creates ~/.whisper/config.toml.
macOS permissionsOpens or checks Microphone and Accessibility permission so the global hotkey can record from any app.
After it finishes:
  1. Double-tap Right Option.
  2. Speak.
  3. Tap Right Option again, or press Space, to stop.
  4. The text is copied to the clipboard by default.
To paste directly into the current app instead, hold Right Option past the double-tap threshold, speak, and release the key to stop.

Manual Homebrew setup

Use this path when you already have Homebrew and prefer to see each command:
brew install gabrimatic/local-whisper/local-whisper
wh setup
brew install gabrimatic/local-whisper/local-whisper installs from the Local Whisper tap directly. Homebrew adds the tap automatically. wh setup finishes the app setup: config, default model, macOS permissions, and the background service. Other managed MLX speech models download when selected in Settings -> Transcription. The model card shows downloaded, partial, or missing cache state, streams download progress inline, and lets you cancel before the current engine is unloaded.

macOS permissions

Local Whisper needs two permissions:
PermissionWhy it is needed
MicrophoneRecords your voice locally.
AccessibilityLets the global hotkey work from any app and paste text back where you were typing.
macOS may list the app as Python in permission screens. That is expected because the background service runs through Local Whisper’s packaged Python runtime. The onboarding window and Settings -> Advanced -> Permissions both send the macOS permission request. If a permission was previously denied and macOS will not show the dialog again, Local Whisper opens the matching System Settings page. If setup finishes with permissions pending, open:
open x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility
Then enable Python under Accessibility. For Microphone, go to System Settings -> Privacy & Security -> Microphone and enable Python there too. Restart after changing permissions:
wh restart

Source setup

Use source setup when you want to develop Local Whisper or test unreleased changes:
git clone https://github.com/gabrimatic/local-whisper.git
cd local-whisper
./setup.sh
The source setup path installs an editable Python package in .venv, builds the Swift menu bar app, configures a LaunchAgent, and adds the wh alias to your shell profile.

Updates

Homebrew installs:
wh update
Source installs:
wh update
wh update refreshes the install, prepares the active model, rebuilds the menu bar app when needed, and restarts the background service. The menu bar “Check for updates…” action uses the same update path.

Service controls

Local Whisper runs as one background service:
wh status    # Check whether Local Whisper is running
wh start     # Start it again
wh stop      # Stop it
wh restart   # Stop and start cleanly
wh log       # Open the live service log
wh doctor    # Check install, permissions, models, and service health
wh update    # Update Local Whisper, prepare models, rebuild the menu app, and restart
Only one service can run at a time, even if both a Homebrew install and a source checkout exist on the same Mac. Extra starts detect the existing service instead of launching another one. Run wh doctor any time you want a health check.

Uninstall

Homebrew installs:
wh uninstall
brew uninstall local-whisper
Source installs:
wh uninstall
wh uninstall removes the background service, config, logs, cached models, and shell alias.