watch every claude code session at once

keep every Claude Code session in view.

You run several at once. Terminal, editor, SDK. tend watches them all and shows a live list: which are working, which need you, which are done.

install
curl -fsSL https://raw.githubusercontent.com/jah2488/tend/main/install.sh | bash

Piping a script into a shell deserves a look first. Read it here.

  • No network calls, ever
  • Binary checksum-verified, SHA-256
  • Reads ~/.claude read-only; never edits your work
tend
tend v1.3.0  2 live · 1 needs you · 1 idle
webapp-checkout ▶ working · 41% cpu
refactor the stripe webhook handler to retry on 409
⎇ fix/stripe-webhooks ⑂ checkout · claude-sonnet-4-6
142k tok · 12 tools · 3 web · Notion · Slack
docs-site ◆ needs you · permission prompt
waiting for approval to run a shell command
⎇ main · 08:14 in
94k tok · 7 tools · 1 web
migrate-users done · opened #412
finished, 18 min ago
⎇ feat/user-migration · merged
 sdk-indexer [Cursor · sdk] ~/proj/search ⎇ index-v3 2.1m tok · idle 03:41
 sdk-cron [SDK · sdk] ~/proj/cron ⎇ scheduled 880k tok · idle 11:02
[↑↓] move · [enter] actions · [tab] digest · [r] refresh · [q] quit
no network no config no telemetry MIT licensed Rust, single binary

the cost of running agents in parallel

Too many sessions, not enough screen.

You fired off three Claude Code sessions this morning. One in a terminal, one inside your editor, one from the SDK.

Somewhere in there, one is blocked on a permission prompt. One is quietly churning through tokens. One finished an hour ago and you forgot to check.

tend watches all of them and shows you one glanceable list, so you stop tab-hopping to find the one that needs you.

watch

A live list, one row per session.

Every session shows its state, its latest message, its cost, and where it reached. When something is live, the row moves.

working
needs you
idle
done
stale
error

State

Six color-coded states, animated when live. A working session spins; one that needs you pulses.

What it's doing

A one-line summary from the latest prompt or message, the current git branch, and any PR opened.

Cost

Total tokens, a context-fullness bar, and live CPU percent. See a session about to fill up.

Activity

Tool calls and web requests made, plus which integrations it touched. Notion, Slack, the rest.

Worktrees

Sibling sessions in the same repo stay distinct. The worktree name sits right next to the branch.

Tints

A colored pip you set, by a file convention any tool can write. "This one's mine", "priority", "blocked".

Notes

A short line under the summary, by the same file convention. "Blocked on review", "do not merge". Set a tint or a note from any tool, or from tend mcp.

Terminal sessions get a full card. Editor and SDK sessions collapse to a one-liner, so background work never crowds what you care about.

digest

Press Tab. See what a session actually did.

A read-only, scrollable account of what one session spent its time on, pulled fresh from its transcript the moment you open it.

digest · webapp-checkout
The tend session digest panel: cost, prompts, a tool histogram, MCP resources, files, outcomes, and a full timeline.
  • Cost: total tokens, context fullness, wall-clock span
  • Asked / Latest: the first prompt and the most recent
  • Tools: a histogram by frequency. MCP collapses to Server·method (e.g. Notion·notion-fetch)
  • Resources: MCP integrations touched, with counts, plus web
  • Files: changed (listed) versus read (counted)
  • Outcomes: any PR opened, and how many errors it hit
  • Timeline: a time-stamped feed of prompts, every tool call (read, edit, shell, web), PRs, and errors, read by glyph. Long sessions keep the most recent 1500
prompt PR edit $ shell web read error tool

worktrees

Tell sibling sessions apart.

When you run parallel sessions across git worktrees in the same repo, tend shows the worktree name right next to the branch, marked with a branching glyph. So three sessions on three worktrees stay distinct, not three identical rows.

tend
api-refactor
⎇ CO-5390/relocate ⑂ CO-5390-relocate
api-tests
⎇ CO-5390/tests ⑂ CO-5390-tests

cost

Know what each session costs.

Every row shows total tokens, a context-fullness bar so you can see a session about to fill up, and live CPU percent. The digest rounds it out with the wall-clock span.

No estimation, no sampling. The numbers come straight from the transcript tend already reads.

webapp-checkout142k
docs-site94k
migrate-users61k
sdk-indexer174k

privacy

Reads your sessions. Never edits them.

tend reads the metadata Claude Code already writes under ~/.claude/ and parses it read-only. It checks whether each session's process is still alive to tell live work from finished work. It never edits a session or transcript, and never touches your repo. The proof is in the code.

  • No network calls. Ever
  • No config file. No telemetry
  • Never edits a session or transcript file
  • The one thing it deletes: stale annotation files under ~/.claude/tend-color/ and ~/.claude/tend-note/ once their session is gone
  • The binary is SHA-256 checksum-verified. The installer refuses on mismatch
  • No root. Installs to ~/.local/bin. Runs nothing it downloads
  • Anything that changes your repo lives in extensions you choose, not in tend

extend

tend observes. Extensions act.

A read-only core by design. tend will never commit, push, or touch the network itself. All the doing is opt-in, and yours. Find one, or write one. Both take about a minute.

Find

Any executable on your PATH named tend-action-<name> is discovered with no config file, shown in the action menu, and run against the session you select. The first one is tend-ship (commit and push a session's work).

tend --list-actions

Build

Copy examples/tend-action-example, rename it tend-action-<name>, put it on your PATH, make it executable. It shows up in the menu next time you run tend.

cp examples/tend-action-example ~/.local/bin/tend-action-mine

Automate

tend mcp speaks the Model Context Protocol over stdio, so another agent or script can read session state and annotate it with tints or notes. Opt-in and local — no outbound network, and sessions and transcripts stay untouched.

claude mcp add tend -- tend mcp
tend-action-example
# self-describe: one line of JSON on stdout, called once at startup
$ tend-action-mine --tend-describe
{"name": "Mine", "key": "M", "when": {"source": "terminal", "has_branch": true}}

# when invoked, tend leaves its TUI and hands the extension locators, not a snapshot
TEND_SESSION_ID=01HZK…   TEND_TRANSCRIPT=~/.claude/projects/…/01HZK….jsonl
TEND_PROJECT_DIR=~/proj/webapp   TEND_GIT_BRANCH=fix/stripe-webhooks
TEND_WORKTREE=checkout   TEND_SOURCE=terminal   TEND_VERSION=1.3.0

install

One line. No root. Installs to ~/.local/bin.

install
curl -fsSL https://raw.githubusercontent.com/jah2488/tend/main/install.sh | bash
  1. 01The installer downloads the latest release binary, verifies its SHA-256 checksum (refuses on mismatch), and handles chmod and Gatekeeper
  2. 02Make sure ~/.local/bin is on your PATH, then run tend
  3. 03
    Update an existing install:
    1. git pull
    2. cargo install --path . --force
    3. quit tend (q) and relaunch

A prebuilt binary ships for macOS on Apple Silicon. Other platforms build from source with a Rust toolchain: git clone, cd tend, cargo install --path .