Changelog

v1.1.0

macOS 26's SpeechAnalyzer is here.

macOS 26 shipped a new engine: SpeechAnalyzer / SpeechTranscriber, which runs entirely on-device — no network, no uploads, no cost. Recognition quality is close to a large Whisper model, and it's noticeably better in far-field or noisy environments; the old 60-second single-session cap from SFSpeechRecognizer is gone too, so you can talk continuously for several minutes. The first result appears within a second of pressing the hotkey, with text filling in as you speak.

Settings now use a segmented picker to choose between "macOS 26 (new engine)" and "Classic engine," with the configuration below changing to match (the new engine shows model status; the classic one shows the "On-device only" toggle). Onboarding recommends the new engine by default on macOS 26+. The picker only lists languages the current engine actually supports, so you can't pick an unsupported locale and trigger an internal framework crash; switching languages automatically releases the old locale's pre-warmed state and reserves the new one, so the next recording uses the new language right away.

Models are managed entirely by the system — no increase to the app's bundle size, no extra memory footprint while running. The first time you use a language, it downloads a few hundred MB automatically; the overlay shows a blue "Downloading speech model X%…" banner while that happens (shown for at least 3 seconds so you can actually read it), and afterward every app on the system shares the download.

A few crashes were also fixed: initializing SpeechTranscriber on an unsupported locale triggering an internal framework fatalError; token routing dropping results because of a missing delegate registration; and worker-state conflicts from reusing an instance across sessions — now a fresh instance is created every time.