Skip to content

⌚ Claude Watch The first wearable interface for AI-assisted coding. Approve code changes from your wrist. No phone. No laptop. Just tap.

Notifications You must be signed in to change notification settings

fotescodev/claude-watch

Repository files navigation

watchOS 10.0+ Swift 5.9+ MCP Protocol MIT License

Coming Soon Beta Testers Wanted



⌚ Claude Watch

The first wearable interface for AI-assisted coding.
Approve code changes from your wrist. No phone. No laptop. Just tap.


# Install and pair in 30 seconds
npm install -g remmy-cli
remmy-cli
# Enter the code shown on your Apple Watch

ProblemSolutionFeaturesQuick StartArchitectureRoadmap




🎬 See It In Action

                    ┌─────────────────────────────────┐
   *buzz* *buzz*    │ 🔧 Claude: File Edit            │
                    │                                 │
  You look down     │ src/auth/login.py               │
  at your watch     │ "Add rate limiting to           │
        ↓           │  prevent brute force..."        │
                    │                                 │
                    │  [Approve]  [Reject]  [Open]    │
                    └─────────────────────────────────┘
                                   │
                              tap Approve
                                   │
                                   ▼
                      ✓ Claude continues coding
                        You continue walking

Your AI pair programmer, now on your wrist.




😤 The Problem

You're using Claude Code. It's incredible. But...

  • 🚶 You step away from your desk for coffee
  • 💻 Claude needs approval for a file edit
  • ⏳ Your AI sits there. Waiting. Blocked.
  • 😫 You come back 10 minutes later to find... nothing happened

Every context switch kills your AI's momentum.


💡 The Solution

┌─────────────┐         ┌─────────────┐         ┌──────────────────┐         ┌─────────────┐
│ Claude Code │──WS────►│Bridge Server│──HTTP──►│ Cloudflare Worker│◄──HTTP──│ Apple Watch │
│   (CLI)     │         │  (on Mac)   │         │  (Cloud Relay)   │         │  (on wrist) │
└─────────────┘         └─────────────┘         └────────┬─────────┘         └─────────────┘
                                                          │                          │
                                                          ▼                          │
                                                    APNs (optional)                  │
                                                          │                          │
                                                          └──────────polling─────────┘

Claude Watch uses a cloud relay. When Claude needs your approval:

  1. 📱 Your watch buzzes
  2. 👀 You glance at your wrist
  3. 👆 Tap Approve
  4. ✅ Claude continues — you never broke stride

No phone. No laptop. No app to open. Just tap the notification.




✨ Features

🔔 Actionable Notifications

Approve or reject directly from the notification banner. The app doesn't even need to open.

🎯 Single-Screen UI

Everything you need, nothing you don't. Status, pending actions, voice input — one glance.

🎤 Voice Commands

"Run the tests" "Fix the errors" "Commit with message auth hotfix"

🔄 Mode Cycling

Just like Claude Code's Shift+Tab:

  • Normal → Approve each action
  • Auto → YOLO mode, approve all
  • Plan → Read-only research

⌚ Complications

See progress right on your watch face. No app launch needed.

📳 Haptic Feedback

Different vibration patterns for different events. You'll feel when something needs attention.




🖼️ Screenshots

Coming soon — currently in active development

┌─────────────────────────┐
│ ● REFACTORING 73% │
│ ▓▓▓▓▓▓▓░░░ │
│ RUNNING AUTO │
├─────────────────────────┤
│ ✏️ Edit login.py │
│ [Approve] [Reject] │
├─────────────────────────┤
│ 🎤 Voice Command │
├─────────────────────────┤
│ ⚡ AUTO → PLAN │
└─────────────────────────┘




🚀 Quick Start

Prerequisites

  • Apple Watch Series 6+ with watchOS 10+
  • Mac with Claude Code CLI installed
  • Xcode 15+ (for building)

Option A: Cloud Mode (Recommended)

Works anywhere with internet — walk your dog, go to a coffee shop, etc.

1️⃣ Generate Pairing Code

curl -X POST https://claude-watch.fotescodev.workers.dev/pair
# Returns: {"code": "ABC-123", "pairingId": "...", "expiresIn": 600}

2️⃣ Enter Code on Watch

Open the watch app → Settings (gear icon) → Pair with Code → Enter code

3️⃣ Send Approval Requests

