Releases: Vitalii-Yemets/holdtotype
Release list
v0.75.4
What a review of the code found, and what it changed
An update installs only what it could actually check. GitHub publishes a SHA-256 for every release file, and the app compares the downloaded installer against it — except that a missing hash used to pass the check quietly, while the log still said "hash matches". Now a missing or wrong hash stops the update, and that log line is written only after a real comparison, with the hash it compared. A truncated hash used to crash the whole program — the shortcut, the tray and the engines with it — and can no longer do that.
An engine will not start on a port somebody else is holding. Readiness used to mean nothing more than "something accepted a connection on 127.0.0.1". Whatever was already sitting on that port would have been handed the recorded audio, and its answer would have been typed into the window you were working in. The port is now checked before the engine starts, and a busy one is an honest error naming the port instead of a silent handover. One consequence worth knowing: two copies of the app on one machine no longer share a recognition server — give the second one its own port.
The log stops quoting you. Replacements, voice commands and empty results used to write the dictated text into the log, and a paste wrote the title of the window it went into, file names and all. They now write counts and the name of the program. An error that carries two texts writes the English one, the way the rest of the log already did.
A file name from Hugging Face stays a file name. Names came from the catalogue into the page without their quotes escaped, so a name could bring its own attributes along and run its own code in the settings window. It cannot any more, and a test makes sure of it.
Live text keeps one writer. The streaming session could have two goroutines writing to its socket at once — one sending audio while another closed the connection — which broke the live text and lost the final result. Writes are now serialized.
The tray menu wears the design you picked. Scan lines and a green highlight were drawn whatever the design was; both now come from the design, and the settings window opens on its own background instead of the terminal's near-black. The terminal design itself is unchanged.
Two callbacks are made once instead of every time. Windows callbacks cannot be freed, and the app created a new one each time the settings window opened and each time the list of running programs was refreshed. Enough of either and the process died without a word in the log.
The tests check the real page. The jsdom harness kept a hand-written copy of the interface labels, and it had drifted: 24 labels the program uses were missing from it, so the page under test showed "undefined" where the real one shows words. The harness now reads the labels from the program itself, and six checks that were passing against invented text now pass against the real text.
Nothing in the settings needs changing after the update, and no model is downloaded again.
v0.75.3
Every design gets the care the terminal had
Editor dresses like VS Code now: the system face for the interface, monospace kept for paths, the shortcut and log lines; filled blue buttons with a lighter hover, red for the destructive ones, the editor's own focus ring, round dots, pill badges, corners you can see.
Document went duskier — the page was near-white and glared — and its ordinary buttons are grey with a thin border, blue left to the main action, red to the dangerous one.
Neon took the look its own shortcut chip already had: a violet gradient fill, light text, a soft border. Dropdowns fit their text again — the control height is now the design's own, not a fixed 30 points.
Soft lost the glare and its status dots turned green, so it no longer hides what is fine, what is warning and what is broken inside one shade of pink.
All of it lives in the design itself: new roles for the secondary button, the hover, the focus ring, the card surface, the dot, the badge and the panel radii. Every role defaults to what the other designs already looked like, so the terminal is untouched.
Also
- Number fields keep their arrows inside one box. On the rounded designs they used to sit outside the field.
- The help contents button stays in its corner and works both ways: hide the column, or bring it back — and on a narrow window it widens the window to make room.
- The log speaks English whatever the interface language is. Errors now carry two texts: the English one goes to the file, the translated one to the window.
SHA-256:
holdtotype-portable.zip—9591b321b6e9a154ff356536ab2d37b401f94b63c84cdacd1a92edf80fa44b7fholdtotype-setup.exe—89bb92aed5885e4a8003f2e4c5e823e62f4bb12d222a5fdeaced30c87b7d3a38
v0.75.2
The week keeps quiet when there is nothing to draw
With Keep the dictation history switched off nothing is recorded — so the This week plate on the status screen had nothing to say, and said it with an empty circle and a zero. The plate is simply not there now, and it comes back the moment history is switched back on.
SHA-256:
holdtotype-portable.zip—29bd7691b8a6b625068e01a0161312c2583513d60b46ee6632a698485b6adfc2holdtotype-setup.exe—25b8361a051102c464faf64334a94a344202cc95844789e03ca804b5350fbc08
v0.75.1
The settings pull themselves together
System was one long list where every row was fenced off from its neighbour. It is now three groups — how the app looks, how it starts and keeps itself current, and the maintenance buttons — with a line only between the groups. The maintenance buttons share one width.
The whisper-server settings left the page. Recognition now stands as two cards with a switch, the way post-processing already does: on this computer or on another one. Threads, autostart, port and the path to the program are edited in a window of their own; the remote server has a window with one field, and a cross inside the field wipes it.
Choosing the remote server without an address used to fail quietly. Now it is an honest failure: the summary card on the status screen goes red and offers a way out, the badge next to System turns red, the status bar says recognition is unavailable — and the engine refuses to pretend by starting the local server instead.
History keeps for as long as you say
The two dropdowns are gone. How long to keep is any number in minutes, hours or days — five minutes if you only need history for the "pasted into the wrong window" moment, thirty days if you want a record. How many entries is any number too. Both fields step by one and take what you type.
The blocks on the tab are parted by a line, with the same air on both sides of it.
The week is a pie
The ring with the count in the middle became a pie: the number sits inside its slice when it fits, the programs are listed as chips beside it, and a single program puts its number in the centre. An empty week is no longer an empty box — it is a dim circle with a zero. Colours are built from the theme: the accent, the amber, the recording red, and hue-rotated shades that stay clear of them, so all eight skins keep their own look.
Help is a manual now
Seventeen sections written for people rather than for the interface: what happens after you release the keys, what each tab does, what every option changes and what it costs, what lives in the app folder, what leaves for the internet, and what to do when something misbehaves — with mockups of the overlay, the cards and the fields drawn inline.
The contents moved to a sticky column on the right that follows you as you read. On a narrow window it hides, and an icon in the corner widens the window to bring it back; the icon then offers to put the window back the way it was.
About and Contacts
About lists every external dependency — engine, library, font, catalogue — with its licence, its address and a plain explanation of what it does here and when it runs. Contacts is three cards: the mail address, which opens your mail app and copies with one icon, the repository, and the page for bugs and ideas.
SHA-256:
holdtotype-portable.zip—deb38b53abb301dd555b93efa33d1889d5446ac18d33f405f558308f2d6cfafcholdtotype-setup.exe—7f5ff8f9580b3cd463a637d378eb5723df486ed65561803f4eb87dee7c22013f
v0.75.0
The status screen answers the question you opened it with
The first screen was four kinds of layout at once: three tiles, headings in capitals, rows borrowed from the settings pages, and the installed models as a run-on line of text. It told you a lot and answered nothing.
It is now three tiers.
Summary. One card says whether the app is ready — and, unlike before, admits when it is not: switched off from the tray (amber, with a Switch on button instead of the shortcut), or an engine that would not start. Trouble is listed underneath as alerts you can act on: retry the recognizer, open the tab where a failed edit is explained. Beside the summary sit two plates: the version, with a button to check for a newer one, and memory — how much is free, what is loaded, how much the models weigh on disk, with a button to hand the memory back.
Quick settings. Five cards — microphone with its live level, speech language, the on-screen plate, the sound cue, start with Windows. Each shows how it is set right now and carries an arrow that opens that setting on its own tab. Nothing is toggled here: the screen is a summary, not a second place to change the same thing by accident.
Models. Two wide plates. Recognition lists the models with the languages they serve, the working one badged active, and the ones that are only taking up disk space. Post-processing carries its own on/off badge and names the model that edits your text.
This week is a ring: where the dictations went, one slice per program, the count in the middle, and characters, today's tally and the average beside it.
Also
- History keeps a when it goes column:
till 5 Sep, or ambertill tomorrowon the last day, with the exact date in a tooltip. - The microphone tab is one even list again — the "Sound" heading is gone, the play button no longer stretches to the width of a proper button, and the empty verdict box no longer holds a gap open.
SHA-256:
holdtotype-portable.zip—a659f953d830653f89eb8d7efc822075412bb8745f91908505de0ee401f2299bholdtotype-setup.exe—3538399460433bc98ee2d9841fc8bbcda3d646a2e953f6772d9d91ab033c800e
v0.74.0
The excluded programs pick themselves
"Never record from these programs" was a text box asking for a comma-separated list of executable names. Nobody knows the executable names. 1Password is 1Password.exe, Telegram Desktop is Telegram.exe, and finding that out meant a trip to the task manager.
It is now a list like every other list in the app — chips with a pencil and a cross, a filter above them — and the dialog behind Add a program offers the programs open on your screen right now as chips with switches. Flip as many as you need, the line underneath counts them ("2 of 3 picked"), and the field at the top is still there for masks like 1password* and for programs that are not running at the moment. A refresh icon re-reads the list, because windows come and go while the dialog is open.
Post-processing, tidied
The external server card gained a Clear button — red, and only there when there is something to clear. It wipes the address, the model and the key, and hands the work back to the local model.
The local model card gained the two actions that used to require opening the catalog: eject the model from memory, and delete it from disk. The eject button greys out when the model is not loaded, so the button tells you the state as well as offering the action.
The response timeout is no longer a five-item dropdown capped at two minutes. It is a number field with its own arrows, styled like the rest of the interface, accepting anything from 5 seconds to 15 minutes, and it now defaults to 120 seconds. Local models on a CPU are slower than the cloud, and 30 seconds was cutting them off mid-sentence.
Downloading a vision projector is no longer possible
Some model repositories ship mmproj-*.gguf files — vision projectors that ride along with multimodal models. They are not language models. The app already hid them from the installed list, but the search results still offered them, so downloading one finished at 100% and then… nothing appeared, anywhere. They are out of the search now, and the download refuses them outright.
Under the glass
The settings window is created at its final position and already in the colours of the skin — it is no longer parked off-screen while the browser engine starts. Changing the skin no longer reaches into windows owned by other threads: each window is asked, by message, to redress itself. And the settings thread now keeps the input-method services out of its windows. All three are aimed at the "ctfmon.exe — Fail Fast Exception" dialog that some sessions show; each removes a way our windows could disturb the text services.
SHA-256:
holdtotype-portable.zip—ffd4988ea3324ed4a6818c279ea31e8eac86030e635ef1af9c3aced12ae4957eholdtotype-setup.exe—3f0780f9cc8b6b62e1aec2f69d98a0cc4c409d244872697fd548c770e5967ac0
v0.73.0
The post-processing tab learns to speak
Post-processing used to fail in silence. Turn it on with no prompt checked, or with a server that answers "no credits remaining", and the app inserted the plain text as if nothing had happened — the reason lived in the log, if you knew to look.
Now the tab says what is wrong, in amber, right next to Enable post-processing: no model picked, no server set up, the server refused, or — the quiet one that cost the most time — post-processing is on but no prompt is checked, so there is nothing to run. The external server card carries a Test connection button and prints the server's own answer in red underneath the honest warning about where your text goes. When a prompt fails mid-dictation, that same line shows which prompt and why.
The server settings live in a dialog with a summary card in front of it, so the card no longer sprawls across the tab. A saved API key shows as dots — proof that something is stored — and stays untouched unless you type a new one.
The model catalog, rebuilt
The catalog had drifted into a loose stack of rows. It is now three tidy lines — search with its button beside the field, memory in words ("Memory available: 8.8 GB of 16 GB", not "1.7 / 16 GB free · CPU"), and the colour key on its own line — over a list with even rows and a fixed height, so the window stops jumping.
Installed models sit in their own block below the results, separated by a rule: a switch to pick the one that edits your text, whether it is in memory or only on disk, an eject button to hand the memory back, and a cross to delete. A model being downloaded keeps its place in the list with live percentages and a cancel cross.
The log speaks English
Every log line — 271 of them — and every error text is now in English, from startup to paste. The log is a thing people send to each other; it should not require Russian.
The ctfmon dialog
"ctfmon.exe — Fail Fast Exception" showed up on restarts and on opening the settings. The cause was ours: a background goroutine polled for the WebView2 window and moved and restyled it from a foreign thread, exactly while the Windows text services were attaching to it. The window is now created off the screen by the thread that creates it, and nothing touches it from outside afterwards.
Also
- The overlay's screen picker names monitors — "MAG 325Q E18V (2560×1440)" — instead of numbering them.
- Prompts can be dragged into the order they run in.
- Per-application rules, the pause hotkey and the animation switch are gone; the settings are shorter for it.
SHA-256:
holdtotype-portable.zip—808ed365b8e678405507ae0430c9c9a8b6ce224225c34f418a3e6761cd24c9e3holdtotype-setup.exe—ed127aeb807fd7f4299a66eca1dba8d98579c7cda5298d352e317136de1ac4b9
v0.72.0
The editor-model card joins the family
The installed editor models on the Post-processing tab still wore the old flat card, and after the 0.70 reframe it fell apart — the size wandered onto its own line and the delete cross floated under a stray rule. The card now wears the same frame as every model card: the name up top with its "in use" chip, and a footer with the size on the left and the actions on the right.
And the mmproj-*.gguf files — vision projectors that ride along with some models — no longer appear in the list at all. They are not language models; offering one as your text editor was a trap, and it is closed.
SHA-256:
holdtotype-portable.zip—67ba870a2e1cbe5f1f4b9642f5a4e84e47208591868a3f488b9f31e46f791240holdtotype-setup.exe—bb62be4f3bfa94653310b9dfc986636156177480d8218d5c169e77cc5994c2a5
v0.71.0
The picker keeps its order and loses its seam
Four small honesty-of-form fixes on the Languages & models tab.
The list stands still. Choosing a model no longer teleports it to the top of the picker — the list keeps one stable order, so nothing jumps under your cursor. Only the mark moves.
The open language holds its list without a seam. The divider line between the language row and its unfolded models is gone; instead the whole open block — header and list together — sits on a faint green tint, the same quiet highlight the navigation uses for the current section.
Model upkeep starts where it says it does. The upkeep block is set off from the language list with a line and real breathing room — no more guessing where one ends and the other begins.
Buttons line up. Buttons that sit in rows share one minimum width now — Unload and Check are twins, and so are their neighbours across the settings pages.
SHA-256:
holdtotype-portable.zip—af1f12fcbf955219e85a327e53e1b7070f86c2ed1780dbf2f02b0c1b1bb55e33holdtotype-setup.exe—95013d0ca913a89eea9c240fad58c5645afc6b7cb2d1323403bed02c10f54072
v0.70.0
The model cards take the frame the screenshots asked for
The model cards inside each language picker wear the frame the design review settled on: the name and its state chip up top with the accuracy and speed bars on the right, the description on its own line, and a footer of chips — languages, translate ability, RAM — with the size and the action icon on the right. The pieces are unbreakable: chips wrap as whole units, so no phrase ever tears mid-word at any width.
Every card carries a switch now. The assigned model's switch is on; flipping another card's switch (or clicking the card) makes it the choice, and flipping the assigned one off returns the language to Auto-detect. The licence-bound model's switch is locked. The "click a model to pick it" hint is gone — the switches say it without words.
"Your own model" became a numbered path: 1 — open the models folder (the button is right there), 2 — copy the model, with both supported layouts shown as cards (Whisper GGML as one file, Sherpa-ONNX as a folder with its files), 3 — restart, and the model appears for the languages it supports. A divider separates it from the upkeep rows, the two cards on the tab breathe apart, and the CPU line is gone.
Two fixes rode along: the Status page's memory line printed a raw format string (adv.ram%!…) since the advisor's removal took its message key along — it speaks again; and a long installed-models list on Status crushed its label into a one-word-per-line column — long values now wrap instead of squeezing the text next to them.
SHA-256:
holdtotype-portable.zip—577488b1036faf16eed5511b6ed57e877ec0cf4d0b1401a394a72c718049d875holdtotype-setup.exe—197d9fc33b05e87684aad90cac743f1f110ff99e5f227c3e0e884a581ba9479f