TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Dictate & AI: WhisperShortcut을 앱스토어에서 다운로드하고 스크린샷·평가·사용자 팁 등을 확인하세요
Download Dictate & AI: WhisperShortcut by Magnus Godde on the App Store. See screenshots, ratings and reviews, user tips, and more apps like Dictate & AI:…
생산성Swift · ShellGitHub @mgsgde온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
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.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Voice-first AI for your Mac. Press ⌘1 anywhere, speak, and the transcription inserts at the cursor — auto-paste, off by default and direct-download only — or lands on the 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, Grok, or Claude — or run fully offline with local Whisper. No account, no subscription, no backend. Open source (AGPL-3.0).README 전문 보기 ↗Voice-first AI for your Mac. Press ⌃⌥1 anywhere, speak, and the transcription inserts at the cursor — auto-paste, off by default and direct-download only — or lands on the 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, Grok, or Claude — 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.server/telemetry/./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./openrouter), then choose the model in Settings → Chat from OpenRouter's live list, grouped by vendor with rough prices — no URL or slug to type, though "Custom slug…" still takes anything. It uses the OpenRouter account connected in Settings → Accounts, the same one Dictate uses, so there is no second key. Web search and image attachments are not available through OpenRouter in Chat./chatgpt), then choose the model in Settings → Chat from the list your account offers. Requests count toward your plan's usage limits; you can see them and set a limit for WhisperShortcut in ChatGPT Settings → Usage. Text and image attachments work. Web search and connected services (Google, Trello, mail) don't run on the plan yet. Dictation can't use the plan either, because OpenAI doesn't allow ChatGPT plans for transcription in other apps. Not in the App Store build yet./v1, e.g. http://localhost:4000/v1 for LiteLLM) and that server's API key; the other two tabs then show it as set up instead of asking again. The app adds /audio/transcriptions for Dictate and /chat/completions for Chat; you name the speech model and the chat model separately (on Azure: your deployment names). Dictate Prompt transcribes your instruction on that server first, then sends the text to its chat model. One-click presets fill in the URL shape, and optional extra headers go with every request. A separate full Dictate URL can still be set under Advanced, for a speech server that does not follow the /v1 layout. The key is only ever sent to that server. Azure is detected from the URL and its key is sent the way Azure expects (api-key, not a bearer token), a bare Azure resource URL is expanded to /openai/v1, and an api-version is filled in for a classic deployment URL that omits it. Requests go straight from your Mac to that endpoint, in the region your resource or project runs in, under your own Microsoft or Google contract — no server of ours is involved. That is a statement about where inference runs and who your data-processing agreement is with; it is not a certification of this app, and whether it satisfies a professional confidentiality duty is a call for you and your counsel. Vertex takes a short-lived gcloud auth print-access-token value as the key, so it has to be pasted again about hourly; Azure keys do not expire. For dictation that never leaves the Mac at all, use Offline Mode instead.&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./whisper-shortcut:tune_whisper_shortcut runs the built-in "tune my setup" recipe (focus prompts tidies instructions that grew too long). AI apps can also read and change WhisperShortcut's settings (models, shortcuts, behaviour) through get_settings/update_settings, within the same access level. Local to this Mac, protected by an access key (a separate one for changes), and switched off while Offline Mode is on./feedback in chat, which attaches the end of the conversation. Report a Problem with Last Dictation… at the top of the Send Feedback menu opens your last dictation together with the transcription model, the date, whether a glossary echo was removed and which glossary terms appear in the text (never the rest of your glossary), so a wrong dictation can be reported without looking anything up. You can edit or delete any of it, then send it by WhatsApp or email, or copy it. 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.Bachata (not "Batchata"), are never removed, and when your transcripts keep misspelling a glossary term it proposes that correction for you to accept. A Scorecard in Settings → Smart Improvement shows whether an accepted change helped (rejected spellings, Dictate Prompt follow-up fixes, dashes added, retries), counted on your Mac from the local usage log. Prompt editors save as you type, and a customized prompt is backed up to system-prompts.md.bak before each change; if the saved prompts cannot be read, the app says so at launch instead of falling back to the defaults silently.Offline dictation (Parakeet Ultra or Whisper) works without an API key after downloading a local model in Settings. Without any cloud key, Dictate Prompt and Chat use the offline MLX model (Qwen3 4B Instruct, ~2.3 GB) on Apple Silicon — the onboarding's offline path downloads it in the background. On Macs with 16 GB of RAM or more, Chat can also use Qwen3.5 9B (~5.6 GB, slower but more knowledgeable; Chat only, /mlx9b). Adding a key before you have used the offline model moves them back to your provider's model; once you have used it (or turned Offline Mode on), they stay offline until you pick another model.
.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 |
| Chat | ⌥Space |
| Settings | ⌃⌥0 |
Installs from before these defaults keep ⌘1–⌘4 and ⌘0. Add Selection to Glossary has no default shortcut; set one in Settings → General. Every shortcut can be changed in Settings → General, and the in-app Chat always sees your current bindings.
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.
Fn (Globe) key (direct-download build only): Press Fn once to start recording, press it again to stop. It is on by default when macOS leaves the key free (System Settings → Keyboard → “Press 🌐 key to” → “Do Nothing”); otherwise turn on Also dictate with 🌐 Fn in Settings → General, under Keyboard Shortcuts, and the app shows how to free the key so macOS does not also react to it. It needs the Accessibility permission — the same one auto-paste uses; onboarding asks for it once for both.
Longer recordings (roughly ten seconds and up) start transcribing in the background while you speak, on Gemini, OpenAI, Grok, and on-device Whisper. Pressing Stop only waits for the last chunk. If any chunk fails, the app transcribes the full recording instead, so you still get a complete result.
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.8 Flash, Gemini 3.1 Pro, and Gemini 4 Argon cannot run below Low and are 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 September 2026 — latency is the median of 10 interleaved runs from one machine, so treat it as a ranking, not a guarantee:
| Model | Latency (1.3 s / 8.2 s / 21.3 s of audio) | Cost per minute | Notable |
|---|---|---|---|
| Grok Speech-to-Text | 0.39 s / 0.77 s / 1.33 s | low | Fastest on short and medium takes; empty on silence |
| GPT Transcribe | 0.74 s / 0.86 s / 1.30 s | $0.0045 flat | Default and recommended; fastest on longer takes; empty on silence; best glossary of the cloud models |
| GPT-4o Mini Transcribe | 0.72 s / 0.85 s / 1.30 s | ~$0.003 | Cheapest cloud option at OpenAI; shuts down 2027-02-26 |
| GPT-4o Transcribe | 0.74 s / 1.03 s / 1.63 s | ~$0.006 | Follows Dictation-prompt instructions; shuts down 2027-02-26 |
| Gemini 3.1 Flash-Lite | 1.01 s / 1.17 s / 1.48 s | ~$0.001 | Default if you only have a Gemini key; best glossary of the Gemini Lite tiers |
| Gemini 3.5 Flash-Lite | 0.96 s / 1.20 s / 1.40 s | ~$0.001 | See the silence caveat below |
| Whisper (offline) | depends on your Mac and model size | free | Runs locally, nothing leaves your machine |
Which offline Whisper model? Whisper Large v3 Turbo (~1.6 GB) is the recommended one: same accuracy as Large v3, roughly half the download and several times faster. Base (140 MB) is the smallest download if you just want to try offline dictation; Tiny and Base both make mistakes a transcript you intend to keep will have to be corrected for. Small (460 MB) sits in between. Medium and Large v3 are no longer offered — turbo is more accurate than Medium at the same size and matches Large v3 at half of it — but if you already downloaded one it stays selectable and deletable. Put names and jargon in the Glossary either way — that matters more than model size.
You do not have to manage the download. Selecting an offline model downloads it and loads it in the background, with progress shown in the model list. If you dictate before it is ready, the recording is kept and transcribed as soon as the model is — the app never quietly falls back to a cloud model you did not pick. The large models load on the GPU rather than the Neural Engine: the ANE needs CoreML to compile the model first, which for Large v3 Turbo ran for over 14 minutes here without finishing, while the GPU loads the same model in about 6 seconds. Tiny and Base compile quickly and keep the ANE.
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 leaked invented sentences on most silent takes, Gemini 3.1 Flash-Lite and GPT-4o Mini Transcribe leaked on some, and GPT Transcribe and Grok 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, and the replacement for GPT-4o Transcribe and GPT-4o Mini Transcribe (both shut down 2027-02-26). 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 → Accounts (Settings → Dictate links there from the model picker). 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: pick OpenRouter as the chat model 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 (the Screenshot shortcut 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.
To capture the whole screen instead, press the Screenshot shortcut and just click anywhere without dragging: the screen you clicked on is copied to the clipboard. Esc still cancels.
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/folder — share a folder so the chat can list, read, and search files in it (dropping a folder onto the chat window does the same)/workspace — limit this chat to one of the shared folders (e.g. /workspace notes); all restores every folder, off drops file access for this chat/model — switch model: type /model and pick from the list, which filters as you type (e.g. /model opus)/think — set reasoning depth for this chat (minimal, low, medium, high, or default; on Grok and GPT the default is low for fast answers, use high for research)/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 MarkdownPut a Markdown file into the app's commands folder (Settings → Chat → Commands → Open Commands Folder, or New Command… for a commented template) and it becomes a slash command: report.md is /report. Its text is sent to the selected chat model as your message, offline models included; text you type after the name (/report focus on next steps) is added as extra instructions. In a meeting chat the model also sees the full transcript, so a command like "write the minutes in our format" works with one click. Optional header lines set the button label, a description, and the scope (meeting, chat, or both); meeting commands also get a button above the meeting chat's message field. The chat shows the command as a compact chip, with the full instruction one click away. Settings lists every command it loaded and says which files it could not read and why.
/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.
Typing / lists commands only; models live behind /model. For speed, the model shortcuts still work when typed in full: /gemini, /grok, /gpt, /openai, /claude, /anthropic, /mlx, and per-model aliases such as /gemini31flashlite. Gemini models use your Google API key, Grok models use your xAI API key, OpenAI models use your OpenAI API key, and Claude models use your Anthropic API key.
Connect Google or Trello in Settings → Accounts to unlock the corresponding chat tools. Creating or deleting a calendar event, changing a Trello card, or opening a URL asks for confirmation first.
A folder shared with /folder, by dropping it on the chat window, or in Settings → Chat → Workspace Folders stays shared for every chat until you remove it. Inside it the chat can list directories, read text files, and search by name or content — read-only, and nothing outside those folders is reachable.
If a shared folder contains the agent-context files you already keep for other AI tools, they are loaded into every message of every chat automatically, the same way Cursor and Claude Code load them:
AGENTS.md, CLAUDE.md, GEMINI.md, or .cursorrules at the folder's top level.agents/rules/, .cursor/rules/, and .claude/rules/SKILL.md under .cursor/skills/, .agents/skills/, and .claude/skills/Point the chat at a notes folder that describes who you are and how you want to be helped, and it works from that context without being asked. Anything reachable under more than one of those paths — CLAUDE.md symlinked to AGENTS.md, .cursor/skills and .claude/skills both pointing at .agents/skills, or plain copies — is loaded exactly once. Whatever those files reference — a dossier folder, other notes — is not preloaded; the chat opens it with its file tools when a question calls for it.
A folder stays shared for every chat, which is usually what you want — but not always. /workspace notes limits the current chat to the folder whose path matches "notes": only its files are searchable and only its context files are loaded. /workspace on its own reports what the chat is using and lists the alternatives, /workspace all restores every folder, and /workspace off turns file access and context files off for this chat. The setting belongs to the chat and survives restarts; other chats are unaffected. It cannot grant a new folder — macOS only lets a sandboxed app take one through the picker or a drop.
By default the chat can only read. Turn on Let the chat create and change files in these folders in Settings → Chat → Workspace Folders and it can also write: create a file, append to one, or replace an exact piece of text in one. It cannot delete or rename anything, it refuses to write into .git, node_modules, or credential directories, and before it replaces or edits a file the previous content is copied into the app's WorkspaceBackups folder and kept for 30 days. While the switch is off the write tools do not exist for the model, so it says so instead of pretending to have saved something.
Hidden entries are visible to the file tools, so dot-directories like .cursor, .claude, or a personal .ai folder can be explored and read. Caches, build output, version-control internals, and credential directories (.git, node_modules, .ssh, …) are skipped.
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.
Online meetings work with headphones. Your microphone can't hear the other participants in your headphones, so the app records what your Mac plays as well and mixes it in. It decides from the output device, and follows it when you switch mid-meeting:
The meeting bar says which one is active (Headset · microphone + Mac sound or No headset · microphone only). Click it to override the detection with With headset: microphone + Mac sound or Without headset: microphone only — needed for Bluetooth or USB speakers, which look like a headset to the app. The Mac's sound means everything your Mac plays (music, videos, notifications), not just the meeting app; only WhisperShortcut's own sound is left out. The first time, macOS asks for permission under Privacy & Security ▸ Screen & System Audio Recording; without it the meeting is recorded from your microphone only, and the meeting bar says so.
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.
No connection, no lost meeting. If a part of the meeting can't be transcribed (offline, quota, the service is down), you get a popup right away, recording continues, and that part's audio is kept on your Mac. When the meeting ends it is tried again automatically; anything still missing stays available under Retry Meeting Transcription in the menu bar menu (hold ⌥ to show the kept audio in Finder). Recovered parts land at their original place in the transcript, and the summary is written once the transcript is complete.
In Settings → Smart Improvement, enable Save usage data (off by default) 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
Build prerequisites:
cannot execute tool 'metal'. Install it once with xcodebuild -downloadComponent MetalToolchain.xcodebuild needs -skipPackagePluginValidation. The scripts above already pass it.xcodebuild build works but scripts/run-tests.sh does not.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..agents/skills/: agent skills (shared by Cursor, Claude Code and the in-app Chat); .cursor/: rules, commands, CODEMAP.md and CONTEXT-CONVENTIONS.md (the layout, shared with sabaki.dance).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.
With Offline Mode on (Settings → Privacy & Permissions), requests the app itself builds may not leave your Mac and the usage log is not written at all — no transcripts, prompts, replies or audio samples on disk. Offline model downloads still reach Hugging Face through FluidAudio's and WhisperKit's own URLSessions. Note that auto-paste needs the Accessibility permission and is therefore only available in the direct-download build, not the App Store one.
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.
Offline speech models are downloaded at runtime, not shipped in this repository: Parakeet Ultra by Moondream, a retraining of NVIDIA Parakeet TDT 0.6B v3, both CC BY 4.0, plus NVIDIA Parakeet CTC 110M for Glossary terms (CC BY 4.0), all downloaded as FluidInference's Core ML conversions and run through FluidAudio (Apache 2.0); Whisper models by OpenAI (MIT), run through WhisperKit (MIT).