# From Claude Code or any script:
curl -X POST https://claude-watch.fotescodev.workers.dev/request \
  -H "Content-Type: application/json" \
  -d '{"pairingId": "YOUR_PAIRING_ID", "type": "bash", "title": "npm test"}'
# Returns: {"requestId": "abc123"}

4️⃣ Poll for Response

curl https://claude-watch.fotescodev.workers.dev/request/abc123
# Returns: {"status": "approved"} or {"status": "rejected"} or {"status": "pending"}

Option B: Local WebSocket Mode

For local development or when you don't want cloud dependency.

# 1. Start server
cd MCPServer && python server.py --standalone --port 8787

# 2. Expose via tunnel (Tailscale/ngrok/Cloudflare)
tailscale serve 8787

# 3. In watch app: Settings → Enter ws://your-url:8787 → Connect



🏗️ Architecture

claude-watch/
│
├── 📱 ClaudeWatch/              # watchOS App (Swift/SwiftUI)
│   ├── App/                     # Entry point + notification handling
│   │   └── ClaudeWatchApp.swift # AppDelegate, notification categories
│   ├── Views/                   # SwiftUI views
│   │   ├── MainView.swift       # Main UI with action queue
│   │   └── PairingView.swift    # Pairing code entry
│   ├── Services/                # Business logic
│   │   └── WatchService.swift   # Cloud polling, state
│   └── Complications/           # Watch face widgets
│
├── 🌐 MCPServer/worker/         # Cloudflare Worker (JavaScript)
│   ├── src/index.js             # Cloud relay API
│   ├── wrangler.toml            # Cloudflare config
│   └── package.json             # Dependencies
│
├── 🖥️ MCPServer/bridge/         # Bridge Server (Python)
│   ├── main.py                  # Entrypoint
│   ├── ndjson_server.py         # NDJSON WebSocket for CLI
│   ├── api.py                   # Watch-facing REST API
│   ├── cloud_client.py          # Cloud relay client
│   └── tests/                   # 379 tests
│
├── 💻 remmy-cli/                # TypeScript CLI
│   └── src/                     # 129 tests
│
└── 🖥️ MCPServer/server.py       # Legacy standalone server (optional)

Bridge Mode Flow (Production)

┌────────────────────────────────────────────────────────────────────────────────┐
│                                                                                │
│  1. PAIRING                                                                    │
│  ────────────────────────────────────────────────────────────────────────────  │
│  remmy-cli                 Bridge              Cloudflare          Watch       │
│       │                      │                      │                 │        │
│       │                      │                      │◄── POST /pair ──│        │
│       │                      │                      │──► {code:"ABC"}─►│       │
│       │                      │                      │                 │        │
│       │─ Enter code ────────►│                      │                 │        │
│       │                      │─ POST /pair/complete ►│                 │        │
│       │                      │                      │                 │        │
│                                                                                │
│  2. REQUEST/RESPONSE                                                           │
│  ────────────────────────────────────────────────────────────────────────────  │
│  Claude CLI              Bridge              Cloudflare          Watch         │
│       │                      │                      │                 │        │
│       │─ can_use_tool (WS) ─►│                      │                 │        │
│       │                      │─ POST /request ─────►│                 │        │
│       │                      │                      │─ APNs push ────►│        │
│       │                      │                      │                 │        │
│       │                      │                      │◄── GET polls ───│        │
│       │                      │                      │◄── POST respond ─│       │
│       │                      │◄─ GET /request ──────│                 │        │
│       │◄─ control_response ──│                      │                 │        │
│       │                      │                      │                 │        │
└────────────────────────────────────────────────────────────────────────────────┘

Cloud Relay API Endpoints

Endpoint Method Description
/pair POST Generate 6-char pairing code (expires 10 min)
/pair/complete POST Watch completes pairing with code + device token
/pair/:id/status GET Check if pairing is complete
/request POST Send approval request (returns requestId)
/request/:id GET Poll for response status
/requests/:pairingId GET List pending requests (for watch polling)
/respond/:id POST Watch sends approve/reject
/health GET Health check

Legacy Standalone Mode (Development)

┌────────────────────────────────────────────────────────────────┐
│                                                                │
│   Claude Code                                                  │
│       │                                                        │
│       │ MCP Protocol                                           │
│       ▼                                                        │
│   ┌──────────┐    WebSocket     ┌─────────────┐                │
│   │server.py │◄────────────────►│ Apple Watch │                │
│   └────┬─────┘                  └─────────────┘                │
│        │                              ▲                        │
│        │ APNs Push                    │                        │
│        └──────────────────────────────┘                        │
│                                                                │
└────────────────────────────────────────────────────────────────┘

