Releases: VocaHQ/vocamac
Release list
🌙 Nightly Build — 2026-08-09
⚠️ Nightly Build — Not for Production Use
This is an automated nightly build from the latest
mainbranch.
It is intended for developers and testers who want to try the latest changes
before they are included in a stable release.This build may be unstable, contain bugs, or include incomplete features.
Do not use it as your daily driver. If you encounter issues, please
report them — your feedback helps us improve!
🏷️ Latest Stable Release
👉 For a reliable experience, use the latest stable release: v0.7.2
📋 What's Changed Since v0.7.2
7 commit(s) since the last stable release (v0.7.2) • built from main @ e849142
✨ New Features
🐛 Bug Fixes
- fix: harden multi-engine follow-ups after #191 (#192) (0405e66)
- fix: tolerate Bluetooth HFP settle for headset input routing (#197) (af9e7db)
- fix(ci): update Homebrew cask workflow and brew docs for VocaHQ org (#194) (35114f5)
- fix: open update details in a standalone window (#190) (1d5ed11)
🔧 Maintenance & Other
- docs: document Homebrew dual-tap conflict after VocaHQ migration (#195) (aa9d15a)
- feat: add Parakeet, Apple Speech, and ONNX transcription engines (#191) (6c96cb3)
- fix: open update details in a standalone window (#190) (1d5ed11)
📝 Other Changes
📥 Installation
- Download
VocaMac-nightly-20260809-e849142-arm64.dmg - Open the DMG and drag VocaMac to Applications
- Open VocaMac from Applications
- Grant Microphone, Accessibility, and Input Monitoring permissions when prompted
This nightly build is Developer ID signed and notarized by Apple.
macOS will open it without any security warnings.
Checksums (SHA-256)
c4f9caa66dcc12211966649d02556a30d4f1e9cd432dbfa69b0b7c468b05186f VocaMac-nightly-20260809-e849142-arm64.dmg
c4f9caa66dcc12211966649d02556a30d4f1e9cd432dbfa69b0b7c468b05186f VocaMac-nightly-arm64.dmg
a70f61cdda99c4df15b398a31bc9323ab018966e43bed439b08b6ffdc77f1e0e VocaMac-nightly-20260809-e849142-arm64.zip
a70f61cdda99c4df15b398a31bc9323ab018966e43bed439b08b6ffdc77f1e0e VocaMac-nightly-arm64.zip
Requirements
- macOS 14 (Sonoma) or later
- Apple Silicon (arm64)
v0.7.2
VocaMac 0.7.2
Pick a microphone in Settings, record, and get text back. That was not reliable after switching audio inputs in some setups. This patch fixes the route handling behind that failure.
Dictation reliability
- A selected microphone now has time to become the active input before VocaMac starts recording. The app rebuilds the input graph and checks the route, so it does not leave a tap attached to the old device. (#187)
- Switching back to System Default now clears a previously pinned microphone and uses the current macOS input again. (#187)
- If a device change still produces an empty or silent capture, VocaMac resets the input and points you to Settings > Audio instead of sending silence to transcription. (#187)
How to update
Download VocaMac-0.7.2-arm64.dmg from the Assets below, open it, and drag VocaMac to Applications. Replacing an existing signed VocaMac install keeps your settings and permissions.
VocaMac 0.7.2 requires macOS 13 (Ventura) or later and an Apple Silicon Mac.
Full changelog: v0.7.1...v0.7.2
v0.7.1
VocaMac 0.7.1 🎙️
Hold the hotkey, speak, get your words back. This patch is for when that stopped working.
If recording flashed on then died, or stayed active and produced nothing, this is for you. Most often the mic route was silent or disconnected after rapid push-to-talk or an audio-device switch. VocaMac keeps the route warm between quick recordings now. It also detects silent captures and resets cleanly when the input has gone away.
🎙️ Dictation reliability
- Rapid push-to-talk works again. The audio engine stays warm for a short window between recordings instead of tearing down and reacquiring a route that often comes back silent. (#178, reported in #176 by @flesler)
- Silent mic routes recover. A capture with no real mic audio resets the input so the next take can succeed. (#178, #184)
- Clear message when there's no audio. Silence no longer goes to Whisper. VocaMac explains that no mic audio was detected and points clamshell users at an external input. (#184)
- Headsets handle startup route changes. Brief reconfiguration when Bluetooth and other headset mics come online no longer kills the recording. (#175, reported in #174 by @yaviral17)
- Hotkey recordings don't get stuck. Startup and shutdown recover when audio hardware is slow or changes under the app. (#173)
- Custom Vocabulary no longer blanks the result. If Whisper returns nothing with a vocabulary prompt, VocaMac retries once without it. (#182, reported in #181 by @flesler)
✨ Polish
- The Settings window is resizable again. (#180)
🙏 Contributors
Thanks to the people who filed the bugs and helped prove the fixes:
- @flesler filed the silent-capture report (#176) with the gap-rate table that pointed at warm-engine reuse, opened the custom-vocab empty-transcript bug (#181), and retested the signed builds for #178 and #182.
- @yaviral17 reported non-default mics stopping recording immediately (#174), with video and logs that led to the headset fix in #175.
📦 How to update
If you installed with Homebrew:
brew upgrade --cask vocamacPrefer a direct download? Grab VocaMac-0.7.1-arm64.dmg from the Assets below and drag it into Applications.
You'll need macOS 13 (Ventura) or later, Apple Silicon (M1 or newer), and at least 8 GB of RAM.
Full changelog: v0.7.0...v0.7.1
v0.7.0
VocaMac 0.7.0 🎙️
This one's big, and a lot of it came from the community. VocaMac now learns the words you actually use, keeps track of how much you dictate, gives you real control over hotkeys and your microphone, and installs cleanly through Homebrew.
Thanks to everyone who filed ideas, opened PRs, and helped test.
✨ What's new
- Custom Vocabulary. Teach VocaMac the names, brands, and jargon you use every day (
kubectl,PostgreSQL,Grafana, your teammates' names) so they stop coming out wrong. It all stays on your Mac. (#169) - Usage Statistics. A new Stats tab with your lifetime words, transcriptions, total time, speaking speed, and a daily streak. Everything is stored locally, and nothing is uploaded. Big thanks to @Mr-Sunglasses, who built this one. (#148, with follow-ups in #168 and #170)
- Hotkey presets and custom recording. Pick a preset (Right Option, Right Command, Right Control, Fn, or a function key), or hit Record and press any key to set your own. (#139)
- Choose your microphone. Pin VocaMac to a specific input instead of always following the system default. If that device disconnects, it falls back on its own. (#156)
- Homebrew install.
brew install --cask vocamacnow works, there's avocamac-nightlycask too, and in-app updates know when you installed through Homebrew and point you the right way. (#157, #159)
🐛 Fixes and polish
- Fixed text injection in the Raycast search bar. Thanks @Mr-Sunglasses (#144)
- Recording state now resets correctly when the mic fails to start (#151)
- Onboarding fixes: the hotkey mode syncs right away, and the quick-test result actually shows up. Thanks @d1scolor (#133) and @debanjanc01 (#166)
- The model picker now matches WhisperKit's Apple Silicon support, so you only see models that run on your Mac (#161)
- VocaMac releases the audio engine when it's idle, freeing your mic for other apps. Thanks @AaronMoat (#136)
- Refreshed the website with the new features, screenshots, and an SEO pass (#172)
🙏 Contributor shout-outs
0.7.0 leaned on the community more than any release so far:
- @Mr-Sunglasses built the whole Usage Statistics feature (#148), added developer conveniences like
/build-quick(#146) and path-based PR labeling (#145), and fixed a couple of things along the way (#144, #141). - @debanjanc01 fixed the onboarding quick-test result (#166).
- @AaronMoat fixed the audio engine lifecycle (#136).
- @d1scolor fixed onboarding hotkey syncing (#133).
If you've got an idea or a bug, open an issue or a PR. It genuinely makes a difference.
📦 How to try it
Homebrew is the easiest way in:
brew tap jatinkrmalik/vocamac
brew trust jatinkrmalik/vocamac
brew install --cask vocamacAlready running VocaMac? Update with:
brew upgrade --cask vocamacPrefer a direct download? Grab VocaMac-0.7.0-arm64.dmg from the Assets below and drag it into Applications.
You'll need macOS 13 (Ventura) or later, Apple Silicon (M1 or newer), and at least 8 GB of RAM.
Full changelog: v0.6.2...v0.7.0
v0.6.2-beta
A patch release focused on stability and clarity. If you were hitting the macOS 26 crash when stopping or starting a recording, this is the build for you.
Crash fixes
- Audio engine tap lifecycle hardening (#134).
AVAudioNode.installTapcan raise an Objective-CNSExceptionfor things like a stale tap, an invalid input format, or a transient state during an audio route change. Swift cannot catch those, so the whole app was aborting withSIGABRT. This release wrapsinstallTap,engine.start(), andremoveTapin a small Objective-C exception bridge, validates the input format up front, removes any lingering tap before installing a new one, and fully resets engine state on failure so the UI no longer gets stuck in the red recording state. - App state and audio engine lifecycle stabilization (#130, closes #129). Production
AppStateis now backed by a single process-wide instance, and allAudioEnginemutations (startRecording,stopRecording,forceReset, and the audio configuration change handler) are serialized through a dedicated queue. This removes a plausible race between route-change notifications and user-driven start/stop, and prevents duplicate production service graphs being created when SwiftUI recreates theAppvalue during menu-bar scene setup.
UX improvements
- "Experimental" model badge (#137). The orange "Unoptimized" badge on the Models tab is renamed to "Experimental" with a hover tooltip that explains what it actually means: WhisperKit has not shipped a tuned variant of that model for your chip family, but your hardware can usually run it anyway. The confirmation alert wording is softened to match, the "Recommended for your device" line gets a clarifying subtitle that the recommendation is based on chip tuning rather than RAM, and the warning triangle on the Onboarding "Try Anyway" button is replaced with a sparkles icon. AppState also now logs the full WhisperKit recommendation triple (
default,supported,disabled) at startup, which makes future "why is this model marked Experimental on my Mac?" questions answerable from the log file alone.
Website
- Footer cleanup (#128). Dropped duplicated cross-product links and added a Changelog link.
Thanks
Special thanks to @slatlasdev and @terrythomas for sticking with us through the macOS 26 crash, sending detailed crash reports, and confirming on the nightly that the fix held. This release would not have shipped without your patience.
Verifying the download
Checksums are attached to this release. Verify with:
shasum -a 256 -c checksums.txt🧪 Experimental Intel (x86_64) Build — community test only
⚠️ Read this first
This is an unsupported, experimental build of VocaMac for Intel (x86_64) Macs, created in response to #98.
VocaMac officially ships Apple Silicon only because WhisperKit is built around the Apple Neural Engine. On Intel Macs, transcription falls back to CPU and is significantly slower.
What this build is
- A one-off cross-compiled
x86_64build of VocaMac0.6.2from theexperimental/intel-buildbranch. - Unsigned and un-notarized. Gatekeeper will block it on first launch — see install instructions below.
- Provided so the user from #98 (and any other Intel-Mac community members) can try it and report back.
What this build is NOT
- A supported, stable release. Do not use this for daily work.
- A signal that VocaMac is moving to support Intel Macs — that decision depends entirely on community feedback.
Install instructions
# 1. Download the DMG below, then:
sudo xattr -cr ~/Downloads/VocaMac-0.6.2-experimental-intel-x86_64.dmg
# 2. Mount the DMG, drag VocaMac.app to /Applications
# 3. First launch — Gatekeeper will refuse. Either right-click → Open,
# or strip quarantine again:
sudo xattr -cr /Applications/VocaMac.app
open /Applications/VocaMac.appWhat we need from testers
- Does the app launch at all?
- Does the Tiny model download succeed?
- Does push-to-talk transcription produce text?
- How slow is it on your specific Intel Mac (chip + RAM)?
Please reply on #98 with your findings.
SHA-256: 3533aa1f89c103650bed3d13db9854916515397d470672ff6e128785e53979e8
v0.6.1
VocaMac v0.6.1 - Crash fixes + Dvorak paste fix
A focused patch release with two startup/recovery crash fixes, a paste regression on non-QWERTY keyboard layouts, and CI hardening to keep nightly + release pipelines healthy ahead of GitHub's Node 16/20 deprecation.
If you're on v0.6.0, the in-app update checker will offer this release automatically. All users are encouraged to upgrade — every fix in this release addresses a reproducible, user-visible problem.
🐛 Bug Fixes
Critical: Startup crash from misplaced SPM resource bundles (#118, #119)
Some users hit an immediate crash on launch — the app would bounce in the menu bar then disappear, with the system log mentioning Could not load tokenizer assets. The root cause was that SPM resource bundles (notably swift-transformers_Hub.bundle, which holds the GPT-2 / T5 tokenizer fallbacks WhisperKit relies on) were not being staged inside the .app in a layout that Bundle.module could find at runtime.
Fix: The build pipeline now uses xcodebuild and places resource bundles at Contents/Resources/<bundle>.bundle/Contents/Resources/<file> — the canonical location that Bundle.module's xcodebuild accessor resolves to. Bundle layout is now validated automatically in release, nightly, and (as of this release) PR builds, so this class of regression cannot reach a release again.
Critical: SIGSEGV crash when stopping recording after a microphone replug (#121)
A reproducible crash:
- Start recording
- Replug or change the microphone (the engine resets and recovers)
- Click Stop Recording in the popover
- App crashes with
EXC_BAD_ACCESS (SIGSEGV)
Root cause: SwiftUI's _ButtonGesture wraps action closures with MainActor.assumeIsolated(), which on macOS 26 / Swift 6 can read a freed executor reference if the view tree mutates at the same instant the gesture fires — exactly what happens when the device-change handler flips appStatus → .idle and removes the Stop button while the user's click is mid-dispatch.
Fix: All Task { } closures inside Button actions are now Task { @MainActor in }, which binds the task directly to the main actor and skips the implicit assumeIsolated hop. Applied across MenuBarView, UpdateView, OnboardingView, and SettingsView.
Audio engine: stale callback flags after device interruption (#121)
AudioEngine.handleAudioConfigurationChange now also clears silenceCallbackFired and maxDurationCallbackFired when a device-change interruption occurs. Previously these stale true flags meant neither silence detection nor the max-duration limiter would fire on the next recording session after a replug — recordings could run indefinitely.
Paste failure on Dvorak and other non-QWERTY layouts (#123, #125)
Users on Dvorak (and any non-QWERTY layout) reported that VocaMac transcribed audio correctly but never injected the text into the focused field — instead the active field was often cancelled.
Root cause: TextInjector posted a synthetic Cmd+V using the QWERTY hardware keycode for V (9). macOS interprets synthesized keystrokes through the active layout, and on Dvorak keycode 9 produces ., so the system fired Cmd+. (cancel) instead of Cmd+V (paste).
Fix: TextInjector now resolves the virtual keycode for the character v on the currently active ASCII-capable keyboard layout via TISCopyCurrentASCIICapableKeyboardLayoutInputSource + UCKeyTranslate, and posts that keycode. Dvorak, Colemak, AZERTY, and Programmer Dvorak users now paste correctly. A QWERTY fallback is retained for safety.
🛠 CI / Build Pipeline
- GitHub Actions bumped to Node.js 24 compatible versions (#122) —
actions/checkoutv4 → v6,actions/cachev4 → v5,actions/upload-artifactv4 → v7. Resolves the deprecation warnings that began appearing on April 23, 2026 ahead of GitHub's June 2, 2026 forced cutover. - Bundle-layout validation now runs on every PR build (#127) — the
Verify SPM resource bundles are correctly stagedstep (previously only in release & nightly) was backported topr-build.yml, so any future #119-class regression is caught at PR review time, not at release time. - Local-dev tip in
build.shnow points to the correct binary path (#127) — the first-time-setup hint referenced the oldswift buildoutput path that no longer exists since the switch toxcodebuild.
📚 Documentation
- Update-check 403 explainer (#120) — README now explains that the in-app update check can return a GitHub 403 on shared/VPN networks where the unauthenticated rate limit is exhausted by other users on the same egress IP, and how to work around it.
- Release-notes are now drafted out-of-tree (#126) —
AGENTS.mdanddocs/RELEASE.mdcodify a "release notes live on the GitHub Release page, not in the repo" policy so we stop accumulating staleRELEASE_NOTES_v*.mdfiles. The notes you're reading right now are the first release shipped under this policy.
📊 What's Changed
| PR | Type | Description |
|---|---|---|
| #118 | fix | Copy SPM resource bundles to Contents/MacOS/ to prevent startup crash |
| #119 | fix | Keep SPM resource bundles flat in Contents/MacOS to fix startup crash |
| #120 | docs | Explain GitHub 403 update-check error on shared/VPN networks |
| #121 | fix | Task { @MainActor in } in view button actions to prevent SIGSEGV; clear stale AudioEngine callback flags |
| #122 | ci | Bump GitHub Actions to Node.js 24-compatible versions |
| #125 | fix | Paste correctly on Dvorak and other non-QWERTY layouts |
| #126 | docs | Stop committing per-version release notes to the repo |
| #127 | fix | Pre-release hygiene — correct dev binary path and add bundle validation to PR builds |
| #124 | chore | Bump version to 0.6.1 |
🙏 Thanks
- @slatlasdev — for the reliable reproduction steps and the
.ipscrash report that made the SIGSEGV (#121) crash trivial to track down. - @robertmassaioli who reported #123 with crystal-clear repro steps.
- Everyone who hit the first-launch tokenizer crash and patiently helped narrow down the bundle-layout root cause for #118 / #119.
📦 Installation
Download VocaMac-0.6.1-arm64.dmg from the assets below, drag VocaMac to Applications, and launch. Verify the download with checksums.txt if desired:
shasum -a 256 -c checksums.txt --ignore-missingIf you're already on v0.6.0, the in-app update checker will offer this release automatically.
Requirements: macOS 13 (Ventura) or later, Apple Silicon (M1 or later), 8 GB RAM minimum.
Full changelog: v0.6.0...v0.6.1
v0.6.0-beta
Zero-Download First Launch 🚀
VocaMac now ships with the Whisper Tiny model bundled inside the app. On first launch, it's automatically installed into Application Support so you can start dictating immediately — no internet connection required, no waiting for a model download.
Previously, every fresh install would fail to load a model until the user manually triggered a download. This eliminates that friction entirely.
Note: The bundled Tiny model is optimised for speed on all Apple Silicon devices. You can switch to a larger model any time via Settings.
Nightly Builds — Now Signed & Notarized ✅
Nightly builds now go through the same Developer ID signing and notarization pipeline as stable releases. Every nightly DMG:
- Is signed with Apple Developer ID — no Gatekeeper warnings
- Is notarized and stapled — validates offline
- Embeds a proper SemVer pre-release version string (e.g.
0.6.0-nightly.20260414+abc1234) so you always know exactly which nightly you're running
Nightly builds also now have an on-demand /build trigger — comment /build on any PR and a signed, notarized DMG is built from that branch and posted as a comment within ~10–20 minutes.
Bug Fixes
Fixed: Stale Paste After Transcription
After injecting transcribed text, pressing Cmd+V within ~2 seconds would paste the transcribed text instead of the user's original clipboard contents. The clipboard restore had a race condition — it was scheduled after the simulated Cmd+V keypress instead of running before it.
Reported by Dinç Ciftci (via #104). Fixed in #106 by @jatinkrmalik.
Fixed: Tokenizer Asset Crash on First-Run Download
Fresh installs showed "No model loaded" with [ERROR] Tokenizer assets are missing immediately after the model downloaded successfully. Two separate issues were fixed:
ensureTokenizerAssetswas pre-validating tokenizer files before passing the folder to WhisperKit — but WhisperKit fetches tokenizers itself during load. Removed the redundant pre-validation entirely. (#113 by @jatinkrmalik)- An incorrect path construction caused the validation to look for tokenizer files in the wrong directory anyway. (#112 by @jatinkrmalik)
Fixed: Double Startup / Duplicate Model Loading
Every launch showed duplicate startup sequences in the logs, meaning the model was being loaded 2–3× unnecessarily. SwiftUI was instantiating multiple AppState objects and performStartup was called on all of them. Fixed by guarding startup with a Task-based once-flag keyed to the specific instance. (#114 by @jatinkrmalik)
Fixed: GitHub Update Checker Rate Limiting (HTTP 403)
The update checker was consuming one of GitHub's 60 unauthenticated API requests/hour per IP on every check — easily exhausting the pool on shared networks (office NAT, VPN). Fixed by sending If-None-Match ETag headers so GitHub returns a rate-limit-free 304 Not Modified when nothing has changed. (#115 by @jatinkrmalik)
What's Changed
| PR | Description | Author |
|---|---|---|
| #110 | feat: support bundled tiny model installs | @jatinkrmalik |
| #101 | feat: sign, notarize, and version nightly builds | @jatinkrmalik |
| #106 | fix: eliminate clipboard restore race condition — closes #104 (reported by Dinç Ciftci) | @jatinkrmalik |
| #112 | fix: resolve tokenizer asset crash on first-run download | @jatinkrmalik |
| #113 | fix: let WhisperKit handle tokenizer fetching instead of pre-validating | @jatinkrmalik |
| #114 | fix: prevent double performStartup across multiple AppState instances | @jatinkrmalik |
| #115 | fix: add ETag caching to UpdateChecker to avoid GitHub rate limits | @jatinkrmalik |
| #107 | ci: add on-demand PR build workflow with /build comment trigger | @jatinkrmalik |
| #111 | ci: use Python venv for huggingface-cli on macOS 15 runners | @jatinkrmalik |
| #103 | fix: correct version extraction in nightly build workflow | @jatinkrmalik |
| #102 | docs: add nightly builds section to README | @jatinkrmalik |
Issue Credits 🙏
| Issue | Reporter | Description |
|---|---|---|
| #104 | Dinç Ciftci | Clipboard restore delay causes stale paste after transcription |
Installation
- Download
VocaMac-0.6.0-arm64.dmg - Open the DMG and drag VocaMac to Applications
- Open VocaMac from Applications
- Grant Microphone, Accessibility, and Input Monitoring permissions when prompted
This release is Developer ID signed and notarized by Apple.
macOS will open it without any security warnings.
Requirements
- macOS 13 (Ventura) or later
- Apple Silicon (arm64)
Checksums (SHA-256)
See checksums.txt for verification.
Full Changelog: v0.5.0...v0.6.0
v0.5.0-beta
In-App Updates
VocaMac can now check for updates automatically and download the latest release right from the app. On launch (once every 24 hours), it queries GitHub Releases and shows an update banner in the menu bar popover when a newer version is available. One-click download with real-time progress, SHA-256 integrity verification, and guided drag-to-Applications install.
Manual check available at Settings > About > Check for Updates.
Improved Mic Indicator Placement
The floating mic indicator now uses a 4-tier Accessibility API fallback strategy instead of the previous binary caret-or-mouse approach:
| Tier | Method | Works In |
|---|---|---|
| 1 | Exact caret position | Native AppKit/SwiftUI apps |
| 2 | Focused element bounds | Electron apps, terminal emulators |
| 3 | Focused window position | Almost all apps |
| 4 | Mouse cursor | Last resort |
This significantly improves indicator placement in apps like Cursor and iTerm2 that don't implement full AX text attributes.
Overhauled Model Recommendation & Support
The model recommendation system has been completely overhauled to fix contradictory states where a larger model could show as "Recommended" while a smaller one was marked "Too Large":
- Fixed prefix matching —
isModelSupported()now uses exact prefix boundary matching and checks WhisperKit's disabled list, preventing false positives from turbo/quantized variant name collisions (e.g.large-v3vslarge-v3_turbo). - Monotonic support ordering — If a smaller model is unsupported, all larger models are automatically marked unsupported too.
- Recommendation validation — The recommended model is now verified against actual support status, with fallback to the largest supported model.
- Force-load unoptimized models — Users can now override device recommendations and try any model with a confirmation warning about potential performance impacts.
- Friendlier labels — "Unsupported" red badge replaced with "Unoptimized" orange badge, and the recommendation footer shows display names instead of raw WhisperKit model IDs.
Other Changes
- Fixed large-v3 model incorrectly marked as unsupported due to substring matching against disabled model variants. The recommendation engine now checks the supported list directly and falls back to the best supported model when the default is too large for the device.
- Improved log rotation efficiency — reduced max log size from 5 MB to 1 MB, cached date formatter, eliminated per-write
fsync, and added proper error handling during rotation. - Tests run 2x faster with zero system side effects — all service dependencies (audio, hotkeys, sounds, permissions) are now injected via protocols with mock implementations.
Installation
- Download
VocaMac-0.5.0-arm64.dmg - Open the DMG and drag VocaMac to Applications
- Open VocaMac from Applications
- Grant Microphone, Accessibility, and Input Monitoring permissions when prompted
This release is Developer ID signed and notarized by Apple.
macOS will open it without any security warnings.
Requirements
- macOS 13 (Ventura) or later
- Apple Silicon (arm64)
Checksums (SHA-256)
See checksums.txt for verification.
What's Changed
- fix: large-v3 model incorrectly marked as unsupported due to substring matching bug by @jatinkrmalik in #92
- fix: improve log rotation efficiency and reduce max log size by @jatinkrmalik in #94
- fix: inject mock services in tests to eliminate system side effects by @jatinkrmalik in #95
- feat: add in-app GitHub Releases update flow by @jatinkrmalik in #96
- fix: add tiered fallback for cursor indicator positioning by @jatinkrmalik in #93
- chore: bump version to 0.5.0 by @jatinkrmalik in #97
- fix: overhaul model recommendation logic and allow force-loading unoptimized models by @jatinkrmalik in #99
Full Changelog: v0.4.0...v0.5.0
v0.4.0-beta
Highlights
VocaMac is now Developer ID signed and Apple notarized. No more xattr -cr commands, no more Gatekeeper warnings. Download the DMG, drag to Applications, and go.
What's New
🔐 Developer ID Signing & Distribution
- App is signed with
Developer ID Application: JATIN KUMAR MALIK (92962VK378) - Hardened runtime enabled, fully notarized and stapled by Apple
- Branded DMG with drag-to-install layout — no terminal commands needed
- Full CI/CD pipeline: cert import → build → sign → notarize → draft release
- Notarization retry logic for transient network failures
🐛 Bug Fixes
- Stuck recording on audio device changes — switching headphones/monitors mid-recording no longer hangs the app (#84, #80)
[BLANK_AUDIO]hallucination tokens — WhisperKit artifacts are now filtered from output (#77, reported by @slatlasdev in #72)- Multi-monitor cursor indicator — recording indicator now follows the correct screen (#78, reported by @slatlasdev in #70)
- Double initialization on launch — eliminated race condition between
WhisperServiceandAppStateinit (#80) - Broken model loading — model download/load sequence fixed (#80)
🧹 Code Health
- Extracted
PermissionManagerfrom monolithicAppState - 67 new unit tests across
AppState,PermissionManager,TranscriptionResult,WhisperModel, andSystemInfo(#85) - Resolved Swift concurrency warnings (#88)
- Consistent
[ServiceName]log prefixes throughout
🌙 Nightly Builds
- Automated nightly builds via GitHub Actions (#86)
- Available as pre-release artifacts for testing latest
main
🌐 Website & Branding
- Simplified install instructions — DMG tab is now 2 steps (download + drag)
- Mobile responsiveness fixes (#71)
- Redesigned OG image, fixed favicons for Google indexing (#73, #82, #83)
- Fixed SEO redirect issues (#81)
Install
- Download VocaMac-0.4.0-arm64.dmg below
- Open the DMG, drag VocaMac to Applications
- Launch from Applications — grant Microphone and Accessibility permissions when prompted
Checksums
SHA-256: 10f1287935e62936149bd1b69855c3c51cec2dec6b4ed7b06ad5ca3464b5a086 VocaMac-0.4.0-arm64.dmg
Contributors
All code by @jatinkrmalik. Bug reports and feedback from @slatlasdev (#70, #72).
Full Changelog: v0.3.0...v0.4.0