Skip to content

michal-franc/toadie-personal-assistant

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

171 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

Toadie Personal Assistant

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.

Demo video — click to play   Watch - Idle   Watch - Thinking

  • 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

Web Dashboard

Architecture

Architecture Diagram

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.

Phone Relay Architecture

Setup

# 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/project

Server 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.apk

For wake word detection, add your Picovoice access key to phone-app/local.properties:

porcupine.access_key=your-key-here

Testing

pytest                             # All tests
curl http://localhost:5566/health  # Health check

Features

Troubleshooting

  • No transcript — Check Deepgram API key, verify audio format (m4a, wav, mp3)
  • Claude not responding — Check tmux attach -t claude-watch or tail -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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors