Productive Voice is a Windows dictation app priced at $39, paid once. A floating pill records speech, a speech service transcribes it on the customer’s own account, an optional AI model tidies it, and the text is pasted into whichever window has focus. PRTOTYPE.COM designed it, built it and ships it.
Dictation on Windows is mostly rented. At November 2026 prices, Wispr Flow Pro costs $15 a month, or $144 for a year paid up front, and Dragon Professional sells for about $699. The $39 one-time slot that VoiceInk fills on macOS did not exist on Windows.
Productive Voice takes that slot. The buyer pays once, connects their own Deepgram, AssemblyAI or Groq key, and pays the provider at cost with no markup. Audio goes from the PC to that provider’s account and nowhere else. The app sends no telemetry.
That decision sets the engineering problem. With no server of ours in the audio path, capture, retry, paste, key storage and the licence check all have to work on the customer’s machine, unattended, on hardware we never see.
The first commit was on 10 March 2026. Version 0.5.2 was published on 11 November 2026, with a changelog that lists what is still not done.
“$39. Pay once. Dictate anywhere on Windows. Your keys, your data, no subscription.”
These are captures of version 0.5.2 running on Windows with demonstration data. The meeting, the names and the keys are invented; the screens are the shipped ones. Click any plate to see it full size.
Click the pill or press the hotkey, speak, and the text is pasted into whichever app has focus through the Win32 API. History files each dictation under the app it went to: Outlook, Slack, Visual Studio Code, Notepad. None of the text on this screen was typed.
Long recordings get a summary in one of five templates: meeting, client call, lecture, interview or brain dump. The summary names the model that wrote it and tells the reader to check important details against the audio. Actions carry the speaker names the user chose.
Speaker labels come from the speech provider, and the app says on screen that they can be wrong. Click a name to rename a speaker; click a time to play the audio from that line. If a provider refuses speaker labels, the app transcribes again without them and still returns the text.
Each recording gets a chapter timeline written from its transcript, with times that point to the nearest spoken line. A player is docked under the recording, with a seek bar and the chapter now playing. A recording that is not transcribed yet shows its estimated cost before the user commits.
Speech goes to Deepgram, AssemblyAI or Groq. Text tidying goes to OpenRouter or OpenAI, or is switched off for raw dictation with one key. HIPAA-safe routing is described in plain words on the toggle itself: it does not make the app HIPAA compliant. Updates are checked at launch and every six hours.
The 30-day trial is anchored to the licence server, so wiping settings does not restart it. Provider keys appear as masks, each with a connection state and the provider’s rate beside it: about $0.0077 a minute for Deepgram. The key itself never reaches this window.
A desktop product runs on the buyer’s machine, where anyone can open it up. These are the rules the app holds itself to, each one enforced in code.
Every reply from the licence server is verified with Ed25519 against a public key built into the app. Only a signed refusal can lock the app. A network failure starts a seven-day offline grace period.
A reply signed more than ten minutes from the PC’s clock is reported as a clock problem, with the reason shown to the user. Setting the clock back never locks the app and never starts a new trial.
The installed app cannot be started as a plain Node program, ignores --inspect and NODE_OPTIONS, and loads only the app.asar built with the release, with its integrity checked. A packaged test reads the fuses back from the exe.
Saved API keys are not sent to the app’s windows. Settings receives a mask, and checking a saved Deepgram key works from the mask. The page security policy allows no inline scripts, and the font ships inside the app.
Audio waiting to be processed lives in a private folder inside the app’s data, under random names. After a crash, only a file the app made itself is recovered. A recording left mid-transcription is reset on the next start.
“Press Enter after paste” would run a half-dictated command in a shell. The app checks the focused process against 17 known terminals and withholds Enter. A terminal inside an editor cannot be detected, and Settings says so.
Six stages, run by one state machine with every side effect injected. The machine is pure, so its timing rules are tested without a microphone, a network or a window.
// src/main/dictation/stateMachine.ts — the 'stop' action (logging removed)
case 'stop': {
// A stop arriving before the mic became ready is a cancel of the start:
// no audio has been streamed yet, so there is nothing to finalize.
if (this.currentState === 'starting') {
this.isCancelled = true;
this.deps.stopSTT();
await this.deps.discardAudioBuffer();
this.setState('idle');
return;
}
if (this.currentState !== 'listening') return;
this.setState('finalizing');
// Do NOT close the STT stream here. The renderer flushes its worklet
// tail (final <256ms of speech) during 'finalizing' and then sends
// AUDIO_END, which closes the stream.
// Closing here used to clip the last word(s) of every dictation.
// Safety net: if AUDIO_END never arrives (renderer crashed), force
// the stream closed after 3s so we never hang in 'finalizing'.
this.finalizeTimeout = setTimeout(() => {
this.deps.stopSTT();
}, FINALIZE_SAFETY_TIMEOUT_MS);
break;
}Each release ships with a changelog, and the two latest carry a section for what is not done. These are the entries, shortened, with those known gaps as published.
The 30-day trial is anchored to the licence server, so reinstalling does not restart it. Development builds no longer bypass the licence gate. The dependency audit is cleared to zero known problems.
AI summaries with five templates, speaker labels with renaming, a chapter timeline for each recording, and an in-app update flow.
Long recordings upload as a compressed copy, so an hour of audio no longer times out on an ordinary connection. Transcribing again no longer deletes the old transcript when the new attempt fails. The claims that audio is processed locally and that the app has an offline mode were removed, because it has no offline speech-to-text.
Saved keys are no longer sent to the app’s windows, Electron fuses are set, waiting audio moves to a private folder, and Recordings becomes a list with the chosen recording beside it and a docked player.
The app talks to the customer’s providers and to one small licence server. Everything else runs on the PC it is installed on.
Version 0.5.2 is on the public releases page, with a SHA-256 value for each installer. The installer is not code-signed yet, so Windows SmartScreen may warn. A 30-day trial starts on first run.
Productive Voice went from a first commit in March 2026 to a licensed, self-updating Windows product. If you have a desktop app that needs native integration, licensing or a hardened release, let's talk it through.