⏸︎ New · Work that parks itself →

Ten agents on ten branches.Watch one screen.

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.

$ curl -fsSL https://jmux.build/install | sh

A self-contained binary. No runtime to install.

See it running → Or try it on mock data: jmux --demo Free and open source · AGPL-3.0
Ticket in, MR out

Self-hosted GitLab and GitHub Enterprise included.

It's your tmux. Config, plugins, prefix key and bindings carry over Sessions outlive the terminal, the SSH connection, and jmux itself Quit jmux and they are still there
The work pipeline

The workflow is your team's.
The orchestration is jmux's.

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.

workflow
Workflow Linear · 25 statuses · 8 unmapped Your workflow ─────────────────────────────────────────────────── Urgent ······························ 1st up next 2 statuses To do ······························· 2nd up next 3 statuses In Progress ······································ 3 statuses ▸ Waiting ······················· no unstarted ⏸︎ 8 8 statuses Done ······································· hidden 1 status + New stage Statuses ──────────────────────────────────────────────────────── Status Stage Parks Issues Customer Escalation Urgent 2 Ready for Development To do 5 In Code Review Waiting ⏸︎ 7 Awaiting QA Sign-off Waiting ⏸︎ 19 Backlog — 5 Unstarted work ────────────────────────────────────────────────── Show unstarted work in the sidebar ······· ◂ 3 per stage ▸ Waiting · 4th of 5 · 8 statuses · in the sidebar, without its unstarted work ↑↓ move · ⇧↑↓ order · ↵ rename · s hide · space unstarted · u up next

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.

Handed-off work parks itself
automatic

In review, in QA, or blocked on a teammate: that session drops into one Parked (n) row. Nothing is killed.

And comes back on its own
reversible

The issue moves, someone comments, the MR changes, a pipeline fails. The session comes back flagged. Nobody had to watch for it.

See what nobody has started
one click

Each stage lists its unstarted work under the sessions already on it. Click a row to start it: worktree, session, agent.

Pull the next thing
on demand

Ctrl-a u takes the top issue of your first non-empty stage and starts it: worktree, session, agent.

File a ticket without losing your place
anywhere

Ctrl-a a opens an issue from wherever you are. Ctrl-S files it and starts work on it.

Progress reported for you
opt-in

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.

Read the work-pipeline guide →

Single pane of glass

The Command Center

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.

  • Borders are coloured by state: running, waiting, complete.
  • Membership is derived from the same group, sort and filter axes as the sidebar. Pin a session to keep it on the grid, or hide one to keep it off. The panes never leave their session.
  • Save the axes as a view and switch views with Ctrl-a [ / ] or a number.
jmux Command Center showing a grid of live Claude agent panes, borders colored by agent state
A single live agent tile, its title colored by run state
Where the work comes from

Your tracker and your forge,
already wired in.

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.

Connect Linear, GitLab or GitHub →

jmux info panel showing Linear issues alongside a session
The Issues panel: Backlog and To do lists of tracker issues
Review it

Read the diff
beside the agent.

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.

jmux with an agent working in the left pane and hunk's syntax-highlighted diff docked in a panel on the right
A syntax-highlighted hunk diff with added lines
Terminal graphics NEW

The picture,
not the link.

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.

How inline images work →

jmux with an agent session running beside the info panel, where a tracker issue's attached screenshots render as real pictures
Browser panes NEW

The app you're building,
beside the agent building it.

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.

How browser panes work →

jmux with a dev server's request log in one pane and a live Chromium browser in the pane beside it, rendering the app's orders page; the sidebar lists four sessions with their agent states
The browser pane close up: a tab strip with the localhost address, and the page rendered underneath it
What the fleet costs you

Which agent is running out of room.
Which one is still cheap.

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.

From the timeline

Word of mouth.

Scott Tolinski
Scott Tolinski
@stolinski
if you don't have a single-letter mux yet, you're ngmi
⋮
imux — github.com/hkparker/imux
kmux — github.com/kamalshkeir/km…
⋮
2:28 PM · Jun 30, 2026 · 38.9K Views
31 24 180 113

“I've used tmux for 5 years — jmux makes me 5× more efficient.”

M
Mouad

“The attention flags, clean sidebar, and quick session switching have genuinely made my workflow much smoother and less chaotic.”

Ravin
@ravinwashere
How it compares

Where each tool stops.

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.

jmuxAgent IDEsAgent muxesRaw tmux
Panes, splits & sessions that survive a detach✓Embedded terminals✓✓
Agent run state at a glanceHooks + 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.

Durable & reversible

Nothing to migrate,
in either direction.

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 chrome peeking behind the theme stack
jmux in a light terminal theme showing the same session, chrome adapting to the palette
jmux in a dark terminal theme: sidebar, window tabs, and a Claude Code session
Scriptable

The same controls, from a script.

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.

work-radar
# One snapshot of the whole workspace
$ jmux ctl status
{"sessions":[{"name":"TRA-812","agent":{"state":"running","ageSeconds":42},"links":[{"type":"issue","id":"TRA-812"}],"attention":false}, …]}
# Start work from an issue: worktree, session, agent
$ jmux ctl issue start TRA-933
{"session":"TRA-933-rotate-keys","pane":"%21","issue":"TRA-933","reused":false}
# Watch an agent's lifecycle as JSONL, no polling loop
$ jmux ctl agent watch --session TRA-812
{"type":"agent_state_changed","session":"TRA-812","state":"waiting"}
# Flag a session that needs a human decision
$ jmux ctl session attention set --target TRA-812 --reason "tests fail"
{"target":"TRA-812","attention":true,"reason":"tests fail"}
Also in the box

Everything visible, nothing in your way.

Session Sidebar

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.

jmux session sidebar showing grouped sessions, activity dots, and agent-state flags

Browser panes

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.

Instant Switching

Ctrl-Shift-↑/↓ moves between sessions with no prefix. Or click the sidebar.

Attention Flags

When an agent finishes or gets stuck, its session raises an orange ! in the sidebar, from the agent's own Stop hook.

Command Palette

Ctrl-a p fuzzy-searches sessions, windows, pane actions, settings and issue commands.

Settings & themes

Ctrl-a I sets state colours, adapters and per-repo defaults. The chrome already matches your terminal's palette.

Demo mode

jmux --demo runs everything on mock data. No credentials, no tracker, nothing to configure.

Ecosystem

Integrated, not reimplemented.

Claude Code
Deepest integration

Hook-driven run state, live context & cache from telemetry, plus a jmux-control skill.

Codex · pi
Same state emitters

Installed by jmux --install-agent-hooks. The agent reports its own state.

Issue tracking

Your issues in the info panel, sitting on workflow stages you define.

MRs, pipelines, approvals

Pipeline glyphs in the sidebar. Self-hosted included.

Pull requests & checks

PR detection, CI glyphs, approve & mark-ready from the panel. Enterprise supported.

Terminal diff viewer

Is the diff panel: word-level, split and full-screen. By Modem, MIT.

A real browser in a pane

Is Ctrl-a b: Chromium beside your agent, and drivable by it. By Zenbu Labs, MIT.

Git worktree manager

One worktree per agent, one session per branch.

anything else
Whatever you run

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.

Two commands and you're in.

Free and open source. tmux 3.2+ is the only requirement, and jmux offers to install it.

$ curl -fsSL https://jmux.build/install | sh
$ jmux

A self-contained binary. No runtime to install.

Homebrew

macOS and Linuxbrew. The only channel that installs tmux for you, since brew can declare it a dependency.

brew install jarredkenny/tap/jmux

Bun

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

Direct download

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.