<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luis Caamaño</title>
    <description>The latest articles on DEV Community by Luis Caamaño (@luis_caamao_13ef24f41199).</description>
    <link>https://dev.to/luis_caamao_13ef24f41199</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3947966%2F8edbe5e1-14b9-4a50-a131-80cf6c59acf6.jpg</url>
      <title>DEV Community: Luis Caamaño</title>
      <link>https://dev.to/luis_caamao_13ef24f41199</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luis_caamao_13ef24f41199"/>
    <language>en</language>
    <item>
      <title>I built a Wear OS bridge for Claude Code — and Claude wrote most of it</title>
      <dc:creator>Luis Caamaño</dc:creator>
      <pubDate>Sat, 23 May 2026 16:33:07 +0000</pubDate>
      <link>https://dev.to/luis_caamao_13ef24f41199/i-built-a-wear-os-bridge-for-claude-code-and-claude-wrote-most-of-it-1jke</link>
      <guid>https://dev.to/luis_caamao_13ef24f41199/i-built-a-wear-os-bridge-for-claude-code-and-claude-wrote-most-of-it-1jke</guid>
      <description>&lt;p&gt;A few months into living inside Claude Code, I hit the same friction over and over: Claude pauses for a&lt;br&gt;
  permission prompt, I'm three rooms away from my laptop, and the session just sits there waiting. Or I think&lt;br&gt;
  of a prompt while making coffee and by the time I'm back at the desk I've half-forgotten it.&lt;/p&gt;

&lt;p&gt;So I built a Wear OS app. It's called &lt;a href="https://github.com/caamanoluismiguel/ccwearos" rel="noopener noreferrer"&gt;CCWEAROS&lt;/a&gt;, and it does&lt;br&gt;
  three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approve permission prompts&lt;/strong&gt; from your wrist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice-prompt your Mac&lt;/strong&gt; while away from the keyboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume past sessions&lt;/strong&gt; without alt-tabbing back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj190ys5p9rlcjjrfmio0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj190ys5p9rlcjjrfmio0.gif" alt="Demo" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## How it works&lt;/p&gt;

&lt;p&gt;Two pieces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;Node.js daemon&lt;/strong&gt; on the Mac that wraps &lt;code&gt;claude&lt;/code&gt; in a pty, parses its output for permission prompts,
and ships state up.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Wear OS 4+ app&lt;/strong&gt; (Jetpack Compose Material3) on the watch that subscribes to that state and sends
commands back down.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;## How Claude wrote most of it&lt;/p&gt;

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

&lt;p&gt;A few patterns that worked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; as the single source of truth.&lt;/strong&gt; Project conventions, RTDB schema, hard rules ("never use
&lt;code&gt;Response.redirect&lt;/code&gt; in middleware", etc.). Reloaded every session so I didn't have to re-explain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One file per sprint in &lt;code&gt;docs/CHANGELOG.md&lt;/code&gt;.&lt;/strong&gt; Dense but specific — future-me (and future contributors)
can trace why every decision was made.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pushing back early.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## Honest constraints&lt;/p&gt;

&lt;p&gt;I put these at the top of the README too — better to lose a curious reader at second 30 than have them angry&lt;br&gt;
  at minute 30:&lt;/p&gt;

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

&lt;p&gt;## What surprised me&lt;/p&gt;

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

&lt;p&gt;## Try it&lt;/p&gt;

&lt;p&gt;Repo (MIT): &lt;strong&gt;&lt;a href="https://github.com/caamanoluismiguel/ccwearos" rel="noopener noreferrer"&gt;github.com/caamanoluismiguel/ccwearos&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Setup is ~10 minutes from clone to a daemon talking to the emulator. Real watch is another 10 if you've never&lt;br&gt;
   sideloaded a Wear OS app before.&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone running Claude Code daily — especially: &lt;strong&gt;what other "away from the laptop" &lt;br&gt;
  moments would you want to handle?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>claude</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
