# Agent Watch puts Claude Code permission prompts on your wrist

> claude-watch is a Swift project from shobhit99 that mirrors a Claude Code session to an Apple Watch through a Node.js bridge on the Mac, so tool output streams live and permission prompts can be approved from the watch. The bridge blocks on the hook until you answer, which is the mechanism that makes the wrist approval real rather than decorative.

**shobhit99/claude-watch** — Control your claude code from your apple watch

- Repository: https://github.com/shobhit99/claude-watch
- Stars: 620 · Forks: 77
- Language: Swift
- License: not declared
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/shobhit99-claude-watch

## Three processes, one local network

The system is split into a bridge server on the Mac, an iPhone app and a watchOS app, and the diagram in the README shows how the pieces talk. The Apple Watch uses WCSession, the standard channel between a watch and its paired phone, to send messages and transfer user info, and the iPhone relays onward over HTTP to the bridge server. The bridge server is a Node.js program that connects to a Claude Code session through HTTP hooks and pushes events to clients with Server-Sent Events. On the watch side, the connection to the bridge is direct over Wi-Fi using Bonjour discovery or a manually entered IP address, so the watch is not merely a display for the phone. The two network paths are therefore different in kind, WCSession for the watch to phone link and HTTP with SSE for everything else, which is the part worth understanding before you try to run it on a network that blocks discovery.

## The bridge blocks on permission requests

The Bridge Server section describes a Node.js HTTP server at skill/bridge/server.js, and the fifth bullet under it is the load-bearing one. It blocks on PermissionRequest hooks, waits for the watch or phone approval, and then returns the decision to Claude Code. The other responsibilities are ordinary: it receives events from Claude Code via HTTP hooks such as PostToolUse, PermissionRequest and Stop, it streams events to connected clients with Server-Sent Events, it handles pairing with a six digit code and a session token, and it advertises itself on the local network via Bonjour and mDNS. The blocking behaviour is what turns this from a notification system into a remote control. A tool call cannot proceed until somebody answers, and the answer travels back over the same hook response, so the approval is not a UI illusion but the actual decision Claude Code waits for. The cost of that design is that a blocked hook blocks the session, so an unreachable watch or a crashed bridge will stall the run rather than fail it.

## The watch app is a terminal viewer with scrollable buttons

The watchOS application is a SwiftUI app that connects directly to the bridge, shows live terminal output including Read, Edit, Bash and Grep operations, displays permission prompts with all options as scrollable buttons, accepts voice input through watchOS dictation, and gives haptic feedback for task completion, approvals and errors. The iPhone app is the relay and the second display. It discovers the bridge via Bonjour with a localhost fallback, pairs using the six digit code, shows connection status and terminal output, displays interactive permission prompts with Yes, Yes all and No, and relays events to the watch over WCSession. The project structure shows a Shared directory holding the models, the session manager and a set of extensions, including a ClaudeMascot that draws the official logo as a SwiftUI Shape, and separate iOS and watchOS app folders. The watch app also carries a Complications provider, which means a complication can surface session state without opening the app.

## Setting it up is four commands and an Xcode project

The prerequisites are specific: macOS with Node.js 18 or newer, Xcode 16 or newer with the watchOS SDK, an Apple Watch on the same Wi-Fi network as the Mac, and the Claude Code CLI installed. The bridge dependencies install with npm in the bridge directory.

```bash
cd skill/bridge
npm install
```

The next step writes the hooks into your Claude Code configuration so every session streams events to the bridge, and the same script removes them later.

```bash
./skill/setup-hooks.sh
```

Then the server runs in the foreground and prints a banner with the pairing code, the IP address and the port.

```bash
cd skill/bridge
node server.js
```

The apps are generated rather than committed as an Xcode project, using a project spec and XcodeGen.

```bash
cd ios/ClaudeWatch
xcodegen generate    # Generates the .xcodeproj
open ClaudeWatch.xcodeproj
```

In Xcode you set the Development Team on both the ClaudeWatch and ClaudeWatchWatch targets, pick the scheme for the phone or the watch, and build. The watch pairs automatically through Bonjour once the bridge is running, and falls back to typing the IP address from the banner.

## Private Wi-Fi Address has to be off, and that is the first snag

The README puts a network requirement before the install steps, and it is the one that will bite you. The watch and the Mac must be on the same Wi-Fi network, and on the watch you go to Settings, Wi-Fi, your network and turn Private Wi-Fi Address off, because that is stated to be required for Bonjour and mDNS discovery to work reliably on the local network. The watch app itself can enter the IP address manually if discovery fails, so the setting is a convenience that turns into a requirement for a smooth first run. There is a second reason to care about this configuration, and it is not only about discovery. The bridge listens on a port on the Mac and advertises it on the local network, and the pair step exchanges a six digit code for a session token. The pairing code is the only thing standing between a device on the same Wi-Fi and a live view of your agent session, so a network that includes untrusted devices, a guest Wi-Fi, or a router that isolates clients is a place where you should think about whether you want this running at all.

## Where this is the wrong shape of tool

There are clear limits to what this project is. It is a bridge for a Claude Code session on a Mac, so a Linux or Windows user gets nothing from it, and neither does anyone who wants the same remote view from a phone that is not an iPhone. The watch experience is also constrained by what a watch screen and dictation can carry, so the voice command path is a shortcut into a prompt rather than a way to drive a multi step task, and the README's own feature list frames it that way. The deeper limitation is the blocking hook design. Because PermissionRequest waits for an answer, a lost network, a backgrounded watch app or a bridge that stops responding will leave a session waiting rather than erroring out, and there is no fallback described in the documentation. That is a deliberate trade for the convenience of never walking back to the terminal, and it is the reason to run the bridge on a machine you are sitting near. The alternative approach, and it is a real one, is to keep the approval on the machine and use a terminal multiplexer or a tmux based remote view instead, which gives you the same away-from-keyboard access with none of the wrist hardware, and which has no permission prompt latency at all.

## A young repository with no stated licence

The project is young and the licensing is not settled. The repository has no GitHub releases, so there is no versioned artefact to install, and the last push to the main branch was on 2026-04-24, which is the point at which the code stood when you look at it. The licence field is recorded as unknown, and there is no licence file in the top level listing, which contains .claude/, .gitignore, README.md, ios/, logo.png, mascot.png, recording.mp4 and skill/. That matters more than it would for a library, because the installation step writes hooks into your Claude Code configuration and runs a server that other devices can reach. The .claude/skills/claude-watch directory holds a SKILL.md that provides a slash command for Claude Code, so the project also wants to be invoked from inside the agent it is watching. Anyone adopting this should settle the licence question with the author before redistributing the bridge or the apps, and should read setup-hooks.sh before running it, since that script is what modifies your agent configuration.

## Conclusion

claude-watch suits developers who run long Claude Code sessions and want to approve a permission prompt from an Apple Watch instead of walking back to the terminal, and it suits people who want live tool output visible without alt-tabbing. It does not suit anyone without an Apple Watch and an iPhone, and it does not suit a machine that is not the Mac running the session, since the bridge and the CLI share a host. Before adopting it, confirm the watch and the Mac are on the same Wi-Fi network with Private Wi-Fi Address turned off, run npm install in skill/bridge, and check what setup-hooks.sh writes into your Claude Code configuration before letting it run.

## FAQ

### What does claude-watch actually do?

It streams Claude Code tool output live to an Apple Watch and iPhone, shows permission prompts such as Edit file or Run command for approval from the wrist, and accepts voice commands through watchOS dictation.

### How do I install the claude-watch bridge?

Run npm install inside the skill/bridge directory, then run ./skill/setup-hooks.sh to configure the Claude Code hooks, and start the server with node server.js. The same setup script accepts --remove to undo the hook configuration.

### Why does the Apple Watch need Private Wi-Fi Address turned off?

The documentation states it is required for Bonjour and mDNS discovery to work reliably on the local network, since the watch app finds the bridge by that mechanism. You can enter the bridge IP address manually if discovery fails.

### How does the claude-watch bridge handle permission requests?

The bridge blocks on PermissionRequest hooks, waits for the watch or the phone to return an approval, and then passes that decision back to Claude Code, so the tool call only proceeds once a human answers.

### What are the prerequisites for claude-watch?

macOS with Node.js 18 or newer, Xcode 16 or newer with the watchOS SDK, an Apple Watch on the same Wi-Fi network as the Mac, and the Claude Code CLI installed.

## Sources

- [Issues](https://github.com/shobhit99/claude-watch/issues)
- [README](https://github.com/shobhit99/claude-watch/blob/main/README.md)
- [shobhit99/claude-watch on GitHub](https://github.com/shobhit99/claude-watch)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/shobhit99-claude-watch
