CHANGELOG

What's changed.

Every shipped update, in reverse chronological order. Bug fixes listed next to features because that's how the work actually went.

full disclosure: some of this codebase was co-written with an llm, which you can tell because nearly every "ship feature" entry below is followed within hours by a "patch n bugs the review missed" entry. apparently anthropic ships the same way.

    • killed a system-level freeze where typing into a slow target app could pin your whole mac for ~24 seconds. now capped at half a second per attempt. yeah that one was rough.
    • removing hotkeys or trigger words used to crash. it doesn't anymore. you can also clear the lists down to zero entries now.
    • Cmd+Q actually cleans up after itself. no zombie state hanging around for the next launch.
    • menu bar preview is one line now, not a wall of your last dictation. nice for privacy too - no shoulder surfing.
    • fresh installs come with a default hotkey slot ready to use. and if you delete it on purpose, it stays deleted. no more "helpful" resurrection.
    • Esc actually stops the in-flight cleanup work now, instead of just hiding the result. was burning api calls in the background, oops.
    • renamed some settings keys under the hood. three startup warnings are gone with them.
    • Esc cancels recording mid-flight. works during the warm-up gap before recording starts, mid-record, and during the cleanup step right after release. no stray text gets injected.
    • recording indicator finally shows up on the screen you're actually looking at. before this it just slapped onto the primary display every time. (the whole point of this app is dictating from your gaming monitor into a terminal on the other - so yeah, definately needed.)
    • new installs use your mac's built-in engine by default. zero download, you can dictate your first sentence in the time it takes to read this. onboarding tells you how to upgrade later if you want.
    • live preview and final transcription share the model in memory now. used to load it twice on cold start - half the ram.
    • tightened the streaming confirmation window from 10s to 3s. side effect: short dictations (the common case) actually trigger the vocabulary boost now. it was kinda dead code for default users before, embarrassing.
    • press your hotkey while the engine is still loading? it tells you. used to just silently do nothing.
    • fat-fingering your hotkey for 200ms doesn't pop a scary error toast anymore. just nothing happens, like it should.
    • switching engines mid-recording used to park the app in a "transcription in progress" state forever. fixed.
    • onboarding asks for the speech recognition permission now (the new default engine needs it).
    • if you picked the high-accuracy engine before this update, it stays selected on update. no surprise re-downloads on launch.
    • added a new high-accuracy on-device speech engine. three flavors: multilingual (25 european languages), english-only, and a smaller fast one for english dictation.
    • live transcript shows up as you speak now. and importantly: the live preview matches what you actually get on release. used to use a different engine for live than for final, which was confusing.
    • models tab in settings: see what's on disk, total storage, download or delete per model. delete is blocked while a model is in use - the underlying ml runtime does Not handle the file disappearing under it gracefully.
    • custom vocabulary lets you teach the recognizer your jargon, names, commands. there's a status indicator that tells you whether boosting is active or still waiting on the boost models to download.
    • recording indicator lives in the notch on m3/m4 macbooks. on everything else it's a small floating pill near the menu bar. way less obtrusive than the centered window we used to show.
    • auto-updates with proper signature verification (yes the kind that doesn't trust whatever bytes show up).
    • trial / license system. 14 days free, $2.99 once. revalidates every 7 days online with a 30-day offline grace period for when your wifi is being weird. clock rollback protection so changing your mac's date can't resurrect an expired trial.
    • trial state stored across two seperate slots so wiping one doesn't reset the timer.
    • optional launch at login.
    • dedicated about window with credits to the open-source libraries that ship inside the app.
    • real keychain integration for sensitive data. no more constant "allow access" dialogs in normal use.
    • cleaner key recorder ui - hover state, focus ring, accessibility labels.
    • recording starts faster on bluetooth and slow usb mics now (audio setup moved off the main thread).
    • paste fallback re-checks the focused app right before posting Cmd+V, so text never lands in the wrong window if focus changes mid-paste.
    • swept em dashes for hyphens across the codebase. minor but the inconsistency was bugging me.
    • three-step onboarding (welcome → permissions → all set) runs on launch when something's missing. auto-advances when you grant.
    • revoke a permission later and onboarding pops back open instead of just silently failing your next dictation.
    • microphone access requests are clearer and survive denials without leaving the app stuck.
    • audio recovery when you switch input devices mid-session. unplug a headset, swap to bluetooth, change mic input - no relaunch needed.
    • recording start reports actual success / failure to the ui instead of pretending everything's fine while capturing silence.
    • sensitive local data is encrypted at rest now, key derived from your machine.
    • fixed a race where two settings saves close together could lose one of them.
    • empty trigger words are ignored. they used to match every single transcription and inject random characters. fun bug.
    • icon-only buttons got accessibility labels so voiceover users can actually navigate the settings.
    • hotkey sidebar selection persists across tab switches now.
    • killed a class of bugs that could freeze the whole system for ~30 seconds during heavy dictation. yeah, the whole system, not just the app.
    • the optional cleanup step has a 5s safety timeout now. slow networks dont hang your transcription anymore.
    • text injection is more reliable in terminals like kitty and any other app that handles keyboard input wierd.
    • stale results from a prior recording can't collide with a new recording's results anymore.
    • cleanup step gracefully recovers from a rare double-callback case in the speech apis. one of those bugs you only see in production.
    • debug logs no longer contain the actual transcribed text, just lengths. safe to share for support tickets.
    • multi-slot hotkeys: bind different keys to different target apps. one for your terminal, one for your editor, one for game chat overlay. hold whichever.
    • pre-speech and post-speech automation keys. open the chat box, dictate, hit enter - all in one hold. up to two key combos before, two after.
    • trigger words: say "execute" or "send" at the end and it fires the action you defined. multiple trigger words supported with key-press, key-combo, or insert-text actions.
    • engine picker. built-in macos speech (27 languages, on-device toggle), a high-accuracy on-device option, or cloud. pick what fits your accuracy / privacy / latency tradeoff.
    • optional cleanup step that strips fillers ("uh", "like", "you know"), converts spoken punctuation, and fixes grammar. each toggleable independently in case you only want some of it.
    • tabbed settings: hotkeys, triggers, engine, refine, general. each gets its own panel.
    • modifier-combo hotkeys. Cmd+`, Ctrl+Shift+F1, anything you can press.
    • live transcript overlay while you talk.
    • friendly warning when your target app isn't running, instead of dictating into the void for 10 seconds and wondering why nothing showed up.
    • trigger words processed before the cleanup step. used to be the other way around and the cleanup would sometimes strip "enter" out before the trigger system saw it.
    • saying just "execute" (a trigger word with no other text) used to make the cleanup step hallucinate a phantom transcript like "this is the cleaned version of the text". fixed.
    • custom vocabulary list gives the cleanup step context for proper nouns and jargon.
    • hold-to-record gesture. press your hotkey, speak, release. quick taps pass through to the active app so a tap-bound hotkey still works for normal use.
    • text lands in the focused app without stealing focus from the app you're actually in.
    • live preview of what's being transcribed appears every 200ms while you talk.
    • pasteboard fallback for apps that won't accept direct typed input. old clipboard contents are restored after.
    • configurable execute trigger word. say it at the end of dictation to fire Enter.
    • audio capture stops fully on release - the macos mic indicator turns off the moment you let go. no mic-on light when you're not actually dictating.
    • [BLANK_AUDIO] artifacts no longer leak into your transcripts.
    • trailing space appended after each dictation so you can keep dictating without manually adding the space.
    • optional copy-to-clipboard alongside injection.
    • the global hotkey listener auto-retries if the os silently disables it.