aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-10-13tmuxrdr: README, requestsHEADtmuxrdrIgor Soarez
2026-10-13tmuxrdr: e2e clears the pane env from cli callsIgor Soarez
running the e2e from inside a herdr session leaked herdr_pane_id into the cli, so pane current looked for the caller's pane on the throwaway server and the script died with "herdr client did not come up".
2026-10-05tmuxrdr: mouse selections copy on release; drag-enters-copy-mode on the roadmapIgor Soarez
2026-10-05tmuxrdr: README and roadmap list the tab row patchIgor Soarez
2026-10-05tmuxrdr: tmux tab row on, session commands in the : promptIgor Soarez
The config turns ui.tab_style = "tmux" on, with the row at the bottom like tmux's status line. The : prompt takes tmux's session commands, on workspaces: new-session (-s, -c, -d, -A), switch-client -t/-n/-p/-l, attach-session -t, list-sessions, kill-session -t, with tmux's messages for a taken or missing name. test-e2e covers both, prints the config check's diagnostics when it fails, and finds the tab row wherever it is drawn.
2026-10-05tmuxrdr: tmux's status line as the tab row (ui.tab_style = "tmux")Igor Soarez
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.
2026-10-05tmuxrdr: build and run as its own binary beside stock herdrIgor Soarez
scripts/build builds the checkout with the pinned toolchains -- Homebrew's keg-only rustup, Zig 0.16.0 from ~/.local/opt, crates through sfw, Zig's hash-pinned packages prefetched by Zig since sfw's proxy breaks them -- and installs it as ~/.local/bin/tmuxrdr. install now sets up tmuxrdr only, in ~/.config/tmuxrdr, and refuses a binary that reads its config elsewhere. test-e2e tests tmuxrdr and starts with a config check. The config turns off herdr's update check, whose update would install stock herdr over the fork.
2026-10-05tmuxrdr: own directories, to run beside stock herdrIgor Soarez
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.
2026-10-05tmuxrdr: README and roadmapIgor Soarez
What tmuxrdr is, how to install, test, maintain and later build it, and the roadmap: the tmux bindings and behaviours only a patch to herdr's code can give, with the patch and its touch points for each.
2026-10-05tmuxrdr: install, end-to-end test and upstream sync scriptsIgor Soarez
install links ~/.config/herdr/config.toml and the plugin to this checkout and registers the plugin. test-e2e presses each binding in a herdr client running in a throwaway tmux and session, and checks the result through the herdr CLI. sync-upstream rebases the tmuxrdr commits onto a newer herdr release, keeping the old branch as a backup.
2026-10-05tmuxrdr: tmux-aligned herdr configIgor Soarez
tmux's bindings on herdr's built-in actions, and the tmux-mode plugin's actions and popups for the rest, each entry commented with the tmux line it mirrors: tmux 3.7c's defaults with this machine's tmux.conf and ~/.tmux.conf.local on top. herdr defaults that collided with tmux keys moved; herdr's own kept where tmux leaves the key unbound.
2026-10-05tmuxrdr: tmux-mode pluginIgor Soarez
The tmux default prefix bindings herdr has no built-in action for, as a herdr plugin built on its CLI and socket: break-pane, swap-pane and rotate-window by pane order (focus behaviour measured on tmux 3.7c), mark/clear-mark, last-window and switch-client -l (from focus events, per session), select-window and move-window by index, paste-buffer -p, display-message in tmux's default format, select-layout -E, kill-pane and kill-window behind tmux's y/n prompts, a command prompt taking tmux's commands, clock-mode, show-messages, and automatic-rename. Also a .gitignore for secrets scoped to tmuxrdr/, leaving herdr's own untouched.
2026-09-29release: v0.9.3v0.9.3Ogulcan Celik
2026-09-29docs: prepare 0.9.3 release notesOgulcan Celik
2026-09-29fix: keep escape-prefixed terminal key bindings intact (#4759)Can Celik
* fix: keep escape-prefixed terminal key bindings intact refs #4751 * test: cover escape-prefixed option+backspace binding refs #4751 (cherry picked from commit 898f733f92dbbe53c428845534b03adb573f92be)
2026-09-29release: v0.9.2Ogulcan Celik
2026-09-29docs: prepare 0.9.2 release documentationOgulcan Celik
2026-09-29fix: summarize old servers and saved machines after herdr update (#4722)Can Celik
* fix: summarize old servers and saved machines after herdr update * fix: include reconnect and per-session restart commands in update summary
2026-09-28fix: capture Windows host default colors at startup (#4710)JJ Liebig
refs #1530 refs #4369
2026-09-28docs: publish preview documentationkangal-bot
2026-09-28perf: send scrolling pane output as row shifts and skip blank cells (#4711)Can Celik
* perf: send scrolling pane output as row shifts and skip blank cells * fix: keep expanded scroll patches disjoint for the fast presentation path
2026-09-28fix(windows): read agent command lines without PROCESS_VM_READ (#4708)JJ Liebig
* 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 < 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<u8> 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 `&` so it stays in cmd.exe's own command line and `ping -n 11` keeps the process alive for the read.
2026-09-28feat: support multiple prefix keys (#4653)JJ Liebig
* 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.
2026-09-27test: fix pane shell idle foreground-command race (#4691)JJ Liebig
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.
2026-09-27fix: make release test robust to diff.noPrefix git config (#4663)Michael Hackner
`git apply` by default expects `-p1`, which is the default behavior of `git diff`, but this can be overridden by config. Specify it explicitly so it works regardless.
2026-09-27fix: bound external event batches in the server loop (#4671)Eric Yue
2026-09-27perf: skip frame clones for unchanged retained graphics (#4672)Eric Yue
2026-09-27perf: avoid rebuilding bsp subtrees when splitting panes (#4670)Eric Yue
2026-09-27perf: use keyed terminal lookup for named targets (#4669)Eric Yue
2026-09-27feat: simplify ssh machine setup discovery (#4204)JJ Liebig
2026-09-27docs: add a guide for adding herdr support to your agentOgulcan Celik
2026-09-27fix: keep offscreen kitty images loaded instead of resending them on scroll ↵Can Celik
(#4686)
2026-09-27feat: let agents report their own resume command (#4687)Can Celik
* feat: let agents report their own resume command * fix: keep reported resume commands tied to accepted sessions and current owners
2026-09-27feat: accept mouse events on terminal session control (#4685)Can Celik
2026-09-27feat: default machine add label to the ssh host (#4678)David Heinemeier Hansson
* feat: default machine add label to the ssh host `herdr machine add <ssh-target>` no longer requires `--label`. Without one, the machine is named after the SSH host with any `user@` prefix removed, so `herdr machine add dev@workbox` shows up as `workbox`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix: make default machine labels unique per session and handle ssh urls --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-27refactor: extract libghostty-vt binding into ghostty-vt workspace crate (#4661)Can Celik
* refactor: extract libghostty-vt binding into ghostty-vt workspace crate * fix: build libghostty-vt into each build's out dir
2026-09-26ci: reuse compiler state on every os and save caches only from masterOgulcan Celik
2026-09-26fix: keep api listener alive after transient accept errors (#4659)Can Celik
* fix: keep api listener alive after transient accept errors refs #4601 * fix: drop repeated api accept failure logs refs #4601
2026-09-26refactor: encode kitty placements in a single pass (#4657)Can Celik
2026-09-26fix: refresh host palette on terminal redraw (#4349)David Heinemeier Hansson
* fix: refresh host palette on terminal redraw * fix: count overlapping host palette queries --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-26fix: create a symlink on non-elevated windows in docs test (#4654)JJ Liebig
* fix: create a symlink on non-elevated windows in docs test Windows terminals without Developer Mode or elevation cannot create file symlinks, so the versions publishing integration test failed with EPERM before it could reach the non-ordinary-file rejection. Fall back to a directory junction, which is creatable without elevation and hits the same rejection path. * fix: detect docs snapshot reparse points with lstat Classify entries with lstat instead of the readdir dirent so symlinks and Windows junctions are rejected regardless of how a runtime classifies them. This keeps the versions integration test's non-ordinary-file assertion meaningful on non-elevated Windows, where the fixture can only create a directory junction.
2026-09-26fix: crop kitty images around overlays instead of hiding them (#4652)Can Celik
2026-09-26fix: accept plugin install options before the repository (#4453)akbash
refs #4446 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-26fix: retain mouse input grace for split csi prefixes (#4636)akbash
refs #4630 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-09-25fix: preserve shift on ctrl+shift+letter for legacy panes (#4597)Ainesh Chatterjee
Panes whose app has not enabled the kitty keyboard protocol received ctrl+shift+letter as the same C0 byte as ctrl+letter. Encode the chord as CSI-u instead, matching Ghostty's legacy encoder. refs #4581 Co-authored-by: ain3sh <ainesh.chatterjee@gmail.com>
2026-09-24fix: keep copy mode active during projection updates (#4281)Marco Mayer
* fix: keep copy mode active during projection updates refs #3812 * fix: preserve linewise selections during projection gaps refs #3812 --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-24docs: explain tmux auto-attach guard in herdr panes (#4592)JJ Liebig
2026-09-24perf: avoid repeated scrollback page lookups (#4553)JJ Liebig
refs #4506
2026-09-24perf: avoid redundant client ANSI encoding work (#4552)JJ Liebig
refs #4546
2026-09-24feat!: replace the custom graphics api with optimized native kitty rendering ↵Can Celik
(#4561) * feat!: replace the custom graphics api with optimized native kitty rendering * fix: enable safe kitty optimizations automatically --------- Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>