Setup
How I run multiple Claude Code sessions in parallel with tmux, plus dotfiles and phone access.
Terminal
Everything runs inside tmux. My shell auto-attaches on launch, and I spawn Claude Code panes with a one-line script.
tmux config highlights
- Mouse enabled (scroll, click, resize)
- Scrollback buffer: 50,000 lines
- True color support (
tmux-256color) - Pane border titles showing pane name
aggressive-resizeso multiple clients can have different window sizes- Plugins via tpm: resurrect + continuum (auto-save/restore sessions)
The cc script
Creates a new Claude Code pane, names it, and re-tiles the grid. Lives at ~/bin/cc.
#!/bin/zsh
# Usage: cc [name]
# Creates a new Claude Code pane in the current tmux session.
# Falls back to a timestamp if no name is given.
if [[ -z "$TMUX" ]]; then
echo "Error: not inside a tmux session" >&2
exit 1
fi
name="${1:-$(date +%H%M%S)}"
tmux split-window -d -c ~ "claude --dangerously-skip-permissions"
pane=$(tmux list-panes -F '#{pane_index}' | tail -1)
tmux select-pane -t "$pane" -T "$name"
tmux select-layout tiled Auto-attach on shell start
This block in .zshrc ensures every terminal session lands inside tmux. SSH connections create a grouped session so phone and laptop share windows but can view them independently.
if [[ -z "$TMUX" ]]; then
if [[ -n "$SSH_CONNECTION" ]]; then
tmux new-session -A -t c -s "remote-$$" \; new-window -n remote 'claude --dangerously-skip-permissions' 2>/dev/null || tmux new -s c 'claude --dangerously-skip-permissions'
else
tmux attach -t c 2>/dev/null || tmux new -s c 'claude --dangerously-skip-permissions'
fi
fi Navigation cheatsheet
| Action | Key |
|---|---|
| Grid view (re-tile) | prefix+g |
| Zoom pane fullscreen | prefix+z |
| Return to grid | prefix+z again |
| Jump to pane by number | prefix+q then number |
| Next pane | prefix+o |
| Move pane to own window | prefix+! |
| Kill pane | prefix+x then y |
Claude Code
Configuration lives in a dedicated repo: MaxGhenis/.claude
Key settings
- teammateMode:
in-process - Bypass permissions: enabled for trusted repos
- Hooks:
enforce-package-managers— blocks wrong package managers per projectauto-commit-wip— commits work-in-progress on session endwarn-uncommitted— alerts on large uncommitted diffs
Skills
11 on-demand skills that load based on conversation context (not preloaded). Examples: Whoop health data, Xero UK accounting, App Store Connect, GCP billing, OpenCollective expenses, Modal/Vercel deployment, agent teams, Slack patterns.
Plugins
- max-productivity (local) — custom commands + all 11 skills
- policyengine-claude — PolicyEngine design system and patterns
- rules-foundation — tax/benefit rules engine conventions
- frontend-design — production-grade UI generation
- plugin-dev — Claude Code plugin development
Dotfiles
Tracked in a separate repo: MaxGhenis/dotfiles
Contains .tmux.conf, .zshrc, and bin/cc. Kept separate from .claude because these files also include non-Claude config (conda, NVM, Julia, PATH, etc.).
Phone access
- Grouped sessions: SSH creates a linked tmux session that shares windows but has its own independent view (cursor position, active pane)
- Tailscale: mesh VPN for networking between devices without port forwarding
- Termux on Android: full Linux environment for SSH access from a phone
aggressive-resize: set in.tmux.confso phone and laptop can have different window sizes simultaneously