Skip to content

Releases: VocaHQ/vocamac

🌙 Nightly Build — 2026-08-09

Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Aug 02:17
e849142

⚠️ Nightly Build — Not for Production Use

This is an automated nightly build from the latest main branch.
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

  • feat: add Parakeet, Apple Speech, and ONNX transcription engines (#191) (6c96cb3)

🐛 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

  • seo: keep HTML attribute quotes when minifying the site (#201) (e849142)

📥 Installation

  1. Download VocaMac-nightly-20260809-e849142-arm64.dmg
  2. Open the DMG and drag VocaMac to Applications
  3. Open VocaMac from Applications
  4. 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

Choose a tag to compare

@github-actions github-actions released this 04 Aug 00:20
a0470b2

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

Choose a tag to compare

@github-actions github-actions released this 17 Jul 20:10
f683df7

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 vocamac

Prefer 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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 02:27
90976b8

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 vocamac now works, there's a vocamac-nightly cask 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:

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 vocamac

Already running VocaMac? Update with:

brew upgrade --cask vocamac

Prefer 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

Choose a tag to compare

@github-actions github-actions released this 14 May 14:45
fcf764e

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.installTap can raise an Objective-C NSException for 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 with SIGABRT. This release wraps installTap, engine.start(), and removeTap in 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 AppState is now backed by a single process-wide instance, and all AudioEngine mutations (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 the App value 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

Choose a tag to compare

@jatinkrmalik jatinkrmalik released this 14 May 15:16
fcf764e

⚠️ 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_64 build of VocaMac 0.6.2 from the experimental/intel-build branch.
  • 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.app

What 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

Choose a tag to compare

@github-actions github-actions released this 27 Apr 17:04
0d8b377

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:

  1. Start recording
  2. Replug or change the microphone (the engine resets and recovers)
  3. Click Stop Recording in the popover
  4. 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/checkout v4 → v6, actions/cache v4 → v5, actions/upload-artifact v4 → 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 staged step (previously only in release & nightly) was backported to pr-build.yml, so any future #119-class regression is caught at PR review time, not at release time.
  • Local-dev tip in build.sh now points to the correct binary path (#127) — the first-time-setup hint referenced the old swift build output path that no longer exists since the switch to xcodebuild.

📚 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.md and docs/RELEASE.md codify a "release notes live on the GitHub Release page, not in the repo" policy so we stop accumulating stale RELEASE_NOTES_v*.md files. 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 .ips crash 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-missing

If 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

Choose a tag to compare

@github-actions github-actions released this 16 Apr 19:38
a49aebe

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:

  1. ensureTokenizerAssets was 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)
  2. 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

  1. Download VocaMac-0.6.0-arm64.dmg
  2. Open the DMG and drag VocaMac to Applications
  3. Open VocaMac from Applications
  4. 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

Choose a tag to compare

@jatinkrmalik jatinkrmalik released this 13 Apr 19:25
bf296b4

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.

image

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 matchingisModelSupported() now uses exact prefix boundary matching and checks WhisperKit's disabled list, preventing false positives from turbo/quantized variant name collisions (e.g. large-v3 vs large-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

  1. Download VocaMac-0.5.0-arm64.dmg
  2. Open the DMG and drag VocaMac to Applications
  3. Open VocaMac from Applications
  4. 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

Choose a tag to compare

@jatinkrmalik jatinkrmalik released this 10 Apr 18:46
b3af121

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 WhisperService and AppState init (#80)
  • Broken model loading — model download/load sequence fixed (#80)

🧹 Code Health

  • Extracted PermissionManager from monolithic AppState
  • 67 new unit tests across AppState, PermissionManager, TranscriptionResult, WhisperModel, and SystemInfo (#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

  1. Download VocaMac-0.4.0-arm64.dmg below
  2. Open the DMG, drag VocaMac to Applications
  3. 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