APP

Adom RC

Many parallel Claude Code chat threads per container — each in its own Hydrogen webview tab, kept in sync with claude.ai/code in your native browser and the Anthropic phone app.

Adom RC
Install this app

Paste this into Claude Code (VS Code panel, Adom editor, or terminal) to install:

I want to install the "Adom RC" app from the Adom Wiki (https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-rc). For the Docker CLI: curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-rc/adom-rc -o /usr/local/bin/adom-rc && chmod +x /usr/local/bin/adom-rc && adom-rc install && adom-rc start Then verify the install works.

Download latest

Windows coming soon
macOS coming soon
🐧 Linux coming soon
🐳 Adom Docker CLI adom-rc ·

See all releases on GitHub (private repo — access required)

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

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

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

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 (v0.2.0)

ADOM
adom-rc 1 month ago
adom-rc v0.2.0 — interactive chat threads + sync across web/phone/Hydrogen
3.2 MB

Install notes

Adom Docker CLI install steps
curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-rc/adom-rc -o /usr/local/bin/adom-rc && chmod +x /usr/local/bin/adom-rc && adom-rc install && adom-rc start

Screenshots

AI Skill — how Claude uses this app

Edit AI Skill

name: adom-rc description: > Manage parallel Claude Code chat threads on this Adom container — pop each one out as its own dedicated Hydrogen webview tab with a Claude-style chat surface (header, conversation feed, composer with image paste), or drive it from the official Claude phone app / claude.ai/code in your native browser. Every thread you spawn is named after the work, anchored on every surface (web, phone, REPL) via label coercion and a seed message, and remains in sync because all surfaces read the same JSONL on disk. Use when the user says: new chat thread, parallel claude, multiple claude tabs, claude in webview, chat panel, label this thread, name this thread, sync claude.ai with my container, go mobile, phone handoff, continue this on my phone, remote claude, claude rc, kill stale claude sessions, claude squad is overwhelming my phone, rc session, adom rc, /adom-rc. user-invocable: true

Adom RC

adom-rc runs many parallel Claude Code threads inside one Adom container, each with its own dedicated chat tab in your Hydrogen workspace and a matching conversation on claude.ai/code + the Anthropic Claude phone app. All three surfaces are bound to the same on-disk JSONL transcript — you can type from any of them and the others see it.

The threads are tmux-hosted Claude REPLs (claude --permission-mode bypassPermissions, not claude rc). Each thread is created on demand, named after the work (adom-rc: silkscreen-readability, adom-rc: drone-delivery-pricing), and lives until you kill it.

Spawn a new chat thread

From the management UI:

  1. Run adom-rc open — opens the Adom RC management UI as a Hydrogen tab.
  2. Type a label in the input box (silkscreen-readability, tps562201-eval, …).
  3. Click New chat ⧉. A new Hydrogen tab pops out: RC · <label>.
  4. The thread auto-receives a seed message anchoring the conversation title on every surface (web, phone, REPL /resume). Claude replies "Ready" and the composer is yours.

From a terminal:

curl -X POST http://127.0.0.1:8773/api/new_thread \
  -d '{"label":"silkscreen-readability"}'

Drive a chat tab from the CLI

# Type "<text>" into a thread's composer + submit, as if the user did it.
# Useful for ralph-loops and automation that needs to talk to a live thread.
adom-rc input <tmux-name-or-label-slug> "<text>"

The chat tab consumes the queued input on its next livetail tick (~1s) and fires the same code path as a real Enter keystroke.

What gets bound to each thread

When /api/new_thread runs:

Bind pointMechanism
Local REPL prompt + /resume pickerclaude -n "<label>"
customTitle / sessionTitle in JSONLADOM_RC_LABEL=<label> + UserPromptSubmit hook (gallia/hooks/adom-rc-title-anchor.sh)
First user turn = the topic nameSeed message sent via tmux send-keys 9s after spawn
chat.html ↔ JSONL hard-bindingtranscript_uuid discovered from projects-dir snapshot diff after seed
claude.ai web linkbridgeSessionId read from ~/.claude/sessions/<pid>.json

That's why the thread shows up by your label on every surface (claude.ai history, phone app, /resume, terminal title bar, Hydrogen tab).

The chat tab UI

The Hydrogen webview tab is a Claude-style chat surface bound to a single thread:

  • Header: brand (Adom RC), label, tmux name, Open on claude.ai ↗, live/sending/thinking pill, ↶ Manage all link
  • Conversation feed: oldest → newest, auto-scroll to bottom unless you've scrolled up (a floating "↓ Jump to latest" pill appears, with a glowing dot if new turns arrived while scrolled away)
  • Composer: Enter sends, Shift+Enter newline, paste an image to attach
  • Image paste UX: clipboard images upload to /tmp/adom-rc-uploads/, show as 88×88 thumbnail chips above the composer, click to zoom (1600 px preview), × to remove. Auto-resized to max 1000 px on the longest side (Claude rejects huge images). The @/tmp/... path is hidden from your composer text — only injected at send time.
  • Optimistic UI: textarea clears the same frame you hit Enter, your message appears immediately as a "sending" bubble, "Claude is thinking…" dots show below until the assistant turn arrives.

Open the same conversation in your native browser

The header's Open on claude.ai ↗ link routes through adom-desktop desktop_open_url, which launches your default OS browser (Edge, Chrome, Firefox, Brave — whatever you actually use), where you're already signed in to claude.ai. Same JSONL, no extra login, no pup window.

Anything you type in either surface (Hydrogen chat tab, claude.ai/code, phone app) appears in all three.

CLI reference

# Daemon lifecycle
adom-rc start                  # tiny_http on 127.0.0.1:8773 + watchdog
adom-rc stop
adom-rc status                 # one line per session

