Skip to main content
Glama

Handoff for Claude Code

Jot ideas on your Apple Watch. Claude Code works on them while you're away. The watch never shows Claude's response, so there's nothing to get pulled into. It's a scratchpad that hands off and goes quiet. The only thing that comes back is Claude's one-line suggestion for what to do next, which you can send with Accept suggestion.

Watch (dictate/scribble) ──AES-GCM──▶ ntfy topic ──▶ handoff plugin ──channel──▶ Claude Code session
  • Watch app: one SwiftUI file, watch-only (no iPhone app), no assets or dependencies. It builds for watchOS 26 / Apple Watch SE 3 with -Osize, whole-module optimization, and dead-code stripping. Notes queue offline and retry when the app comes back to the foreground.

  • Plugin (plugin/): a Claude Code plugin around one Node file with zero dependencies. It decrypts notes on your Mac and drops anything that doesn't decrypt with your key (prompt-injection gate), then pushes each note into the session as a channel event.

  • Privacy: notes are end-to-end encrypted on the watch with a per-device key (stored in the Keychain). The relay only sees ciphertext on a random topic.

Setup

1. Install the plugin (in Claude Code):

/plugin marketplace add maxvbuda/claude-watch-notes-mcp
/plugin install handoff@handoff

2. Get the handoff command (in your terminal): npm install -g github:maxvbuda/claude-watch-notes-mcp, or npm link from a clone.

3. Install the watch app: from the App Store, or build it yourself: cd watch && xcodegen generate && open ClaudeNotes.xcodeproj, pick your team, then Run.

4. Pair (once): run handoff pair, or /handoff:pair inside Claude Code. It shows a code like K7QX-M2PA; type it into the app on the watch. The watch generates its own topic and key, sends them sealed with a key derived from the code, and waits for the Mac's acknowledgement. Nothing secret is built into the app, so one build works for anyone. Running Claude Code sessions pick up a new pairing automatically. To pair again, tap Settings at the bottom of the list, then Unpair.

Related MCP server: MCP Apple Notes

Use

Before you leave, start a session in the project you want Claude to work on. There are two ways.

Instant (channel mode):

handoff start             # add --continue to pick up your last conversation

Ideas arrive in the session within seconds. Only sessions opened with handoff start take notes, so other Claude Code windows you have open won't grab them.

Several chats: run handoff start in as many projects as you like. Each one shows up on the watch by its folder name, or by a name you choose with handoff start --name "Website". Pick one in the To row at the top of the app, and your notes go only to that chat. Any chat lets whichever one is open take it. A note for a chat that's closed waits until it opens again.

New chats from the watch: run handoff host ~/GitHub (or any folder of projects) and leave it running. The watch then shows New chat, a browser for the folders inside it. Tap into any folder, then choose Start chat here, or type a name under New folder… to make a folder there and start in it. Then name the chat (it starts as the folder's name) and tap Start chat. The new chat is selected on the watch, so the next note goes straight to it. Only folders inside the one you gave can be opened (no .. or symlinks out), and node_modules and hidden folders aren't listed.

Chats started from the watch run headless inside handoff host: each note runs claude -p --permission-mode auto in that folder, continuing the same Claude Code session, one note at a time. There's no channel, so there's no development-channel warning to click, and nothing runs while the chat is idle. A Terminal window shows each chat's log live. To open the conversation as a normal Claude Code window, run the claude --resume … command the host prints for that chat. Keep handoff host running while you're away: it is what starts those Claude runs, without anyone at the Mac to approve them.

Every few minutes (no warning): in a normal claude --permission-mode auto session, run

/loop 5m /handoff:inbox

--permission-mode auto lets Claude work without you there to approve each step: a safety classifier reviews every action instead. If it blocks 3 actions in a row, Claude Code goes back to asking in the terminal, so the server tells Claude to skip blocked steps and list them in its summary instead of retrying.

On the watch, tap Jot an idea… and add as many lines as you like. Swipe a line to delete it, then tap the orange send button in the corner. A ✓ means the note was delivered.

When Claude finishes a note it can suggest a next step, like Claude Code's prompt suggestions. The suggestion shows at the top of the watch app. Tap Accept suggestion to send it to Claude as a new note, or swipe it away. To turn suggestions off, go to Settings → Suggestions.

When you get home, the work is done. Claude calls watch_note_done with a summary for each note; the summaries are in ~/.claude-watch-notes/notes/. Notes that arrive while no session is running are handed to the next session that starts, exactly once even with several sessions open.

Notes

  • ntfy.sh keeps messages for about 12 hours. The server saves them to disk as soon as they arrive, so this only matters if no Claude session is running for that whole time. To self-host ntfy, change RELAY in plugin/server/handoff.mjs and Relay.base in App.swift.

  • ntfy turns messages of 4 KB or more into file attachments, which ntfy.sh keeps for only about 3 hours. The server handles those, but a very long note (roughly 2,900+ characters) needs a session running within that window.

Tests

node --test test/server.test.mjs     # server: 40 tests against a mock relay (protocol, crypto, dedupe,
                                     #   multi-session races, reconnects, stalls, re-pairing, pair command)
node test/watch-e2e.mjs              # watch app in the SE 3 simulator + real pair/MCP server, via mock relay
node test/watch-e2e.mjs --real-relay # same UI flow through the public ntfy.sh

The watch end-to-end run unpairs the simulator. Afterwards, run pair again.

See PRIVACY.md for exactly what data goes where, and docs/official-listing.md for the plan to get Handoff on Anthropic's approved channel list.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants like Claude to search and reference your Apple Notes using semantic search and RAG capabilities, with fully local execution and no API keys required.
    1,482 npm
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Codex and Claude Code to save decisions, deadlines, and context into an encrypted local vault on macOS, then recall them later with citation to the exact note revision used. Grants are scoped, device-bound, and owner-approved via Touch ID, with all exact, date-aware, and semantic retrieval running locally.
    2
    Apache 2.0