Integration guide

Run the bridge behind Bubbles

bubble-wand exposes each Claude Code session running in your tmux to the Bubbles watch app โ€” so from your wrist you can see which sessions need you, read a summary, dictate a reply by voice, and tap through menus. Your Anthropic key and your code never leave your machine.

How it works

A "thread" on your wrist is a tmux pane running claude on your box. The bridge reads and writes those panes directly (tmux capture-pane / send-keys) โ€” so it must run on the same machine as your Claude Code sessions. That constraint is the privacy model: no server in the middle, no shared multi-tenant host, and no one else ever holds your key.

Wear OS watch โ”€โ”€HTTP (+ bearer token)โ”€โ”€โ–ถ bubble-wand โ”€โ”€tmuxโ”€โ”€โ–ถ your Claude Code panes (Bubbles app) (this repo, on YOUR box) (session "dev", window 1)

This is for people who run their own Claude Code sessions in tmux. It is not a hosted SaaS and not turnkey for non-developers โ€” and that's deliberate.

01Requirements

A short list. If you already run Claude Code in tmux on an always-on box, you have most of it.

Python 3.11+ tmux โ€” your claude panes in one window a machine that stays on your own Anthropic API key (sk-ant-โ€ฆ)
Your key is pasted once during setup and stored only on this box. Get one at console.anthropic.com โ†’ API keys.

02Quick start

One command bootstraps everything โ€” clone, virtualenv, dependencies, and a systemd user service โ€” then prints a one-time setup URL.

$ curl -fsSL https://get.darn-tech.com/install.sh | bash

or clone it yourself โ€”

$ git clone https://github.com/GreenTilden/bubble-wand cd bubble-wand ./install.sh

