HoldToType

docs

Build it yourself

The only requirement is a running Docker Desktop. Nothing is installed on the machine: no Go, no compilers, no packaging tools.

One script

git clone https://github.com/Vitalii-Yemets/holdtotype
cd holdtotype
.\build.ps1   # small model, about 466 MB
.\build.ps1 -Model medium   # more accurate, larger

The result lands in dist/:

filewhat it is
holdtotype.exe

tray client: Go, WinAPI, WebView2

whisper-server.exe

recognition, whisper.cpp, static build

sherpa-server.exe

recognition, sherpa-onnx, official static build, pinned and checksum-verified

sherpa-online-server.exe

streaming recognition, sherpa-onnx, from the same pinned archive

llama-server.exe

the editor model for post-processing, llama.cpp

models/

the model you chose at build time

config.default.json

default settings

What the pipeline does

MinGW-w64 cross-compilation of whisper.cpp and llama.cpp inside a Linux container, the Go client with cgo for microphone capture, icon generation, installer packaging. All of it is in build/Dockerfile. Both engines are pinned to specific upstream versions, so builds stay reproducible.

Tests

Everything runs in containers too, nothing to install:

docker build --file build/Dockerfile --target gotest .   # Go unit tests and go vet, Windows target
docker run --rm -v "${PWD}:/w" -w /w node:20 sh -c "node test/build-page.js && cd test && npm i --no-save --silent jsdom && node ui.test.js"   # the settings page in jsdom
  • client/internal/... — unit tests for the pieces that carry logic: version comparison, hotkey duplicates, per-application rules, replacements, voice commands, history, prompt chains, sound analysis, file hashes and the lists file.
  • test/ui.test.js — the real settings page rendered in jsdom: section switching, the translation matrix, the prompt editor, rules, replacements, commands, history, model deletion, the first-run wizard, and no JavaScript errors.
  • test/locales.test.js — every one of the eight languages carries every string the page and the program ask for.
  • test/setup.test.js — the installer page: the steps, the model choice, the silent switches.
  • client/internal/theme — every design keeps its own face, corners, level marks and lamps.

Then run your own build instead of the downloaded one. It is the same program, made from the same sources.