Each one on its own ticket, branch and worktree. One sidebar shows which is running, which is waiting on a decision, and which is handed off. Ticket to merge request, in the tmux you already have.
A self-contained binary. No runtime to install.
Five agents means five terminals to check, and all five are waiting on you. jmux gives them one rail to report on. Every frame below was captured from a running jmux: the real cells, colours and text. Scroll, and the window follows.
Every session you have running, always on screen: branch, merge request, CI, and what its agent is doing right now.
No hunting through tabs to find out who is working. When a twenty-session day gets loud, Ctrl-a f narrows the rail to Needs you or Active.
The flag and the timer say who is waiting on a decision, and how long they have been stuck. Everything else keeps running.
That state comes from hooks, not from reading the screen. Claude Code, Codex and pi report their own run state through installed emitters, so WAITING means the agent said so.
Define the stages you think in (To do, In progress, Waiting, Done) and map as many tracker statuses onto each one as you need.
Ctrl-a G groups the fleet by those stages. Press it again to group by agent state instead, in urgency order: Needs you, Running, Active, Done, Idle. Work you have handed off drops into one collapsed Parked band at the bottom.
The dim ○ rows are issues with no session yet. Grouped by stage they sit under the stage that claims them; anywhere else they collect in one Up next band.
Your queue and your fleet stop being two different screens.
Land on one and jmux shows the ticket beside the exact pre-flight: session name, the worktree it will cut, base branch, tool, agent. Nothing is provisioned yet.
Press Enter and all of it happens: the worktree is created, the session opens, and your agent starts with the issue already in its context. No stash, no branch switch, no ticket pasted into a prompt.
The row you were reading becomes the row above it.
Your tracker has 25 statuses, named for someone else's process. You think in five. Define your own stages (Urgent, To do, In Progress, Waiting, Done) and map each tracker status onto one of them. In Code Review and Awaiting QA Sign-off are both Waiting. The sidebar, the queue and the parking all follow your stages, not the tracker's.
Ctrl-a W lists your stages, then every status your tracker has. Each status gets two settings: which stage it belongs to, and whether work in it is out of your hands.
In review, in QA, or blocked on a teammate: that session drops into one Parked (n) row. Nothing is killed.
The issue moves, someone comments, the MR changes, a pipeline fails. The session comes back flagged. Nobody had to watch for it.
Each stage lists its unstarted work under the sessions already on it. Click a row to start it: worktree, session, agent.
Ctrl-a u takes the top issue of your first non-empty stage and starts it: worktree, session, agent.
Ctrl-a a opens an issue from wherever you are. Ctrl-S files it and starts work on it.
Move an issue when work starts, an MR opens, or it merges. ^a Z undoes it. Off until you turn it on.
Other tools answer a growing fleet with a bigger grid. jmux gets quieter as work leaves your hands, and loud again when it comes back. Nothing starts, and nothing moves in your tracker, until you say so.
The sidebar tells you who needs you. The Command Center shows all of them at once: the agent pane from every session, in one live grid. Type into a tile and you are typing into that agent.


Linear for issues. GitHub or GitLab for merge requests, including self-hosted GitLab inside your own network. Sessions link themselves to their branch's PR and issue, and pipeline status shows in the sidebar as a glyph.
Press n on any issue in the panel to start it, or Ctrl-a u to start the top issue of your first non-empty stage.


Ctrl-a g opens a side panel with four tabs: Diff, Issues, MRs, Review. The Diff tab is hunk: syntax highlighting, word-level diffs, split and full-screen.
Split mode shows the code as the agent writes it. Ctrl-a z goes full-screen when you want to read it. The MRs tab finishes the job without a browser: a approve · r undraft · s status · o open.


Someone attached a screenshot to the bug. In most terminals that is a URL you have to leave to follow. Here it is the picture, in the panel, under the sentence that describes it, and in the comment thread.
Real image data, drawn with the kitty graphics protocol in Ghostty, kitty, WezTerm and Konsole. Nothing to turn on: jmux asks your terminal whether it can draw. Where it cannot, images stay links. Clicking a rendered image still opens it.
This works because jmux is the outermost program on your terminal. tmux runs inside a pty jmux owns, so the pixels never pass through a multiplexer.

Ctrl-a b splits the pane and puts Chromium in it: a live page you can click, scroll, fill in and open DevTools on, without leaving the terminal.
Ctrl-a p → Open dev server finds the port the session is listening on and opens it. It reads listening sockets, not scrollback, so a server that printed its URL four hundred lines ago is still found, and a URL in a log line is never mistaken for one.
Every pane is its own browser, with its own tabs and history. Your agents can drive it too (snapshot, click, fill, eval), so the agent that wrote the code can check it.
The browser is terminal-browser by Zenbu Labs (MIT). You install it. jmux relays its graphics, sizes its pane and hands it to your agents. It needs a terminal that can draw images and, for now, Apple Silicon macOS.


