Mission control for parallel Claude Code agents — see every Claude instance's live status right inside the picker.
Running Claude Code in multiple tmux sessions in parallel is great — until you realize sesh's picker only shows session names, not what each Claude is actually doing. You end up attaching into every session one by one just to find out: did the refactor finish? Is anyone blocked on a permission prompt? Who's still thinking?
cc-sesh layers a Claude status display on top of sesh's picker, so you can tell at a glance:
- how many Claude instances live in each session and what each is doing — idle, running, or waiting on OAuth
- a sticky
ATTNreminder when any Claude finishes a round of work, so you never miss a "done" - everything upstream sesh already does — tmux + zoxide + configs + tmuxinator, naming, configuration — kept intact
- Why?
- Quick start — install + tmux config in 30 seconds
- Commands
- Picker hotkeys
- Shell completion
- Coexistence with upstream sesh
- Configuration
- Credits & license
Homebrew (recommended)
brew install Wingsdh/tap/cc-seshGo install
go install github.com/Wingsdh/cc-sesh/v2@latestRequires Go 1.25+.
Append the block below to your ~/.tmux.conf (or $XDG_CONFIG_HOME/tmux/tmux.conf):
# === cc-sesh ===
# prefix + t — open the picker as a popup
bind-key "t" display-popup -E -w 80% -h 70% "cc-sesh picker -i"
# prefix + b — jump back to the previous session
bind-key "b" run-shell "cc-sesh last"
# Don't exit tmux when closing a session (so cc-sesh last has somewhere to go)
set-option -g detach-on-destroy offOr as a one-liner, the whole thing:
cat >> ~/.tmux.conf <<'EOF'
# === cc-sesh ===
bind-key "t" display-popup -E -w 80% -h 70% "cc-sesh picker -i"
bind-key "b" run-shell "cc-sesh last"
set-option -g detach-on-destroy off
EOF
tmux source-file ~/.tmux.conf 2>/dev/nullInside tmux, hit prefix + t. That's it.
-ienables the source icons (requires a Nerd Font).
cc-sesh picker # open the built-in picker
cc-sesh list # list every session source (tmux + config + zoxide + tmuxinator)
cc-sesh connect <name> # connect to a session (creates it if absent)
cc-sesh last # jump to the previous session
cc-sesh window # list / switch / create windows in a sessionlist / connect / window / pane / clone / root / last semantics and flags match upstream sesh — see the upstream usage docs for full details.
Inside the picker (no fzf-tmux wrapper required):
| Hotkey | Action |
|---|---|
Ctrl-a |
all sources (default) |
Ctrl-t |
tmux sessions only |
Ctrl-g |
sesh.toml configs only |
Ctrl-x |
zoxide history only |
Ctrl-f |
walk $HOME to depth ≤ 2 |
Ctrl-d |
kill the tmux session under cursor |
Alt-d |
dismiss the ATTN flag on the current row (does not kill) |
→ |
expand the session under cursor (tmux sources only) |
← |
collapse the session (from a window row: collapse its session and move the cursor back) |
Ctrl-r |
re-capture the preview snapshot |
The preview pane renders only when the terminal is at least 102 columns wide (list 60 + gap 2 + preview 40); it comes back automatically when you widen the terminal. On wider terminals the list takes 40% of the width (min 60 columns) and the preview the rest.
Bash
cc-sesh completion bash > cc-sesh-completion.bash
sudo cp cc-sesh-completion.bash /etc/bash_completion.d/
source ~/.bashrcZsh
cc-sesh completion zsh > _cc-sesh
sudo mkdir -p /usr/local/share/zsh/site-functions
sudo cp _cc-sesh /usr/local/share/zsh/site-functions/
source ~/.zshrcFish
cc-sesh completion fish > ~/.config/fish/completions/cc-sesh.fish
source ~/.config/fish/config.fishsesh and cc-sesh can be installed side-by-side — every name path is renamed:
| upstream sesh | cc-sesh | |
|---|---|---|
| binary | sesh |
cc-sesh |
| Go module | github.com/joshmedeski/sesh/v2 |
github.com/Wingsdh/cc-sesh/v2 |
| config dir | $XDG_CONFIG_HOME/sesh/ |
$XDG_CONFIG_HOME/cc-sesh/ |
| config file | sesh.toml |
sesh.toml (same filename) |
| state dir | — | $XDG_STATE_HOME/cc-sesh/ (attention state, fork-only) |
The attention state file lives at
$XDG_STATE_HOME/cc-sesh/attention.json(default~/.local/state/cc-sesh/attention.json). Delete it any time to wipe all ATTN flags; the next picker open starts fresh.
The config file lives at ~/.config/cc-sesh/sesh.toml. The schema is identical to upstream sesh — [default_session] / [[session]] / [[wildcard]] / [tui] / blacklist / dir_length / sort_order / cache, all of it works as-is.
For configuration syntax and examples, see the upstream Configuration section.
cc-sesh adds no new configuration keys — the Claude integration is zero-config and intentionally not configurable.
cc-sesh is built on top of joshmedeski/sesh. Every piece of session management — tmux / zoxide / tmuxinator integrations, naming strategies, the configuration system, the picker — was designed and polished by Josh Medeski and the upstream contributors over years. Without sesh, there is no cc-sesh. ❤️
MIT, inheriting from upstream sesh's LICENSE, copyright © 2023 Josh Medeski. Modifications by this fork are released under the same MIT license.
