From handsfree
Hands-free voice mode for Claude Code on macOS. Reads each response aloud with macOS `say`, then opens a dictation listener (SFSpeechRecognizer) for the next prompt. End your turn by saying "over" or by waiting out the 10s countdown. Transcript flows back into the session via the handsfree MCP channel.
How this skill is triggered — by the user, by Claude, or both
Slash command
/handsfree:handsfree [on|off|status][on|off|status]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Toggle hands-free voice mode for the current macOS session.
Toggle hands-free voice mode for the current macOS session.
you (speak) -> SFSpeechRecognizer -> handsfree MCP channel -> Claude
|
you (hear) <- macOS `say` <- Stop hook reads response <---------+
After each assistant turn, the Stop hook:
say (markdown/code fences stripped).SFSpeechRecognizer.http://127.0.0.1:<port>/inject with a
per-session bearer token, which the MCP channel forwards as the next
user prompt./handsfree on — set the active flag at ~/.claude/handsfree/active and
kick off the loop with a short greeting (so the Stop hook fires)./handsfree off — clear the active flag. The Stop hook no-ops on the next
turn and stops listening./handsfree status — print on or off.If invoked with no argument, toggle.
<channel source="handsfree"> events are user prompts spoken aloud.
Treat them exactly like a typed user message.When the user invokes this skill, run:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/state.sh" ${1:-status}
…and then in your response either:
Do not TTS yourself in chat — the Stop hook does that automatically.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub farishijazi/claude-voice-handsfree --plugin handsfree