Approve Claude Code changes from your Apple Watch.
# 1. Install the CLI
npm install -g remmy-cli
# 2. Run the pairing command
remmy-cli
# 3. Enter the code shown on your Apple WatchThat's it! Claude Code will now send approval requests to your watch.
For development and testing without a physical Apple Watch.
- Xcode Command Line Tools:
xcode-select --install - watchOS SDK (included with Xcode)
- Cloud server access (simulators can't use localhost)
xcrun simctl boot "Apple Watch Series 11 (46mm)"DEVICE_ID=$(xcrun simctl list devices | grep "Apple Watch Series 11" | grep -oE '[A-F0-9]{8}-([A-F0-9]{4}-){3}[A-F0-9]{12}' | head -1)
echo $DEVICE_ID# Build in Xcode first, then:
xcrun simctl install "Apple Watch Series 11 (46mm)" /path/to/ClaudeWatch.appSimulators cannot reach localhost. You must use cloud mode:
BUNDLE_ID="com.edgeoftrust.remmy"
# Enable cloud mode
xcrun simctl spawn "$DEVICE_ID" defaults write "$BUNDLE_ID" useCloudMode -bool true
# Set pairing ID (get from remmy-cli pairing)
xcrun simctl spawn "$DEVICE_ID" defaults write "$BUNDLE_ID" pairingId -string "YOUR_PAIRING_ID"xcrun simctl launch "Apple Watch Series 11 (46mm)" com.edgeoftrust.remmy# List simulators
xcrun simctl list devices | grep "Apple Watch"
# Shutdown all simulators
xcrun simctl shutdown all
# Send test notification
xcrun simctl push "Apple Watch Series 11 (46mm)" com.edgeoftrust.remmy payload.json
# View logs
log stream --predicate 'process == "ClaudeWatch"' --level debugFor real Apple Watch with push notifications.
- Apple Developer Account ($99/year)
- Cloudflare Account (free tier works)
- Physical Apple Watch paired with iPhone
Push notifications require Apple Push Notification service (APNs) credentials.
- Go to Apple Developer Portal
- Click "+" to create new key
- Name it "Remmy APNs"
- Check "Apple Push Notifications service (APNs)"
- Download the
.p8file (can only download ONCE) - Note your Key ID (10 characters)
- Note your Team ID (from membership page)
cd claude-watch-cloud
# Set secrets (you'll be prompted for values)
npx wrangler secret put APNS_KEY_ID # Your 10-char key ID
npx wrangler secret put APNS_TEAM_ID # Your team ID
npx wrangler secret put APNS_PRIVATE_KEY # Base64 of .p8 file
# Base64 encode the .p8 file:
base64 -i ~/Downloads/AuthKey_XXXXXXXXXX.p8 | pbcopynpx wrangler deploy# Check secrets are set
npx wrangler secret list
# Test health endpoint
curl https://claude-watch.fotescodev.workers.dev/health| Environment | APNS_SANDBOX | Used For |
|---|---|---|
| Development | "true" |
Xcode debug builds |
| TestFlight | "false" |
TestFlight, App Store |
To switch environments, edit wrangler.toml:
APNS_SANDBOX = "false" # For TestFlight/productionThen redeploy: npx wrangler deploy
- Codes expire after 30 minutes
- Generate new code: run
remmy-cliagain - Verify code is exactly 6 characters, no spaces
- Check Wi-Fi/cellular connectivity on watch
- Verify cloud server:
curl https://claude-watch.fotescodev.workers.dev/health
- Simulators cannot use localhost
- Must use cloud mode (see Simulator Setup above)
- Check permissions: iPhone → Watch app → Notifications → Remmy
- Verify Do Not Disturb is OFF
- Test APNs: Check
apnsSent: truein API response
- Secrets not configured:
npx wrangler secret list - Redeploy after setting secrets:
npx wrangler deploy
| Build Type | Required Setting |
|---|---|
| Xcode Debug | APNS_SANDBOX = "true" |
| TestFlight | APNS_SANDBOX = "false" |
| App Store | APNS_SANDBOX = "false" |
# Check cloud server
curl https://claude-watch.fotescodev.workers.dev/health
# Check pairing status
curl https://claude-watch.fotescodev.workers.dev/approval-queue/YOUR_PAIRING_ID
# View Cloudflare logs
npx wrangler tail| Error | Cause | Solution |
|---|---|---|
| "Connection timeout" | Server unreachable | Check URL, firewall |
| "Max reconnection attempts" | Persistent failure | Reset app, check config |
| "BadDeviceToken" | Invalid APNs token | Re-pair watch |
| "InvalidProviderToken" | Wrong Key/Team ID | Verify APNs credentials |
- Use Cloud Mode for production - better reliability, supports push notifications
- Re-pair after environment switch - device tokens differ between sandbox/production
- Keep pairing codes fresh - use within 30 minutes
- Monitor connection status - watch main screen shows current state
- Architecture Guide - System design
- Data Flow Reference - API endpoints
- Solutions Index - Known issues and fixes
Last updated: 2026-01-23