by craftzdog
Run many Claude Code sessions across your projects, each in its own tmux session — then list them, see which are done vs. still working, and jump to one from a single popup.
# Add to your Claude Code skills
git clone https://github.com/craftzdog/tmux-claude-session-managerGuides for using ai agents skills like tmux-claude-session-manager.
tmux-claude-session-manager is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by craftzdog. Run many Claude Code sessions across your projects, each in its own tmux session — then list them, see which are done vs. still working, and jump to one from a single popup. It has 188 GitHub stars.
tmux-claude-session-manager's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/craftzdog/tmux-claude-session-manager" and add it to your Claude Code skills directory (see the Installation section above).
tmux-claude-session-manager is primarily written in Shell. It is open-source under craftzdog on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh tmux-claude-session-manager against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Run many Claude Code sessions across your projects, each in its own tmux session — then list them, see which are done vs. still working, and jump to one from a single popup.
If you launch Claude per-directory (one nested session per project), you quickly end up with a dozen of them and no way to tell which are finished without opening each one. This plugin gives you:
prefix + u) listing every running Claude session.working / waiting / idle — driven by
Claude Code hooks, so you instantly see which need you.prefix + y) that opens/attaches a Claude session for the
current directory.ctrl-x) of finished sessions from the picker.Status is optional: without the hooks the picker still lists, previews, jumps,
and kills — sessions just show ? instead of a color.
display-popup)claude command)Add to ~/.tmux.conf (or ~/.config/tmux/tmux.conf):
set -g @plugin 'craftzdog/tmux-claude-session-manager'
Then hit prefix + I to install.
Keybinding note: by default the plugin binds
prefix+y(launch) andprefix+u(list). If your config binds those elsewhere, either change the options below, or make sure the plugin loads after your own bindings (putrun '~/.tmux/plugins/tpm/tpm'after them) so the one you want wins.
git clone https://github.com/craftzdog/tmux-claude-session-manager ~/clone/path
Add to ~/.tmux.conf, then reload (prefix + r or tmux source ~/.tmux.conf):
run-shell ~/clone/path/claude_session_manager.tmux
| Key | Action |
|---|---|
prefix + y |
Launch (or re-attach to) a Claude session for the current directory, in a popup |
prefix + u |
Open the session picker |
Inside the picker:
| Key | Action |
|---|---|
enter |
Jump to the session (switches to its origin window, resumes in the popup) |
ctrl-x |
Kill the highlighted session |
↑ / ↓, type to filter |
fzf navigation |
Sessions needing your attention (waiting, idle) sort to the top.
Status comes from Claude Code hooks
that stamp each session's state onto its tmux session. Add the following to your
Claude Code settings (~/.claude/settings.json), merging into any existing
hooks block. Adjust the path if your plugins live elsewhere (e.g.
~/.tmux/plugins/...):
{
"hooks": {
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "$HOME/.config/tmux/plugins/tmux-claude-session-manager/scripts/state.sh working"
}
]
}
],
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "$HOME/.config/tmux/plugins/tmux-claude-session-manager/scripts/state.sh waiting"
}
]
}
],
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "$HOME/.config/tmux/plugins/tmux-claude-session-manager/scripts/state.sh waiting"
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "$HOME/.config/tmux/plugins/tmux-claude-session-manager/scripts/state.sh idle"
}
]
}
]
}
}
The state machine:
| Event | State | Meaning |
|---|---|---|
UserPromptSubmit |
🔴 working |
Busy — leave it |
Notification (permission) |
🟡 waiting |
Needs permission |
PreToolUse (AskUserQuestion) |
🟡 waiting |
Asking you a question |
Stop |
🟢 idle |
Turn finished — your move |
Claude Code reloads
hooksdynamically — no restart needed. Sessions that are already running start reporting status on their next event once the hooks are added.
Set any of these before the plugin loads (defaults shown):
set -g @claude_launch_key 'y' # prefix key: launch/open for current dir
set -g @claude_list_key 'u' # prefix key: open the picker
set -g @claude_command 'claude' # command run in new sessions
set -g @claude_session_prefix 'claude-' # tmux session name prefix
set -g @claude_popup_width '90%' # popup width
set -g @claude_popup_height '90%' # popup height
claude-<hash-of-dir> tmux session running
claude, records the window it came from in @claude_origin, and attaches to
it in a popup.@claude_state / @claude_state_at on each session as Claude
works.capture-pane preview, and on selection moves your client to the session's
origin window before resuming it in the popup.prefix + u from inside a session popup detaches that popup
first (closing it), then reopens the picker full-size on the outer host client —
so you never end up with a cramped popup-in-popup.MIT © Takuya Matsuyama