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