lazyclaude
April 15, 2026 · View on GitHub
English | 日本語
A lazygit-inspired TUI for managing multiple Claude Code sessions.
Live preview, permission prompt popups, scrollback browsing, SSH remote sessions -- all from a single tmux popup.
Why lazyclaude?
Claude Code is powerful, but managing multiple sessions is painful:
- Context switching -- you can't see what other sessions are doing without
tmux select-window - Permission prompts block -- you have to be in the right window at the right time to approve
- No overview -- which sessions are running, idle, or stuck waiting for input?
lazyclaude solves this with a single TUI that shows all sessions at a glance, routes permission prompts as popups, and lets you approve from anywhere.
Features
Session Management
- Create, rename, delete, and attach to Claude Code sessions
- Live preview of any session's output without leaving the session list
- Project-based grouping with collapsible trees
- Resume terminated sessions with preserved conversation history (
lazyclaude sessions resume)
Activity Tracking
- Real-time 5-stage status for every session:
?Running |!Needs Input |✓Idle |✗Error |×Dead - Status updates via Claude Code hooks (injected automatically, zero config)
Permission Prompts
- Tool approval popups appear as overlays -- no need to switch windows
- One-key approval:
1accept,2always allow,3reject - Stacked popups with
Up/Downnavigation when multiple sessions need input - Diff preview with dual line numbers, color-coded additions/deletions, and scrollbar
- Supports Write and Edit tool diffs (unified diff format with clean inline display)
- Works across SSH tunnels
Fullscreen Mode
- Direct keyboard forwarding to Claude Code (transparent passthrough)
- Scrollback browser with vim-like navigation (
Ctrl+Vor mouse wheel) - Visual line selection and clipboard copy (
vselect,ycopy)
MCP Server & Plugin Management
- View and toggle MCP servers registered in Claude Code
- Install, uninstall, and enable/disable Claude Code plugins from the TUI
- Scope-aware operations (project vs global)
Search & Navigation
- fzf-style
/filter on any panel (sessions, plugins, MCP servers) ?Telescope-style keybinding help overlayTab/Shift+Tabpanel cycling
PM/Worker Multi-Agent
- Spawn a PM (Project Manager) session that orchestrates multiple Worker sessions
- Workers run in isolated git worktrees with their own branches
- PM and Workers communicate via a built-in message API (
/msg/send,/msg/create) - Resume terminated workers to continue where they left off (
sessions resume) - PM reviews Worker pull requests and sends structured feedback
- Each Worker receives a system prompt with its role, task, and communication instructions
Profile Selection
- Define multiple
claudelaunch profiles in$HOME/.lazyclaude/config.json(model, args, env) - Choose a profile on session creation (
n,N,w,W,P) with an inline options input - Workers spawned via
lazyclaude msg create --profile <name> --options "..."inherit the chosen profile - Profiles resolve per host: remote sessions use the daemon's
$HOME/.lazyclaude/config.json - List profiles with
lazyclaude profile list(-vfor ARGS/ENV,--jsonfor scripting)
Minimal $HOME/.lazyclaude/config.json:
{
"version": 1,
"profiles": [
{"name": "opus", "command": "claude", "args": ["--model=claude-opus-4-6"], "default": true},
{"name": "sonnet", "command": "claude"}
]
}
Infrastructure
- tmux plugin integration via
display-popup(Ctrl+\to toggle) - SSH remote sessions with automatic reverse tunnel for notifications
- SSH password authentication via SSH_ASKPASS integration
- Built-in MCP server for Claude Code IDE auto-discovery
- Launch lazygit directly from the TUI (optional, if installed)
Requirements
- tmux >= 3.4 (for
display-popup -b rounded) - Claude CLI
- lazygit (optional -- for in-TUI git management)
Installation
Quick install (standalone binary)
curl -fsSL https://raw.githubusercontent.com/any-context/lazyclaude/prod/install.sh | sh
Downloads a pre-built binary to ~/.local/bin/. No Go required. Run with lazyclaude.
Note: This installs the binary only. For tmux plugin integration (
Ctrl+\popup), use TPM or clone the repo instead.
With TPM (tmux plugin)
Add to .tmux.conf:
set -g @plugin 'any-context/lazyclaude'
Then press prefix + I to install. The plugin registers Ctrl+\ to open lazyclaude as a tmux popup.
Clone manually (tmux plugin without TPM)
git clone https://github.com/any-context/lazyclaude ~/.local/share/tmux/plugins/lazyclaude
cd ~/.local/share/tmux/plugins/lazyclaude
make install PREFIX=~/.local
Add to .tmux.conf:
run-shell ~/.local/share/tmux/plugins/lazyclaude/lazyclaude.tmux
Then reload: tmux source ~/.tmux.conf
Build from source
Requires Go 1.25+:
git clone https://github.com/any-context/lazyclaude
cd lazyclaude
make install PREFIX=~/.local
Keybindings
Sessions panel
| Key | Action |
|---|---|
j / k | Navigate sessions |
n | Create new session |
d | Delete session |
Enter | Fullscreen mode |
a | Attach (direct tmux attach) |
R | Rename session |
D | Purge orphan sessions |
Fullscreen mode
| Key | Action |
|---|---|
Ctrl+\ / Ctrl+D | Exit fullscreen |
Ctrl+V / Mouse wheel | Enter scroll mode |
| All other keys | Forwarded to Claude Code |
Scroll mode (in fullscreen)
| Key | Action |
|---|---|
j / k | Scroll line by line |
J / K / PgUp / PgDn | Half-page scroll |
g / G | Jump to top / bottom |
v | Toggle visual line selection |
y | Copy selection to clipboard |
Esc / q | Exit scroll mode |
Popup (permission prompt)
| Key | Action |
|---|---|
1 | Accept |
2 | Allow always |
3 | Reject |
Y | Accept all pending |
j / k | Scroll content |
Up / Down | Switch between stacked popups |
Esc | Hide popup |
Global
| Key | Action |
|---|---|
? | Keybinding help overlay |
/ | Search filter on current panel |
Tab / Shift+Tab | Cycle panel focus |
p | Restore hidden popups |
q / Ctrl+C | Quit |
Architecture
+---------------------------+ +---------------------------+
| User's tmux | | lazyclaude tmux (-L) |
| (display-popup) | | Claude Code sessions |
| | | |
| +-------------------+ | | @0: session-1 |
| | lazyclaude TUI |<--+-------+-> @1: session-2 |
| | (gocui) | | | @2: session-3 |
| +--------+----------+ | | |
| | | +---------------------------+
| +--------v----------+ |
| | MCP Server | | Claude Code hooks POST to:
| | (in-process) |<---------- /notify, /stop,
| | 127.0.0.1:<port> | | /session-start,
| +-------------------+ | /prompt-submit
+---------------------------+
Hooks are injected at session startup via claude --settings <file> -- ~/.claude/settings.json is never modified. The hooks discover the MCP server via lock file scanning, so they survive server restarts.
Development
make build # Build binary
make test # All tests (race + coverage)
make lint # golangci-lint
make readme-gif # Regenerate docs/images/hero.gif (Docker required)
Known Issues
- Paste in fullscreen mode -- Pasting text (Cmd+V / Ctrl+Shift+V) in fullscreen mode does not work reliably. This is a limitation of how tmux
display-popupinteracts with bracketed paste sequences. Workaround: useato attach directly to the session, then paste.
Roadmap
- Multi-agent support -- Support for agents beyond Claude Code (e.g. Codex, Gemini CLI, custom agents)
- Chat viewer -- Built-in viewer for inter-session message history (PM/Worker conversations)
Have a feature idea? Open an Issue -- we'd love to hear it.
Contributing
We welcome contributions! Whether it's bug reports, feature requests, or pull requests -- all are appreciated. See Issues for current tasks or open a new one.
License
MIT