main CHANGELOG.md
Eric Bower  ·  2026-06-12
  1# Changelog
  2
  3Use spec: https://common-changelog.org/
  4
  5## Staged
  6
  7## v0.7.0 - 2026-05-29
  8
  9### Fixed
 10
 11- `zmx run` will now detect heredocs and add the completion marker to a newline
 12
 13### Changed
 14
 15- *BREAKING* `zmx run` when creating session it runs `bash` instead of `$SHELL`
 16  - There are just too many edge cases with tracking exit status in other shells which makes `zmx run` much less useful for task management.
 17  - This means when using `zmx run` the target shell must have support for `$?` exit code tracking
 18- *BREAKING* `zmx tail` now strips ansi escape codes
 19
 20## v0.6.0 - 2026-05-16
 21
 22### Added
 23
 24- `zmx send` send raw bytes to session without ZMX completion marker or auto-newline
 25- `zmx print` send raw bytes to client's stdout
 26- `zmx ls` is accepted as an alias for `zmx list`
 27- Added `--help` flag for all commands (it just returns the main help cmd for now)
 28
 29### Fixed
 30
 31- An idle daemon (no clients, no PTY traffic) used to ignore SIGTERM indefinitely.
 32- An idle attached client used to ignore SIGWINCH until the next keystroke or daemon output.
 33- Don't kill all sessions when `.Info` ipc event changed
 34- Reset terminal emulator to default state on detach
 35
 36### Changed
 37
 38- `zmx wait` output will tail the last 20 lines of every task that failed
 39- Detaching from a session will now do a full terminal reset
 40
 41## v0.5.0 - 2026-04-16
 42
 43### Added
 44
 45- New client leader policy: last client to send user input bytes (non-ansi escape codes) becomes the leader
 46  - The client leader controls resizing and any other terminal state changes
 47  - Non-leader clients are read-only until they send user input bytes and takeover leadership
 48  - When a leader is promoted we immediately resize to their window size
 49- `zmx attach` now lets users switch to another session from within a session
 50- `zmx tail` will receive all outout from sessions in read-only mode
 51- `zmx write` will pipe data from stdin, convert to base64, chunk, and send data through pty to write to a file
 52
 53### Changed
 54
 55- *BREAKING* `zmx run` is now synchonous by default and tails the session
 56  - Use detached mode (`-d`) for previous behavior
 57- *BREAKING* `kill` and `wait` now require "\*" suffix for wildcard match sessions
 58  - e.g. `zmx kill "d.*"`, `zmx kill "*"`, `zmx wait "test*"`
 59- `zmx run` accepts `--fish` flag to indicate the session's shell is fish
 60- `zmx kill` now supports multiple args and it will kill sessions that match a prefix
 61  - e.g. `zmx kill "d.*"` will kill all sessions that match that prefix
 62
 63### Fixed
 64
 65- `zmx list` will send "no sessions found" to stderr instead of stdout
 66- `zmx wait` will send errors to stderr instead of stdout
 67- Rewrite OSC `133;A` with `redraw=0` to prevent prompt loss on resize
 68
 69## v0.4.2 - 2026-03-18
 70
 71### Changed
 72
 73- `zmx list` renamed keys and made formatting more stable
 74- More accurate fish completions
 75
 76### Fixed
 77
 78- Validate session name length against Unix socket path limit
 79- Use platform-correct `O_NONBLOCK` for fcntl
 80- Daemon ignore `SIGPIPE`, handle `EINTR` in poll
 81- Daemon isolate forked child from parent code path and heap-alloc argv
 82- `zmx run` stdin regression with `ZMX_TASK_COMPLETED`
 83- `zmx run` when no client is attached, send DA response query from daemon
 84- `zmx run` re-quote when using shell meta chars
 85- `zmx wait` use-after-free
 86- `zmx wait` time out after 3 polls if no matching sessions are found
 87- `zmx list` clean up socket on `ConnectionRefused`, not `Timeout`
 88
 89## v0.4.1 - 2026-02-23
 90
 91### Fixed
 92
 93- Update `libghostty` to fix `zig build test`
 94
 95## v0.4.0 - 2026-02-20
 96
 97### Added
 98
 99- New environment variable `ZMX_SESSION_PREFIX` which will be inserted before every session name for every command
100- New command `zmx wait` which will stall until all tasks (`zmx run`) are completed.
101
102### Changed
103
104- `zmx version` now returns the socket and log directory locations
105- `zmx run` now inserts a `ZMX_TASK_COMPLETED` marker after every run command to indicate when the task is completed and then returns the aggregate exit status
106
107### Fixed
108
109- `libghostty` had a regression that caused `zmx` to crash
110
111## v0.3.0 - 2026-02-01
112
113### Added
114
115- New flag `--vt` for `zmx [hi]story` which prints raw ansi escape codes for terminal session
116- New flag `--html` for `zmx [hi]story` which prints html representation of terminal session
117- New list flag `zmx [l]ist [--list]` that lists all session names with no extra information
118- New command `zmx [c]ompletions <shell>` that outputs auto-completion scripts for a given shell
119- List command `zmx list` now shows `started_at` showing working directory when creating session
120- List command `zmx list` now shows `cmd` showing command provided when creating session
121- List command `zmx list` now shows `→` arrow indicating the current session
122
123### Fixed
124
125- On restore, background colors for whitespace now properly filled
126- Spawn login shell instead of normal shell
127- Properly cleanup processes (parent and children) during `zmx kill` or SIGTERM
128
129## v0.2.0 - 2025-12-29
130
131### Added
132
133- New command `zmx [hi]story <name>` which prints the session scrollback as plain text
134- New command `zmx [r]un <name> <cmd>...` which sends a command without attaching, creating session if needed
135- Use `XDG_RUNTIME_DIR` environment variable for socket directory (takes precedence over `TMPDIR` and `/tmp`)
136
137### Changed
138
139- Updated `ghostty-vt` to latest HEAD
140
141### Fixed
142
143- Restore mouse terminal modes on detach
144- Restore correct cursor position on re-attach
145
146## v0.1.1 - 2025-12-16
147
148### Changed
149
150- `zmx list`: sort by session name
151
152### Fixed
153
154- Send SIGWINCH to PTY on re-attach
155- Use default terminal size if cols and rows are 0
156
157## v0.1.0 - 2025-12-09
158
159### Changed
160
161- **Breaking:** unix socket and log files have been moved from `/tmp/zmx` to `/tmp/zmx-{uid}` with folder/file perms set to user
162
163If you upgraded and need to kill your previous sessions, run `ZMX_DIR=/tmp/zmx zmx kill {sesion}` for each session.
164
165### Added
166
167- Use `TMPDIR` environment variable instead of `/tmp`
168- Use `ZMX_DIR` environment variable instead of `/tmp/zmx-{uid}`
169- `zmx version` prints the current version of `zmx` and `ghostty-vt`