Releases: rootMonsteR/holdtospeak
Release list
HoldToSpeak 0.1.3 — HoldToSpeak.exe, and a failed start no longer hangs
A small but important fix: a failed start now closes itself instead of hanging.
Download
| HoldToSpeak-0.1.3-x64-setup.exe | Installer. Per-user — installs to %LOCALAPPDATA%, never asks for admin rights. |
| HoldToSpeak-0.1.3-x64.zip | Portable. Unzip and run HoldToSpeak.exe. |
HoldToSpeak-0.1.3-x64-setup.exe 66F1EDFE3977C10A44699B90BB91FCA1EF2EB68E6FDDCA84812800E41A630D1A
HoldToSpeak-0.1.3-x64.zip 03D0EB10AE1C1B0D453EE52451DA7D0BAF8E803BA45470BD69A2050BF286C0DE
Still unsigned, so SmartScreen will warn on first run — More info → Run anyway, or verify
against the hashes above.
Renamed: the app is now HoldToSpeak.exe
The rebrand had stopped short of the binaries. Everything else — paths, tray, config folders, docs,
the icon — said HoldToSpeak, but the executable you actually ran was still called nib-core.exe,
and Task Manager showed a stray nib-* process for it.
nib-core.exe -> HoldToSpeak.exe
nib-asr-sidecar.exe -> HoldToSpeak-engine.exe
Upgrading cleans up after itself — the old binaries are removed rather than left sitting beside
the new ones, and your Start-menu shortcut is repointed automatically. Verified on a real upgrade
over an existing install, not just a fresh one.
If you launch the app from a script or a custom shortcut, that's the one thing to update.
Fixed: a failed start could hang forever
v0.1.1 fixed the app vanishing with no error, by keeping the window open so the message could be
read. That was the right fix for a person sitting in front of it — and the wrong one for every
launcher that has no person at all: an installer's smoke test, a CI sandbox, a scheduled task.
Those get their own console window too, so the app sat waiting for an Enter key that was never
coming, and a clean failure became a hung process.
The wait is now bounded. You still get 60 seconds to read the error — and the prompt says so
plainly — after which it closes itself.
Press Enter to close this window (closes automatically in 60s)...
This only affects the error path. If the app starts normally, nothing about this release changes
what you see.
How it was found
Microsoft's winget validation flagged the 0.1.2 submission with an executable error. The manifest
itself passed cleanly, and no logs were published — so rather than guess, the failure was
reproduced locally: launched with an unusable model directory in its own console, the process was
still alive after 20 seconds with nobody present. Confirmed, fixed, then re-verified in the built
installer rather than just the development build.
Everything else from 0.1.2 is unchanged
The app icon, the global hotkeys (Ctrl+Alt+M modes, Ctrl+Alt+O overlay, Ctrl+Alt+Q quit), and
the redesigned Bars / Wave / Volt overlays all arrived in
0.1.2 and carry over.
Unchanged: your voice still never leaves your machine. No account, no telemetry, one network
request ever — the first-run model download, against a pinned checksum. See
PRIVACY.md.
HoldToSpeak 0.1.2 — app icon, real global hotkeys, redesigned overlays
Polish release: the app now has an identity, and the keys it advertises actually work.
Download
| HoldToSpeak-0.1.2-x64-setup.exe | Installer. Per-user — installs to %LOCALAPPDATA%, never asks for admin rights. |
| HoldToSpeak-0.1.2-x64.zip | Portable. Unzip and run nib-core.exe. |
HoldToSpeak-0.1.2-x64-setup.exe 20A627D541BB723B31F764BD9BEFABD95C2E7503CCEA1ABB8C5B7DCC9206A7DB
HoldToSpeak-0.1.2-x64.zip 28278660A042449DFA8C39C522F0AAB05B1D6B6F9A934F4E0B1A1517D48476A7
Still unsigned, so SmartScreen will warn on first run — More info → Run anyway, or verify
against the hashes above.
New: it has a face
An actual app icon, in the tray, the taskbar, the Start menu, the installer and Add/Remove
Programs. A dark tile with a glowing waveform and HUD corner brackets — deliberately the same
visual language as the on-screen overlay, so the whole thing reads as one product instead of an
anonymous binary.
The small sizes are a simplified drawing rather than a shrunk copy: five bars at 16 px works out
under 1.5 px each and antialiases into a smear, so the tray version uses three fatter bars. The
icon is generated by a committed script, so it stays reproducible.
New: global hotkeys that exist
The old startup banner listed m = cycle mode · q = quit without saying those were typed into
its own console window — so they looked like hotkeys and did nothing when pressed anywhere else.
Now they're real:
| Ctrl + Win (hold) | dictate — speak, then release |
| Ctrl + Alt + M | cycle cleanup mode |
| Ctrl + Alt + O | cycle overlay theme |
| Ctrl + Alt + Q | quit |
All rebindable in %APPDATA%\HoldToSpeak\hotkeys.toml (off disables one). The banner now prints
your actual bindings, so it can never advertise a key that doesn't exist.
Improved: the overlay themes
HUD was the only theme that told you anything. The other three were decoration — nothing on
screen showed the cleanup mode, or even whether the mic was being heard. The rule now: picking a
theme changes how the overlay looks, never what it tells you. Every theme gained the same status
row (a live dot that tracks your input, the mode label, an input meter), and each got its artwork
redone:
- Bars — a studio meter: gradient bars with bright tips, falling peak-hold caps, and a
reflection that grounds them. Was a flat block of rectangles that looked like a media player. - Wave — an oscilloscope: the voice bands are now harmonics of one trace over a faint
graticule, with two phase-lagged ghosts for motion. Was three crossing sines that read as a
screensaver. - Volt — electrodes at both ends, so the bolt reads as current flowing between two
terminals rather than a stray scribble in an empty panel.
Every iteration was rendered and checked over both a dark and a light background, since the
overlay is translucent and a design that reads on one can vanish on the other.
Also
- Cleanup Polish mode (added in 0.1.1) strips conversational filler —
, like,,, you know,,
and stuff— while leaving "I like this" and "you know the answer" intact. - winget manifest updated to 0.1.2.
- 81 tests, clippy
-D warnings, and the platform-layering check all clean in CI.
Unchanged: your voice still never leaves your machine. No account, no telemetry, one network
request ever — the first-run model download, against a pinned checksum. See
PRIVACY.md.
HoldToSpeak 0.1.1 — fixes the silent first-run crash
A bug-fix release, from real first-run testing of v0.1.0. If you have v0.1.0, upgrade — one of
these is the difference between the app starting and the app vanishing without a word.
Download
| HoldToSpeak-0.1.1-x64-setup.exe | Installer. Per-user — installs to %LOCALAPPDATA%, never asks for admin rights. |
| HoldToSpeak-0.1.1-x64.zip | Portable. Unzip and run nib-core.exe. |
HoldToSpeak-0.1.1-x64-setup.exe 2588D5A5D0A56962562845C9020B578032991AE935249818FBFFF4461C9C7502
HoldToSpeak-0.1.1-x64.zip DD466BB2CB227E8F98C889590D96F806087A66E644908CBF3E062F33424F7024
Still unsigned, so SmartScreen will warn on first run — More info → Run anyway, or verify
against the hashes above.
Fixed
The app could crash on first run — because Windows' own ONNX Runtime was being used
This is the big one, and the cause turned out to be more interesting than "a random crash".
Windows 11 ships its own onnxruntime.dll in System32 (the Windows ML component, version
1.17). HoldToSpeak ships 1.27.1, which is the version its speech engine is built against. The
app's own folder is normally searched first — but if our copy isn't loaded for any reason, Windows
silently falls back down the search order and hands the engine the operating system's older
runtime instead. The engine then asks for an API version that runtime doesn't have, gets NULL
back, and dereferences it: an instant crash, with no message.
It's now impossible for that to happen silently. The app loads its own runtime explicitly by full
path, checks that the copy actually in use is the one it shipped, and asks the runtime directly
whether it supports the API the engine needs. If any of that fails it says so in plain English
instead of dying.
Startup errors no longer vanish with the window
The related reason nobody could diagnose the above: the app is a console application, so when it's
started from a shortcut, a double-click, or the installer's "run now" checkbox, Windows gives it a
console of its own and destroys that console the instant the process exits — taking the error
message with it.
Now:
- Startup errors stay on screen. If the app owns its console it waits for you to press Enter.
Run from an existing terminal it doesn't pause, so scripts don't hang. - The engine start is retried once, so a one-off hiccup costs a second rather than the session.
- Errors say something useful, including the engine's exit code, and the model/microphone
failure paths got the same treatment.
"Polish" mode wasn't doing anything
Without the (Pro) language model, Polish was silently falling back to Auto — the menu offered a
mode that quietly ran a different one. Polish is now a genuine, fully offline mode that strips
conversational scaffolding:
Before: I'm just testing this, like, you know, testing the software and stuff, just to make sure it can come up with a proper coherent sentence.
After: I'm just testing this, testing the software, just to make sure it can come up with a proper coherent sentence.
It only ever deletes filler — it never invents or reorders words — and it will not touch a word
that is doing real work. "like" is filler in "it's, like, fine" but not in "I like this";
"you know" is filler in "it's, you know, tricky" but not in "you know the answer". The rule is
that a filler must be delimited by commas, so when there's no way to be sure, it leaves your words
alone. Auto stays deliberately light — only Polish is aggressive.
Stray spaces between dictations
Spacing between utterances was based on what the app had last typed, which stopped being true the
moment you typed something yourself or clicked elsewhere. It now notices both, and stops guessing.
Also
wingetmanifest updated to 0.1.1.- Everything above is covered by tests (78, up from 73).
Unchanged: your voice still never leaves your machine. No account, no telemetry, one
network request ever — the first-run model download, against a pinned checksum. See
PRIVACY.md.
HoldToSpeak 0.1.0 — first public release
⚠️ Superseded — downloads removedThis version had a startup bug that could make the app close instantly with no error message,
on machines where Windows' own bundled ONNX Runtime got loaded instead of the one shipped with
the app. There was no way for a user to tell what had gone wrong.The binaries have been deliberately removed from this release so nobody installs it by
accident. The tag and source snapshot are kept, so this version stays reproducible.➡️ Get the latest release
instead. It fixes the crash, and reports the problem clearly if anything like it ever happens
again.
Hold Ctrl+Win anywhere, speak, let go — your words appear at the cursor. Entirely on your own
machine: no account, no cloud, no telemetry.
This is the first public release. The dictation core is solid and used daily by its author; the
packaging around it is new. Rough edges expected, bug reports very welcome.
Download
| HoldToSpeak-0.1.0-x64-setup.exe | Installer. Per-user — installs to %LOCALAPPDATA%, never asks for admin rights. |
| HoldToSpeak-0.1.0-x64.zip | Portable. Unzip and run nib-core.exe. |
Requires Windows 10/11 (x64) and a microphone. On first launch it downloads the speech model
(~460 MB, once) and tells you it is doing so. After that it needs no network at all.
⚠️ These binaries are not code-signed
Windows SmartScreen will show "Windows protected your PC" on first run. Click
More info → Run anyway. Code signing costs money and is on the list; until then, verify what
you downloaded against these hashes, or build from source:
HoldToSpeak-0.1.0-x64-setup.exe F2112FFFF57DC743F4DE4BF201F3F4340584612586FF79790F28FDD9CFD92049
HoldToSpeak-0.1.0-x64.zip 550954A95114D47C9F8CDD3DA93F327F631D26B256140B50CCDA79E3D0C9DF73
Get-FileHash .\HoldToSpeak-0.1.0-x64-setup.exe -Algorithm SHA256What's in it
- Push-to-talk dictation — hold Ctrl + Win, speak, release. A 400 ms look-back buffer means
your first word is never clipped by a late key press. - Works in the apps that usually break — terminals, WSL, IDEs, browsers, chat apps — by
choosing a text-injection route per target instead of relying on clipboard-paste-and-hope. - Never rewrites your commands — focused on a terminal or code editor, dictation drops to
verbatim automatically, sokubectl get pods -n kube-systemstays exactly that. - Refuses password fields — detected live via UI Automation. If the focused control is a
credential field, nothing is typed. - Learns your jargon —
learn cube ctl => kubectlfixes it permanently, in a plain-text file
you can edit. - Tells you when it can't help — dictating into an elevated window gives you "text kept, not
inserted" rather than a silently swallowed sentence. - Tray icon for cleanup modes and overlay themes, and an optional start-with-Windows toggle.
Privacy
Your voice never leaves your machine, and PRIVACY.md
exists so you can verify that rather than trust it. There is exactly one network request in the
entire product — the one-time model download — from one hard-coded URL, verified against a pinned
SHA-256. No update check, no license server, no usage ping. Unplug the network after setup and
everything still works.
One limitation stated plainly: audio is currently written to a single temporary WAV file for the
duration of one transcription, then deleted. Passing it through shared memory instead is the
intended design and is not done yet.
Known limitations
- Unsigned binaries — SmartScreen warning, as above.
- English only, CPU only. GPU acceleration and more languages come later.
- Windows only. Every Win32 call is confined to one crate behind a trait wall (enforced in CI),
which makes a macOS port a swap rather than a rewrite — but that port does not exist yet. - No settings GUI yet; configuration is hand-edited TOML in
%APPDATA%\HoldToSpeak\.
Licensing
MIT. The speech model
(NVIDIA Parakeet TDT 0.6B v2) is separately licensed CC-BY-4.0 and is downloaded on first run
rather than bundled. The shipped sherpa-onnx runtime is deliberately built without espeak-ng to
keep GPLv3 code out of the distribution, and the packaging script refuses to build if it detects
otherwise. Full details in
THIRD-PARTY-NOTICES.md.