Skip to content
Projects

ritikrishu/iterm-dash has 13 GitHub stars and 0 forks. GitHot measured 0 stars in 24 hours and +1 in 7 days. Last checked 2026-11-09 06:37 UTC. Last push 2026-10-28.

How these counts are measured

Live previews of every Claude Code session in iTerm2, in one keyboard-driven tab.

Measured star growth

in 24h
0
in 7 days
+1
in 15 days
Update delayed
in 1 month
Update delayed

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

README.md

Original

iterm-dash

Never leave a Claude waiting.

A live, keyboard-driven grid of every Claude Code session you already have open in iTerm2.
Press n to land in the next one that needs you.

CI MIT license macOS and iTerm2

Install · How it works · FAQ · Architecture

iterm-dash running in a real iTerm2 window, showing six Claude Code sessions live. One cell turns blue with 'Needs your input'. Space opens it full size, n switches iTerm2 to that session's tab, Command-1 returns to the dashboard, and 2 jumps straight to another session's tab.

Recorded in a real iTerm2 window. The six sessions are scripted stand-ins, so no private work is on screen; the dashboard, their status and the tab switches are real.

Why

I run eight or nine Claude Code sessions at once, each in its own iTerm2 tab, and two things kept going wrong.

A session would finish, or stop to ask me something, and then sit there until I happened to click past its tab. That's Claude Code time I wasn't using. And every so often I'd cycle through every tab just to glance at each one and check it was still on track, which is tedious with nine of them.

iterm-dash is one more iTerm2 tab that shows all the others live. The sessions that need you light up, and a single key takes you to them.

What you get

See who needs you

A session waiting on a question turns blue with Needs your input and shows the question under its title. A finished one turns green with Done · your turn. Every cell shows how long ago its status changed, so a session that has been waiting a while stands out. The header counts them, and the page title does too, for example (2) iterm-dash.

The header reads '1 needs input · 1 done · 4 working'. Below it, a blue 'Needs your input' cell shows Claude's question, next to a green 'Done · your turn' cell finished 4 minutes ago.

The real screen, not a summary

Each cell is the session's actual terminal screen at full width, colours and all, scaled to fit and updated as it changes. You can tell a session that's making progress from one that's going in circles without opening it.

Keyboard first

Key Action
n Jump to the next session that needs you: waiting first, then errors, then done
1 – 9 Jump to that cell's tab
← ↑ → ↓ Move the focus ring
Space Peek: enlarge the focused cell (Space or Esc closes it)
Enter Jump to the focused or enlarged cell's tab
h / H Hide the focused cell / bring a hidden one back
a Show every session, not just Claude Code
- + Smaller or larger minimum text size
? Show all shortcuts

The mouse works too: click a cell to peek, double-click to jump.

Peek before you jump

Space opens the focused session full size, so you can read the question or the diff and decide whether it needs you now.

An enlarged session showing Claude's question about how a database backfill should treat existing keys, with numbered options.

Works with the tabs you already have

There's no tmux, no wrapper command and nothing to relaunch. Start Claude Code however you like, in any window or tab. iterm-dash finds sessions as they open and close and keeps them in the order it first saw them.

Read-only by design

iterm-dash never types into, resizes or rearranges your sessions. Apart from managing its own dashboard tab, the only thing it does in iTerm2 is bring a session's tab to the front when you ask.

Install

You need macOS, iTerm2 3.7 or later, and uv. uv installs Python 3.12+ for you if you don't have it.

  1. Turn on iTerm2's Claude Code integration: choose iTerm2 › Install Claude Code Integration and complete at least Enable Python API and Install Hook. The hook is how each session reports whether it's working, waiting or done.

  2. Install iTerm2's browser plugin, which lets iTerm2 open a web page as a tab: download iTermBrowserPlugin-1.0.zip, unzip it and move iTermBrowserPlugin.app to /Applications. If it's missing, iterm-dash tells you so and prints these steps.

  3. Install and run iterm-dash from any iTerm2 tab:

    uv tool install iterm-dash
    iterm-dash
    

The dashboard opens as a new iTerm2 tab. Run iterm-dash again at any time to bring it back to the front. The first run takes a few seconds longer while Python compiles, and iTerm2 may ask you to allow the API connection.

Other ways to install, and how to uninstall

With pipx (needs Python 3.12 or later):

pipx install iterm-dash

The latest commit on main:

uv tool install git+https://github.com/ritikrishu/iterm-dash

From a clone:

git clone https://github.com/ritikrishu/iterm-dash && cd iterm-dash
uv tool install --editable .

To update, stop the server and upgrade:

iterm-dash stop
uv tool upgrade iterm-dash

To uninstall, stop the server and remove the tool. Settings and logs live in ~/Library/Application Support/iterm-dash/.

iterm-dash stop
uv tool uninstall iterm-dash

Usage

Command What it does
iterm-dash Starts the background server if needed, then opens the dashboard tab or brings it forward
iterm-dash stop Stops the background server (and the demo server, if one is running)
iterm-dash smoke Read-only check against iTerm2: prints one line of metadata per session (id, title, size, status, fetch time), never screen text
iterm-dash demo Starts a demo server with made-up sessions and prints its URL, so you can try the UI without iTerm2

The server keeps running until iTerm2 quits or you run iterm-dash stop.

