To use speech to text in the Mac terminal, click in the terminal window, start dictation and speak. The words appear at the prompt. You can use the Dictation built into macOS, or a dictation app such as ParrotFlow. Neither one runs the command. You read the line, then press Return.
Code needs more care. You say “max underscore retries” and you want max_retries. Below is what each tool does with code words, and how to fix the rest.
macOS Dictation in a terminal
Turn it on in System Settings → Keyboard → Dictation. Put the cursor where you want the text, then press the Microphone key, your Dictation shortcut, or choose Edit → Start Dictation. Apple’s guide does not name any terminal. It says to place the insertion point in an app. Anthropic’s Claude Code tips say that pressing fn twice starts system dictation “in any terminal”.
What it does well:
- There is nothing to install.
- Apple lists spoken symbols, and several fit code. “underscore” gives
_, “forward slash” gives/, “backslash” gives\, “hyphen” gives-, “dot” gives.and “vertical bar” gives|. - “no space on” writes the next phrase without spaces. “no space off” goes back to normal.
- On a Mac with Apple silicon, you can keep typing while you speak.
What to watch for:
- “dash” gives an en dash,
–, not a hyphen. Say “hyphen” for a flag. - Auto-punctuation adds commas, periods and question marks. You can turn it off under Keyboard → Dictation.
- Apple says “new line” is the same as pressing Return once. Its guide does not say what that does at a shell prompt, where Return runs the line.
- Dictation stops after 30 seconds with no speech.
- It is not available while Voice Control is on.
Apple’s guide does not say whether Dictation reads the screen, or whether you can add commands of your own.
ParrotFlow in a terminal
- Install ParrotFlow and grant the Microphone and Accessibility permissions. See Install and Permissions.
- Click in the terminal pane where you want the text.
- Hold the hotkey and speak. A new config uses Right ⌘. Release the key.
- ParrotFlow pastes the text at the cursor with one ⌘V, as plain text. It puts your old clipboard back 0.4 seconds later.
- Read the line and press Return yourself. ParrotFlow does not press it.
ParrotFlow knows these terminals by name or bundle ID: Terminal, iTerm2, Ghostty, kitty, WezTerm, Alacritty, Warp, Hyper, Rio and Tabby. macOS does not report a terminal as a text field, so ParrotFlow always counts these as a place to write.
Stay in the pane until the text arrives. If the focus moves to another pane first, ParrotFlow puts the text on the clipboard so it does not land in the wrong session. Escape cancels a dictation, and the terminal gets the Escape too.
What the terminal reader adds
When you press the hotkey, ParrotFlow reads the visible screen of the terminal. macOS hands over a terminal’s screen as one block of text, so the read takes about 1 ms on a small pane. The text stays on your Mac. This needs the Accessibility permission.
ParrotFlow takes terms from that screen: identifiers, file names, backticked runs and long words the dictionary does not know. It compares each run of one to four dictated words with them, by letters and by sound. A small language model then checks that the new spelling fits the sentence.
| On screen | You say | You get |
|---|---|---|
config_loader.py in an ls listing |
open config loader dot py and fix it | Open config_loader.py and fix it. |
def parse_flags(argv): |
the bug is in parse flags | The bug is in parse_flags(). |
rewrite_line: true |
set rewrite line to false | Set rewrite_line to false. |
So when a command or your coding agent has just printed a name, you can say it in plain words. Until the language model has loaded after ParrotFlow starts, the text goes through as dictated.
Dictate code, file paths and CLI flags
ParrotFlow does not turn “underscore”, “slash”, “dot” or “dash” into symbols by default. Earlier versions had rules for this. They were removed because people also say these words in normal sentences. By default, ParrotFlow writes spoken numbers as digits and takes names from the screen. For symbols, add a rule.
A rule is a pattern and the text that replaces it. Open ~/.config/parrotflow/config.yaml. From the menu bar, use Settings, then Edit Config.
-
Add this transform under
transforms::transforms: - name: code_symbols description: spoken symbols as code characters replace: '_': ['/\s*\bunderscore\b\s*/'] '/': ['/\s*\bslash\b\s*/'] '--': ['/\bdash dash\s+/'] '$1.$2': ['/\b(\w+) dot (py|ts|js|json|md|yaml|sh|swift)\b/'] -
Add it to
pipeline:, afternumbers_en. Theapp:line keeps it out of your email and chat.transcription: pipeline: - transform: fillers - transform: fillers_fr when: language == "fr" - transform: dates_en - transform: numbers_en - transform: code_symbols app: /term|ghostty|kitty|alacritty|warp/ - transform: money_en - transform: disfluencyIf your pipeline has more steps, keep them. The pattern is matched against the app’s name and bundle ID together.
termcovers Terminal, iTerm2 and WezTerm. -
Save. The app reloads the file at once.
We ran these sentences through the rule with ParrotFlow 0.18.0:
| You say | App in front | You get |
|---|---|---|
| rename max underscore retries | Ghostty | rename max_retries |
| the bug is in app slash parser dot py | Terminal | the bug is in app/parser.py |
| git commit dash dash amend | iTerm2 | git commit --amend |
| rename max underscore retries | Slack | rename max underscore retries |
To check a sentence of your own without speaking, run it through your rules. --app names the app to pretend is in front.
/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --replace "git commit dash dash amend" --app Ghostty
Limits of this rule:
- “underscore” and “slash” join the words on both sides. “cd slash tmp” becomes
cd/tmp. Type the first slash of an absolute path yourself. - A rule matches only the words it names. If the recogniser writes “double dash” instead, nothing changes. The
transcribed:line in~/Library/Logs/ParrotFlow.logshows what it wrote. Add that spelling to the rule. - The recogniser can start the line with a capital and end it with a full stop. In our test, the text “Git commit dash dash amend.” became
Git commit --amend.Check the end of the line before you press Return.
For a name you say every day, use the vocabulary instead. See Teach ParrotFlow a word.
When the text does not appear
Check these in order. The full list is in ParrotFlow hears you but types nothing.
- Press ⌘V. When ParrotFlow does not paste, for example after a pane switch, it leaves the text on the clipboard.
- Check Accessibility. Run
grep "launched —" ~/Library/Logs/ParrotFlow.log | tail -1and look foraccessibility=Granted. - If ParrotFlow shows a notice such as “Terminal has taken the keyboard”, an app has secure input on. In Terminal, look for a checkmark next to Terminal → Secure Keyboard Entry. Apple says this setting can stop other apps from detecting what you type in Terminal. ParrotFlow’s docs do not say that secure input stops the paste. Turn the setting off to rule it out.
- The terminal inside an editor, such as VS Code, is not on ParrotFlow’s list of terminals, and its docs do not cover it. Try a standalone terminal to compare.
For macOS Dictation, Apple’s troubleshooting page lists the checks: Dictation turned on, the right shortcut, the right language, and a working microphone.
Coding agents in the terminal
Sources
Last checked: 24 October 2026. ParrotFlow facts are from release 0.18.0. We ran the rule and screen examples through ParrotFlow’s command line, with screen text we wrote, not a live terminal. We did not test live dictation or macOS Dictation in a terminal.
- Apple: Dictate messages and documents on Mac, Commands for dictating text on Mac, If Dictation on Mac doesn’t work as expected, Use secure keyboard entry in Terminal.
- Anthropic: Claude Code power user tips.
- ParrotFlow: Pipelines, for rules,
app:and screen spelling. Configuration, for how text is pasted.