MCP Tools (Local Mode)

Tool Description
watch_request_approval Block until watch approves/rejects
watch_notify Send notification to watch
watch_update_progress Update progress indicator
watch_set_task Set current task name
watch_complete_task Mark task as done



🗺️ Roadmap

✅ Done

  • WebSocket real-time sync
  • Actionable push notifications
  • Mode cycling (Normal/Auto/Plan)
  • Voice commands
  • Watch face complications
  • Haptic feedback patterns
  • Cloud relay (Cloudflare Worker)
  • Pairing flow with 6-char codes
  • Remote approval via polling

🚧 In Progress

  • APNs push notifications (setup guide)
  • TestFlight beta
  • App Store submission

🔮 Future

  • Multi-session support
  • Diff preview on watch
  • Siri integration
  • Android Wear OS port



🧑‍💻 For Developers

📖 Documentation

  • Getting Started - Complete setup guide (simulator, device, troubleshooting)
  • Architecture - System design and data flows (read before contributing)
  • Agent Guide - For AI agents working on this codebase

Deploy Your Own Cloud Relay

cd MCPServer/worker

# Install wrangler
npm install

# Login to Cloudflare
npx wrangler login

# Create KV namespaces
npx wrangler kv:namespace create PAIRINGS
npx wrangler kv:namespace create REQUESTS

# Update wrangler.toml with your namespace IDs

# Deploy
npx wrangler deploy
# → https://your-worker.your-subdomain.workers.dev

Test Cloud Relay API

# 1. Create pairing
curl -X POST https://claude-watch.fotescodev.workers.dev/pair
# → {"code":"ABC-123","pairingId":"...","expiresIn":600}

# 2. Complete pairing (simulating watch)
curl -X POST https://claude-watch.fotescodev.workers.dev/pair/complete \
  -H "Content-Type: application/json" \
  -d '{"code":"ABC-123","deviceToken":"test"}'

# 3. Send request
curl -X POST https://claude-watch.fotescodev.workers.dev/request \
  -H "Content-Type: application/json" \
  -d '{"pairingId":"YOUR_ID","type":"bash","title":"npm test"}'
# → {"requestId":"abc123"}

# 4. Respond (simulating watch)
curl -X POST https://claude-watch.fotescodev.workers.dev/respond/abc123 \
  -H "Content-Type: application/json" \
  -d '{"approved":true}'

# 5. Check status
curl https://claude-watch.fotescodev.workers.dev/request/abc123
# → {"status":"approved"}

Run Local WebSocket Server

cd MCPServer
python server.py --standalone --port 8787

# Server runs on:
# - WebSocket: ws://localhost:8787
# - REST API:  http://localhost:8788

Test Local Server Without Watch

# Get current state
curl http://localhost:8788/state

# Simulate approval
curl -X POST http://localhost:8788/action/respond \
  -H "Content-Type: application/json" \
  -d '{"action_id": "test123", "approved": true}'

Add to Claude Code (MCP)

// ~/.claude/settings.json
{
  "mcpServers": {
    "watch": {
      "command": "python",
      "args": ["/path/to/MCPServer/server.py"]
    }
  }
}

Key Files

File Description
MCPServer/bridge/main.py Bridge entrypoint - orchestrates all components
MCPServer/bridge/ndjson_server.py NDJSON WebSocket server for Claude CLI
MCPServer/bridge/api.py Watch-facing REST API
MCPServer/bridge/cloud_client.py Cloud worker relay client
remmy-cli/src/commands/start.ts CLI start command
MCPServer/worker/src/index.js Cloudflare Worker - cloud relay API endpoints
ClaudeWatch/Services/WatchService.swift Watch app service - polling, state, API calls
ClaudeWatch/Views/MainView.swift Main UI - action queue, approve/reject buttons
ClaudeWatch/Views/PairingView.swift Pairing code entry UI
ClaudeWatch/App/ClaudeWatchApp.swift App entry, notification handling



📜 License

MIT License — see LICENSE for details.




Built for developers who code on the move.
Inspired by the vibecoding hardware control deck.


Made with ❤️ and way too much ☕

About

⌚ Claude Watch The first wearable interface for AI-assisted coding. Approve code changes from your wrist. No phone. No laptop. Just tap.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •