What NodalVoice is#
NodalVoice is a Windows dictation app. You hold a shortcut, speak, and the text appears wherever you were typing. Transcription runs on your own machine by default: no account, no upload, no internet. It started as a prototype on 8 August 2026, built in Tauri and Rust, and was rewritten four days later as a native WPF application on .NET 10. It is a separate program from Nodal, with its own repository and tests, and the two are being joined so that your voice can reach your agents.
The reason it matters to Nodal is the second half of the owner’s description of the notification center: you can answer an agent, or bring up any agent and send it a custom prompt, by speaking. Typing long prompts to several agents is slow, and agents often ask short questions that are faster to answer aloud.
How you use it#
- Dictate. Hold
Ctrl + Winand speak. Release to transcribe and insert.Ctrl + Win + Spacetoggles recording for longer dictations, andEsccancels. - Choose where it goes. When you finish, NodalVoice asks where the text belongs: into a specific agent session as a prompt, or into another window such as Notepad or Obsidian.
- Optionally rewrite it. Another AI agent can turn rambling speech into a prompt-ready prompt before it is sent.
- Send. A prompt arrives in the session, or text arrives in the window.
NodalVoice starts in the notification area and shows a small floating widget while you record. A live transcript preview appears as you speak. Settings, history and models are in its own window. Windows comes first, and a Linux version is planned to be built before version 1 of Nodal.
Local by default#
Transcription uses the Whisper family of speech models through whisper.cpp, wrapped for .NET. Models are downloaded once and kept locally, and models from earlier prototypes are reused rather than fetched again. A cloud transcription option exists, with its key encrypted by Windows’s per-user data protection so a copied settings file yields nothing. By design, the audio never leaves your computer unless you turn that on, and raw audio is never written to a temporary file: samples go straight from the capture callback, resampled and filtered, into the recognizer.
Engineering that matters to users#
- Small and quiet. The rewrite measured 135 MB resident with the tray icon running and 0.005 percent idle CPU on a 16-core machine, compared with roughly 200 MB of web view to draw a 300-pixel pill in the first prototype.
- A real keyboard hook. The prototype polled the keyboard every 12 milliseconds forever. The rewrite installs a low-level hook on its own thread, so Windows calls it only when a key changes. That is the single biggest reason idle CPU is effectively zero.
- Chord logic that handles awkward cases. A hold chord that is a prefix of the toggle chord gets a short grace delay, releasing only the toggle key does not arm a hold, and a modifier whose key-up was swallowed by another window is healed by probing its real state.
- Audio done properly. Shared-mode capture through WASAPI, resampling to 16 kHz mono with a low-pass filter inside the capture callback, and a pull-model level meter so the audio thread does not flood the interface.
- Layered design. A platform layer for Win32, a core layer for audio, transcription, settings and the dictation state machine, and a WPF shell, with dependencies flowing one way. The logic that is easy to get subtly wrong has its own tests, including an integration test that synthesizes a sentence with the Windows speech engine and checks the transcript.
Speed and accuracy work#
A write-up in the repository measures the delay between releasing the key and getting the text. The live preview and the final transcript are deliberately separate passes: a small fast model snapshots a sliding 24-second window about every 600 milliseconds while you speak, and on release a larger selected model transcribes the whole silence-trimmed recording. Reusing the preview would have been fast and would have silently dropped accuracy, so the pipeline kept the accurate pass and accelerated it instead.
| Model | CPU final pass | With Vulkan and vocabulary |
|---|---|---|
| base | 1,221 ms | 987 ms |
| small (English) | 3,553 ms | 1,244 ms |
| large v3 turbo, quantized | 16,991 ms | 1,288 ms |
| large v3 turbo | 15,379 ms | 1,347 ms |
The numbers are median final-inference times for a 13-second synthetic test clip, measured on one Windows machine with an NVIDIA GPU, using the optional Vulkan runtime with a CPU fallback. The same clip also tested a vocabulary system. With a list of configured terms passed to the model and a conservative canonicalizer afterward, exact-term accuracy on the test sentence rose from 6 to 8 of 9 terms on CPU to 9 of 9 on all four models. A later check of an English-only distilled model scored 9 of 9 and was about a quarter faster than full turbo. The write-up is careful to say that one synthetic voice is not enough evidence to pick a universal default, and recommends testing on real microphones, accents and noise.
The vocabulary canonicalizer is deliberately timid. It restores spelling and casing, such as a spoken “Open AI” becoming OpenAI, and fixes narrow one-character or plural errors. It will not turn a shorter common word into a longer technical term, and it will not rewrite “cloud” as “Claude”, because a global rule like that would corrupt the ordinary word.
The path into Nodal#
The link between NodalVoice and Nodal is a local named pipe, designed with a short list of safety rules. The pipe uses a per-user security descriptor plus a shared-secret handshake. The message format has no field for raw audio. If the pipe is unreachable, the transcript stays in NodalVoice’s own history instead of disappearing. Delivery goes through preview, confirmation and a capability check at the moment of sending, and the audit record keeps request ID, time, target session, result and prompt length or hash, never the text. A token lifecycle covering bootstrap, rotation, expiry, replay protection and instance binding is its own required plan. Everything fails closed. The wider rationale is on the notification center page and in the security page.
Status
NodalVoice itself is a working Windows app. Its integration with Nodal is the newest part of the beta line and is tuned in public. Whether and when NodalVoice is bundled with Nodal, or kept as a separate download, has not been settled; the design records it as either.
Where it fits#
Voice control of Nodal itself, such as telling it to focus a session, stop it or relaunch it, is a recorded idea and not part of the current plan, which is about dictation into sessions. Clipboard-related ideas from the original prototype, such as keeping an archive of the last 50 text and image clipboard entries, are on NodalVoice’s own backlog. The history of the project, including how NodalVoice and the earlier ToolTab app fit together, is on the history page, and the app that taught the owner what a Beeper should be is the subject of the ToolTab v1 page.