skill
Hands-Free — voice narration
Public Made by Adomby adom
When the user can't look at the screen, narrate replies aloud via adom-tts — verified, queued, replayable.
← Commit history
Publish 1.1.0
7 files changed
+68−76
README.md+9−13@@ -1,15 +1,11 @@-# I'm Driving — hands-free narration+# Hands-Free — voice narration -The discoverable entry skill for drive-mode. When the user says **"I'm driving"**,-**"read me that"**, **"hands-free"**, or anything similar, Claude stops writing text-and **narrates the answer aloud** via the Adom Desktop TTS player (`adom-tts`).+Tell your AI "read it to me" and it speaks its answers aloud through the+shared [Adom TTS](https://wiki.adom.inc/adom/adom-tts) player — verified+end-to-end, queued across all your AI threads, with a replayable History for+anything you missed. -Its one job beyond discoverability: **match the play surface to the user's window-mode** (`pup` vs `hydrogen`) so the audio is actually audible — the default-hydrogen surface is silent when the user is in `pup` mode.--See [`SKILL.md`](SKILL.md) for the trigger list and the narration recipe.--## License--**MIT** — © 2026 Adom Industries Inc. Open source; see [LICENSE](LICENSE). Modify, fork, and redistribute freely.+Use it on a commute, cooking, walking, or just resting your eyes at your+desk. This skill is a thin trigger layer: the full contract lives in the+[adom-tts skill](https://wiki.adom.inc/adom/adom-tts) (this package depends+on it).
SKILL.md+40−46@@ -1,61 +1,55 @@ ----name: im-driving+name: hands-free+user-invocable: true description: >- Hands-free / drive-mode. The MOMENT the user signals they're driving or can't- look at the screen, STOP writing text walls — narrate your answer ALOUD through- the Adom Desktop TTS player (adom-tts). Read + apply this skill immediately on- any hands-free phrase, and keep narrating every reply until they say they're done.- TRIGGERS (invoke instantly on ANY of these, exact or paraphrased):- "I'm driving", "I am driving", "while I drive", "while driving", "I'm in the car",- "on the road", "hands free", "hands-free", "drive mode", "driving now",- "read me", "read it to me", "read that back", "read me your last",- "read me that", "read me the last", "read your last answer", "speak that",- "say that out loud", "play it back", "play that", "narrate this", "talk to me",- "I can't look at the screen", "can't read the screen", "can't see the screen".-metadata:- type: reference+ Hands-free / eyes-free narration. The MOMENT the user signals they can't look+ at the screen — or just prefers to LISTEN — stop writing text walls and speak+ your answer aloud through the shared Adom TTS player, and keep narrating+ every reply until they say they're done. TRIGGERS (invoke instantly on ANY of+ these, exact or paraphrased): "hands free", "hands-free", "read it to me",+ "read me your answer", "read me that", "read that back", "read your last+ answer", "speak that", "say that out loud", "narrate this", "talk to me",+ "play it back", "I can't look at the screen", "can't read the screen",+ "can't see the screen", "I'm driving", "I am driving", "while I drive",+ "I'm in the car", "on the road", "on my commute", "drive mode". --- -# I'm Driving — hands-free narration+# Hands-Free — voice narration -When the user is driving, **your reply is AUDIO, not text.** Narrate it through-`adom-tts` (the Adom Desktop TTS player). Don't make them read.+The user's eyes and hands are busy (or they simply prefer listening). Speak+your answers; don't write walls of text they can't read. -## ⚠️ The one rule that makes it actually audible (the usual failure)+## The one pattern (everything else lives in the adom-tts skill) -`adom-tts` defaults to a **hydrogen webview** player. If the user's window mode is-**pup**, that webview tab isn't open and **they hear NOTHING** — the clip-synthesizes, you think it played, and they get silence. So ALWAYS match the play-**surface** to their window mode:+This skill is a thin entry point. The canonical contract — verified playback,+the shared queue, History and replays, buffering through connection drops —+is documented ONCE, in the `adom-tts` skill. Read it. The short version: ```bash-# 1. Detect the surface from the user's window mode-MODE=$(adom-cli hydrogen probe | python3 -c "import sys,json;print(json.load(sys.stdin).get('window_mode','hydrogen'))")-SURFACE=$([ "$MODE" = "pup" ] && echo pup || echo hydrogen)--# 2. If the relay has >1 client, the pup player's browser_open_window is-# AMBIGUOUS and fails silently. Pin it to the user's host:-export ADOM_DESKTOP_TARGET=$(adom-desktop status | python3 -c "import sys,json;print(json.load(sys.stdin).get('hostname',''))")--# 3. Narrate to THAT surface. NOTE: --thread is a `play` flag, NOT a `say` flag. adom-tts say "This is the <thread> thread — <your spoken answer>" \- --play --surface "$SURFACE" --out /tmp/reply.mp3+ --out /tmp/answer.mp3 --thread "<thread>" \+ --desc "<one human sentence: what this update says>" \+ --play --confirm ``` -## How to narrate well+- `--thread` + `--desc` are REQUIRED with `--play` (exit 6 otherwise) — many+ AI threads share one player and one History; the human needs WHO and WHAT.+- `--confirm` blocks until the human actually heard it. On UNCONFIRMED, do+ NOT re-send (clips buffer + retry on their own); poll `adom-tts check`.+- Keep each spoken reply conversational, roughly 30-60 seconds.+- No separate text summary on top — the user isn't reading.++## Session rules -- **Start with** "This is the `<thread name>` thread —" (all Claude threads share- one player, so the user needs to know who's speaking). Also pass `--thread`.-- **Conversational + short.** No markdown, no code, no slugs/jargon read aloud.-- **Proactive.** While they're driving, narrate EVERY reply automatically — don't- wait to be asked again.-- **Replay:** `adom-tts play last --surface "$SURFACE"`.-- **Confirm if it matters:** add `--wait` (blocks until the audio's `ended` event).- If it times out, the surface was wrong — re-check `window_mode`.+- Once triggered, narrate EVERY reply until the user ends it ("I'm not+ driving anymore", "back at my desk", "you can stop reading now").+- If the player surface is a desktop browser context (`adom-cli hydrogen+ probe` says window_mode "pup"), add `--surface pup`.+- Missed clips: the player's History drawer replays any clip instantly —+ tell the user it's there if they say they missed something. -## Why this skill exists+## Safety note -The hands-free capability lives in the `adom-tts` tool, but it was undiscoverable-(the `driving-*` skills are about driving *software*, not a car) and it silently-failed when the play surface didn't match the user's window mode. This skill is the-discoverable entry point + the surface-matching fix.+This skill exists so the user does NOT have to look at a screen. Never ask+them to read, click, or review anything visual while hands-free — offer to+queue visual items for later instead.
hands-free-hero.pngadded⋯ 1 unchanged line ⋯
install.sh+4−2@@ -1,6 +1,8 @@ #!/usr/bin/env bash set -e-SKILL_DIR="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+SKILL_DIR="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/hands-free" mkdir -p "$SKILL_DIR" cp "$(dirname "$0")/SKILL.md" "$SKILL_DIR/SKILL.md"-echo "Installed im-driving skill to $SKILL_DIR"+# remove the pre-rename skill dir so both names never coexist+rm -rf "${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+echo "Installed hands-free skill to $SKILL_DIR"
package.json+8−8@@ -1,11 +1,11 @@ { "schema_version": 1, "type": "skill",- "slug": "im-driving",- "title": "I'm Driving \u2014 hands-free narration",- "brief": "When the user is driving, narrate replies aloud via adom-tts (to the correct pup/hydrogen surface).",- "version": "1.0.2",- "description": "Hands-free / drive-mode entry skill. On any 'I'm driving' / 'read me' signal, narrate the answer through the Adom Desktop TTS player instead of text \u2014 and match the play surface to the user's window_mode so it's actually audible.",+ "slug": "hands-free",+ "title": "Hands-Free — voice narration",+ "brief": "When the user can't look at the screen, narrate replies aloud via adom-tts — verified, queued, replayable.",+ "version": "1.1.0",+ "description": "Hands-free entry skill. On any 'read it to me' / 'hands-free' / eyes-busy signal, speak the answer through the shared Adom TTS player instead of writing a text wall. Defers to the adom-tts skill for the canonical verified pattern.", "license": "MIT", "dependencies": { "adom/adom-tts": "*"@@ -20,11 +20,11 @@ "accessibility", "hands-free", "voice",- "driving"+ "narration" ], "hero": {- "headline": "I'm Driving",- "subhead": "Hands-free: Claude narrates the answer aloud \u2014 to the surface you can actually hear.",+ "headline": "Hands-Free",+ "subhead": "Your AI speaks its answers aloud — verified, queued, replayable.", "screenshot": "docs/shot.png" }, "visibility": "public",
page.json+5−5@@ -2,10 +2,10 @@ "schema_version": 1, "type": "skill", "slug": "hands-free",- "title": "I'm Driving — hands-free narration",- "brief": "When the user is driving, narrate replies aloud via adom-tts (to the correct pup/hydrogen surface).",- "version": "1.0.2",- "description": "Hands-free / drive-mode entry skill. On any 'I'm driving' / 'read me' signal, narrate the answer through the Adom Desktop TTS player instead of text — and match the play surface to the user's window_mode so it's actually audible.",+ "title": "Hands-Free — voice narration",+ "brief": "When the user can't look at the screen, narrate replies aloud via adom-tts — verified, queued, replayable.",+ "version": "1.1.0",+ "description": "Hands-free entry skill. On any 'read it to me' / 'hands-free' / eyes-busy signal, speak the answer through the shared Adom TTS player instead of writing a text wall. Defers to the adom-tts skill for the canonical verified pattern.", "license": "MIT", "dependencies": { "adom/adom-tts": "*"@@ -20,7 +20,7 @@ "accessibility", "hands-free", "voice",- "driving"+ "narration" ], "hero": { "type": "image",
uninstall.sh+2−2@@ -1,3 +1,3 @@ #!/usr/bin/env bash-rm -rf "${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"-echo "Removed im-driving skill"+rm -rf "${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/hands-free"+echo "Removed hands-free skill"