claudeers.
// DevOps & CI/CD

claude-tmux-status

Show Claude Code's live state in your tmux status bar

// DevOps & CI/CD[ cli ][ api ][ claude ]#claude#devopsMIT$open-sourceupdated 24 days ago
Actively maintained
97/100
last commit 23 days ago
last release none
releases 0
open issues 0
// star history

Install with your AI

Paste into Claude Code, Cursor, or any agent — it reads the repo and wires the tool into your project.

Install and set up claude-tmux-status (git-clone project) into my current project.
Found on https://claudeers.com/claude-tmux-status
Repo: https://github.com/alexose/claude-tmux-status
Homepage/docs: —
Detected install method: git-clone → git clone https://github.com/alexose/claude-tmux-status
Category: devops. Platforms: cli, api.
Read the repo's README for exact setup and env vars, then install it and wire it into my project.

Claudeers Health Verdict:
active; community-verified: false. Confirm the source before running anything.
// or clone
git clone https://github.com/alexose/claude-tmux-status

// compatibility

Platformscli, api
Operating systems
AI compatibilityclaude
LicenseMIT
Pricingopen-source
LanguageShell

claude-tmux-status

Show what Claude Code is doing right now, right in your tmux status bar.

When Claude is running inside a tmux window, this hook recolors that window's entry in the status bar to reflect Claude's live state — so you can tell at a glance which of your windows is busy versus waiting on you. It only changes the color; your window name is left exactly as you set it.

Demo (older version — the current hook only recolors, it no longer renames)

[0] 0:dash  1:b  2:mage  3:other  4:zsh  5:django  6:bash  7:zsh  8:zsh  9:bash*
                                                            └─ green = Claude finished, waiting on you

States

Your window name never changes — only its color in the status bar:

StyleMeaning
reverse videoClaude is busy — thinking or running a tool
redClaude is blocked on you — a question or permission prompt
green (dark)Claude finished; you haven't looked yet
green (light)Claude finished and you've looked at it
defaultClaude Code exited (styling cleared)

Red vs green. Red means Claude stopped and can't continue until you answer — it asked a clarifying question, or it wants permission to run a tool. Green means the turn is over and there's output waiting to be read. Both chime; only red is holding up work.

Seen. When Claude finishes while you're looking elsewhere, the window goes dark green. The moment you look at it — focus the terminal tab, or switch to that tmux window — it lightens to mark the output as read. That's a one-shot tmux pane-focus-in hook, which needs focus-events on; the script enables it. If Claude finishes while you're already watching, it goes straight to light green with no chime.

Your window name is left alone

This hook never renames your window — it only recolors it. To make sure your title actually stays put, it also locks the window against the other things that would rename it:

  • tmux's automatic-rename, which names a window after its foreground process (e.g. bash, or 2.1.210 — Claude names its process after its version), and
  • the shell's title escape sequences (allow-rename).

Both are turned off for the window, so your title is preserved 100% of the time. The lock stays on even after Claude exits, so the name can't drift later either. If you actually want a window back on tmux auto-rename, run tmux set-window-option automatic-rename on for it.

Background agents. The Stop event fires when the main agent finishes even if tasks launched with run_in_background are still working. The hook reads the background_tasks field from the Stop payload and, if anything is still running, keeps the window in the "busy" color and defers the chime until the last background task finishes — so it won't signal "done" early.

How it works

A single hook script, tmux-status.sh, is wired to seven Claude Code hook events (SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop, Notification, SessionEnd). On each event it reads the payload from stdin, figures out which tmux window it's running in (via $TMUX_PANE), and sets that window's style with tmux set-window-option. It never renames the window. It's a no-op outside tmux.

All styling is applied dynamically by the script — no .tmux.conf changes are required.

Detecting "blocked on you." Two different events mean it: a Notification whose message mentions permission, and PreToolUse for the AskUserQuestion tool. The second one matters — Claude Code doesn't reliably emit a Notification when it asks a clarifying question, so PreToolUse is sometimes the only event that fires until you answer. Treating it as "busy" left the window in reverse video for the whole wait. Both events now paint red, so their order doesn't matter, and the window's state is stashed in a @claude_state window option so the second one doesn't chime again.

