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 distributed as a signed and notarized DMG via GitHub Releases, a cask is the correct packaging format. Users get the exact same binary as the manual download, installed with a single command.
# Install
brew tap jatinkrmalik/vocamac
brew install --cask vocamac
# Upgrade to latest version
brew upgrade --cask vocamac
# Uninstall
brew uninstall --cask vocamac
brew untap jatinkrmalik/vocamacAfter installation, VocaMac appears in /Applications/VocaMac.app. Launch it from Spotlight or the Applications folder.
A nightly cask is also available, built daily from the latest main branch:
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 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: jatinkrmalik/homebrew-vocamac.
- Create a new public GitHub repository named
homebrew-vocamacunder thejatinkrmalikaccount - The repository must follow Homebrew tap naming:
homebrew-<name> - Clone it locally:
git clone https://github.com/jatinkrmalik/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 jatinkrmalik/vocamac && brew install --cask vocamac.
Before pushing a cask update to the tap, test it locally against a real DMG:
brew install --cask ./homebrew/Casks/vocamac.rbThis installs the cask directly from the file path, bypassing the tap. 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 vocamacWhen 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/jatinkrmalik/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] - 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
jatinkrmalik/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 with the repo scope. The token owner must have write access to jatinkrmalik/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.
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 install --cask vocamacThe tap repository may not exist or the cask file is missing.
Fix: Verify the tap:
brew tap --repair jatinkrmalik/vocamac
ls "$(brew --prefix)/Homebrew/Library/Taps/jatinkrmalik/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