A terminal control tower for all your Claude Code sessions — a macro view of what every agent is doing, with live status, idle time, and one-line AI summaries. Built for running many agents at once.
| Every session, one screen | Subscribes to cmux's event feed and keeps a live registry of every Claude Code session — across projects and worktrees. |
| Status at a glance | running / awaiting / idle with per-session idle timers and the last tool each agent touched. |
| AI summaries | A debounced Haiku call turns the last ~20 transcript messages into a one-line "what is this session actually doing" summary. |
| Zero config auth | Reuses the OAuth token from your existing Claude Code login in the macOS keychain — no API key, no env var. An Anthropic API key or AWS Bedrock work too, via the same env vars Claude Code uses. |
| Resumable | A cursor file lets the cmux subscriber pick up where it left off after a restart; the subprocess auto-reconnects with backoff. |
macOS only. Requires cmux running locally and a recent Claude Code install.
Grab the latest build for your Mac — these links always point to the newest release:
| Chip | Download |
|---|---|
| Apple Silicon (M1+) | claude-tower-darwin-arm64 |
| Intel | claude-tower-darwin-amd64 |
curl -fsSL -o claude-tower https://github.com/PierrickMartos/claude-tower/releases/latest/download/claude-tower-darwin-arm64
chmod +x claude-tower
xattr -d com.apple.quarantine claude-tower # unsigned binary — clear Gatekeeper flag
./claude-tower# 1. Install Go (one-time)
brew install go
# 2. Clone, then build:
git clone https://github.com/PierrickMartos/claude-tower.git
cd claude-tower
go mod tidy
go build
# 3. Run — by default auth is read from your Claude Code login (macOS keychain).
# If you're not logged in yet, run `claude` once to authenticate.
# An API key or AWS Bedrock work too — see Auth below.
./claude-tower| Key | Action |
|---|---|
j / k or ↑ / ↓ |
Navigate rows |
g / G |
Jump to top / bottom |
r |
Force re-summarise the focused row |
q |
Quit |
- Subscribes to
cmux events(NDJSON socket stream, reconnects via--cursor-file). - Filters
agent.hook.*events → maintains an in-memory session registry keyed by Claude session id (running / awaiting / idle status, last tool, idle time). - cmux redacts tool input and prompt text by design, so for the LLM summary the
reader tails the matching transcript at
~/.claude/projects/<cwd>/<sid>.jsonl. - A debounced (5s) per-session worker sends the last ~20 transcript messages to
claude-haiku-4-5and gets back a one-line summary.
Three methods, resolved per call with the same env conventions Claude Code itself uses:
| Precedence | When | Method |
|---|---|---|
| 1 | CLAUDE_CODE_USE_BEDROCK is truthy |
AWS Bedrock — InvokeModel with the standard AWS credential chain (env, ~/.aws profile, SSO, IMDS). Model defaults to eu.anthropic.claude-haiku-4-5-20251001-v1:0; override with ANTHROPIC_SMALL_FAST_MODEL (e.g. a us. inference profile). |
| 2 | ANTHROPIC_API_KEY is set |
API key — direct Anthropic API call with x-api-key. |
| 3 | otherwise | Claude Code OAuth (default) — reads the access token your Claude Code login put in the macOS keychain (security find-generic-password -s "Claude Code-credentials"). Re-read on every call, so re-logging into Claude Code (which refreshes the token) is picked up automatically. |
If auth can't be resolved (no keychain token, expired token, AWS config
error) the summary falls back to the session's slug (auto-generated by
Claude Code, just less polished) — the UI keeps working either way.
⚠️ Unofficial use (OAuth mode only). Anthropic's OAuth tokens are issued for Claude Code traffic. Inference calls work and many community tools rely on it, but it's not officially supported, and rate limits draw from your subscription. The API-key and Bedrock modes are ordinary, fully supported API usage.
main.go— wires everything togetherinternal/cmuxevents/— subprocess wrapper aroundcmux eventsinternal/registry/— session state mapinternal/transcript/— Claude Code JSONL readerinternal/creds/— auth resolution (keychain OAuth, API key, or Bedrock)internal/summarizer/— Haiku one-linerinternal/ui/— Bubble Tea model
| Symptom | Fix |
|---|---|
cmux: command not found |
Install / launch cmux, ensure cmux is on PATH |
| Empty table | No Claude sessions are running, or cmux hooks aren't installed (cmux hooks setup --agent claude) |
| Generic "[no summary]" rows | Not logged into claude yet, or first 5s debounce not elapsed |
| Rows show slug instead of summary | OAuth token expired — run claude once to refresh. In Bedrock mode: AWS config failed to load — check AWS_REGION / credentials |