# Spawning
adom-rc open                   # open management UI as a Hydrogen tab
adom-rc new --label "<topic>"  # spawn a phone-attachable RC session (claude rc)
adom-rc handoff "<label>"      # primer-handoff from the active VSCode chat

# Driving a chat tab from CLI
adom-rc input <name> "<text>"  # queue text + auto-submit in the chat tab

# Cleanup
adom-rc kill <name>
adom-rc kill-stale --idle-hours 24
adom-rc disable-av-squad       # one-shot: kill any AV-spawned alpha/beta/gamma/delta

# Per-session
adom-rc attach <name> --refresh
adom-rc label <name> "<new label>"

# Skill
adom-rc install                # deploy SKILL.md to ~/.claude/skills/adom-rc/

HTTP API (AI-drivable)

EndpointPurpose
POST /api/new_thread {label}Spawn interactive chat thread (used by "New chat ⧉")
POST /api/new {label}Spawn claude rc for phone QR attach
POST /api/popout {tmux_name}Open / refresh a chat tab in Hydrogen
POST /api/inject {tmux_name, text}Send a prompt to a thread
POST /api/upload {data_b64, ext}Stash a clipboard image, returns /tmp/... path
POST /api/desktop/open_url {url}Open URL in user's native browser
POST /api/test/queue_input {tmux_name, text}Queue text for the tab to consume + submit (drives adom-rc input)
GET /api/sessionsList sessions (cheap; no disk scan)
GET /api/conversation/threads?tmux_name=...Live-tail threads for a session
GET /api/conversation/<uuid>Live-tail one thread by JSONL UUID

Phone attach (legacy claude rc flow, still supported)

For threads spawned via /api/new (or adom-rc new), the management UI shows a QR code + a claude.ai/code?environment=env_… URL. Scan with the Anthropic phone app to attach. The conversation is the same JSONL the chat tab sees, so phone-typed prompts surface in your Hydrogen tab too.

VSCode handoff

/adom-rc handoff "<label>" picks the most recent VSCode Claude Code chat's JSONL transcript, spawns a fresh tmux RC session, primes it with the last 20 turns of context, and prints the RC URL. Then attach from the phone.

Daemon architecture (what to know when it acts up)

  • Bounded thread pool: 8 workers, 32-slot queue. Past incident (2026-04-27): unbounded thread::spawn per request let chat tabs spiral the daemon to 400% CPU + all RAM for 35 min. Now: when the queue is full, accept blocks and clients backpressure via their AbortController.
  • Streaming JSONL parse: BufReader::lines() instead of read_to_string — concurrent reads no longer multiply RAM by file size.
  • Mtime-keyed turn cache: 32-entry LRU keyed by (uuid, mtime, size).
  • /api/sessions is a pure state read — does NOT scan the projects directory. The card-preview lookups (latest_assistant, cse_id) belong in a dedicated endpoint, not the hot livetail path.
  • Per-UUID inflight coalescer: concurrent cache misses for the same thread serialize behind one parse, then all hit the freshly populated cache.

Troubleshooting

SymptomFix
Claude CLI not foundRun curl -fsSL https://claude.ai/install.sh | bash, then retry.
Chat tab shows old JS / cached UIThe _v=<unix-ms> cache buster on POST /api/popout forces a fresh navigation. If your tab still looks stale, close + popout again.
Daemon won't start (already running)adom-rc stop first, then adom-rc start.
Thread spawned but composer in REPL is full of seed text but never submittedWelcome screen ate the first Enter. Daemon now waits 9 s + sends a redundant Enter; if you still see this, raise the boot wait in api_new_thread.
Image paste fails with size errorDaemon caps at 8 MB upload + auto-resize to max 1000 px. Bigger images need to be downsized first.
Hung daemon at high CPUadom-rc stop and re-run adom-rc start. The bounded thread pool prevents this in normal use; if it recurs, file an issue with ps/ls /proc/$pid/task output.

Related

  • claude-squad — legacy 4-slot tmux launcher (now disabled by adom-rc disable-av-squad).
  • app-creator, adom-cli-design, tool-publisher — gallia skills for building / distributing Adom apps; adom-rc follows all three.
  • pupbrowser_open_window for automated browser use; complements desktop_open_url for human-in-the-loop logged-in pages.

Sub-Skills
?
What are Sub-Skills?

Sub-skills are community-contributed AI skill extensions for this component. They teach AI assistants about specific tools, configurators, or workflows.

Examples:

  • A manufacturer’s configuration tool for a motor controller
  • A community-written design guide for an amplifier circuit
  • An automated test/validation script for a sensor module

How to add one: Click Add Sub-Skill, provide the URL to your skill and a brief description. Submissions are reviewed by the Adom team before going live.

No sub-skills yet. Be the first to contribute one!

🔎 How Claude finds this page (discovery snippet)

This page opts into Adom Wiki auto-discovery. When a user working in Claude Code mentions any of the trigger phrases below, Claude can proactively suggest this page. The pitch is exactly what Claude will say.

Pitch
"Run many parallel Claude Code chat threads per Adom container — each in its own dedicated Hydrogen webview tab, kept in sync with claude.ai/code in your native browser and the Anthropic Claude phone app. Image paste, label coercion across surfaces, drive-from-CLI."
Triggers
"new claude chat thread", "parallel claude tabs", "multiple claude sessions", "claude in webview", "claude in hydrogen", "chat panel in container", "name this thread", "label this conversation", "sync claude.ai with my container", "open claude on my phone", "phone handoff", "continue this on my phone", "remote claude", "claude rc", "rc session", "adom rc", "/adom-rc", "kill stale claude sessions", "claude phone app", "claude.ai web client", "vscode chat to phone", "disable claude squad"