Run a fleet of coding agents in the terminal you already use — then run your actual backlog through them. Stages you define, work that parks itself once it leaves your hands, and issue-to-merged without opening a browser.
No runtime needed — installs a self-contained binary.
Your tracker has 25 statuses named for someone else's process. You think in five. So you define your own workflow stages — Urgent, To do, In Progress, Waiting, Done — and sit each one on top of one or many of your tracker's statuses. In Code Review and Awaiting QA Sign-off are both just Waiting. jmux runs your terminal from your ladder, not theirs.
Ctrl-a W — your stages, then every status your tracker offers. Two settings each: which stage it belongs to, and whether its work has left your hands.
In review, in QA, blocked on a teammate — that session drops into one Parked (n) row. Nothing is killed.
The issue moves, someone comments, the MR is touched, a pipeline goes red. It returns flagged, without you watching.
Each stage shows the work nobody has picked up, right under the sessions that have. Click a row and it becomes real — worktree, session, agent.
Ctrl-a u takes the top of your first non-empty stage and does the whole ticket-to-worktree-to-agent dance.
Ctrl-a a files an issue from wherever you are. Ctrl-S files it and starts work on it.
Move an issue along when work starts, an MR opens, or it merges — with ^a Z to undo. Off until you say so.
Every other tool's answer to a growing fleet is a bigger grid. This one gets quieter as work leaves your hands — and loud again the moment it comes back.
Two signals meet in one list. Agent state comes from Claude Code's hooks and telemetry; parked comes from your team's tracker. The sidebar sorts by both — so the thing waiting on a human is at the top, and the thing waiting on someone else is out of sight.
The pipeline hands you a fleet. This is where you drive it. Pin the Claude or Codex pane from every session into one live grid — and type into any tile to steer that agent for real.


Select an issue, press n — jmux creates the worktree, opens the session, and launches your agent with the issue context already loaded. No stashing, no branch switching, no copy-pasting a ticket into a prompt.
Linear for issues. GitHub, GitLab or self-hosted GitLab for merge requests — the one integration the desktop tools can't reach into your network to offer. Sessions auto-link to their branch's PR and issue, and pipeline status shows up as a glyph in the sidebar.
Or skip the picking entirely: Ctrl-a u pulls the top item off your first non-empty stage and does the whole thing.


Ctrl-a g toggles a tabbed side panel — Diff, Issues, MRs, Review — with the Diff tab powered by hunk: syntax highlighting, word-level diffs, split and full-screen views.
Split mode to watch while the agent works, Ctrl-a z for full-screen when it's time to actually read it. Then flip to the MRs tab and approve, undraft, or move the issue on — a approve · r undraft · s status · o open in browser.


Someone attached a screenshot to the bug. Everywhere else that's a URL you have to leave the terminal to follow. Here it's the picture — in the pane, under the sentence describing it, in the comments where the argument happened.
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 and believes the answer. Where it can't, images stay the links they always were — and clicking a rendered one still opens it.
It works because jmux is the outermost program on your terminal. tmux runs inside a pty jmux owns, so the pixels never have to survive a multiplexer.

No other multiplexer and no agent IDE shows you this. jmux reads Claude Code's own OpenTelemetry stream and puts two numbers on a session's row: how much of its context window is occupied, and a countdown on how long its prompt cache stays warm.
Both change how you work a fleet. The first tells you which session is about to start forgetting things and should be handed off before it does. The second tells you which one to send the next message to now — sending while the cache is warm can save up to 90% on input tokens, and a five-agent day is a lot of input tokens.
There is no setup. If Claude Code is running, the numbers are there.
These aren't rival products so much as different heights. Panes are table stakes. The question is how far past them a tool is willing to go.
| 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 stand in for tmux rather than building on it.
And Claude Code's own Agent Teams? That's an input, not a column. Agent Teams parallelises one task, in one repo, with one vendor's agent. jmux runs your queue across repos, agents, worktrees and branches — an Agent Teams run is one session in it.
The other agent multiplexers are replacements — a new server, a new config, a new keymap, and your plugins left behind. jmux isn't one. It drives the tmux you already have, so your config, prefix key, plugins, theme and bindings all carry over; jmux enforces only the handful of settings it needs to draw its own chrome.
Which is why your work is genuinely durable. Sessions detach and reattach over SSH, from a second machine, from a phone. They survive the terminal closing — and they survive jmux itself being killed, because the agents were never running inside jmux to begin with. And the exit is free: quit, and your sessions are exactly where you left them, reachable with jmux gone entirely.
The chrome follows suit — every glyph and surface is drawn from your terminal's own palette, so jmux looks native in light or dark without a line of config. Tune the rest from the settings screen (Ctrl-a I): running / waiting / complete colors, code host, issue tracker, panel widths.



“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.”

Other control surfaces stop at panes and processes. jmux's understands tickets, branches, and run state — so an agent can pick up TRA-933, get its own worktree and session, work, and raise a flag when it needs a human. State comes from hooks and telemetry, not from scraping a screen buffer, so it's authoritative rather than a guess. Context auto-resolves from $TMUX, so it works headless too.
Every session at a glance — project group, git branch, agent state, pipeline status, linked issue or PR, and live context tokens. A real workspace map where your status bar used to be.
Ctrl-Shift-↑/↓ — no prefix, no menu, no mode. Or click the sidebar.
When an agent finishes or needs you, its session raises an orange ! in the sidebar — from a Claude Code Stop hook.
Ctrl-a p — fuzzy-search sessions, windows, pane actions, settings, and issue commands.
Ctrl-a I — state colors, adapters, 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. State is reported, not guessed.
PR detection, CI glyphs, approve & mark-ready from the panel. Enterprise supported.
Every terminal agent works in a pane, with opt-in screen detection for run state. vim, emacs, lazygit, your scripts — it's a real terminal underneath.
tmux 3.2+ is all jmux needs — and it offers to install that for you.
No runtime needed — installs a self-contained binary.
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 the whole thing on mock data first.