Every Claude Code session in one sidebar, inside your terminal.

A pier where your sessions dock. pier takes one tmux pane and fills it with every running session — which worktree and branch each one is on, whether it's working or waiting for you — and jumps to any of them with a single click. Not a second app to run alongside, just one more pane in the terminal you already keep open.

brew install zkzofn/tap/pierView on GitHub →
A tmux window with pier's sidebar docked on the left. The sidebar groups every running Claude Code session by worktree: under "web" on branch main a session titled "Refactor the checkout flow" is working, under "api" on branch feat/search a session is waiting for input, under "docs" a session is waiting for permission, and a plain terminal session is listed below. Each row's status icon changes as the session changes state. The pane on the right holds Claude Code itself, and the tmux status bar along the bottom shows the current pane's path and git branch.

The round trip

Which window is waiting for you?

Two Claude Code sessions in, you start doing the rounds — cycling through windows to find the one that stopped and wants an answer. Three sessions in, the rounds cost more than the work.

tmux already knows which panes exist. pier reads that, asks Claude Code's hooks what each one is doing, and puts the answer in a column you never have to leave.

  • working
  • waiting for you
  • !waiting for permission
  • ·unknown
  • $terminal session

Recorded by Claude Code hooks, picked up by the sidebar through fsnotify.

What it does

Six things, and nothing that changes how you work

pier sits in a tmux pane. Your prefix key, your config, your muscle memory — all of it stays.

One sidebar, every session

Every running Claude Code instance across all your tmux sessions, grouped by worktree — path and branch. Sessions with no Claude Code pane are listed too, marked $, so a plain shell stays visible and jumpable.

prefix + g show / hide the sidebar

Status you can read at a glance

Claude Code hooks record what each pane is doing and the sidebar picks the change up instantly. Working, waiting for your input, or waiting for you to approve a permission — the answer is a glyph, not a tour of your windows.

● working ○ waiting ! permission

Jump with one click

Click an item to focus it, even when it lives in a different tmux session. With the sidebar focused, j and k move and Enter jumps. Item labels carry the prompt you last submitted there, so you know what you left running.

prefix + ← focus the sidebar

One more session, two keystrokes

prefix+N opens the picker with your current session on top and the cursor already on it, so Enter means "one more Claude Code here". Type to filter directories, ^S for a plain shell instead, Tab to rename before it starts.

prefix + N then Enter

A crash does not cost you the thread

A conversation lost to a crash, power loss, or OS shutdown grows an ↻ resume button in the picker, and ↻ restore all rebuilds the whole pre-shutdown layout in one stroke. Resuming is always an explicit choice, never automatic.

↻ resume ↻ restore all

pier is the front door

Outside tmux it opens the picker and attaches to whatever you pick. Inside tmux it runs claude in the current pane. Flags like -r pass straight through, and a word pier does not know is an error — so a typo never starts a session.

pier -r → claude -r

How it works

tmux is the source of truth

State files are decoration. Even if every hook dies, the list of sessions stays correct.

Inside one tmux session, the pier sidebar pane sits beside the Claude Code pane. The sidebar polls tmux every two seconds for the list of panes, while Claude Code's hooks write per-pane state files that the sidebar watches with fsnotify.

Discovery polls tmux

Every two seconds the sidebar runs list-panes -a and detects Claude Code panes by process name or version string.

Hooks record status

pier hook runs as a child of Claude Code, so it inherits the pane and maps to it exactly. No resident process.

fsnotify closes the loop

State lands in a file per pane and the TUI picks the change up instantly, without waiting for the next poll.

Keyboard

Nothing here needs memorising

Click ? help at the bottom of the sidebar and pier shows you this same list, in a popup.

tmux(prefix: ctrl+b)

prefix N
new-session picker
prefix g
show / hide the sidebar
prefix x
kill session, jump to next
prefix ←
focus the sidebar pane

sidebar

click
jump to that session
j / k
move · Enter jump
n
new-session picker
r
refresh now
q
hide the sidebar
?
this help

picker(keys act on the ▸ row)

type
filter dirs, or a ~/ path
Enter
claude session at the row
^S
terminal session at the row
Tab
edit the session name
^T
start with telegram attached

Footprint

What it costs to keep open

tmux's model means one sidebar per session. Measured on macOS (Apple Silicon), RSS.

ItemMeasured
One sidebar7.1 – 9.7 MB (avg 8.1 MB)
Total with 6 sessions48.8 MB
pier hook / pier statusNo resident process (a few ms per event)
Binary size5 MB
License
MIT
Written in
Go 1.24
Direct dependencies
5
Releases since July 2026
12

Tagging a release runs the tests, builds the binaries, publishes the GitHub Release from the CHANGELOG, and bumps the Homebrew formula — in one pass, or not at all.

Install

Two lines, then a short wizard

The first pier run offers to wire tmux and the Claude Code hooks, and to add a shell alias. Say no to either and run it later.

Homebrew

brew install zkzofn/tap/pier
pier

From source

git clone https://github.com/zkzofn/pier.git
cd pier
make setup    # build, install to ~/.local/bin, wire it up
pier

Homebrew ships a prebuilt binary; Go 1.24+ is only needed for a source build.

Requirements

  • Claude Code, the thing being dashboarded
  • tmux 3.2+ (developed and verified on 3.6a, installed with Homebrew)
  • Developed and verified on macOS. Linux should work but is unverified.

Updating

pier upgrade asks the tap right now and runs the Homebrew upgrade for you. A pier start checks once a day on its own, and while a newer version is out every sidebar carries an↑ version · pier upgrade line.

PIER_NO_UPDATE_CHECK=1 silences both.

Questions

Before you install it

Does it run on Linux?

pier is developed and verified on macOS. Linux should work but is unverified — a source build has been seen bringing the sidebar up on tmux 3.4, but the hook and Claude Code wiring has not been checked there. Release binaries are built for darwin/arm64 and darwin/amd64.

What does it do to my tmux config?

pier setup appends one marked block to ~/.tmux.conf and merges six hook entries into ~/.claude/settings.json. Existing settings are preserved, a .bak-pier backup of settings.json is written first, re-running never duplicates anything, and a running tmux server is reloaded on the spot.

What if I skip the hooks?

Everything but the status icons, prompt labels, and crash recovery still works — sidebar, jump, and status bar are driven by tmux itself. The icons just stay at · (unknown).

How does it know what is running?

tmux is the source of truth. Every two seconds the sidebar polls tmux list-panes -a and detects Claude Code panes directly. The hook state files are decoration — even if the hooks die, the list stays correct.

How do I update it?

brew update && brew upgrade zkzofn/tap/pier, or pier upgrade from inside pier, which asks the tap right now and runs the upgrade for you. While a newer version is out, every sidebar carries an ↑ version · pier upgrade line at the bottom.

Dock your sessions.

One command, then pier. The wizard handles the rest, and everything it writes is a marked block it can find again.

brew install zkzofn/tap/pier