How it works

  1. One background Python process holds a single connection to iTerm2's Python API.
  2. Screens: it treats each session's screen stream only as a "something changed" signal, then fetches the raw screen buffer at a throttled rate. Lines are cached by their content, so a changed or scrolled frame only re-renders the lines that are new. Fetching a 214×57 screen takes about 1 ms, and re-rendering a changed frame about 0.5 ms (measured on iTerm2 3.7.6 with Claude Code 2.1.310).
  3. Status comes from iTerm2's Claude Code integration (iterm2.get_session_status), the same source as iTerm2's Session Status tool.
  4. The page is served on 127.0.0.1 with a per-run token and opened as an iTerm2 browser tab. A WebSocket sends it only the rows that changed, and it renders each screen at full width and scales it to fit the cell. Claude Code ends every row with a hard line break, so text can't be re-flowed into a narrower cell without breaking it.

In the same setup, with several sessions working, the server used about 1% CPU. The full design, including the edge cases that shaped it, is in docs/architecture.md.

Privacy and safety

Your terminals hold private work, so iterm-dash is built to keep it on your machine:

  • The server only listens on 127.0.0.1. The page, its WebSocket and its control API all require a random token that changes on every start. Only the page's own JavaScript and CSS are served without it, and they contain no terminal data.
  • The dashboard opens as an iTerm2 browser tab, never in your default browser, so that browser's extensions and sync never see your terminal contents or the token URL.
  • It makes no outbound network requests and has no telemetry.
  • Logs and iterm-dash smoke record metadata only (ids, titles, sizes, timings), never screen text.
  • It never sends keystrokes to, resizes or closes your sessions.

See SECURITY.md to report a vulnerability.

How it compares

  • iTerm2's Session Status tool (View › Toolbelt › Session Status) lists the same statuses and jumps to a session when you click it. If a status list is enough for you, you don't need iterm-dash. What iterm-dash adds is the live screen, so you can see whether a busy session is on track.
  • Claude Code's agent view (claude agents) manages background sessions and shows a summary per session. Sessions open in other terminals only appear once you background them. iterm-dash shows the sessions you already have, as they are, without changing how you run them.
  • Session managers such as claude-squad, agent-deck and ccmanager start and manage agent sessions for you and let you drive them from one place. Choose one of those if you want orchestration. iterm-dash doesn't start, stop or type into anything.

FAQ

Does it work with Ghostty, Terminal.app, Warp or tmux?

No. It's built on iTerm2's Python API and browser tabs, so it's iTerm2 only. tmux running inside an iTerm2 tab shows up like any other session, but tmux's -CC integration mode isn't supported.

Do I need Claude Code?

The live previews work for any iTerm2 session: press a to show them all. The "needs you" highlighting relies on the status that Claude Code reports through iTerm2's integration, so other tools show up as plain previews.

Why not resize sessions to fit the grid?

Resizing a session in iTerm2 resizes its real window. Tabs share one window size, and it fails on full-screen windows. iterm-dash renders each screen at its own width and scales it down instead, so your windows stay exactly as you left them.

A session says "Done" but Claude crashed. Why?

Status is reported by Claude Code's hook. If Claude exits uncleanly, the last status can go stale. That's why every cell shows how long ago its status changed. The clock starts when iterm-dash sees the change, so after the server restarts, it counts from the restart.

Something isn't working. Where do I start?
  • Every cell says "Status unknown" or nothing ever lights up: iTerm2's Claude Code hook isn't installed or was dropped. Choose iTerm2 › Install Claude Code Integration (or Reinstall Claude Code Integration), then restart the Claude Code sessions that were already running.
  • iterm-dash can't connect to iTerm2: turn on the Python API in Settings › General › Magic, and run iterm-dash from an iTerm2 tab.
  • You closed the dashboard tab: run iterm-dash again. It reopens the tab or brings it forward.
  • Something else: iterm-dash smoke shows what iterm-dash can see, and server.log records what it did. Both contain metadata only, so they're safe to paste into an issue.
Where are the logs and settings?

In ~/Library/Application Support/iterm-dash/: server.log, settings.json (text size and the show-all toggle), server.json and dashboard.json. Set ITERM_DASH_STATE_DIR to use a different folder.

Can it answer prompts or send text to a session?

Not in this version, and not by accident. Version 1 is deliberately read-only. Its only action is focusing a tab.

Development

git clone https://github.com/ritikrishu/iterm-dash && cd iterm-dash
uv sync
uv run pytest        # Python tests (no iTerm2 needed)
npm test             # page module tests
uv run iterm-dash demo

iterm-dash demo serves the real UI fed by scripted sessions, which is how the still screenshots above were made. It's the quickest way to work on the page. The tests run against fake sessions, so neither needs iTerm2.

How the code fits together:

Module Job
backend.py iTerm2 API: discovery, screen watchers, status, focus, and the content-keyed line cache
pump.py Throttled, latest-only screen fetches
render.py Screen lines → styled row runs, plus row diffs
hub.py Cached state, and broadcasts changes to open pages
web.py Token-guarded routes and the WebSocket
web/app.js The grid UI, built on pure modules (layout.js, nav.js, clicks.js, format.js, rows.js)
server.py, cli.py Process entry point and the iterm-dash command
surface.py Opens the iTerm2 browser tab
demo.py Scripted sessions for UI work

Read CONTRIBUTING.md before opening a pull request, and docs/architecture.md for the design and the iTerm2 behaviour it depends on. There's one hard rule: anything that changes a session gets tested only on a throwaway session, and debug output never prints screen text.

License

MIT. iterm-dash is an independent project, not affiliated with Anthropic or iTerm2. Claude and Claude Code are trademarks of Anthropic.

Explore related projects