See what every Claude Code session is doing. Each iTerm2 tab shows a status prefix. โก running, ๐ค idle, or ๐ด needs attention (with flashing).
FAQ
iterm2-tab-status is a Claude Code plugin with hand-picked skills for productivity work, indexed on Flowy. Install it with the command on its page. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
See what every Claude Code session is doing. Each iTerm2 tab shows a status prefix. โก running, ๐ค idle, or ๐ด needs attention (with flashing).

In Claude Code, register the marketplace first:
/plugin marketplace add JasperSui/jaspersui-marketplace
Then install the plugin from this marketplace:
/plugin install iterm2-tab-status@jaspersui-marketplace
On first session start, the plugin automatically:
After the first session, restart iTerm2 (or toggle Scripts โ AutoLaunch โ claude_tab_status.py twice).

To update to the latest release:
claude plugin update iterm2-tab-status@jaspersui-marketplace
This re-fetches the plugin and installs the newest version on its own โ you do not need to run /plugin marketplace update first (that only refreshes the catalog listing). After updating, restart the iTerm2 adapter (close and reopen iTerm2, or toggle Scripts โ AutoLaunch โ claude_tab_status.py) so it picks up any adapter-side changes.
See CHANGELOG.md for what's in each release.
If auto-bootstrap didn't work, run:
/iterm2-tab-status:setup
Run in Claude Code:
/iterm2-tab-status:uninstall
Then remove the plugin:
claude plugin uninstall iterm2-tab-status
| State | Prefix | Tab Color | Badge | Dismiss on Focus |
|---|---|---|---|---|
| Running โ Claude is processing | โก | No change | No | No |
| Idle โ Claude finished | ๐ค | No change | No | No |
| Attention โ needs permission | ๐ด | Flashes orange | Yes | Yes |
Lifecycle: User submits โ โก โ Claude finishes โ ๐ค โ User submits โ โก โ Claude needs permission โ ๐ด flash! โ User focuses โ cleared
Your original tab color, title, and badge are saved and restored.
Prefer the prefix/badge without the color flash? Set "flash_enabled": false โ the badge and notification still fire, just no tab-color flash. It's hot-reloaded, so toggling it off also stops a flash that's already in progress.
Claude Code hooks โ JSON signal file โ iTerm2 adapter โ tab status
No screen scraping. Claude Code's official hooks API writes a signal file on every event. The unified hook handles both UserPromptSubmit (โ running) and Notification (โ idle/attention). The iTerm2 adapter polls for signal files and sets the matching tab's prefix, color, and badge by TTY. Only the attention state flashes and shows a badge โ running and idle are informational prefixes that persist.
The easiest way to configure is with the slash command in Claude Code:
/iterm2-tab-status:config
This opens an interactive prompt to change flash color, prefixes, badge, notifications, and more.
Settings are stored in ~/.config/claude-tab-status/config.json. Example with all keys and their defaults:
{
"dir": "~/.cache/claude-tab-status",
"color_r": 255,
"color_g": 140,
"color_b": 0,
"interval": 0.6,
"flash_enabled": true,
"prefix_running": "โก ",
"prefix_idle": "๐ค ",
"prefix_attention": "๐ด ",
"display_target": "title",
"subtitle_activity_source": "off",
"badge": "โ ๏ธ Needs input",
"badge_enabled": true,
"notify": false,
"sound": "",
"signal_max_age": 1800
}
The config file is hot-reloaded โ changes take effect within ~1 second, no restart needed.
Settings are resolved in this order (highest wins):
export CLAUDE_ITERM2_TAB_STATUS_COLOR_R=255)~/.config/claude-tab-status/config.json)Environment variables are useful for CI or per-machine overrides without touching the config file.
By default, status is shown as a tab title prefix.
Set "display_target": "subtitle" to leave the main tab title alone and write status to the iTerm2 user variable user.claudeStatus. In iTerm2, open Settings > Profiles > General and set Subtitle to:
\(user.claudeStatus)
Use "display_target": "both" to update both the title prefix and subtitle variable.
Set "subtitle_activity_source": "prompt" to append a compact, sanitized activity snippet
to the subtitle, such as โก Run tests. The default is "off", which keeps subtitle
output status-only and does not persist prompt text in signal files. Prompt snippets are
opt-in because Claude Code's UserPromptSubmit hook payload includes the submitted
prompt.
Claude Code can also set terminal titles. If you want iTerm2 to control the main title while this plugin updates the subtitle, add this to your shell startup file:
export CLAUDE_CODE_DISABLE_TERMINAL_TITLE=1
| Variable | Default | Description |
|---|---|---|
CLAUDE_ITERM2_TAB_STATUS_DIR | $XDG_RUNTIME_DIR/claude-tab-status or ~/.cache/claude-tab-status | Signal file directory (per-user, mode 0700) |
CLAUDE_ITERM2_TAB_STATUS_COLOR_R | 255 | Flash color red (0-255) |
CLAUDE_ITERM2_TAB_STATUS_COLOR_G | 140 | Flash color green (0-255) |
CLAUDE_ITERM2_TAB_STATUS_COLOR_B | 0 | Flash color blue (0-255) |
CLAUDE_ITERM2_TAB_STATUS_INTERVAL | 0.6 | Flash interval in seconds |
CLAUDE_ITERM2_TAB_STATUS_FLASH_ENABLED | true | Enable/disable tab-color flash (attention only) |
CLAUDE_ITERM2_TAB_STATUS_PREFIX_RUNNING | โก | Running state prefix |
CLAUDE_ITERM2_TAB_STATUS_PREFIX_IDLE | ๐ค | Idle state prefix |
CLAUDE_ITERM2_TAB_STATUS_PREFIX_ATTENTION | ๐ด | Attention state prefix |
CLAUDE_ITERM2_TAB_STATUS_DISPLAY_TARGET | title | Where to show status: title, subtitle, or both |
CLAUDE_ITERM2_TAB_STATUS_SUBTITLE_ACTIVITY_SOURCE | off | Subtitle activity source: off or prompt |
CLAUDE_ITERM2_TAB_STATUS_BADGE | โ ๏ธ Needs input | Badge text (attention only) |
CLAUDE_ITERM2_TAB_STATUS_BADGE_ENABLED | true | Enable/disable badge (attention only) |
CLAUDE_ITERM2_TAB_STATUS_NOTIFY | false | macOS notification (attention only) |
CLAUDE_ITERM2_TAB_STATUS_SOUND | (empty) | Sound file path (attention only) |
Tab doesn't show status โ Check that the iTerm2 Python Runtime is installed. Verify signal files are created: ls "${XDG_RUNTIME_DIR:-$HOME/.cache}/claude-tab-status/" after Claude goes idle. Set export CLAUDE_ITERM2_TAB_STATUS_LOG=DEBUG and check iTerm2's script console (Scripts โ Manage โ Console).
Wrong tab gets prefix โ The TTY in the signal file doesn't match the iTerm2 session. Restart iTerm2.
Tab stuck on a stale status (e.g. still showing ๐ด attention after you've responded) โ A signal is reclaimed when its PID dies, but the recorded PID is the long-lived login shell, so a signal left behind by a session that has moved on can persist while the tab stays open. The adapter also expires any signal not refreshed within signal_max_age seconds (default 1800); lower it (e.g. "signal_max_age": 600) to clear stuck statuses sooner, or set 0 to disable age-based expiry.
See CONTRIBUTING.md.
If this plugin saves you tab-switching time, consider giving it a โญ!
.claude-plugin/
plugin.json
.github/
FUNDING.yml
ISSUE_TEMPLATE/
bug.md
feature.md
workflows/
ci.yml
release.yml
.gitignore
.pre-commit-config.yaml
assets/
demo.gif
initial-setup.jpg
CHANGELOG.md
CODE_OF_CONDUCT.md
commands/
config.md
setup.md
uninstall.md
CONTRIBUTING.md
hooks/
hooks.json
LICENSE
pyproject.toml
README.md
scripts/
bootstrap.sh
claude_tab_status.py
hook.sh
SECURITY.md
tests/
test_adapter.py
test_bootstrap.sh
test_hooks.sh
test_integration.py
test_plugin_structure.sh
uv.lockยฉ 2026 Flowy ยท Free and open source
Built for Claude Code ยท Not affiliated with Anthropic
CLAUDE_ITERM2_TAB_STATUS_SIGNAL_MAX_AGE | 1800 | Reclaim signals not refreshed within N seconds (0 disables) |
CLAUDE_ITERM2_TAB_STATUS_LOG | WARNING | Log level (DEBUG, INFO, WARNING, ERROR) |