DEV Community

Cover image for I built a Wear OS bridge for Claude Code — and Claude wrote most of it
Luis Caamaño
Luis Caamaño

Posted on

I built a Wear OS bridge for Claude Code — and Claude wrote most of it

A few months into living inside Claude Code, I hit the same friction over and over: Claude pauses for a
permission prompt, I'm three rooms away from my laptop, and the session just sits there waiting. Or I think
of a prompt while making coffee and by the time I'm back at the desk I've half-forgotten it.

So I built a Wear OS app. It's called CCWEAROS, and it does
three things:

  • Approve permission prompts from your wrist
  • Voice-prompt your Mac while away from the keyboard
  • Resume past sessions without alt-tabbing back

Demo

## How it works

Two pieces:

  1. A Node.js daemon on the Mac that wraps claude in a pty, parses its output for permission prompts, and ships state up.
  2. A Wear OS 4+ app (Jetpack Compose Material3) on the watch that subscribes to that state and sends commands back down.

Both sides talk through Firebase Realtime Database. No cloud relay, no third-party services beyond
Firebase (yours) and Anthropic (your key). A macOS LaunchAgent keeps the daemon alive across reboots; FCM
wakes the watch when the daemon has something new.

## How Claude wrote most of it

Roughly 90% of the codebase came out of Claude Code sessions. I drove architecture decisions, validated UX on
a real Galaxy Watch 8, and pushed back when something felt wrong — but the Kotlin, the TypeScript, the FCM
wake flow, the pty wrangling, all of it was Claude pairing with me through four sprints.

A few patterns that worked:

  • CLAUDE.md as the single source of truth. Project conventions, RTDB schema, hard rules ("never use Response.redirect in middleware", etc.). Reloaded every session so I didn't have to re-explain.
  • One file per sprint in docs/CHANGELOG.md. Dense but specific — future-me (and future contributors) can trace why every decision was made.
  • Pushing back early. When Claude proposed a fix that addressed the symptom instead of the root cause, I'd interrupt and ask for the cause first. That habit alone saved hours of debugging.

## Honest constraints

I put these at the top of the README too — better to lose a curious reader at second 30 than have them angry
at minute 30:

  • Mac must be awake. No cloud relay. Mac sleeps = watch shows OFFLINE.
  • Voice mode auto-allows tool use. It runs claude -p non-interactively, so permission prompts get bypassed. Use the interactive path if you want gates.
  • Tested only on macOS + Wear OS 4 (Galaxy Watch 8). No Pixel Watch, no Apple Watch, no Linux, no Windows.

## What surprised me

The thing that took longest wasn't the bridge — it was getting the watch UI to feel right. Wear OS has
weird quirks: emulator behaves nothing like a real device, touch targets need to be 48dp minimum or they
miss, AnimatedContent re-creates child composables on state change unless you pin them with a contentKey.
The wrapper code was a weekend. The polish was three weeks.

## Try it

Repo (MIT): github.com/caamanoluismiguel/ccwearos

Setup is ~10 minutes from clone to a daemon talking to the emulator. Real watch is another 10 if you've never
sideloaded a Wear OS app before.

Would love feedback from anyone running Claude Code daily — especially: what other "away from the laptop"
moments would you want to handle?

Top comments (0)