main
CHANGELOG.md
Eric Bower
·
2026-09-19
Changelog #
Use spec: https://common-changelog.org/
Staged #
Added #
- Completions for
yash
v0.8.1 - 2026-09-05 #
Fixed #
- Make ghostty's max_scrollback_lines canonical source of scrollback buffer
v0.8.0 - 2026-09-03 #
Added #
- We now track cwd changes via OSC7
- Replay window title on attach
ZMX_NO_DETACH_KEYenv var to disablectrl+\keybinding- Added
--labelsflag to attach command- e.g.
zmx attach --labels "project=pico env=prod" pico - e.g.
zmx attach --labels "$(zmx get pico)" pico.sub
- e.g.
- New command
zmx print-envwhich prints the leader's tracked env vars
Fixed #
- Clear screen when switching sessions to prevent term state corruption
- Stray NUL byte in the OSC 7 sequence replayed on attach
- The OSC 7 cwd is now decoded before the chdir, so a new session can start in a directory whose name needed percent-encoding
- CLI commands now respond with correct error exist codes
- Various re-attach handling bugs
Changed #
- Upgraded to zig v0.16
zmx listreplacedstart_dirwithcwd- Storing 2k lines of scrollback buffer (like tmux) for each session
ZMX_TASK_COMPLETEDtask marker now includes a 4ch hex id to ensure no collisions from nested task runsZMX_TASK_COMPLETED:{id}:0
v0.7.1 - 2026-08-27 #
Fixed #
- Prevent
v0.6.0daemons from hanging when connecting fromv0.7.0clients
v0.7.0 - 2026-07-23 #
Added #
- Label system for sessions:
zmx set <name> k=v ...to attach key=value labels to live sessionszmx set <name> key=to remove a specific label (empty value = delete)zmx get <name>to read labels from a sessionzmx get <name> keyto print a single valuezmx clear <name>to remove all labelszmx listnow shows labels by default as tab-separated fields
Fixed #
zmx runwill now detect heredocs and add the completion marker to a newline- Race between
zmx kill X; zmx run X - Improved claim leader detection
zmx sendno longer claims client leadership or triggers a resize probe- Improved
ctrl+\key detection - Support for linux kernel < 4.11 by avoiding statx calls
Changed #
- BREAKING We now store logs inside of
XDG_STATE_DIR - BREAKING
zmx runwhen creating session it runsbashinstead of$SHELL- There are just too many edge cases with tracking exit status in other shells which makes
zmx runmuch less useful for task management. - This means when using
zmx runthe target shell must have support for$?exit code tracking
- There are just too many edge cases with tracking exit status in other shells which makes
- BREAKING
zmx tailnow strips ansi escape codes
v0.6.0 - 2026-05-16 #
Added #
zmx sendsend raw bytes to session without ZMX completion marker or auto-newlinezmx printsend raw bytes to client's stdoutzmx lsis accepted as an alias forzmx list- Added
--helpflag for all commands (it just returns the main help cmd for now)
Fixed #
- An idle daemon (no clients, no PTY traffic) used to ignore SIGTERM indefinitely.
- An idle attached client used to ignore SIGWINCH until the next keystroke or daemon output.
- Don't kill all sessions when
.Infoipc event changed - Reset terminal emulator to default state on detach
Changed #
zmx waitoutput will tail the last 20 lines of every task that failed- Detaching from a session will now do a full terminal reset
v0.5.0 - 2026-04-16 #
Added #
- New client leader policy: last client to send user input bytes (non-ansi escape codes) becomes the leader
- The client leader controls resizing and any other terminal state changes
- Non-leader clients are read-only until they send user input bytes and takeover leadership
- When a leader is promoted we immediately resize to their window size
zmx attachnow lets users switch to another session from within a sessionzmx tailwill receive all outout from sessions in read-only modezmx writewill pipe data from stdin, convert to base64, chunk, and send data through pty to write to a file
Changed #
- BREAKING
zmx runis now synchonous by default and tails the session- Use detached mode (
-d) for previous behavior
- Use detached mode (
- BREAKING
killandwaitnow require "*" suffix for wildcard match sessions- e.g.
zmx kill "d.*",zmx kill "*",zmx wait "test*"
- e.g.
zmx runaccepts--fishflag to indicate the session's shell is fishzmx killnow supports multiple args and it will kill sessions that match a prefix- e.g.
zmx kill "d.*"will kill all sessions that match that prefix
- e.g.
Fixed #
zmx listwill send "no sessions found" to stderr instead of stdoutzmx waitwill send errors to stderr instead of stdout- Rewrite OSC
133;Awithredraw=0to prevent prompt loss on resize
v0.4.2 - 2026-03-18 #
Changed #
zmx listrenamed keys and made formatting more stable- More accurate fish completions
Fixed #
- Validate session name length against Unix socket path limit
- Use platform-correct
O_NONBLOCKfor fcntl - Daemon ignore
SIGPIPE, handleEINTRin poll - Daemon isolate forked child from parent code path and heap-alloc argv
zmx runstdin regression withZMX_TASK_COMPLETEDzmx runwhen no client is attached, send DA response query from daemonzmx runre-quote when using shell meta charszmx waituse-after-freezmx waittime out after 3 polls if no matching sessions are foundzmx listclean up socket onConnectionRefused, notTimeout
v0.4.1 - 2026-02-23 #
Fixed #
- Update
libghosttyto fixzig build test
v0.4.0 - 2026-02-20 #
Added #
- New environment variable
ZMX_SESSION_PREFIXwhich will be inserted before every session name for every command - New command
zmx waitwhich will stall until all tasks (zmx run) are completed.
Changed #
zmx versionnow returns the socket and log directory locationszmx runnow inserts aZMX_TASK_COMPLETEDmarker after every run command to indicate when the task is completed and then returns the aggregate exit status
Fixed #
libghosttyhad a regression that causedzmxto crash
v0.3.0 - 2026-02-01 #
Added #
- New flag
--vtforzmx [hi]storywhich prints raw ansi escape codes for terminal session - New flag
--htmlforzmx [hi]storywhich prints html representation of terminal session - New list flag
zmx [l]ist [--list]that lists all session names with no extra information - New command
zmx [c]ompletions <shell>that outputs auto-completion scripts for a given shell - List command
zmx listnow showsstarted_atshowing working directory when creating session - List command
zmx listnow showscmdshowing command provided when creating session - List command
zmx listnow shows→arrow indicating the current session
Fixed #
- On restore, background colors for whitespace now properly filled
- Spawn login shell instead of normal shell
- Properly cleanup processes (parent and children) during
zmx killor SIGTERM
v0.2.0 - 2025-12-29 #
Added #
- New command
zmx [hi]story <name>which prints the session scrollback as plain text - New command
zmx [r]un <name> <cmd>...which sends a command without attaching, creating session if needed - Use
XDG_RUNTIME_DIRenvironment variable for socket directory (takes precedence overTMPDIRand/tmp)
Changed #
- Updated
ghostty-vtto latest HEAD
Fixed #
- Restore mouse terminal modes on detach
- Restore correct cursor position on re-attach
v0.1.1 - 2025-12-16 #
Changed #
zmx list: sort by session name
Fixed #
- Send SIGWINCH to PTY on re-attach
- Use default terminal size if cols and rows are 0
v0.1.0 - 2025-12-09 #
Changed #
- Breaking: unix socket and log files have been moved from
/tmp/zmxto/tmp/zmx-{uid}with folder/file perms set to user
If you upgraded and need to kill your previous sessions, run ZMX_DIR=/tmp/zmx zmx kill {sesion} for each session.
Added #
- Use
TMPDIRenvironment variable instead of/tmp - Use
ZMX_DIRenvironment variable instead of/tmp/zmx-{uid} zmx versionprints the current version ofzmxandghostty-vt