Skip to main content
Two local passes rewrite your transcript before it is inserted. Both are off by default, and neither involves a model or the network.

Text replacements

Turn on the master toggle and the rule list appears. Each rule has two fields on the row itself.
  • Spoken phrase. What to look for in the transcript, for example my email.
  • Insert this text. What to put there instead, for example alex@example.com.
Behind the chevron:
  • Regex. Treat the spoken phrase as a regular expression instead of a literal string.
  • Trim before. Also consume whitespace immediately before each match.
  • Trim after. Also consume whitespace immediately after each match.
  • Caps. None (default), UPPERCASE, lowercase, or Capitalize, applied to this rule’s output.
  • Enabled. On by default. Turn it off to park a rule without deleting it.
The whole list exports to and imports from a JSON file.

Magic tokens

Use these inside the inserted text. Transform tokens act on the entire rule output no matter where you put them, and they are removed from the result. If a token and the Caps dropdown disagree, Caps is applied last and wins.
Rules run in order, so a later rule sees the output of earlier ones.Literal matching is case-sensitive. my email will not match “My email”. Tick Regex and start the pattern with (?i) for a case-insensitive match.$ is literal in the inserted text, so regex capture groups such as $1 cannot be referenced. Regex is for matching, not for templating.An invalid regex is skipped, with a warning in the log. It will not break the rest of your rules.Empty spoken phrases are skipped, so a half-finished rule is harmless.
Importing only accepts the fields listed above. Anything else in the JSON is dropped, and an imported rule can never turn on a capability that is not already a per-rule option.

Spoken emoji

Say “happy emoji” or “thumbs up emoji” to insert 😊 or 👍. A command is a known emoji name followed by the word “emoji”. Both parts are required. The trailing “emoji” is what keeps ordinary words like “happy” or “fire” from silently turning into pictures. Anything it does not recognize is left exactly as transcribed, punctuation and spacing included.
A name can be one to five words, and longer names win over shorter ones. “Broken heart emoji” gives 💔 rather than matching just “heart”.The trailing keyword is accepted within one edit of “emoji”, so “emojii” and “emoj” still work.Names are matched exactly first, then fuzzily, so “smily”, “thumps up”, and “rokcet” all land. Fuzzy matching is skipped for names shorter than five characters, because short words are too easy to confuse (“bad” versus “sad”). An ambiguous match is rejected rather than guessed.

Pipeline order

AI cleanup runs first, then spoken emoji, then text replacements, and the text is inserted last. Emoji expansion sitting after AI cleanup means it works on plain dictation too, not just cleaned-up text. Replacements come last because hand-written, deterministic fix-ups should always win over whatever the model produced.
Last modified on August 7, 2026