What the installer does

  1. Creates a virtualenv and installs dependencies (fastapi, uvicorn, anthropic).
  2. Installs a systemd --user service (clawatch-bridge, bubble-wand's engine) with lingering enabled โ€” it starts on boot and keeps running after you log out.
  3. Writes a config file with no secrets in it.
  4. Prints a one-time setup URL for your box's LAN address, e.g. http://<your-box-LAN-IP>:8793/setup?t=<one-time-code>
Open that URL from a phone or laptop on the same network, paste your Anthropic key, and click Provision this bridge. The page mints a bearer token and shows you the URL + token to enter in the watch app's Settings. No key is ever typed into a file by hand โ€” the /setup page writes it (and the token) to a 0600 file and applies it live, no restart needed.

Prefer to run it without systemd? CLAWATCH_NO_SERVICE=1 ./install.sh prints the exact uvicorn command instead.

03Mapping your sessions

By default the bridge reads panes in the tmux target dev:1 โ€” session named dev, window 1. Each pane in that window becomes one thread on your wrist.

tmux new-session -s dev # a session called "dev" # in window 1, split into panes and run `claude` in each: tmux split-window -h # pane 2 tmux split-window -v # pane 3, etc. # run your Claude Code sessions in those panes

Point the bridge at wherever your Claude Code panes actually live by setting CLAWATCH_TMUX_WINDOW (e.g. work:2). The bridge derives each thread's status โ€” working, needs input, or idle โ€” from the pane, and surfaces the ones needing you first.

04Configuration

Config is read from the environment (the installer writes it to clawatch.env). Secrets are added by /setup, not by hand.

VariableDefaultWhat it does
CLAWATCH_HOST0.0.0.0Bind address. 0.0.0.0 lets any device on your LAN reach it; set a specific LAN IP to restrict it.
CLAWATCH_PORT8793Port to listen on.
CLAWATCH_TMUX_WINDOWdev:1The tmux window whose panes are your Claude Code threads.
ANTHROPIC_API_KEY(unset)Your key. Written by /setup. Powers voice-suggestion features; when unset those simply return empty.
CLAWATCH_TOKEN(minted)Bearer token required on every /api call. Minted by /setup; pin it yourself to keep it stable.
CLAWATCH_TAIL_LINES40Default number of recent lines returned per thread.
CLAWATCH_SUGGEST_MODELclaude-haiku-4-5-20251001Model used for wrist reply suggestions (uses your key).
CLAWATCH_SUGGEST_MAX_TOKENS150Cap on suggestion output.

Restart after editing config: systemctl --user restart clawatch-bridge.

05Remote access (off your LAN)

The bridge is LAN-first โ€” the simplest, safest setup is the watch and the bridge on the same network. To reach your sessions from cellular or away from home, front the bridge with a named Cloudflare Tunnel.

๐ŸŒ

One cloudflared process

Runs on this box and publishes a stable hostname โ€” no inbound ports and no firewall changes on your end.

๐Ÿ”‘

Token becomes mandatory

Once you expose it, the bearer token is your only guard. Treat the tunnel hostname as a secret too.

๐Ÿ”’

Provision on the LAN first

Onboarding (/setup) is refused over a tunnel or proxy on purpose โ€” set it up locally, then expose the already-configured bridge.

06Security & privacy

The bridge sits next to live shells, so every surface is locked down by design.

๐Ÿ”’

Your key stays local

Written to a 0600 file by /setup and sent only to Anthropic, on your behalf. No telemetry, ever.

๐Ÿ›ก๏ธ

Injection-safe tmux

Every tmux call uses an argv list (shell=False) โ€” no shell, no interpolation. The pane target is an integer index verified against the live pane list, so no client string reaches the tmux -t argument.

โŒจ๏ธ

Dictated text can't execute

Sends use send-keys -l -- <text> (literal) then a separate Enter, so control sequences in a voice reply (C-c, ;kill-server) are typed as plain characters, never run.

๐Ÿ”‘

Auth on everything

Every /api route requires Authorization: Bearer <token> (constant-time compare). Soft keys are an allowlist, never a raw key name.

๐Ÿšช

Onboarding is LAN-locked

/setup works only from loopback/private addresses, only with the one-time code, and only while unconfigured; any proxy/tunnel hop or a provisioned bridge is rejected.

07API reference

All /api routes require Authorization: Bearer <CLAWATCH_TOKEN>. index is the integer pane index (1..N), verified against the live pane list.

EndpointNotes
GET /healthzLiveness, no auth โ†’ {"ok": true}
GET /api/threadsList panes as threads with derived status
GET /api/threads/{index}/tailRecent output + any parsed menu prompt. Query: lines=40&scrollback=false
POST /api/threads/{index}/sendBody {"text":"โ€ฆ","submit":true} โ€” dictated reply
POST /api/threads/{index}/keyBody {"action":"escape|interrupt|clear|enter"}
POST /api/threads/{index}/suggestHaiku-generated reply suggestions (needs your key; else [])
GET /api/usageSuggestion token/cost tally
GET /setup ยท POST /api/setupOne-time LAN onboarding

Smoke test

TOKEN=... # the token from /setup BASE=http://<your-box-LAN-IP>:8793 curl -s $BASE/healthz curl -s -H "Authorization: Bearer $TOKEN" $BASE/api/threads | jq curl -s -H "Authorization: Bearer $TOKEN" "$BASE/api/threads/1/tail?lines=20" | jq

08Managing the service

systemctl --user status clawatch-bridge # is it running? systemctl --user restart clawatch-bridge # after a config change journalctl --user -u clawatch-bridge -f # live logs

To re-provision with a different key: clear ANTHROPIC_API_KEY / CLAWATCH_TOKEN from clawatch.env and restart โ€” /setup becomes available again.

09The Bubbles watch app

clawatch-bridge is the server half. The client is Bubbles, a Wear OS app that lists your threads, shows live status, reads the tail, and takes voice replies. Install it on your watch and enter the URL + token from /setup in its Settings.

โŒš

Bubbles for Wear OS PILOT

In invite-only testing now; a public Play Store listing is on the way. The bridge is free and open source โ€” start there.

Want a hand setting it up? Book 15 min with me โ†’