Voice-first macOS menu bar app: dictate, voice-edit clipboard, read aloud, AI chat with Google/Trello tools, and live meeting notes. Bring your own keys (Gemini, GPT, Grok) or run offline with Whisper.
73
stars
1,349
commits
Swift
primary language
Sep 10, 2026
updated
Voice-first AI for your Mac. Press ⌘1 anywhere, speak, and the transcription lands on your clipboard — ready to paste into any app. Speak an instruction (⌘2) to rewrite whatever you copied, have any selected text read aloud (⌘4), or open an AI chat that works with your Calendar, Gmail, Tasks, and Trello (⌥Space).
Bring your own API keys — Gemini, and optionally GPT or Grok — or run fully offline with local Whisper. No account, no subscription, no backend. Open source (AGPL-3.0).

▶️ Watch the full demo on YouTube · Website: whispershortcut.com · Made by Magnus Gödde
⬇️ Get WhisperShortcut on the Mac App Store — the easiest way to install, with automatic updates.
.dmg from GitHub Releases./folder and the chat can read it — including the AGENTS.md / CLAUDE.md files and the rules and skills under .agents/, .cursor/, or .claude/ you already keep there, which are loaded into every message automatically so the chat works from your own context. Turn on file editing in Settings and it can write notes back into that folder too. Grok models additionally search X.com posts, which makes them the best pick for opinions, trends, and breaking social-media chatter — and /x @handle narrows that search to the accounts you care about.&t=1h50m10s) and it analyses a ten-minute window around it — the sensible way to ask about one passage of a long podcast. Without a timestamp the whole video is sent; if it is too long for the model, the opening ten minutes are used and the answer says so. Video analysis is Gemini-only: other providers cannot open YouTube links./feedback in chat, which attaches the end of the conversation. Share Usage Report in Settings → About adds a summary of how the app actually behaved for you — how many dictations and chats, which models, how often a result had to be redone — with no transcripts, prompts, replies, or audio in it, shown to you in full beforehand. Every route prefills the app and macOS version, and nothing is sent until you press send.Offline Whisper dictation works without an API key after downloading a local model in Settings.
.dmg from Releases.WhisperShortcut.app into /Applications.Default menu bar shortcuts (all configurable in Settings → General):
| Action | Default shortcut |
|---|---|
| Dictate | ⌘1 |
| Dictate Prompt | ⌘2 |
| Screenshot | ⌘3 |
| Read Aloud | ⌘4 |
| Voice Feedback | ⌘5 |
| Flag Meeting Moment | ⌘6 |
| Chat | ⌥Space |
| Settings | ⌘0 |
Press Stop in the menu bar (or use the active mode's shortcut again) to cancel recording, TTS playback, or in-flight processing.
To change a shortcut, open Settings → General, click Record next to it and press the combination once. Any key works with at least one of ⌘/⌥/⌃, and F1–F20 can be bound on their own, without a modifier — that is the binding to use for a programmable (QMK/VIA) keyboard with a dedicated dictation key.
Accuracy tuning (Settings → Dictate, cloud models only):
0.0 (the default) is verbatim. The models' own default is 1.0, which is what the app sent before this setting existed and the most likely source of invented or swapped words.Minimal is the default; raising it can help with hard audio, accents, and unusual vocabulary. On Flash-Lite the latency cost is close to zero; on Pro it roughly doubles. Gemini 3.1 Pro cannot run below Low and is clamped to it.Which transcription model should I pick? All of them work; they differ in speed, price, and how they behave on hard audio. Measured on the same recordings in August 2026 — latency is the median of 10 interleaved runs from one machine, so treat it as a ranking, not a guarantee:
| Model | Latency (1.4 s / 8.9 s / 35 s of audio) | Cost per minute | Notable |
|---|---|---|---|
| Grok Speech-to-Text | 0.35 s / 0.97 s / 1.45 s | low | Fastest at every length tested |
| GPT Transcribe | 0.69 s / 0.99 s / 2.04 s | $0.0045 flat | Returns nothing on silence instead of inventing text |
| GPT-4o Mini Transcribe | 0.76 s / 0.97 s / 1.61 s | ~$0.003 | Cheapest cloud option at OpenAI |
| GPT-4o Transcribe | 0.72 s / 1.07 s / 2.16 s | ~$0.006 | Follows Dictation-prompt instructions |
| Gemini 3.1 Flash-Lite | 1.58 s / 1.28 s / 1.83 s | ~$0.001 | Best glossary adherence of the Gemini tiers |
| Gemini 3.5 Flash-Lite | 1.86 s / 2.97 s / 6.63 s | ~$0.001 | Slowest tested; see the caveat below |
| Whisper (offline) | depends on your Mac and model size | free | Runs locally, nothing leaves your machine |
Recommendations by what you care about:
A note on silence. If a recording is silent or unintelligible, some models invent a plausible-sounding sentence built from your Glossary instead of returning nothing. WhisperShortcut filters implausible transcripts, but the filter cannot catch every case: in our tests Gemini 3.5 Flash-Lite produced normal-length invented sentences that passed the filter, while Gemini 3.1 Flash-Lite's inventions were long enough to be caught and GPT Transcribe returned nothing at all. If you often start recording before you start speaking, that is worth knowing when picking a model.
GPT Transcribe (OpenAI): OpenAI's current transcription model, billed by audio duration rather than tokens. It is a pure speech-to-text model, so it ignores the Dictation system prompt; your Glossary still applies and is sent as keyword hints, which in testing was the more reliable way to get names and product terms spelled right. Unlike the GPT-4o transcription models, it returns an empty transcript on silence instead of echoing the glossary back.
OpenRouter: select the OpenRouter transcription model, then click Connect OpenRouter Account in Settings → Dictate. That opens OpenRouter in a browser sheet where you sign in — or create an account, if you do not have one — and approve; the app receives its key directly, so there is nothing to copy and paste. You pay OpenRouter for what you use, and can top up or revoke access from your OpenRouter dashboard at any time. If you already hold a key, "Enter an API key manually instead" still accepts it. The same connection covers chat as well: use the Use OpenRouter preset button in Settings → Chat and no key is needed there either. The model list in Settings → Dictate is fetched live from OpenRouter and filtered to models that actually accept audio, with rough prices shown, so there is no slug to look up or memorise — pick one from the menu. New models appear as OpenRouter adds them, without an app update. "Custom slug…" still lets you type anything, for models the list does not cover. OpenRouter has no dedicated transcription endpoint, so the audio is sent as a chat message; that means your Dictation system prompt and Glossary apply here, unlike the OpenAI and self-hosted transcription endpoints.
Optional: capture a screenshot (⌘3 or chat /screenshot) before or during the prompt when screenshot-in-prompt mode is enabled.
Use Settings → Read Aloud to pick the TTS provider, voice, Smart Rewrite, and playback speed. Chat replies can also be read aloud from the message actions.
Press the Screenshot shortcut to capture the screen. Captures can be attached to the next Dictate Prompt or chat message, or saved to a folder when that option is enabled in Settings → Screenshot.
Open the chat window from the menu bar or its configured shortcut. Chat sessions are stored locally.
Core slash commands:
/new — start a new chat/screenshot — attach a screenshot to your next message/attach — open the file picker for PDFs, images, or text/model — switch model (e.g. /model 3.5 flash)/think — set reasoning depth for this chat (minimal, low, medium, high, or default)/x — Grok only: limit X search to specific accounts for this chat (e.g. /x @karpathy @simonw); /x off searches all of X again. Set a default under Settings → Chat/settings — open Settings/pin / /unpin — keep the window open or close on focus loss/meeting — start or stop live meeting recording/copy — copy the chat history as Markdown/feedback opens a message to the developer with the end of the current chat quoted, so a problem you were just discussing does not have to be described twice.
Model shortcuts include /gemini, /grok, /gpt, /openai, and per-model aliases such as /gemini35flash. Gemini models use your Google API key, Grok models use your xAI API key, and OpenAI models use your OpenAI API key.
Connect Google or Trello in Settings → Chat to unlock the corresponding chat tools.
Type /meeting in chat to start and stop live meeting recording. Audio is rotated into chunks, transcribed, and appended to the meeting transcript. Saved transcripts live in the app's Application Support folder.
While a meeting runs:
While the meeting runs there is only the chat — the notes are already in it. Once a meeting has ended, its view has two tabs: Chat and Notes, where Notes holds the final summary. Chunks rotate faster while the chat window is on screen so the live view keeps up, and fall back to the configured interval when it is not.
Dictate and Dictate Prompt keep working during a meeting, and the menu bar shows which of the two recordings is running: 📝 for the meeting, 🔴 / 🤖 while you dictate on top of it. Stopping a meeting is not instant — the last chunk still has to be transcribed — so the meeting bar says Finishing… and the menu bar shows ⏳ until the transcript and summary are saved.
In Settings → General, enable Save usage data if you want the app to learn from your interactions. Then use Improve from usage or Generate with AI to review suggested updates to system prompts, user context, or the Whisper glossary before accepting them.
git clone https://github.com/mgsgde/whisper-shortcut.git
cd whisper-shortcut
bash install.sh
For development, build and restart the app with:
bash scripts/rebuild-and-restart.sh
Useful scripts:
scripts/rebuild-and-restart.sh: Build Debug, sync bundled docs, and restart the local app.scripts/logs.sh: Stream or filter app logs.scripts/create-release.sh: Create a tagged release.scripts/test-gemini-models.sh, scripts/test-grok-models.sh, scripts/test-openai-models.sh: Check provider model availability and basic responses.WhisperShortcut/: Swift source for the macOS app.WhisperShortcut/Docs/: User-facing markdown bundled with the app (mirrored from the repo README and data-directory docs on rebuild).WhisperShortcut.xcodeproj/: Xcode project and shared schemes.scripts/: Local development and release helper scripts..github/workflows/release.yml: GitHub Actions workflow for signed, notarized release builds.plans/: Shared implementation plans and specs..cursor/: Cursor agent commands, skills, and rules (see .cursor/commands/README.md).Core files:
AppState.swift: Central app state machine.MenuBarController.swift: Main app orchestrator.SpeechService.swift: Dictation, Dictate Prompt, and Read Aloud logic.ChatView.swift: Chat UI and view model.ChatTools.swift: ChatToolRegistry and local, Google, and Trello chat tools.TranscriptionModels.swift: Gemini, OpenAI, Whisper, and self-hosted transcription models.Settings/: Settings UI, defaults, and persistence.WhisperShortcut stores settings, chat sessions, meeting transcripts, usage logs, short-lived Smart Improvement audio samples, and downloaded models on your Mac. API keys, OAuth refresh tokens, and Trello tokens are stored in Keychain.
WhisperShortcut uses one canonical app data location so sandboxed and non-sandboxed builds see the same files:
~/Library/Containers/com.magnusgoedde.whispershortcut/Data/Library/Application Support/WhisperShortcut/
See the App Data Location section in privacy.md for what each subfolder contains.
GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for details.
Hacker News (1)
Swift
93.0%
Shell
5.5%
Python
1.6%
Voice-first macOS menu bar app: dictate, voice-edit clipboard, read aloud, AI chat with Google/Trello tools, and live meeting notes. Bring your own keys (Gemini, GPT, Grok) or run offline with Whisper.
73
stars
1,349
commits
Swift
primary language
Sep 10, 2026
updated
Voice-first AI for your Mac. Press ⌘1 anywhere, speak, and the transcription lands on your clipboard — ready to paste into any app. Speak an instruction (⌘2) to rewrite whatever you copied, have any selected text read aloud (⌘4), or open an AI chat that works with your Calendar, Gmail, Tasks, and Trello (⌥Space).
Bring your own API keys — Gemini, and optionally GPT or Grok — or run fully offline with local Whisper. No account, no subscription, no backend. Open source (AGPL-3.0).

▶️ Watch the full demo on YouTube · Website: whispershortcut.com · Made by Magnus Gödde
⬇️ Get WhisperShortcut on the Mac App Store — the easiest way to install, with automatic updates.
.dmg from GitHub Releases./folder and the chat can read it — including the AGENTS.md / CLAUDE.md files and the rules and skills under .agents/, .cursor/, or .claude/ you already keep there, which are loaded into every message automatically so the chat works from your own context. Turn on file editing in Settings and it can write notes back into that folder too. Grok models additionally search X.com posts, which makes them the best pick for opinions, trends, and breaking social-media chatter — and /x @handle narrows that search to the accounts you care about.&t=1h50m10s) and it analyses a ten-minute window around it — the sensible way to ask about one passage of a long podcast. Without a timestamp the whole video is sent; if it is too long for the model, the opening ten minutes are used and the answer says so. Video analysis is Gemini-only: other providers cannot open YouTube links./feedback in chat, which attaches the end of the conversation. Share Usage Report in Settings → About adds a summary of how the app actually behaved for you — how many dictations and chats, which models, how often a result had to be redone — with no transcripts, prompts, replies, or audio in it, shown to you in full beforehand. Every route prefills the app and macOS version, and nothing is sent until you press send.Offline Whisper dictation works without an API key after downloading a local model in Settings.
.dmg from Releases.WhisperShortcut.app into /Applications.Default menu bar shortcuts (all configurable in Settings → General):
| Action | Default shortcut |
|---|---|
| Dictate | ⌘1 |
| Dictate Prompt | ⌘2 |
| Screenshot | ⌘3 |
| Read Aloud | ⌘4 |
| Voice Feedback | ⌘5 |
| Flag Meeting Moment | ⌘6 |
| Chat | ⌥Space |
| Settings | ⌘0 |
Press Stop in the menu bar (or use the active mode's shortcut again) to cancel recording, TTS playback, or in-flight processing.
To change a shortcut, open Settings → General, click Record next to it and press the combination once. Any key works with at least one of ⌘/⌥/⌃, and F1–F20 can be bound on their own, without a modifier — that is the binding to use for a programmable (QMK/VIA) keyboard with a dedicated dictation key.
Accuracy tuning (Settings → Dictate, cloud models only):
0.0 (the default) is verbatim. The models' own default is 1.0, which is what the app sent before this setting existed and the most likely source of invented or swapped words.Minimal is the default; raising it can help with hard audio, accents, and unusual vocabulary. On Flash-Lite the latency cost is close to zero; on Pro it roughly doubles. Gemini 3.1 Pro cannot run below Low and is clamped to it.Which transcription model should I pick? All of them work; they differ in speed, price, and how they behave on hard audio. Measured on the same recordings in August 2026 — latency is the median of 10 interleaved runs from one machine, so treat it as a ranking, not a guarantee:
| Model | Latency (1.4 s / 8.9 s / 35 s of audio) | Cost per minute | Notable |
|---|---|---|---|
| Grok Speech-to-Text | 0.35 s / 0.97 s / 1.45 s | low | Fastest at every length tested |
| GPT Transcribe | 0.69 s / 0.99 s / 2.04 s | $0.0045 flat | Returns nothing on silence instead of inventing text |
| GPT-4o Mini Transcribe | 0.76 s / 0.97 s / 1.61 s | ~$0.003 | Cheapest cloud option at OpenAI |
| GPT-4o Transcribe | 0.72 s / 1.07 s / 2.16 s | ~$0.006 | Follows Dictation-prompt instructions |
| Gemini 3.1 Flash-Lite | 1.58 s / 1.28 s / 1.83 s | ~$0.001 | Best glossary adherence of the Gemini tiers |
| Gemini 3.5 Flash-Lite | 1.86 s / 2.97 s / 6.63 s | ~$0.001 | Slowest tested; see the caveat below |
| Whisper (offline) | depends on your Mac and model size | free | Runs locally, nothing leaves your machine |
Recommendations by what you care about:
A note on silence. If a recording is silent or unintelligible, some models invent a plausible-sounding sentence built from your Glossary instead of returning nothing. WhisperShortcut filters implausible transcripts, but the filter cannot catch every case: in our tests Gemini 3.5 Flash-Lite produced normal-length invented sentences that passed the filter, while Gemini 3.1 Flash-Lite's inventions were long enough to be caught and GPT Transcribe returned nothing at all. If you often start recording before you start speaking, that is worth knowing when picking a model.
GPT Transcribe (OpenAI): OpenAI's current transcription model, billed by audio duration rather than tokens. It is a pure speech-to-text model, so it ignores the Dictation system prompt; your Glossary still applies and is sent as keyword hints, which in testing was the more reliable way to get names and product terms spelled right. Unlike the GPT-4o transcription models, it returns an empty transcript on silence instead of echoing the glossary back.
OpenRouter: select the OpenRouter transcription model, then click Connect OpenRouter Account in Settings → Dictate. That opens OpenRouter in a browser sheet where you sign in — or create an account, if you do not have one — and approve; the app receives its key directly, so there is nothing to copy and paste. You pay OpenRouter for what you use, and can top up or revoke access from your OpenRouter dashboard at any time. If you already hold a key, "Enter an API key manually instead" still accepts it. The same connection covers chat as well: use the Use OpenRouter preset button in Settings → Chat and no key is needed there either. The model list in Settings → Dictate is fetched live from OpenRouter and filtered to models that actually accept audio, with rough prices shown, so there is no slug to look up or memorise — pick one from the menu. New models appear as OpenRouter adds them, without an app update. "Custom slug…" still lets you type anything, for models the list does not cover. OpenRouter has no dedicated transcription endpoint, so the audio is sent as a chat message; that means your Dictation system prompt and Glossary apply here, unlike the OpenAI and self-hosted transcription endpoints.
Optional: capture a screenshot (⌘3 or chat /screenshot) before or during the prompt when screenshot-in-prompt mode is enabled.
Use Settings → Read Aloud to pick the TTS provider, voice, Smart Rewrite, and playback speed. Chat replies can also be read aloud from the message actions.
Press the Screenshot shortcut to capture the screen. Captures can be attached to the next Dictate Prompt or chat message, or saved to a folder when that option is enabled in Settings → Screenshot.
Open the chat window from the menu bar or its configured shortcut. Chat sessions are stored locally.
Core slash commands:
/new — start a new chat/screenshot — attach a screenshot to your next message/attach — open the file picker for PDFs, images, or text/model — switch model (e.g. /model 3.5 flash)/think — set reasoning depth for this chat (minimal, low, medium, high, or default)/x — Grok only: limit X search to specific accounts for this chat (e.g. /x @karpathy @simonw); /x off searches all of X again. Set a default under Settings → Chat/settings — open Settings/pin / /unpin — keep the window open or close on focus loss/meeting — start or stop live meeting recording/copy — copy the chat history as Markdown/feedback opens a message to the developer with the end of the current chat quoted, so a problem you were just discussing does not have to be described twice.
Model shortcuts include /gemini, /grok, /gpt, /openai, and per-model aliases such as /gemini35flash. Gemini models use your Google API key, Grok models use your xAI API key, and OpenAI models use your OpenAI API key.
Connect Google or Trello in Settings → Chat to unlock the corresponding chat tools.
Type /meeting in chat to start and stop live meeting recording. Audio is rotated into chunks, transcribed, and appended to the meeting transcript. Saved transcripts live in the app's Application Support folder.
While a meeting runs:
While the meeting runs there is only the chat — the notes are already in it. Once a meeting has ended, its view has two tabs: Chat and Notes, where Notes holds the final summary. Chunks rotate faster while the chat window is on screen so the live view keeps up, and fall back to the configured interval when it is not.
Dictate and Dictate Prompt keep working during a meeting, and the menu bar shows which of the two recordings is running: 📝 for the meeting, 🔴 / 🤖 while you dictate on top of it. Stopping a meeting is not instant — the last chunk still has to be transcribed — so the meeting bar says Finishing… and the menu bar shows ⏳ until the transcript and summary are saved.
In Settings → General, enable Save usage data if you want the app to learn from your interactions. Then use Improve from usage or Generate with AI to review suggested updates to system prompts, user context, or the Whisper glossary before accepting them.
git clone https://github.com/mgsgde/whisper-shortcut.git
cd whisper-shortcut
bash install.sh
For development, build and restart the app with:
bash scripts/rebuild-and-restart.sh
Useful scripts:
scripts/rebuild-and-restart.sh: Build Debug, sync bundled docs, and restart the local app.scripts/logs.sh: Stream or filter app logs.scripts/create-release.sh: Create a tagged release.scripts/test-gemini-models.sh, scripts/test-grok-models.sh, scripts/test-openai-models.sh: Check provider model availability and basic responses.WhisperShortcut/: Swift source for the macOS app.WhisperShortcut/Docs/: User-facing markdown bundled with the app (mirrored from the repo README and data-directory docs on rebuild).WhisperShortcut.xcodeproj/: Xcode project and shared schemes.scripts/: Local development and release helper scripts..github/workflows/release.yml: GitHub Actions workflow for signed, notarized release builds.plans/: Shared implementation plans and specs..cursor/: Cursor agent commands, skills, and rules (see .cursor/commands/README.md).Core files:
AppState.swift: Central app state machine.MenuBarController.swift: Main app orchestrator.SpeechService.swift: Dictation, Dictate Prompt, and Read Aloud logic.ChatView.swift: Chat UI and view model.ChatTools.swift: ChatToolRegistry and local, Google, and Trello chat tools.TranscriptionModels.swift: Gemini, OpenAI, Whisper, and self-hosted transcription models.Settings/: Settings UI, defaults, and persistence.WhisperShortcut stores settings, chat sessions, meeting transcripts, usage logs, short-lived Smart Improvement audio samples, and downloaded models on your Mac. API keys, OAuth refresh tokens, and Trello tokens are stored in Keychain.
WhisperShortcut uses one canonical app data location so sandboxed and non-sandboxed builds see the same files:
~/Library/Containers/com.magnusgoedde.whispershortcut/Data/Library/Application Support/WhisperShortcut/
See the App Data Location section in privacy.md for what each subfolder contains.
GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for details.
Hacker News (1)
Swift
93.0%
Shell
5.5%
Python
1.6%