What you will get
| You say | You get |
|---|---|
| the test in parser dot ts fails since PR four seven eight | the test in parser.ts fails since [#478](https://github.com/OWNER/REPO/pull/478) |
| deploy the parrot flow site to Versailles | deploy the ParrotFlow site to Vercel |
The first row needs two rules from this page. The second row needs two words in your vocabulary. Without them, ParrotFlow writes what the recogniser heard.
Which voice input to use
Claude Code has its own voice input. Its power user tips say this:
- In the CLI, run
/voice, then hold the space bar. - In Claude Code Desktop, press the microphone button.
- Voice is off by default, and your organization’s policy can turn it off.
- On macOS, the system dictation (press fn twice) also works in any terminal.
Use Claude Code’s voice input if you only dictate into Claude Code and want nothing else to install.
Use ParrotFlow if you want one tool for every app. The same hotkey works in the terminal, in your editor, in Slack and in the browser. Your vocabulary and your rules apply in all of them. Speech is turned into text on your Mac. Claude Code works fine without ParrotFlow.
Dictate into Claude Code
- Install ParrotFlow and grant its permissions. See Install and Permissions. Pasting into another app needs Accessibility.
- Click in Claude Code’s input, in the terminal or in any other app where you run it.
- Hold the hotkey and speak. A new config uses Right ⌘. Release the key.
- The text is pasted where the cursor is. Read it, edit it if you want, then press Return yourself.
ParrotFlow does not press Return for you. You always see the prompt before Claude Code gets it.
Add your project’s names
The recogniser does not know the names in your codebase. Teach each one once. The shortest way is from the terminal:
/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --learn "parrot flow" ParrotFlow
✓ parrot flow → ParrotFlow
If you installed with Homebrew, parrotflow runs the same binary.
The first quoted part is what the recogniser writes today. The second is what you want. You can also fix the word by hand after a dictation and press Y when the pill offers to learn it. Teach ParrotFlow a word covers every way, and how ParrotFlow keeps ordinary words ordinary.
Add rules for code
A rule is a pattern and what replaces it. These two are useful in prompts to a coding agent.
-
Open
~/.config/parrotflow/config.yaml. From the menu bar, use Settings, then Edit Config. -
A new config already defines
github_refs, with no step in the pipeline. Put your repository in place ofOWNER/REPOin it. If your config has nogithub_refs, see Turn “PR 478” into a link. -
Add this transform under
transforms:. It writes spoken file names as code.transforms: - name: dotted description: spoken file names as code replace: $1.$2: ['/\b(\w+) dot (ts|tsx|js|py|md|yaml|json|swift)\b/']It only acts on the extensions in the list. Add the ones your project uses.
-
Add both to the pipeline, after
numbers_en.app:makesdottedrun only in a terminal.transcription: pipeline: - transform: fillers - transform: fillers_fr when: language == "fr" - transform: dates_en - transform: numbers_en - transform: github_refs - transform: dotted app: /term|ghostty|iterm|warp/ - transform: money_en - transform: disfluencyThe pattern is matched against the app’s name and bundle identifier together, for example
Ghostty com.mitchellh.ghostty. If you run Claude Code in another app, add its name to the pattern. -
Save the file. The app reloads it at once.
Let the agent write the rules
The ParrotFlow skill teaches a coding agent how to edit config.yaml and check the change. Add it once:
npx skills add znat/parrotflow --skill parrotflow
Then ask Claude Code in your own words:
/parrotflow When I say P zero, P one or P two, I want the number as a digit.
The skill tells the agent to back up config.yaml first. Then it makes the smallest change and runs --check-config. For a rule, it also runs --replace on a sentence that must change and one that must not. It cannot press your hotkey, so it ends by asking you for one real dictation.
Check that it worked
Ask the app what it loaded:
/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --check-config
The pipeline line shows both steps, and the condition on dotted:
· pipeline sentence_repair → vocabulary → transform fillers → transform fillers_fr when language == "fr" → transform dates_en → transform numbers_en → transform github_refs → transform dotted in /term|ghostty|iterm|warp/ → transform money_en → transform disfluency
Run one sentence through your rules. --app is the app to pretend is in front.
/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --replace "the test in parser dot ts fails since PR four seven eight" --app Ghostty
the test in parser.ts fails since [#478](https://github.com/OWNER/REPO/pull/478)
With --app Slack, dotted does not run, and the output keeps “parser dot ts”. --replace skips the vocabulary step, so a learnt name does not show here. Check those with a dictation.
Last, dictate the sentence into Claude Code.
Turn a note into a bug report
A prompt step can rewrite a dictation with a language model, when you ask. Add a chip with a key, dictate a rough note, and press B. See Dictate bug reports. It needs a model, for example a local one through Ollama: see Format dictation with a local model.
Limits
- ParrotFlow pastes text. It does not send the prompt, and it does not know Claude Code’s commands.
dottedkeeps the case the recogniser wrote. “parser dot TS” becomesparser.TS.- Claude Code gets the Markdown link as text.
- A rule with
app:does not run when no app is in front.
Related
- ParrotFlow for developers.
- Programmable dictation, for rules, scripts and prompts.
- Custom vocabulary.
- Pipelines, for
app:conditions. - The ParrotFlow skill.