Clearing it. Red goes away on PostToolUse, which fires the moment you submit an answer or approve the tool. Without that event the window keeps its red until whatever repaints next — Claude's following tool call, which is however long it spends thinking first. PostToolUse reads the stored state and repaints only when the window is actually red, so it leaves a finished (green) window alone.

Sound when Claude needs you (macOS)

When Claude finishes (green) or gets blocked on a question (red), the hook can play a sound — but only if you're not already looking at that window. If your terminal is frontmost and Claude's tmux window is the active one, it stays silent; if you're in another app, or another tmux window, it chimes.

It chimes once per state change, not once per event: a question is announced by two hook events a few seconds apart, and the hook tracks the window's current state so that's one alert, not two.

It's on by default on macOS (uses lsappinfo + afplay) and a no-op elsewhere. Configure via environment variables in your ~/.claude/settings.json env or shell:

VariableDefaultMeaning
CLAUDE_TMUX_SOUNDPopA macOS system-sound name (see /System/Library/Sounds), a path to a sound file, or off to disable.
CLAUDE_TMUX_ASK_SOUND(same as CLAUDE_TMUX_SOUND)Sound for the red "needs an answer" states, so a question is audibly distinct from a finished turn. Same formats.
CLAUDE_TMUX_TERMINAL_APP(auto)Comma-separated app name(s) that count as "your terminal", e.g. iTerm2 or Ghostty,Code.

CLAUDE_TMUX_TERMINAL_APP exists because tmux overwrites $TERM_PROGRAM, so the host terminal can't be auto-detected. Without it, the hook matches the frontmost app against a built-in list of common terminals (iTerm2, Terminal, Ghostty, WezTerm, Alacritty, kitty, Warp, Code, Cursor, …). Set it if you use a terminal that isn't recognized, or run more than one.

Requirements

Install

git clone https://github.com/alexose/claude-tmux-status.git
cd claude-tmux-status
./install.sh

The installer copies tmux-status.sh into ~/.claude/hooks/ and merges the required hook events into ~/.claude/settings.json (backing it up first). It's idempotent and won't duplicate entries on re-runs. Set CLAUDE_CONFIG_DIR to target a non-default config directory.

Restart any running Claude Code sessions afterward to pick up the hooks.

Manual install

If you'd rather not run the script:

  1. Copy tmux-status.sh to ~/.claude/hooks/tmux-status.sh and chmod +x it.
  2. Merge the contents of settings.hooks.json into your ~/.claude/settings.json (combine the hooks blocks if you already have one).

Uninstall

Remove the ~/.claude/hooks/tmux-status.sh entries from the hooks block in ~/.claude/settings.json (or restore a settings.json.bak.* backup the installer made), and delete ~/.claude/hooks/tmux-status.sh.

License

MIT

// faq

What is claude-tmux-status?

Show Claude Code's live state in your tmux status bar. It is open-source on GitHub.

Is claude-tmux-status free to use?

claude-tmux-status is open-source under the MIT license, so it is free to use.

What category does claude-tmux-status belong to?

claude-tmux-status is listed under devops in the Claudeers registry of Claude-compatible tools.

4 views
45 stars
unclaimed
updated 24 days ago

// embed badge

claude-tmux-status on Claudeers
[![Claudeers](https://claudeers.com/api/badge/claude-tmux-status.svg)](https://claudeers.com/claude-tmux-status)

// retro hit counter

claude-tmux-status hit counter
[![Hits](https://claudeers.com/api/counter/claude-tmux-status.svg)](https://claudeers.com/claude-tmux-status)

// reviews

// guestbook

0/500

// related in DevOps & CI/CD

🔓

⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI…

// devopssansan0/Python61,486GPL-3.0[ claude ]
🔓

Use Claude Code as the foundation for coding infrastructure, allowing you to decide how to interact with the model while enjoying updates from Anthropic.

// devopsmusistudio/TypeScript36,683MIT[ claude ]
🔓

Professional Antigravity Account Manager & Switcher. One-click seamless account switching for Antigravity Tools. Built with Tauri v2 + React (Rust).专业的 Antig…

// devopslbjlaq/Rust30,371NOASSERTION[ claude ]
→ see how claude-tmux-status connects across the ecosystem