<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tmuxrdr.git/src, branch tmuxrdr</title>
<subtitle>herdr but with less disrespect for the tmux community
</subtitle>
<id>https://git.soarez.net/sz/tmuxrdr.git/atom?h=tmuxrdr</id>
<link rel='self' href='https://git.soarez.net/sz/tmuxrdr.git/atom?h=tmuxrdr'/>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/'/>
<updated>2026-10-05T12:45:17+00:00</updated>
<entry>
<title>tmuxrdr: tmux's status line as the tab row (ui.tab_style = "tmux")</title>
<updated>2026-10-05T12:45:17+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-10-05T12:45:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=9a12d7fb0eae23c016d3e941a16765084fbf0eaa'/>
<id>urn:sha1:9a12d7fb0eae23c016d3e941a16765084fbf0eaa</id>
<content type='text'>
herdr draws each tab as a centred, padded block, and a named tab shows its
name without its number. With ui.tab_style = "tmux" the row is tmux 3.7c's
default status line: "[session] " cut to status-left-length 10, then each
window as "#I:#W#{?window_flags,#{window_flags}, }" -- current "*", last
"-", zoomed "Z" -- one space apart, plain text in the status line's colours.
Unnamed tabs are called after their active pane's directory, like
automatic-rename-format '#{b:pane_current_path}'.

