Releases: Sammons/voicevector
Release list
VoiceVector v0.6.2
Windows delivery and polish, from user testing:
- Single-exe download — no zip. The Windows release is now one signed
VoiceVector-windows-x64.exe(SmartScreen shows a verified publisher);
no zip to extract, no.configsidecar, and the in-app updater swaps the
exe directly. - Real app icon everywhere — exe, title bar, and system tray (the tray
previously showed the default application glyph). - Fluent styling across the app — checkboxes, combo dropdowns, radio
buttons, text fields and tooltips now match the violet/Fluent look instead
of WPF's legacy default chrome. - Optional user-land installer — first run offers to copy the app to
%LOCALAPPDATA%\Programs\VoiceVectorwith a per-user Start Menu shortcut
and optional start-with-Windows. Never needs admin; declining keeps the
portable single file.
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.6.1
- Windows builds are now Authenticode-signed. Releases are signed via
Azure Artifact Signing with a public-trust certificate issued to
Sammons Software LLC; the signing key never leaves Microsoft's HSM and
CI authenticates keylessly through GitHub OIDC. The exe in this and all
future releases shows a verified publisher in SmartScreen instead of the
"unknown publisher" warning. Past unsigned releases keep validating
forever via their timestamp. - No code changes since v0.6.0 — this release exists to ship the signature.
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.6.0
Big release: review-before-pasting, multi-machine peering, and AI routing.
Multi-machine and routing are labeled Experimental in Settings — new and
still rough; great to try, don't rely on them yet.
- Router picks a numbered destination, not an opaque window id. The router
model now gets one flat, numbered list of destinations (0 = leave the cursor
where it is) and replies with a single small number, which the app maps back
to the real machine + window. Previously it had to echo a 5-digit window id
verbatim, which small models frequently got wrong — so routing failed and
fell back to a local paste more often than it should. Much more reliable. - See where routed text is going, and pick the field. When the router
targets a window, the staging card now shows a thumbnail of that window with
the destination input field highlighted; press ⇥ (⇧⇥ to go back) to cycle
through the window's input fields before you hit ⏎. The receiving machine
focuses the exact field you chose. Works for a window on this machine or a
paired one (macOS; the target must share its screen). Newwindowpeer
request and afieldindex ondeliver(docs/multi-machine.md). - Routed text lands in the app's input field. After the receiving machine
foregrounds the target app, its text input isn't always focused, so the
paste went nowhere. macOS now walks the foregrounded window's Accessibility
tree and focuses the first editable text field/area (the chat box, terminal,
etc.) before pasting. Needs the receiving Mac's Accessibility permission.
(Windows foregrounds and pastes into the app's focused control; Linux/Wayland
pastes into the focused window — no per-field control there.) - Cross-machine routing actually reaches paired machines. Pairing now
records the peer's network address on both sides (the receiving side reads
it from the connection), so you no longer have to type it in by hand. And a
paired machine is offered to the router even when it isn't sharing its
screens — "send this to " routes to its focused window (window 0);
sharing screens still adds per-window targeting. (Delivery into a machine
still requires that machine's "May paste into me" permission.) - Auto-submit (press Enter after pasting) — a per-hotkey option, off by
default. After the text is pasted the app presses Enter, so a dictated chat
message or terminal command is sent without touching the keyboard. It also
travels with a routed delivery: the receiving machine presses Enter, which
is the point for the cross-machine case where no one is at that keyboard.
Leave it off for editors, where Enter just inserts a line. - Speak the destination. When you open a router dictation by naming where
it should go — "Hey Slack, …", "Send this to the terminal —", "Tell Ben
that …" — the router now honours that spoken destination (it's given your
original words alongside the window lists), and the cleanup strips the
addressing phrase out of the pasted text instead of leaving it in. - Routed text only pastes once the target window is actually focused. On
macOS and Windows the app now confirms the destination window came to the
front before pasting; if the system refuses the focus change, the text is
copied with a "click it and press ⌘V/Ctrl+V" notice instead of landing in
whatever window happened to be focused (e.g. the terminal). (Linux/Wayland
can't focus another app's window, so it pastes into the focused one as
before.) - The AI router's choice is validated and bounced back. The destination
must be a machine and window that were actually offered (or window 0 for the
current focus); an invalid or hallucinated pick is returned to the router
with a specific error telling it what was wrong, up to three tries, before
falling back to the normal local paste. No more silent routing to nothing. - A spoken revision that transcribes to nothing now says so ("Didn't catch
that…") instead of silently doing nothing. - Multi-machine peering (Settings → Multi-machine, all three apps).
VoiceVector instances on the same tailnet/LAN pair with a 6-digit code
confirmed on both screens (Bluetooth-style numeric comparison over a
commit-then-reveal exchange), then talk over TLS with pinned self-signed
identities — no central authority. Per-peer permissions, both off by
default: "may see my screens" and "may paste into me". Protocol:
docs/multi-machine.md. - Route with AI (per hotkey, needs Review before pasting). A router model
looks at the draft, your windows and screens — and paired machines' too —
and picks the window the text was meant for; the staging card shows its
choice ("→ Slack on crankshaft") and ⏎ sends it there: the target window
is raised before pasting locally, or the text is delivered to the paired
machine, which pastes and saves it as a routed entry. Any router failure
falls back to the normal paste. Prompt:shared/prompts/router.txt.
Linux note: Wayland hides other apps' windows, so a Linux machine offers
its screens and receives text into the focused window, without per-window
targeting.
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.4.1
- Screenshot context covers every display. One image per display is
attached (not just the frontmost window), each preceded by a caption saying
which display is active — the one the text will be inserted into — and on
macOS and Windows that window is outlined in red in its screenshot. Linux
crops the portal's desktop capture per monitor; Wayland hides the focused
window, so with several displays the caption says the active one is unknown. - Screenshots are saved with the entry.
<id>-screen-N.jpgbeside the
WAV and Markdown, described byscreenshots/activeScreenshot/
screenshotOutlinefront-matter keys (docs/storage-format.md). One set per
dictation, taken when the hotkey fires; a retry from the library reuses it
instead of capturing whatever is on screen now. Deleted with the entry. - Fix (macOS): the app crashed at launch when "Keep the microphone always
warm" was on. - Fix (macOS): binding a hotkey to a regular (non-modifier) key crashed
the app whenever Settings showed that hotkey's name. - Fix (macOS): a newly added hotkey that was never set swallowed the
letter A everywhere (its placeholder is key code 0, which is A).
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.4.0
- Linux app (
apps/linux/, Ubuntu 26.04 / GNOME 50 reference; Wayland
and X11). C on GTK 4 / libadwaita, dynamically linked against system
libraries only — a ~230 KB binary, no runtime to install. Hotkeys through
the XDG GlobalShortcuts portal by default (sudo-free, hold-to-talk works),
or raw evdev input for modifier-only keys after a one-timeinputgroup
step; paste through the RemoteDesktop portal with a clipboard fallback;
API keys in the Secret Service. Same storage format, profiles, review mode,
and prompts as the other two apps, checked by a 104-assertion self-test in
CI. Seedocs/linux/README.md. - Review before pasting (per hotkey). The cleaned text is staged in a
card above the recording pill instead of being pasted. Press the hotkey and
say a change — "make it shorter", "turn that into a list", "sign it Ben" —
as many times as you like; a review model (the cleanup model by default, or
one you pick) rewrites the draft each time. ⏎ pastes, Esc discards. Neither
key reaches the app underneath while a draft is staged. - Screenshot context (per hotkey). A screenshot of the frontmost window is
captured when the hotkey fires and attached to the cleanup call and every
revision, so the model knows what you're looking at. macOS asks for Screen
Recording once; models without vision fall back to text automatically. - Reviewer prompt lives in
shared/prompts/review.txt, embedded and
self-test-checked in both apps like the cleanup prompts.
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.3.2
Recording feel, especially with external audio interfaces.
- Instant HUD. The recording overlay appears the moment the hotkey fires;
the microphone opens in the background. USB interfaces (Focusrite Scarlett
and friends) take about half a second to open, and that used to block the
whole UI. - Warm microphone (Settings → General). Two independent options: keep the
microphone open for 15 seconds after a recording (on by default — back-to-back
takes start instantly) and always keep it open while VoiceVector runs (off by
default). Either shows the OS mic-in-use indicator while the mic is open. - Level meter that works at any gain. Conservatively gained interfaces
produce speech around −40 dBFS — perfectly transcribable, but the old linear
meter barely moved. The meter is now a fixed, quantized scale (−60 dBFS
silence → −15 dBFS full, three steps), and handles Float32/Int16/Int32 and
multichannel input, taking the loudest channel. - Voice detection relative to the noise floor so silence-gap streaming
(transcribe-while-you-pause) works on quiet inputs too. VoiceVector --probe-audio [seconds](macOS) prints the default input's
format, per-channel levels, and device open latency, for diagnosing this
class of problem.
Full changelog: https://github.com/Sammons/voicevector/blob/main/CHANGELOG.md
VoiceVector v0.3.1
Full Changelog: https://github.com/Sammons/voicevector/commits/v0.3.1