Repository navigation
Releases
vtmux 3.8-rc1
The first release candidate of vtmux, the drop-in tmux 3.8 replacement. From here to 3.8, fixes only. From beta3, upgrade with no restart: tmux vtmux-upgrade -b <new binary>.
New
- Static Linux builds. musl tarballs for x86_64 and aarch64 run on EL9, Debian 11 and Alpine:
mise use -g "github:martintrojer/vtmux[matching=musl]". - Faster under load. 20,000 commands piped into
-Ctake 118 ms (tmux 180 ms), and commands answer in 13 ms while a client floods keys (a huge paste).
Fixed
- A live upgrade no longer loses or garbles what you type during it, even mid-paste, and never leaves your terminal raw.
- No more stray blinking cursor on Ghostty, and the terminal's mouse, cursor and modes now match tmux after every popup, copy mode, detach and upgrade.
capture-pane -Jmatches tmux, so tmux-resurrect saves the same pane contents it does with tmux.
Removed
- Save and restore. Use tmux-resurrect and tmux-continuum: both are tested against vtmux. Drop any
vtmux-persist*lines from your config.
Reviewed
A final panel of 9 reviewers from two model families found no critical or high defects; every medium was fixed before this release.
Full list: CHANGELOG.md.
Install
mise use -g github:martintrojer/vtmux (mise waits a day before it offers a new release), the tarballs below, or cargo install --locked vtmux@3.8.0-rc.1 (needs Zig 0.17).
vtmux 3.8-beta3
The third beta of vtmux, the drop-in tmux 3.8 replacement. From beta2, upgrade with no restart: tmux vtmux-upgrade -b <new binary>.
New
- Restores you can pick up. After a reboot, each restored pane shows its last screen. Press Enter and its command starts again below it, editor screens included.
set -s vtmux-persist-respawn autorestarts your shells by itself; agents, editors andsshwait for Enter. - A restart that fails keeps the screen. If a restored pane's program is gone, the pane stays restored with its screen and says why, instead of closing.
Safer
vtmux-upgrade -bonto anything that is not a vtmux (/bin/echo, a script) is refused with exit 1 and the server keeps running. Before, it could replace the server and lose every session. Downgrades to beta1 and beta2 still work.- Live upgrades keep keys, a held Esc, a paste in flight and a signal sent during the switch.
set -s vtmux-persist offat run time now sticks across a restart.- Two end-of-milestone review panels, 63 findings, every critical and high fixed and re-reviewed.
Closer to tmux
Esc then a key on a busy server is M-x, tmux in a pane with no TMUX_PANE finds its pane by its tty, break-pane -a/-b, copy-mode -S, format comparisons on non-UTF-8 bytes, the no-PATH search path, and a detach during a flood no longer freezes the terminal.
Full list: CHANGELOG.md.
Install
mise use -g github:martintrojer/vtmux, the tarballs below, or cargo install --locked vtmux@3.8.0-beta.3 (needs Zig 0.17).
vtmux 3.8-beta2
The second beta of vtmux, the drop-in tmux 3.8 replacement. Upgrade a running server with no restart: tmux vtmux-upgrade -b <new binary>.
New
- Kitty graphics (opt-in).
set -s vtmux-graphics on: images fromkitten icat, chafa, image.nvim and plotting tools show in the pane, clip at its edges and follow zoom, scrolling and window switches. Noallow-passthroughneeded. - More terminals. Most of ncurses 6.6's terminal database attaches (wezterm, contour, foot, rio and more), on hosts without terminfo for them.
- Pixel sizes. Panes report their size in pixels, so image tools size their output.
Faster
| before | now | tmux 3.8 | |
|---|---|---|---|
| vim/less over 1M lines of history | 4.1 s | 3 ms | 3 ms |
| key echo | 0.38 ms | 0.30 ms | 0.24 ms |
| agent TUIs, server CPU vs tmux | up to 1.25x | 0.76-0.92x | 1x |
Safer
- A full code review across the codebase found and fixed live-upgrade data losses (typed input, partly sent messages, queued commands), a crash after a re-attach with queued notifications, and a persistence case that could overwrite the only good checkpoint.
- Unfinished escape strings are capped at
input-buffer-size, as in tmux. - Memory-safety fixes in the bundled Ghostty bindings.
Closer to tmux
Signals and terminal settings for clients and panes, the current target across command lists, target lookups, #{V:} loops, #{pane_last_output_time}, window names after a split, and a few dozen smaller fixes.
Full list: CHANGELOG.md.
Install
mise use -g github:martintrojer/vtmux, the tarballs below, or cargo install --locked vtmux@3.8.0-beta.2 (needs Zig 0.17).
vtmux 3.8-beta1
First release. Linux (x86_64, aarch64) and macOS 15+ (Apple silicon).
Drop-in tmux 3.8. Every tmux 3.8 command, option, format, hook and control-mode message. Your .tmux.conf, plugins and scripts work unchanged. All 415 behaviour-oracle scenarios recorded from real tmux 3.8 pass, and 173 of tmux's own 174 regress tests (1 expected failure, recorded).
Ghostty's emulator. Each pane is a libghostty-vt terminal, with tmux's quirks kept where scripts can see them.
Better rendering. One frame per client, only what changed, inside synchronized output, the cursor placed once: no cursor jumping under heavy output. A redraw-heavy benchmark sends 0.07 MB to your terminal where tmux sends 10.1 MB, at 0.3x the CPU.
Live upgrade. tmux vtmux-upgrade -b <new binary> swaps the binary under a running server. Shells, editors and builds keep running; clients stay attached; scrollback comes along. 10 panes x 100k lines upgrade in 0.6 s.
Persistence (opt-in). set -s vtmux-persist layout (or full, with screens and scrollback) checkpoints the server; after a crash or reboot it comes back with its sessions, windows and layout, panes dead until respawn-pane.
Pane blend. vtmux-pane-inactive-blend dims inactive panes like Ghostty's unfocused splits.
Kitty keyboard protocol (opt-in). set -s vtmux-kitty-keys on and programs that ask for it (neovim, helix, agent TUIs) get kitty-encoded keys: Shift+Enter, C-i apart from Tab, Escape apart from Alt. Key tables and the prefix work as before; programs that don't ask see tmux. Off by default: byte for byte tmux 3.8. A granted program that is killed no longer leaves the shell sending CSI 99;5u for C-c: the grant ends with the program (also across a live upgrade). A program that is the pane's own process (how mu launches agents) keeps its grant across an upgrade from any build; one killed while sharing a surviving shell's process group (prog; exec bash) keeps it until reset.
Built for speed. Whole-program LTO: 7-18% less server CPU for agent panes, many clients and key echo. (numbers)
Desktop notifications (opt-in). set -s vtmux-notifications on: a pane's OSC 9 and OSC 777 notifications reach attached Ghostty clients, from any window (a display-popup -E agent's too, on its own client), rate-limited as Ghostty limits itself. Off, tmux 3.8's behaviour (dropped). (D30)
In-band resize (opt-in). set -s vtmux-inband-resize on: programs that ask for mode 2048 (neovim) get every new size in-band, no SIGWINCH race. Live upgrades keep the grant, and a downgrade that would drop it is refused. Off, vtmux is tmux byte for byte (D31).
Lean where it counts (numbers and method):
- 1M lines of scrollback settle at 103 MB vs tmux's 622 MB; 20 panes streaming at a 100k limit at 217 MB vs 1.25 GB.
- Pane output at 0.37-0.62x tmux's server CPU; 8 attached clients at 0.06-0.19x; an idle server with a real config at 0.28x.
What it costs: an idle server uses 9.0 MB vs 4.2 MB and each idle pane 18 KB vs 5.4 KB; a key's echo takes 0.33 ms vs 0.21 ms; busy agent TUIs cost 0.85-1.3x tmux's CPU.
Real tmux bugs fixed by default are in compat/DIVERGENCES.md; opt-in paper-cut fixes in docs/PAPERCUTS.md.