An open-source Mac app that types what you say, and does what you ask.
Take a screenshot, paste a link, attach a file, open an app or a terminal, ask ChatGPT, send the message. By voice, in any app.
π Website Β·
Most dictation apps type whatever you say. Say "take a screenshot" and you get the words. SayControl takes the screenshot.
Hold fn, talk, let go. Your words land wherever the cursor is, and these phrases do the thing instead:
| π£οΈ Say | β‘ What happens |
|---|---|
| "take a screenshot" | A picture of your screen, pasted mid-sentence |
| "copy the link" | The address of the browser tab in front of you |
| "attach the PDF from downloads" | The newest match, attached for real. Several matches float a picker: say "the first one" |
| "copy the file path" | Whatever Finder has selected, as a full path |
| "open Chrome" | Apps and sites, by name |
| "open terminal in the downloads folder" | A terminal, already standing in that folder |
| "ask ChatGPT how to center a div" | The question opens in ChatGPT, already asked. Claude, Grok, Perplexity and Google too |
| "scratch that" | Takes back the last paste |
| "send it" | Presses Return for you |
| "add everything and commit saying ship the fix" (in a terminal) | git add . && git commit -m "ship the fix", waiting at the prompt until you press Return |
| Hold fn + control: "make it shorter" | Command mode rewrites what you selected, or the whole box |
![]() πΈ Screenshot and link, straight into Claude |
![]() π Attach a file by saying its name |
![]() π¬ Ask ChatGPT without leaving your sentence |
![]() β©οΈ Changed your mind? "Scratch that" |
Nothing runs behind your back: a terminal command waits at the prompt for your Return, and the ones you can't undo (rm, sudo, --force) won't take a spoken "send it". The full list, with every phrasing, is at saycontrol.com/controls.
- π§Ή Cleans up as it goes. Ums, stutters and false starts are gone before the text lands.
- π¨ Writes in the right register. Tones pick casual through formal for Personal, Work, Email and Agents, by the app you're in. Your words stay yours: a tone only changes punctuation, casing and layout.
- π§ Learns your words. Fix a word right after it lands and it's spelled right next time.
- π Reads the room. Names and jargon on screen are handed to the recognizer, so they come out right the first time.
- β‘ Phrases. Say "my email address" and the whole address is typed.
- π 60+ languages.
Claude Code and Codex tell you out loud when they finish or need a yes ("Your agent on fernly wants to run: npm test. Say allow or deny."), and you answer by voice. This runs on SayControl Cloud: 10 conversations to try on Free, 300 a month on Pro.
Pick in Settings βΊ Models. Every route needs a free SayControl account.
| βοΈ SayControl Cloud | π» This Mac | π Your own API key | |
|---|---|---|---|
| Speech to text | The most accurate live models we've measured, picked for you | Cohere Transcribe, Qwen3-ASR, Parakeet, Nemotron, Voxtral, Whisper | OpenAI, ElevenLabs, AssemblyAI, Soniox, xAI, Google, OpenRouter⦠|
| Cleanup and tones | Included | On your own key: Claude, OpenAI, OpenRouter, Cerebras, Groq, Google | On your own key |
| Spoken controls & Ask | Pro | β Free | β Free |
| Command mode | Pro | β Free, on your own key | β Free, on your own key |
| Price | Free: 2,000 words a week Β· Pro: $12/month, unlimited | Free | Free (your provider bills you) |
| Internet | Needed | Not needed for speech | Needed |
Most local models write while you talk. Which ones keep up live is measured on your own Mac the first time each loads.
- Download the DMG and drag SayControl to Applications. It's signed and notarized.
- Open it, sign in, and allow the Microphone, Accessibility and Input Monitoring when the setup asks.
- In System Settings βΊ Keyboard, set "Press π key to" to Do Nothing.
- Hold fn and talk.
Needs macOS 13 or later, on Apple silicon or Intel. Updates install themselves.
git clone https://github.com/soorower/SayControl.git
cd SayControl
SAYCTRL_DEV=1 ./scripts/build.sh # "SayCtrl Dev.app": every provider, plus the dev tools
./scripts/build.sh # SayControl.app: the build people downloadYou need macOS 13+, the Xcode command line tools and cmake. The first build fetches whisper.cpp, CrispASR and Sparkle at pinned versions and compiles the speech engines into the app (a few minutes, once). Without an Apple certificate the build is signed ad-hoc: it runs, but macOS asks for permissions again after every rebuild.
The two builds are separate apps to macOS, with their own settings (~/.config/sayctrl and ~/.config/sayctrl-dev), so they can sit side by side.
| Area | Where |
|---|---|
| π¦ The app: key down β record β transcribe β clean up β paste | Sources/main.swift |
| π£οΈ Spoken controls | Commands.swift (the grammar), AttachFiles.swift, FinderPaths.swift, OpenTarget.swift, TerminalTarget.swift |
| π» Terminal commands | Shell.swift: every command it can write, readable in one file |
| βοΈ Command mode | CommandMode.swift |
| π§ Speech, streaming | LiveTranscribe.swift (cloud and API-key providers over WebSocket) |
| π» Speech, on this Mac | LocalEngine.swift, LocalLive.swift, LocalSpeed.swift, scripts/engines/ (C++ around CrispASR) |
| π§Ή Cleanup and tones | Refine.swift, Tones.swift, ModelKeys.swift |
| π§ Learning your words | Corrections.swift, Replacements.swift, Phrases.swift, ScreenVocab.swift, Hints.swift |
| π€ Coding agents | AgentBridge.swift, CodexBridge.swift, ClaudeWatcher.swift, VoiceIO.swift |
| βοΈ Account and cloud | Cloud.swift, Account.swift, SignIn.swift |
| πͺ Windows and settings | SettingsUI.swift, SettingsPane.swift, ModelsPage.swift, Components.swift, Theme.swift |
| βοΈ Settings on disk | Config.swift: ~/.config/sayctrl/.env |
| π¨ Design mock-ups | design/: the HTML each screen was built from |
| π¦ Build and release | scripts/: build.sh, make_dmg.sh, release.sh |
Handy dev flags on the built binary: --transcribe <file.wav> runs a clip through the current model, --snapshot <dir> draws every settings pane to PNG, --modelsshot <dir> draws Settings βΊ Models in each state.
Your history, recordings, dictionary and phrases stay on your Mac. On a local model your voice never leaves it; on your own key it goes only to that provider. On SayControl Cloud your audio passes through our servers to be written down and isn't kept there. Details: saycontrol.com/privacy.
- whisper.cpp and ggml (MIT) run Whisper and Parakeet.
- CrispASR (MIT) runs Cohere Transcribe, Qwen3-ASR, Voxtral and Nemotron.
scripts/engines/qwen3_run.cppandvoxtral4b_run.cppare adapted from its command-line examples, andnemotron_stream.cppbuilds on its Nemotron backend. Both projects are Copyright (c) 2023-2026 The ggml authors. - Sparkle (MIT) installs updates.
- Bricolage Grotesque is under the SIL Open Font License (
Resources/Fonts/OFL.txt). - The models are their makers' work under their own licences: Cohere Transcribe, Qwen3-ASR and Voxtral (Apache 2.0), Parakeet (NVIDIA, CC BY 4.0), Nemotron (NVIDIA, OpenMDW 1.1), Whisper (OpenAI, MIT).
MIT: use it, change it, ship it. The licence covers the code, not the SayControl name or icon, so a copy you ship should go by its own name. Found a security problem? See SECURITY.md.




