TLDR;
- For existing users, keep
autoUpdateConfigset totruein your existing configuration. Macrowhisper will handle the migration toconfigVersion 2when you restart the service after the update. - Biggest config changes are self-explanatory and have been implemented for consistency and predictability in how Macrowhisper handles your config.
- The entire documentation has been rewritten for clarity. There's more examples and explanations.
- I released THIS VIDEO showing a few of the new things.
Details
For existing users
- Macrowhisper now uses
configVersion: 2, with clearer rules:nullmeans “inherit the default,” and""means “use an intentionally empty value.” - Built-in action templates are now clearly separated from empty values:
.noneis a do-nothing template,.autoPasteis the insert template,.runruns a Shortcut without input, andaction: ""means an empty payload. action: ""andaction: ".none"are not the same. An empty payload stays empty..nonealso turns off ESC simulation and clipboard restoration..noneis now reserved for action templates. For fields likeiconormoveTo, usenullto inherit or""for an explicit empty value.- Existing configs are migrated automatically for users that set
autoUpdateConfigtotrue, and Macrowhisper creates a one-time backup namedmacrowhisper.json.backup.pre-v2. - If
defaults.autoUpdateConfigisfalse, migration is not automatic. You can update manually withmacrowhisper --update-config. - Several config names were cleaned up and are migrated automatically:
noEsc->simEsc,pressReturn->simReturn,noUpdates->disableUpdateCheck, andnoNoti->muteNotifications.
Configuration and action behavior
smartCasing,smartPunctuation, andsmartSpacingare now available for insert actions and are enabled by default. They improve capitalization, punctuation, and spacing based on the insertion point.- Most remaining smart-insert edge cases are in apps with weak Accessibility support.
restoreClipboardDelaycan now be set globally or per action. The default is0.3s.- Default-level values are now more standardized. Omitted or
nulldefaults cleanly fall back to Macrowhisper’s built-in defaults, which also makes smaller hand-edited configs easier whenautoUpdateConfigis off. - Auto-updated configs are normalized more clearly, including a built-in
returnDelayof0.15sand cleaner persisted values like3instead of3.0. inputConditionnow works across all action types, not just insert actions.bypassModeslets you tell Macrowhisper to completely skip processing for specific Superwhisper modes, so no Macrowhisper action runs for those recordings.
More powerful actions, chaining, and placeholders
- Shortcut, shell, and AppleScript actions can now run either asynchronously or synchronously. Set
scriptAsync: falseto wait for completion, and usescriptWaitTimeoutto control how long Macrowhisper waits. - Output from synchronous script-like steps can now be reused later in the same chain through
{{actionResult}},{{actionResult:0}},{{actionResult:1}}, and so on. - New
{{appVocabulary}}captures likely names, usernames, and special terms from the active app. - New folder placeholders are available:
{{folderName}},{{folderPath}},{{folderName:<index>}}, and{{folderPath:<index>}}. Index0is the newest or current recording,1is the previous one, and so on. - The same folder lookups are also available in the CLI with
--folder-name [<index>]and--folder-path [<index>]. meta.jsonplaceholders are more flexible. You can now use nested keys and arrays such as{{promptContext.systemContext.language}}.{{segments}}now formats speaker-separated transcript data into readable output, which makes it much easier to pass multi-speaker transcripts into scripts and automations.- New
{{frontAppUrl}}exposes the active browser URL in supported browsers. - New
triggerUrlslets actions match against the current browser page. This is still experimental, and not all browsers are supported yet. - Placeholders now support transforms such as
{{placeholder::transform||find||replace}}, plus capture transforms like${1::uppercase}inside regex replacements. - Supported transforms include uppercase/lowercase variants, title case, sentence cleanup, camelCase, PascalCase, snake_case, kebab-case, trimming, and alternating/random case.
- If a transform depends on exact first-letter casing, you may want to disable
smartCasingfor that action. - Placeholder parsing was refactored so placeholders can now include curly brackets (such as
${1::uppercase}). - Fixed simReturn so chained insert actions press Return before the next nextAction step begins.
simReturnnow also works for empty""and.noneinsert actions, and can be gated with insertinputCondition.
CLI and runtime improvements
- New
--copy-action <name>renders an action and copies the result to the clipboard without polluting{{clipboardContext}}. It supports placeholder expansion and context placeholders. --exec-action,--get-action, and--copy-actionnow support--meta, so they can target a recording folder name, a recording folder path, or a compatible standalonemeta.jsonfile.- New
--run-auto [--meta <value>]runs the same automatic action selection logic Macrowhisper uses live, including bypass modes, trigger muting, triggers, and active-action fallback (a great way to re-insert your last dictation following same triggers). --run-autoignores one-time runtime overrides such as--schedule-actionand--auto-return.- New
--validate-configvalidates both JSON syntax and Macrowhisper config rules, and config error reporting is clearer. - New
--mute-triggerscan mute triggers persistently or temporarily for a set duration. --auto-returnnow uses the resolved action payload when possible instead of always falling back to a plainswResultinsert.- Running
--exec-actionnow also respectsmoveTowhen there is a real recording folder to move or delete. - Config path commands are more predictable:
--set-configsaves and switches paths without starting the daemon,--reset-configreturns to the default path the same way, and--config <path>now persists the path immediately and starts the daemon if needed. --exec-actionand--run-autorestore the clipboard using one chain-level snapshot, matching watcher-style behavior more closely.- CLI clipboard restoration now happens only once at the end of the chain, according to the final step’s
restoreClipboardandrestoreClipboardDelay. - CLI chains only restore the clipboard if a step in that chain actually wrote to the clipboard, so non-insert-only flows avoid unnecessary clipboard churn.
- CLI clipboard cleanup remains separate from clipboard restoration, so
{{clipboardContext}}protection still works without changing restore semantics.
- CLI clipboard restoration now happens only once at the end of the chain, according to the final step’s
Reliability, consistency, and performance
{{clipboardContext}}is now frozen when the recording is validated, so delayed or chained actions keep a stable clipboard snapshot instead of reading a changing live clipboard later.- That frozen clipboard behavior now applies consistently across all action types, still supports pre-recording clipboard fallback and stacking, and keeps recent Superwhisper sync noise out of the captured context.
appContext,frontApp, andappVocabularyare now captured lazily only when needed, whileselectedTextandclipboardContextare captured once per recording session and reused across chains.- Selected text capture via Accessibility has been improved.
- Active URL capture via Accessibility has been improved.
- Trigger matching for front apps is more forgiving. Macrowhisper now works if either the app name or the bundle ID is available.
- Recording validation is smarter: if an LLM result is expected, Macrowhisper waits for that result even if the raw voice field is empty.
- In those LLM-driven cases, voice triggers still match only the raw transcription (
result), not the processed LLM output. - Burst protection is stronger. If multiple new recordings appear at the same time, Macrowhisper now skips all of them instead of risking the wrong action on the wrong session.
- Logs were cleaned up to be easier to read and less noisy.
- The documentation has been fully updated to match the new behavior.
How to Update
If Installed through Homebrew
brew update
brew upgrade macrowhisper
macrowhisper --restart-service
Why do you need to re-grant accessibility permissions after update?
MacOS stores accessibility permissions tied to the absolute file path, not the application signature. Since Macrowhisper is a single binary application rather than an app bundle, when Homebrew upgrades it, the application gets placed in a version-specific folder. Each brew upgrade causes the binary to be stored at a different path, which macOS treats as a completely different application, effectively resetting the accessibility permissions.
You'll notice multiple versions of Macrowhisper appearing in your System Settings → Privacy & Security → Accessibility panel after updates. You can manually remove these stale entries when upgrading, but unfortunately there's no automatic workaround as long as you install using Homebrew due to this path-based permission system.
Alternative installation option: If you prefer not to re-grant accessibility permissions after each update, you can install Macrowhisper using the script instead of Homebrew (you do need to uninstall using Homebrew first).
If Installed with Script
curl -L https://raw.githubusercontent.com/ognistik/macrowhisper/main/scripts/install.sh | sh
macrowhisper --restart-service