Repository navigation
Releases: rsperko/keyscribe
Release list
KeyScribe 0.8.1
Full Changelog: v0.8.0...v0.8.1
KeyScribe 0.8.0
Full Changelog: v0.7.0...v0.8.0
KeyScribe 0.7.0
Moonshine Base (English) removed
Moonshine Base (English) is no longer included. If it was your selected model, KeyScribe switches to another model you have installed, or to Apple Speech on macOS 26 and later, and removes the Moonshine download. On macOS 15, if Moonshine was the only model you had downloaded, download another model in Settings ▸ Speech Models before dictating again. If you see The selected speech model is not installed, the button on that message opens Speech Models.
What's Changed
- Remove the Moonshine speech model by @rsperko in d3e2a14
- Build the app through a shared Xcode app definition by @rsperko in #1
New Contributors
Full Changelog: v0.6.0...v0.7.0
KeyScribe 0.6.0
Changed behavior
- Other audio during dictation is now a three-way choice — Quiet (default, turned down but still
audible), Mute (silenced), Unchanged (left alone). If you had the old mute setting on, you are
migrated to Quiet, not Mute: other audio you used to lose entirely is now audible at a low level.
Pick Mute in Settings ▸ General to keep the old behavior. Themute_system_audioconfig key is
replaced byother_audio; the old key is still read when the new one is absent, and dropped on the
next write. - LLM rewrites follow the language of the content. The prompt no longer hardcodes "Write in
English" — output is written in whatever language the content is already in, and the spelling
clause (en-GB vs en-US) applies only on an English locale. A mode that must pin a language or
translate says so in its own prompt. Previously a non-English selection could come back translated. - Rewrite requests refuse cross-origin redirects. A provider endpoint that answers with a redirect
to another host now fails instead of following it — a 307/308 preserves the body, so following one
would replay the prompt and transcript to a host the mode was not wired to. If a connection stops
working after this upgrade, check whether its base URL redirects.
New
- Diagnostics report. Settings ▸ Maintenance ▸ Diagnostics ▸ Copy Diagnostics, or
KeyScribe.app/Contents/MacOS/KeyScribe --diagnosefrom a terminal. Covers version, permissions,
speech engine, per-mode delivery settings, and recent dictation outcomes — no transcript text, no
clipboard contents, no API keys. Newdocs/troubleshooting.mdexplains how to read it. - Dictation sound volume (
sound_volume, 0–100). 0 also skips the start cue, so capture admits
with no cue hold. - Error indicator on the menu-bar Settings item, so a config or model-load failure is visible
without opening Settings.
Fixed
- A dictation whose audio route died mid-take could be inserted as a silent truncation. When the
device went away for good, audio stopped arriving while the app still believed it was recording, and
the prefix was finalized and pasted as an ordinary success. The loss is now reported to the dictation
that owned the capture, and the level meter decays instead of freezing at the last level it saw. - Insertion now aborts at the last point before text lands, per keystroke and immediately before
the ⌘V post, instead of only at the caller's gate — and restores the clipboard right away rather than
leaving dictated text on it through the post-paste backstop. - Replacement patterns are checked for catastrophic backtracking before they compile, with the
bound fail-closed for hand-edited config files. - Speech-model load failures retry and surface rather than leaving the engine unusable.
- Pinned dependencies are checked for upstream mutation (
make check-deps,make fix-deps) after
an upstream moved a release tag and re-uploaded a binary asset in place, which broke fresh checkouts
while warm build directories kept working.
For downstream builds
Two source-breaking changes in KeyScribeKit:
Settings.DuringDictation(muteSystemAudio:keepDisplayAwake:sounds:)is now
DuringDictation(otherAudio:keepDisplayAwake:sounds:soundVolumePercent:), and the
muteSystemAudio: Boolproperty is nowotherAudio: OtherAudio(.unchanged/.quiet/.mute).PromptInputs.languageis removed — both the property and thelanguage:init parameter. Output
language is now driven by the content, not by a caller-supplied value.
On-disk config migrates itself; only call sites need updating.
KeyScribe 0.5.1
Full Changelog: v0.4.0...v0.5.1
KeyScribe 0.4.0
Full Changelog: v0.3.3...v0.4.0
KeyScribe 0.3.3
Full Changelog: v0.3.2...v0.3.3
KeyScribe 0.3.2
Full Changelog: v0.3.1...v0.3.2
KeyScribe 0.3.1
Full Changelog: v0.3.0...v0.3.1
KeyScribe 0.3.0
Full Changelog: v0.2.2...v0.3.0