WARNING: This is a personal software project. DON'T USE IT. It was 100% AI-generated and has bugs and problems that only the creator can deal with. This will ultimately be fixed, but BE WARNED.
Voice-to-Claude pipeline: Speak into your Galaxy Watch or phone (or just say "hey toadie"), Claude Code executes your command, and responses come back as text or TTS audio. Includes permission prompts for dangerous operations.
- Wear OS Watch App — Record voice commands from your wrist, view chat history, approve/deny Claude tool permissions
- Android Phone App — Full companion app with animated creature (Toadie), chat interface, voice recording, and text input
- Wake Word Detection — Say "hey toadie" hands-free using Picovoice Porcupine — always-on, on-device, low battery impact
- Python Server — HTTP + WebSocket server bridging apps to Claude Code, with permission hook for dangerous operations
- Speech-to-Text & TTS — Powered by Deepgram for fast transcription and natural voice responses
- Permission System — Dangerous tool calls (Bash, file writes) require approval from your watch or phone before Claude can proceed
- Web Dashboard — Vue.js control panel for monitoring Claude state, chat history, transcription settings, and permission prompts
- Remote Access — Works over Tailscale so you can talk to Claude from anywhere, not just your local network
- Public Viewer — Share a read-only live view via Cloudflare Tunnel — visitors see the animated creature, live chat, and Claude's state in real-time, protected by Cloudflare Access email OTP
Watch → Phone (Bluetooth/DataLayer) → Server (HTTP + WebSocket) → Deepgram (STT/TTS) + Claude Code → Response back
The watch has no direct network connection — all traffic relays through the paired phone via the Wearable DataLayer API.
For public access, a Cloudflare Tunnel exposes only /viewer and /ws through cloudflared path-based ingress, with Cloudflare Access email OTP as the auth layer.
# Server dependencies
pip install deepgram-sdk aiohttp
# Deepgram API key
export DEEPGRAM_API_KEY="your-api-key"
# Start server (pass your project directory)
./server.py /path/to/your/projectServer runs on HTTP :5566 + WebSocket :5567. Dashboard at http://localhost:5566.
# Build and install apps
cd watch-app && ./gradlew assembleDebug && adb install -r app/build/outputs/apk/debug/app-debug.apk
cd phone-app && ./gradlew assembleDebug && adb install -r app/build/outputs/apk/debug/app-debug.apkFor wake word detection, add your Picovoice access key to phone-app/local.properties:
porcupine.access_key=your-key-here
pytest # All tests
curl http://localhost:5566/health # Health check- Tailscale Peer Verification — Access control using Tailscale node identity
- Security: Defense in Depth — Multiple overlapping security layers
- Hardware Button Quick Record — Double-press a hardware button to start recording on the watch
- Public Viewer via Cloudflare Tunnel — Share a read-only live view of Claude sessions with anyone
- No transcript — Check Deepgram API key, verify audio format (m4a, wav, mp3)
- Claude not responding — Check
tmux attach -t claude-watchortail -f /tmp/claude-watch.log - Permission prompts missing — Ensure phone app is connected via WebSocket
- Watch can't connect — Watch only needs to be paired with phone; phone needs server IP in settings