jmux reads Claude Code's OpenTelemetry stream and puts two numbers on a session's row: how much of its context window is used, and how long its prompt cache stays warm.
The first tells you which session is about to run out of room, so you can hand off before it does. The second tells you which one to message now: a warm cache costs up to 90% less on input tokens, and a five-agent day is a lot of input tokens.
Nothing to set up. If Claude Code is running, the numbers are there.
“I've used tmux for 5 years — jmux makes me 5× more efficient.”
“The attention flags, clean sidebar, and quick session switching have genuinely made my workflow much smoother and less chaotic.”

Every tool here gives you somewhere to run an agent. The table shows how much of the rest it takes on: the ticket, the branch, the review, the handoff.
| jmux | Agent IDEs | Agent muxes | Raw tmux | |
|---|---|---|---|---|
| Panes, splits & sessions that survive a detach | ✓ | Embedded terminals | ✓ | ✓ |
| Agent run state at a glance | Hooks + telemetry | ✓ | Screen heuristics | ✗ |
| Worktree isolation & diff review in place | ✓ | ✓ | ✗ | ✗ |
| Issues & PRs, incl. self-hosted GitLab | ✓ | Partial | ✗ | ✗ |
| Your workflow: stages, parking, ticket → merged | ✓ | ✗ | ✗ | ✗ |
| Context window & cache-warm economics | ✓ | ✗ | ✗ | ✗ |
| Keeps your terminal config, plugins & bindings | ✓ | ✗ | Brings its own | ✓ |
| Reversible: your sessions outlive it | ✓ | ✗ | ✗ | ✓ |
← swipe the table to compare →
Agent IDEs (Orca, Cursor, Windsurf, Conductor) ship their own terminal, editor and runtime in a desktop app.
Agent muxes (herdr and friends) are agent-aware multiplexers that replace tmux rather than build on it.
Claude Code's Agent Teams is not a column. It splits one task, in one repo, with one vendor's agent. jmux runs your whole queue across repos, agents, worktrees and branches. An Agent Teams run is one session inside it.
Other agent multiplexers replace tmux: a new server, a new config, a new keymap, and your plugins left behind. jmux drives the tmux you already have, so your config, prefix key, plugins, theme and bindings carry over. It enforces only the few settings it needs to draw its own chrome.
That is also what makes the work durable. Sessions detach and reattach over SSH, from a second machine, from a phone. They survive the terminal closing, and they survive jmux being killed, because the agents never ran inside jmux. Uninstall it and your sessions are where you left them, in plain tmux.
The chrome is drawn from your terminal's own palette, so it matches light or dark with no config. The settings screen (Ctrl-a I) covers the rest: running / waiting / complete colours, code host, issue tracker, panel widths.



jmux ctl goes past panes and processes. It knows tickets, branches and run state, so an agent can pick up TRA-933, cut its own worktree and session, do the work, and raise a flag when it needs a human. Every answer is JSON. Context comes from $TMUX, so it works headless.
Every session at a glance: project group, git branch, agent state, pipeline status, linked issue or PR, live context tokens. It sits where your status bar used to be.
Ctrl-a b puts Chromium in a pane beside the agent building the page. Ctrl-a p → Open dev server finds what the session is serving and opens it. Your agents can drive it too.
Ctrl-Shift-↑/↓ moves between sessions with no prefix. Or click the sidebar.
When an agent finishes or gets stuck, its session raises an orange ! in the sidebar, from the agent's own Stop hook.
Ctrl-a p fuzzy-searches sessions, windows, pane actions, settings and issue commands.
Ctrl-a I sets state colours, adapters and per-repo defaults. The chrome already matches your terminal's palette.
jmux --demo runs everything on mock data. No credentials, no tracker, nothing to configure.
Hook-driven run state, live context & cache from telemetry, plus a jmux-control skill.
Installed by jmux --install-agent-hooks. The agent reports its own state.
PR detection, CI glyphs, approve & mark-ready from the panel. Enterprise supported.
Is Ctrl-a b: Chromium beside your agent, and drivable by it. By Zenbu Labs, MIT.
Any terminal agent works in a pane, with opt-in screen detection for run state. vim, emacs, lazygit, your own scripts: it is a real terminal underneath.
Free and open source. tmux 3.2+ is the only requirement, and jmux offers to install it.
A self-contained binary. No runtime to install.
macOS and Linuxbrew. The only channel that installs tmux for you, since brew can declare it a dependency.
brew install jarredkenny/tap/jmux
Runs jmux from source under your own Bun 1.3.8+. The way in on Alpine and other musl systems, where the binary cannot run.
bun install -g @jx0/jmux
Signed tarballs with checksums for macOS and Linux, on arm64 and x86-64, including a baseline build for older CPUs.
Browse the release →macOS and Linux (glibc). On Windows, run it inside WSL. Not ready to point it at your repos? jmux --demo runs on mock data with nothing to configure.