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.0.0
6 files changed
+111
SKILL.mdadded+57@@ -0,0 +1,57 @@+---+name: im-driving+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+---++# I'm Driving — hands-free 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 one rule that makes it actually audible (the usual failure)++`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:++```bash+# 1. Detect the surface+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. Narrate to THAT surface+adom-tts say "This is the <thread> thread — <your spoken answer>" \+ --thread "<thread>" --play --surface "$SURFACE" --out /tmp/reply.mp3+```++## How to narrate well++- **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`.++## Why this skill exists++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.
docs/shot.pngadded⋯ 1 unchanged line ⋯
docs/shot.svgadded+15@@ -0,0 +1,15 @@+<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 1000 600">+ <rect width="1000" height="600" fill="#0d1117"/>+ <rect x="60" y="70" width="880" height="460" rx="12" fill="#161b22" stroke="#30363d" stroke-width="1.5"/>+ <circle cx="92" cy="100" r="7" fill="#ff5f56"/><circle cx="116" cy="100" r="7" fill="#ffbd2e"/><circle cx="140" cy="100" r="7" fill="#27c93f"/>+ <text x="500" y="105" fill="#8b949e" font-family="monospace" font-size="15" text-anchor="middle">im-driving — hands-free narration</text>+ <line x1="60" y1="128" x2="940" y2="128" stroke="#30363d" stroke-width="1.5"/>+ <text x="92" y="180" fill="#7ee787" font-family="monospace" font-size="18">$ # user says: "I'm driving — read me that"</text>+ <text x="92" y="224" fill="#79c0ff" font-family="monospace" font-size="18">$ adom-cli hydrogen probe </text>+ <text x="92" y="252" fill="#c9d1d9" font-family="monospace" font-size="17"> window_mode = pup</text>+ <text x="92" y="300" fill="#79c0ff" font-family="monospace" font-size="18">$ adom-tts say "..." --play --surface pup</text>+ <text x="92" y="344" fill="#e6edf3" font-family="monospace" font-size="18"> 🔊 Narrating to the pup player… </text>+ <text x="92" y="372" fill="#7ee787" font-family="monospace" font-size="18"> ✓ audible (surface matched window_mode)</text>+ <text x="92" y="452" fill="#f0883e" font-family="monospace" font-size="16"> default hydrogen surface → SILENT on pup. match it.</text>+ <rect x="92" y="476" width="14" height="22" fill="#58a6ff"/>+</svg>
install.shadded+6@@ -0,0 +1,6 @@+#!/usr/bin/env bash+set -e+SKILL_DIR="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+mkdir -p "$SKILL_DIR"+cp "$(dirname "$0")/SKILL.md" "$SKILL_DIR/SKILL.md"+echo "Installed im-driving skill to $SKILL_DIR"
package.jsonadded+30@@ -0,0 +1,30 @@+{+ "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.0",+ "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.",+ "license": "MIT",+ "dependencies": {+ "adom/adom-tts": "*"+ },+ "scripts": {+ "install": "./install.sh",+ "uninstall": "./uninstall.sh"+ },+ "tags": [+ "skill",+ "tts",+ "accessibility",+ "hands-free",+ "voice",+ "driving"+ ],+ "hero": {+ "headline": "I'm Driving",+ "subhead": "Hands-free: Claude narrates the answer aloud \u2014 to the surface you can actually hear.",+ "screenshot": "docs/shot.png"+ }+}
uninstall.shadded+3@@ -0,0 +1,3 @@+#!/usr/bin/env bash+rm -rf "${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+echo "Removed im-driving skill"