Release v8.11.0
Added
Native Windows support — no WSL required (#232)
- The MCP server,
converse, and the CLI now run natively on Windows 11: portable file
locking (voice_mode/file_lock.py), safe PID liveness probes via psutil, a dead-stream
stall backstop in the recording loop, and a Windows-safeVOICEMODE_DEBUG. No behavior
change on Linux/macOS; works with local or remote OpenAI-compatible STT/TTS endpoints.
Multi-voice sequences and voice surveys — converse grows turns[]
- Multi-voice
turns[](VM-1772) — oneconversecall speaks an ordered multi-voice
script with no synthesis dead-air (turn N+1 synthesizes while N plays). Per-turnvoice,
pause_after_ms(default 150 ms),tts_instructions,speed. CLI: repeatable
--say 'VOICE:TEXT'or--script FILE|-. The scalarmessage/voicepath is unchanged. - Surveys — the
askverb (VM-1775) — a turn can speak a question and collect the
spoken reply, so a multi-question survey runs in one call. Returns an index-aligned JSON
survey result, so a partial run still shows exactly which questions were answered; each
reply is logged the instant it's captured. Full per-turn control-channel support plus
spoken "repeat" / "wait" / "break". CLI--askexits 0 on completion, 3 on a partial. - "Heard you" cue (VM-1859) — opt-in
ackplays a short content-free cue the moment an
askturn captures a reply, and stays silent on a timeout — audible contrast between
captured and missed. Default off; enable per turn, call-wide, or with--ack. - Survey conventions (VM-1859) — agents are now instructed to announce the question
count up front and acknowledge collected answers at the top of the next call.
Control channel — transport buttons for in-flight speech
- pause / resume / stop (VM-1676) — a local-only socket into the running server lets a
Stream Deck key, media key, orvoicemode control {pause|resume|stop}act on the
utterance being spoken without going through the agent; a stop returns a clean
[control: stop]marker so the assistant continues in text. Off by default
(VOICEMODE_CONTROL_CHANNEL_ENABLED=true). See
docs/reference/control-channel.md. - skip-back (VM-1685) — CD-style replay: first press restarts the current utterance,
further presses step back through a bounded history buffer
(VOICEMODE_HISTORY_BUFFER_SIZE, default 8). Replays cached audio only — no new agent
turn, no STT, no model call. Pause now frees the provider connection (resume plays the
buffered remainder), and astatusquery reports now-playing + buffer position. - skip-forward (VM-1739, VM-1754) — the universal "move on" button: pressed while the
assistant speaks, it cuts the utterance and hands you the mic; pressed while you
speak, it ends the recording immediately and transcribes what was captured — a manual
end-of-turn and a reliable VAD fallback. Lands in ~200 ms.
Other
voicemode reconnect(VM-1727) — heal a dropped voicemode MCP server from a single
CLI call: drives Claude Code's/mcpreconnect flow on the agent's own tmux pane,
fails loud rather than sending blind keystrokes, distinct exit codes per outcome.
Changed
- Media-key Next now barges instead of stopping (VM-1742) — the Hammerspoon binding
sendsskip-forward: cut the assistant and take the mic. Point
~/.hammerspoon/init.luaatscripts/hammerspoon/voicemode-media-keys.lua. - Previous media key now replays (VM-1919) — the Hammerspoon binding's Previous
handler is wired tovoicemode control skip-back(it was a notice-only stub pending
VM-1685): first press restarts the current utterance, further presses step back. - Held
pauseself-heals after 5 minutes, not 30 seconds (VM-1853) —
pause-and-walk-away now survives; tune withVOICEMODE_CONTROL_PAUSE_TIMEOUT.
Security
- Control channel hardened following adversarial review (VM-1688) — named intents
replace free-form agent-facing text; peer-credential authentication with a0700
socket directory; bounded input; never-resumed pause self-heals; stale-socket cleanup
refuses files it doesn't own; handler threads and connection lifetime capped. Docs
Security section rewritten to the real threat model.
Fixed
- STT exchange-log records now carry
audio_file, matching TTS (VM-4) — the saved
recording's filename was computed but dropped before logging, so no STT record named
its audio (0 of ~11k on a long-lived install). The log→audio join is now an exact
match for both directions; no schema change. - Mixed-provider TTS failover resolves the model per endpoint (VM-1390) —
kokoro-fastapi/OpenAI gettts-1, mlx-audio getsmlx-community/Kokoro-82M-bf16, so
failover in a mixed chain speaks instead of hanging. Per-provider override:
VOICEMODE_TTS_MODELS_<PROVIDER>. - Local Whisper STT retries transient failures (VM-926) — timeouts / connection errors
/ 5xx retry with short backoff instead of losing the turn
(VOICEMODE_STT_RETRY_ATTEMPTS, default 2); permanent errors still fail fast. voicemode service installnames the missing dependencies (VM-1718, #303) — prints
each missing package with its install command instead of a generic failure.- Sony WH/WF-series headphones get full Bluetooth chime amplitude (VM-1883, #496) —
bareWH-/WF-model names are now detected as Bluetooth. Thanks @blakechasteen.
Installation
Quick Start (Recommended)
# Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install VoiceMode and configure services
uvx voice-mode-install
# Add to Claude Code MCP
claude mcp add --scope user voicemode -- uvx --refresh voice-modeAlternative: Direct Installation
# With UV
uv tool install voice-mode
# With pip
pip install voice-mode==8.11.0For detailed documentation, visit https://getvoicemode.com