The logic is in src/client/shell/tabs_tmux.rs; render_tab_bar keeps its
layout, scrolling, mouse hits and + button, with three one-line hooks for
width, text and style, and the session at the left. Each tab's active pane
and each workspace's previous tab are remembered by the client, so nothing
changes in the protocol and the client works against a stock herdr server.
The default, herdr, draws as before.
</content>
</entry>
<entry>
<title>tmuxrdr: own directories, to run beside stock herdr</title>
<updated>2026-10-05T09:02:45+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-10-05T09:02:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=2312d3978b7d123968e834c0e0080ad2ff5559df'/>
<id>urn:sha1:2312d3978b7d123968e834c0e0080ad2ff5559df</id>
<content type='text'>
app_dir_name() names the directory every herdr path is built from --
config, sessions, sockets, logs, plugin registry, state. A release build of
tmuxrdr now uses "tmuxrdr", so ~/.config/tmuxrdr and ~/.local/state/tmuxrdr,
and shares nothing with a stock herdr on the same machine. Debug builds keep
"herdr-dev", which herdr's own tests expect.
</content>
</entry>
<entry>
<title>fix: keep escape-prefixed terminal key bindings intact (#4759)</title>
<updated>2026-09-29T18:17:23+00:00</updated>
<author>
<name>Can Celik</name>
<email>ogulcancelik@gmail.com</email>
</author>
<published>2026-09-29T17:34:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=8e78f929d8f0306a5c68518969e90274c44cb1f0'/>
<id>urn:sha1:8e78f929d8f0306a5c68518969e90274c44cb1f0</id>
<content type='text'>
* fix: keep escape-prefixed terminal key bindings intact

refs #4751

* test: cover escape-prefixed option+backspace binding

refs #4751

(cherry picked from commit 898f733f92dbbe53c428845534b03adb573f92be)
</content>
</entry>
<entry>
<title>fix: summarize old servers and saved machines after herdr update (#4722)</title>
<updated>2026-09-29T00:47:12+00:00</updated>
<author>
<name>Can Celik</name>
<email>ogulcancelik@gmail.com</email>
</author>
<published>2026-09-29T00:47:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=9dc3a1df2b563df0637264fc0dffcd607c324ac5'/>
<id>urn:sha1:9dc3a1df2b563df0637264fc0dffcd607c324ac5</id>
<content type='text'>
* fix: summarize old servers and saved machines after herdr update

* fix: include reconnect and per-session restart commands in update summary</content>
</entry>
<entry>
<title>fix: capture Windows host default colors at startup (#4710)</title>
<updated>2026-09-28T15:16:27+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-28T15:16:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=d5680d84fd1df3b592424eae5c50d54642f0727d'/>
<id>urn:sha1:d5680d84fd1df3b592424eae5c50d54642f0727d</id>
<content type='text'>
refs #1530
refs #4369</content>
</entry>
<entry>
<title>perf: send scrolling pane output as row shifts and skip blank cells (#4711)</title>
<updated>2026-09-28T13:19:42+00:00</updated>
<author>
<name>Can Celik</name>
<email>ogulcancelik@gmail.com</email>
</author>
<published>2026-09-28T13:19:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=80c0c07250d22f69d3fa05cb1700302d66180eb8'/>
<id>urn:sha1:80c0c07250d22f69d3fa05cb1700302d66180eb8</id>
<content type='text'>
* perf: send scrolling pane output as row shifts and skip blank cells

* fix: keep expanded scroll patches disjoint for the fast presentation path</content>
</entry>
<entry>
<title>fix(windows): read agent command lines without PROCESS_VM_READ (#4708)</title>
<updated>2026-09-28T11:16:10+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-28T11:16:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=8c8cb49c237eec2f82192dd831ec7308905f2c0a'/>
<id>urn:sha1:8c8cb49c237eec2f82192dd831ec7308905f2c0a</id>
<content type='text'>
* fix(windows): read agent command lines without PROCESS_VM_READ

Windows process command lines were read by opening each process with
PROCESS_VM_READ and walking its PEB. Hardened runtimes (Electron/Node) and
security products deny that access, so those processes resolved to a bare
`node.exe`/`bun.exe` name with no argv, argv0, or cmdline. A runtime-wrapped
agent launched from such a process was then indistinguishable from an
unrelated runtime process, and the pane stayed on the shell with
`agent_status: unknown`.

Prefer `NtQueryInformationProcess` with `ProcessCommandLineInformation`
(Windows 8.1+), which needs only `PROCESS_QUERY_LIMITED_INFORMATION`, and keep
the existing PEB read as a fallback for processes that do not expose a stored
command line. The fallback still requires `PROCESS_VM_READ`, so this only
widens coverage.

refs #4579

* fix(windows): handle growing command lines before failure test

The retry added for a command line that grows between the size probe and the
read was unreachable. NTSTATUS is signed, so STATUS_BUFFER_OVERFLOW,
STATUS_BUFFER_TOO_SMALL, and STATUS_INFO_LENGTH_MISMATCH are all negative and
were treated as failures by the earlier `status &lt; 0` check.

Check the growth statuses first and retry once with the reported size. Also read
the returned UNICODE_STRING header unaligned, since a Vec&lt;u8&gt; buffer only
guarantees byte alignment.

* test(windows): keep command-line marker test process alive

Passing the marker as a second argument to `ping` let `ping` exit as soon as it
saw one target, so the command-line query could race the process exit. Move the
marker into a `rem` after `&amp;` so it stays in cmd.exe's own command line and
`ping -n 11` keeps the process alive for the read.</content>
</entry>
<entry>
<title>feat: support multiple prefix keys (#4653)</title>
<updated>2026-09-28T09:58:09+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-28T09:58:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=7f89b11a11160874ba89f3be7c64b29960bd2df3'/>
<id>urn:sha1:7f89b11a11160874ba89f3be7c64b29960bd2df3</id>
<content type='text'>
* feat: support multiple prefix keys

keys.prefix accepts an array in addition to a single string so one
config can define several prefix keys. Every configured prefix enters
the same prefix mode, and the help panel lists them all.

Published keybinding profiles keep the primary prefix as a scalar and
carry the rest in an optional extra_prefixes field so older clients
keep working with the primary prefix.

* fix: reject an empty prefix list on reload

An explicitly empty keys.prefix array now stays empty through config
parsing so validation rejects it and a reload keeps the current
keybindings instead of silently falling back to ctrl+b.</content>
</entry>
<entry>
<title>test: fix pane shell idle foreground-command race (#4691)</title>
<updated>2026-09-27T20:38:56+00:00</updated>
<author>
<name>JJ Liebig</name>
<email>jonathan.liebig@gmail.com</email>
</author>
<published>2026-09-27T20:38:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=0d5d6f1f317e238c8297076bc6ab5c3a0cd56283'/>
<id>urn:sha1:0d5d6f1f317e238c8297076bc6ab5c3a0cd56283</id>
<content type='text'>
The interactive-shell idle test sent SIGINT as soon as it observed the
shell was busy. That condition can be true before the shell finishes
moving the command into its own foreground process group, so the
interrupt could arrive before the command reset its signal dispositions.
The command then survived in a stale foreground group while the shell
showed a prompt, and the pane was never observed idle again.

Run cat and end it with EOF instead. cat blocks on stdin, so the busy
state is stable, and EOF avoids the interrupt/job-control race.</content>
</entry>
<entry>
<title>fix: bound external event batches in the server loop (#4671)</title>
<updated>2026-09-27T20:16:55+00:00</updated>
<author>
<name>Eric Yue</name>
<email>jiacheng.yue@foxmail.com</email>
</author>
<published>2026-09-27T20:16:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/tmuxrdr.git/commit/?id=c210c953e454882c5ef3cd366bcd4b53b7c64791'/>
<id>urn:sha1:c210c953e454882c5ef3cd366bcd4b53b7c64791</id>
<content type='text'>
</content>
</entry>
</feed>
