One place to watch, switch between, and steer every AI coding agent you run in tmux.
Claude Code · Codex · Gemini CLI · OpenCode · Crush · pi · OhMyPi
Features · Install · Setup · Usage · Ticket workflow · How it works · Configuration
Run five agents across three repositories and the hard part stops being the code — it is noticing which agent has been sitting on a permission prompt for ten minutes. nagare (流れ, flow) is a single binary that sits in a tmux popup and answers that at a glance: every agent, what it is doing, what it last said, and which ones are waiting on you.
- Session picker — every agent pane in every tmux session, grouped by repository, with fuzzy search, a live preview, and status reported by the agents' own hooks wherever they offer them.
- Act without switching — approve a permission prompt (Ctrl+y), send a prompt (Ctrl+l), or jump to the next agent waiting on you (F4).
- Worktree aware — agents in different git worktrees of one repo get their own name, branch and outstanding-work summary. F3 starts an agent in a fresh worktree.
- Ticket board — plan work across projects, then hand a ticket to any agent. Each attempt runs on its own branch in an isolated worktree; review the diff and open the pull request from the board.
- Notifications — toast, terminal bell, desktop notification or popup when an agent needs input or finishes a long task.
- Agent-to-agent messaging — an MCP (Model Context Protocol) server lets agents discover each other, exchange messages, and pick up tickets.
- 13 themes, mouse support, and a grid view for watching everything at once.
Press Tab to cycle list → board → grid. The grid shows every agent's live output side by side.
Tickets move from Backlog to Done. Pressing d on a ready ticket picks an agent (and optionally a model), pins the target branch to a commit, and starts the agent in a worktree nagare owns, so your own checkout is never touched.
Pressing Enter opens a ticket: its description, the agent working on it, the attempt record, the pull request, and the report the agent submitted when it finished.
Tokyo Night (default), Aura, Catppuccin, Dracula, Flexoki, Gruvbox, Kanagawa, Monokai, Nord, One Dark, One Dark Pro, Rosé Pine and Vesper. Each has a light and a dark variant that follows your terminal's background, and Ctrl+t previews them live.
- Linux or WSL2. On macOS, agents that run as their own binary are detected, but
ones started through Node are found by walking
/proc, which macOS does not have. - tmux 3.3 or newer.
- Go 1.26 or newer, to build.
- git, and optionally the GitHub CLI (
gh) for creating pull requests from the board.
git clone https://github.com/nmicovic/nagare.git
cd nagare
go install . # installs `nagare` into $(go env GOPATH)/binMake sure $(go env GOPATH)/bin is on your PATH. Alternatively, ./compile.bash
builds a stripped binary in the repository directory.
nagare setupThis wires nagare into every supported agent it finds. Re-running it is safe: generated files are rewritten in place and every registration is refreshed.
| Agent | Status reporting | Messaging tools |
|---|---|---|
| Claude Code | hooks in ~/.claude/settings.json |
MCP, ~/.claude.json |
| Codex | hooks in ~/.codex/hooks.json |
MCP, ~/.codex/config.toml |
| Gemini CLI | hooks in ~/.gemini/settings.json |
MCP, ~/.gemini/settings.json |
| OpenCode | plugin in ~/.config/opencode/plugins/ |
MCP, ~/.config/opencode/opencode.json |
| Crush | read from the pane | MCP, ~/.config/crush/crush.json |
| pi | extension in ~/.pi/agent/extensions/ |
the same tools through nagare tool (pi has no MCP client) |
| OhMyPi | extension in ~/.omp/agent/extensions/ |
MCP, ~/.omp/agent/mcp.json |
It also installs the /nagare-ls, /nagare-send, /nagare-send-wait and
/nagare-inbox slash commands, or an Agent Skill for agents without user-level
slash commands (Codex, Crush).
Note
Codex does not run newly installed hooks until you approve them. Open /hooks in
Codex once after setup and trust the nagare hooks.
Then bind nagare to tmux popups in ~/.tmux.conf:
bind g display-popup -w100% -h100% -B -E "nagare" # prefix + g: picker
bind b display-popup -w100% -h100% -B -E "nagare board" # prefix + b: ticket board
bind e display-popup -w80% -h80% -E "nagare notifs" # prefix + e: notificationsand reload with tmux source-file ~/.tmux.conf.
nagare # session picker (default)
nagare board # cross-project ticket board
nagare notifs # notification history and settings
nagare new ~/src/api # new tmux session running Claude Code in ~/src/api
nagare new ~/src/api -a codex # …or any other agent: codex, opencode, gemini, crush, pi, omp
nagare new ~/src/api -w retry # start the agent in a new git worktree named "retry"
nagare new scratch # quick prototype in ~/Prototypes/scratch
nagare setup # install status reporting, MCP server and slash commands| Key | Action | Key | Action | |
|---|---|---|---|---|
| Type | Fuzzy search by name or path | Ctrl+y | Approve the permission prompt | |
| ↑ ↓ | Move the selection | Ctrl+a | Approve always | |
| Enter | Jump to the agent | Ctrl+l | Send a prompt inline | |
| F4 | Next agent waiting on you | Ctrl+g | Write a prompt in $EDITOR |
|
| Tab / Shift+Tab | Cycle list, board and grid | Ctrl+n | New session | |
| Ctrl+t | Pick a theme | Ctrl+r | Quick prototype | |
| Ctrl+s | Show saved sessions | F2 | Name the selected task | |
| Ctrl+o | Cycle sort order | F3 | New git worktree | |
| Ctrl+f | Star a session | F5 | Edit the session note | |
| Ctrl+e | Edit the config file | Ctrl+w | Unload the agent (close its pane) | |
| F1 | All shortcuts | Ctrl+x | Kill the agent's window; offers to remove its worktree | |
| Esc | Quit |
Mouse: click to select, click again to jump, scroll to move. Turn it off with
picker.mouse = false.
| Key | Action | Key | Action | |
|---|---|---|---|---|
| h l / ← → | Move between lanes | d | Run the ticket with an agent | |
| 1–5 | Jump to a lane | v | Review the attempt's diff | |
| j k / ↑ ↓ | Select a ticket | p | Push the branch and open a pull request | |
| Enter | Open the ticket | c | Archive a finished ticket's worktree | |
| n / e | New / edit ticket | a | Show available agents | |
| [ ] | Move ticket left / right | t | Toggle Today / All | |
| x | Delete ticket | ? | Built-in guide to the workflow | |
| q / Esc | Quit |
- Plan. Create a ticket with a repository and a target branch.
- Isolate. d resolves the target branch to a fixed commit, creates the
branch
nagare/<ticket>-<attempt>and a worktree under~/.local/share/nagare/workspaces/, starts the agent there, and hands it the ticket. Your checkout and the target branch are never modified. - Review. When the agent calls
submit_ticket, the ticket moves to Review. Press v to see the commits and the full diff against the base commit. - Finish. p pushes the branch (never with
--force) and creates the pull request withgh— or finds the existing one if a previous attempt was interrupted. Once merged, move the ticket to Done, close the agent, and c removes the worktree. Uncommitted work blocks removal, and the branch is always kept.
Every attempt is recorded on disk — base commit, branch, agent, model, pull request — so a retry never overwrites what the previous one did.
flowchart LR
agent["Agent CLI"] -->|"lifecycle event, as JSON"| hook["nagare hook-state"]
hook -->|"writes the agent's status"| state[("state files")]
hook -->|"alerts when input is needed"| notify["notifications"]
tmux["tmux panes"] -->|"scanned for agent processes"| picker["nagare picker"]
state -->|"read on every scan"| picker
agent <-->|"MCP tools: agents, messages, tickets"| mcp["nagare mcp"]
Agents report their own state through hooks, plugins or extensions, so a status is a fact, not a guess from screen text. The picker matches those reports to tmux panes and adds what tmux knows: path, branch, worktree, and a preview of the pane.
~/.config/nagare/config.toml (Ctrl+e opens it). Every key is
optional; these are the defaults.
[appearance]
theme = "tokyonight"
[picker]
show_help_bar = true
mouse = true
animations = true
quick_project_path = "~/Prototypes"
[notifications]
enabled = true
[notifications.needs_input]
toast = true
bell = true
os_notify = true
popup = false
[notifications.task_complete]
toast = true
min_working_seconds = 30 # only notify for tasks that ran at least this longState lives in ~/.local/share/nagare/: agent status, notifications, messages,
tickets, attempt records and the managed worktrees.
go build -o nagare . # debug build
go test ./... # run the test suite
go vet ./...Issues and pull requests are welcome.
Built with Bubble Tea, Lip Gloss and Cobra.
MIT © 2026 Nemanja Mićović





