🍺 Homebrew is the recommended way to install VocaMac. See the README for the full installation options.
VocaMac is distributed via Homebrew as a cask, not a formula. This distinction matters:
- Formula — for command-line tools and libraries built from source
- Cask — for pre-built macOS applications distributed as binaries (
.app,.dmg)
Since VocaMac is a native macOS .app primarily distributed via Homebrew (with DMG downloads also available via GitHub Releases), a cask is the correct packaging format.
# Install
brew tap vocahq/vocamac
brew trust vocahq/vocamac
brew install --cask vocamac
# Upgrade to latest version
brew upgrade --cask vocamac
# Uninstall
brew uninstall --cask vocamac
brew untap vocahq/vocamacAfter installation, VocaMac appears in /Applications/VocaMac.app. Launch it from Spotlight or the Applications folder.
brew trust vocahq/vocamac trusts the whole VocaMac tap. This is intentional: the stable and nightly casks conflict with each other, so Homebrew may load both cask definitions while resolving an install.
The Homebrew tap moved to vocahq/vocamac when the project transferred to the VocaHQ GitHub organization. Existing installs keep working via GitHub redirects, but if you still have the old tap and the new one, Homebrew sees the same cask in both places:
Error: Cask vocamac exists in multiple taps:
* jatinkrmalik/vocamac/vocamac
* vocahq/vocamac/vocamac
Fix: remove the old tap, then use the new one:
brew untap jatinkrmalik/vocamac
brew tap vocahq/vocamac && brew trust vocahq/vocamac && brew install --cask vocamacInstalled apps are untouched. If you already have VocaMac installed from Homebrew and only need to clean up the duplicate tap (no reinstall), brew untap jatinkrmalik/vocamac is enough — then upgrade with brew upgrade --cask vocamac.
The same recovery steps are documented in the homebrew-vocamac tap.
A nightly cask is also available, built daily from the latest main branch:
brew tap vocahq/vocamac
brew trust vocahq/vocamac
brew install --cask vocamac-nightlyThe nightly cask uses version :latest and sha256 :no_check because the DMG content changes with every daily build. Homebrew will always fetch the newest artifact without needing a cask definition update.
Stable and nightly conflict. Both casks install to /Applications/VocaMac.app, so you can only have one installed at a time. Uninstall the stable cask before installing nightly, or vice versa:
brew uninstall --cask vocamac
brew trust vocahq/vocamac
brew install --cask vocamac-nightlyNightly is a pre-release build intended for testing and early feedback. Use the stable release for daily use.
No auto-update workflow is needed for the nightly cask. The cask definition itself never changes. Homebrew re-downloads the latest DMG each time brew upgrade --cask vocamac-nightly runs.
The cask lives in a custom tap repository: VocaHQ/homebrew-vocamac.
- Create a new public GitHub repository named
homebrew-vocamacunder theVocaHQorganization - The repository must follow Homebrew tap naming:
homebrew-<name> - Clone it locally:
git clone https://github.com/VocaHQ/homebrew-vocamac.git cd homebrew-vocamac - Create the cask directory structure:
mkdir -p Casks
- Copy the cask file from the main repo:
cp /path/to/vocamac/homebrew/Casks/vocamac.rb Casks/
- Commit and push:
git add Casks/vocamac.rb git commit -m "chore: add vocamac cask" git push origin main
Users can then install with:
brew tap vocahq/vocamac
brew trust vocahq/vocamac
brew install --cask vocamacBefore pushing a cask update to the tap, test it from a tap checkout against a real DMG. Homebrew 6 rejects loose cask files outside a tap, so copy the cask into a local tap checkout first:
brew tap vocahq/vocamac
cp homebrew/Casks/vocamac.rb "$(brew --repository vocahq/vocamac)/Casks/vocamac.rb"
brew trust vocahq/vocamac
brew install --cask vocamacThis installs the cask from the local tap checkout. It requires a real DMG to exist at the URL specified in the cask (i.e., a published GitHub Release).
To verify the installation:
ls /Applications/VocaMac.app
brew info --cask vocamacTo uninstall after testing:
brew uninstall --cask vocamacThen restore or commit the tap checkout changes, depending on whether the test was for a local-only change or a real tap update.
When a new VocaMac version ships, the cask needs two updates: the version string and the sha256 checksum.
-
Download the new DMG:
curl -L -o VocaMac-X.Y.Z-arm64.dmg \ https://github.com/VocaHQ/vocamac/releases/download/vX.Y.Z/VocaMac-X.Y.Z-arm64.dmg
-
Compute the SHA-256:
shasum -a 256 VocaMac-X.Y.Z-arm64.dmg
-
Update
homebrew/Casks/vocamac.rb:- Change
version "X.Y.Z"to the new version - Replace
sha256 :no_checkwithsha256 "<computed-sha256>"
- Change
-
Test locally (see Testing Locally above)
-
Commit and push to the tap repository:
cd /path/to/homebrew-vocamac git add Casks/vocamac.rb git commit -m "chore: update vocamac to vX.Y.Z" git push origin main
The repository includes .github/workflows/update-homebrew-cask.yml, which automates cask updates on every release publish.
- The workflow triggers on
releaseevent withtypes: [published], or viaworkflow_dispatch(optionaltaginput; defaults to the latest release) - It extracts the version tag (e.g.,
v0.6.2→0.6.2) - It downloads the DMG from the release assets
- It computes the SHA-256 checksum
- It updates
homebrew/Casks/vocamac.rbwith the new version and sha256 - It pushes the change to the
VocaHQ/homebrew-vocamactap repository
The workflow needs a Personal Access Token with repo scope to push to the tap repository:
- Secret name:
HOMEBREW_TAP_TOKEN - Scope:
repo(full control of private and public repositories) - Set at: Repository Settings → Secrets and variables → Actions
Generate the token at github.com/settings/tokens. Prefer a classic PAT with the repo scope (works when the token owner is a VocaHQ org owner), or a fine-grained PAT with resource owner VocaHQ, repository access homebrew-vocamac, and permission Contents: Read and write. A fine-grained PAT issued under a personal account without org resource ownership cannot push to VocaHQ/homebrew-vocamac.
Once VocaMac meets the notability requirements, the cask can be submitted to the official homebrew-cask repository, eliminating the need for a custom tap.
- 75+ GitHub stars on the repository
- Signed and notarized DMG (VocaMac already meets this)
- Stable release (not a pre-release or nightly)
- Active maintenance (recent commits, responsive maintainer)
- Fork Homebrew/homebrew-cask
- Create a branch:
git checkout -b add-vocamac - Run
brew create --cask <dmg-url>to generate the cask file - Place it in
Casks/v/vocamac.rb(note the subdirectory structure) - Test:
brew install --cask ./Casks/v/vocamac.rb - Commit and open a PR against
Homebrew/homebrew-cask - Respond to reviewer feedback
Once merged, users install with just brew install --cask vocamac — no tap required.
Running brew uninstall --zap vocamac removes the app and all associated user data:
zap trash: [
"~/Library/Application Support/VocaMac", # Downloaded models, user config
"~/Library/Caches/com.vocamac.app", # Cached data
"~/Library/Preferences/com.vocamac.app.plist", # UserDefaults/preferences
"~/Library/Saved Application State/com.vocamac.app.savedState", # Window state
]This is useful for a clean reinstall or when troubleshooting. A plain brew uninstall --cask vocamac only removes the .app bundle and leaves user data intact.
When VocaMac is installed via Homebrew Cask, the built-in update checker detects the Homebrew installation and disables in-app DMG downloads. Instead of showing a "Download & Install" button, the update banner and About tab display a Homebrew-specific message:
Updates are managed by Homebrew. Run:
brew upgrade --cask vocamac
Nightly users see the nightly token instead:
Updates are managed by Homebrew. Run:
brew upgrade --cask vocamac-nightly
Homebrew moves the launched app into the configured app directory, usually /Applications/VocaMac.app, and keeps cask metadata under the Homebrew prefix. VocaMac checks standard Apple Silicon and Intel Caskroom roots for the supported cask tokens (vocamac and vocamac-nightly), requires a Homebrew install receipt, and verifies that the cask's staged VocaMac.app entry resolves back to the running app bundle.
| Installation Method | Update Behavior |
|---|---|
| DMG (manual) | In-app download, SHA-256 verification, open DMG |
| Homebrew Cask | Shows the matching Homebrew upgrade command; no in-app download |
This prevents conflicts between Homebrew's version management and the app's own update mechanism. Always use brew upgrade --cask vocamac or brew upgrade --cask vocamac-nightly to update a Homebrew-installed copy of VocaMac.
You have both the pre-migration tap (jatinkrmalik/vocamac) and the current tap (vocahq/vocamac) installed. Homebrew cannot choose which cask definition to use.
Fix:
brew untap jatinkrmalik/vocamac
brew tap vocahq/vocamac && brew trust vocahq/vocamac && brew install --cask vocamacSee Migrating from jatinkrmalik/vocamac.
The checksum in the cask file doesn't match the downloaded DMG. This happens when the cask hasn't been updated for a new release.
Fix: Update the cask manually (see Manual Cask Update) or wait for the auto-update workflow to complete.
A previous installation exists at /Applications/VocaMac.app.
Fix: Remove the existing app first:
rm -rf /Applications/VocaMac.app
brew trust vocahq/vocamac
brew install --cask vocamacHomebrew 6 requires explicit trust for casks from third-party taps. Trust the VocaMac tap rather than only one cask, because the stable and nightly casks declare conflicts_with and Homebrew may load the other cask while resolving an install.
Fix: Trust the VocaMac tap, then install again:
brew trust vocahq/vocamac
brew install --cask vocamacThe tap repository may not exist or the cask file is missing.
Fix: Verify the tap:
brew tap --repair vocahq/vocamac
ls "$(brew --prefix)/Homebrew/Library/Taps/VocaHQ/homebrew-vocamac/Casks/"Homebrew installs the app to /Applications/VocaMac.app — it behaves identically to a manual DMG install. If the app won't launch:
- Check Gatekeeper:
spctl --assess /Applications/VocaMac.app - If quarantined:
xattr -d com.apple.quarantine /Applications/VocaMac.app - Grant permissions in System Settings → Privacy & Security
Check the workflow run logs in the main repository's Actions tab. Common causes:
HOMEBREW_TAP_TOKENsecret is missing or expired- The tap repository doesn't exist or the token lacks write access
- The release DMG asset name doesn't match the expected pattern