github ognistik/macrowhisper v2.0.0

19 hours ago

TLDR;

  • For existing users, keep autoUpdateConfig set to true in your existing configuration. Macrowhisper will handle the migration to configVersion 2 when 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: null means “inherit the default,” and "" means “use an intentionally empty value.”
  • Built-in action templates are now clearly separated from empty values: .none is a do-nothing template, .autoPaste is the insert template, .run runs a Shortcut without input, and action: "" means an empty payload.
  • action: "" and action: ".none" are not the same. An empty payload stays empty. .none also turns off ESC simulation and clipboard restoration.
  • .none is now reserved for action templates. For fields like icon or moveTo, use null to inherit or "" for an explicit empty value.
  • Existing configs are migrated automatically for users that set autoUpdateConfig to true, and Macrowhisper creates a one-time backup named macrowhisper.json.backup.pre-v2.
  • If defaults.autoUpdateConfig is false, migration is not automatic. You can update manually with macrowhisper --update-config.
  • Several config names were cleaned up and are migrated automatically: noEsc -> simEsc, pressReturn -> simReturn, noUpdates -> disableUpdateCheck, and noNoti -> muteNotifications.

Configuration and action behavior

  • smartCasing, smartPunctuation, and smartSpacing are 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.
  • restoreClipboardDelay can now be set globally or per action. The default is 0.3s.
  • Default-level values are now more standardized. Omitted or null defaults cleanly fall back to Macrowhisper’s built-in defaults, which also makes smaller hand-edited configs easier when autoUpdateConfig is off.
  • Auto-updated configs are normalized more clearly, including a built-in returnDelay of 0.15s and cleaner persisted values like 3 instead of 3.0.
  • inputCondition now works across all action types, not just insert actions.
  • bypassModes lets 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: false to wait for completion, and use scriptWaitTimeout to 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>}}. Index 0 is the newest or current recording, 1 is 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.json placeholders 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 triggerUrls lets 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 smartCasing for 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.
  • simReturn now also works for empty "" and .none insert actions, and can be gated with insert inputCondition.

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-action now support --meta, so they can target a recording folder name, a recording folder path, or a compatible standalone meta.json file.
  • 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-auto ignores one-time runtime overrides such as --schedule-action and --auto-return.
  • New --validate-config validates both JSON syntax and Macrowhisper config rules, and config error reporting is clearer.
  • New --mute-triggers can mute triggers persistently or temporarily for a set duration.
  • --auto-return now uses the resolved action payload when possible instead of always falling back to a plain swResult insert.
  • Running --exec-action now also respects moveTo when there is a real recording folder to move or delete.
  • Config path commands are more predictable: --set-config saves and switches paths without starting the daemon, --reset-config returns to the default path the same way, and --config <path> now persists the path immediately and starts the daemon if needed.
  • --exec-action and --run-auto restore 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 restoreClipboard and restoreClipboardDelay.
    • 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.

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, and appVocabulary are now captured lazily only when needed, while selectedText and clipboardContext are 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

Don't miss a new macrowhisper release

NewReleases is sending notifications on new releases.