# Adom RC

`adom-rc` runs **many parallel Claude Code chat threads on one Adom container**, each in its own dedicated Hydrogen webview tab. Every thread is also live on **claude.ai/code in your native browser** and the **Anthropic Claude phone app** — same JSONL on disk, three windows.

![Adom RC chat tab](https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-rc/hero.png)

## What it does

- **Spawn a chat thread per task.** Type a label, click **New chat ⧉** — you get a popped-out Hydrogen tab `RC · <label>` with a Claude-style chat surface (scrolling feed, composer, image paste with thumbnails).
- **Three surfaces, one conversation.** The thread is live on **claude.ai/code** in your default browser (one click, no extra login) and on the **Anthropic Claude phone app**. Type from any one — the other two see it.
- **Names you actually recognize.** Your label (`silkscreen-readability`, `tps562201-eval`, `bar-lighting-ideas`) is coerced into the thread title on every surface — Hydrogen tab, /resume picker, claude.ai history, phone-app thread list. Three coercion paths for belt-and-suspenders coverage.
- **Image paste with thumbnails.** Paste a screenshot in the composer — it auto-resizes to ≤1000 px, uploads to a temp path, shows as an 88×88 thumbnail above the composer with click-to-zoom. The `@/tmp/...` path is hidden from your text; only injected at send time.
- **Drive a chat tab from the CLI.** `adom-rc input <name> "<text>"` queues a message that the tab consumes and submits — same code path as a real Enter keystroke. Useful for ralph-loops and automation.

## Quick start

```bash
adom-rc start              # daemon on 127.0.0.1:8773 + watchdog
adom-rc open               # management UI as a Hydrogen tab
```

In the management UI: type a label, click **New chat ⧉**. Done.

The thread shows up on **claude.ai/code** under your /history (named `adom-rc: <label>`) and on the **Anthropic Claude phone app** under Recents. Same JSONL, same conversation, three windows.

## How it works

```
[hydrogen webview chat tab]
   │ POST /api/inject {tmux_name, text}
   ▼
[adom-rc daemon] ── tmux send-keys ──→ [tmux session running `claude` REPL]
   │                                            │
   │                                            └─→ writes turn to
   │                                                ~/.claude/projects/-home-adom-project/<uuid>.jsonl
   │
   └─ live-tails the JSONL ──→ chat tab polls /api/conversation/<uuid>
                              ─→ claude.ai/code reads same conversation via bridge_session_id
                              ─→ Anthropic phone app same way
```

Each thread is `claude --permission-mode bypassPermissions -n "<label>"` running in tmux. `tmux send-keys -l "<text>"` is the inbound channel; the JSONL on disk is the live-tail source. Three windows, one source of truth.

## Drive a chat tab from CLI

```bash
adom-rc input <tmux-name-or-label-slug> "<text>"
```

The tab consumes the queue on its next livetail tick (~1s) and fires the same code path as if you'd typed and hit Enter. The tab itself doesn't need to be focused.

## Phone attach (legacy `claude rc` flow, still supported)

For phone-attachable threads, use `adom-rc new --label "<topic>"` or `/adom-rc handoff "<label>"` — the management UI shows a QR + a `claude.ai/code?environment=env_…` URL. Scan with the Anthropic phone app to attach.

## Architecture highlights

- Single Rust binary (~3 MB)
- Bounded thread pool (8 workers, 32-slot queue) — chat-tab polling cannot OOM the daemon
- Streaming JSONL parse + mtime-keyed LRU cache + per-UUID inflight coalescer
- Background watchdog respawns crashed `keepalive: true` sessions every 15s
- State persisted to `~/.adom-rc/state.json`
- All UI rendered from embedded HTML/CSS — no node, no bundler

## Source

GitHub: [adom-inc/adom-rc](https://github.com/adom-inc/adom-rc) (v0.2.0)
