Skip to content

Releases

vtmux 3.8-rc1

Choose a tag to compare

@github-actions github-actions released this 13 Nov 07:16

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 -C take 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 -J matches tmux, so tmux-resurrect saves the same pane contents it does with tmux.

Removed

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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 07:10

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 auto restarts your shells by itself; agents, editors and ssh wait 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 -b onto 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 off at 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

Choose a tag to compare

@martintrojer martintrojer released this 11 Nov 21:50

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 from kitten icat, chafa, image.nvim and plotting tools show in the pane, clip at its edges and follow zoom, scrolling and window switches. No allow-passthrough needed.
  • 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

Choose a tag to compare

@martintrojer martintrojer released this 11 Nov 21:51

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.