Would Herdr instead of tmux make sense? #16

Closed
opened 2026-07-29 16:52:14 +01:00 by pedromcaraujo · 1 comment
No description provided.
Author
Owner

Looked into this. Correcting the premise first: herdr has no browser UI. It's a
single Rust TUI binary — the author explicitly sells "no Electron, no hosted control
plane". Remote access is SSH, or herdr --remote streaming the TUI back to a local
terminal client
. No nginx, no xterm.js, no PWA, no phone keybar, no upload dropzone.

So it's not a forge replacement. The real question is the one in the title: swap
herdr in for tmux, underneath forge's existing browser layer — ttyd would exec
herdr attach <channel> instead of tmux new-session -A.

Pros

  • Agent state detection comes free. herdr integration install claude gives
    blocked/working/done/idle over a local socket API. That's exactly what abc8169
    (#15) just built by scraping Claude's transcript JSONL — replaced by a supported
    contract.
  • The socket API beats shelling out. web/tmux_ctl.py is 289 lines of tmux
    subprocess calls for splits/zoom/kill/lazygit plus transcript parsing.
  • Already in nixpkgs (0.7.5), so packaging is a non-issue.
  • Agent-shaped primitives — pane metadata/titles, native agent resume, live
    handoff. Closer to where forge would go if it ever wants N agents per repo.

Cons

  • It's a TUI, and we render TUIs through xterm.js. modules/shell.nix is 119
    lines of tmux.conf tuned for exactly that (extended keys, OSC 52, mouse scroll,
    Shift+Enter). All of it would need re-solving against herdr's own keybinding/theme
    config, with no guarantee its sidebar renders sanely at phone width in an iframe.
  • herdr's sidebar duplicates forge's sidebar. Two channel lists in one viewport.
    We'd run herdr with its sidebar off — throwing away its headline feature and using
    it as a state API + multiplexer only.
  • Pre-1.0, ~5 months old. 0.7.x, no sandboxing, breaking changes likely. tmux is
    the most boring dependency in this repo, which is a feature for something driven
    from a phone on a train.
  • Not a small change. tmux touches all four nix modules plus tmux_ctl.py and
    index.html — ~86 references across ~900 lines. It's a rewrite of the whole
    session layer.

Decision — not now

The one genuine draw is the state API, and we just solved that ourselves in #15, and
it works. Rewriting the session layer to un-solve and re-solve our newest feature,
against a 0.7 dependency, on the layer that is hardest to debug from a phone, is a
bad trade.

There's no partial adoption either: herdr is the multiplexer, so tmux_ctl.py
can't just read its socket while tmux stays underneath. All-or-nothing.

Revisit when herdr reaches 1.0, or when we actually want multiple agents per
channel — that's the point where its model starts paying for the migration.

Refs: https://herdr.dev/docs/ · https://github.com/ogulcancelik/herdr

Looked into this. Correcting the premise first: **herdr has no browser UI.** It's a single Rust TUI binary — the author explicitly sells "no Electron, no hosted control plane". Remote access is SSH, or `herdr --remote` streaming the TUI back to a *local terminal client*. No nginx, no xterm.js, no PWA, no phone keybar, no upload dropzone. So it's not a forge replacement. The real question is the one in the title: swap herdr in for **tmux**, underneath forge's existing browser layer — ttyd would exec `herdr attach <channel>` instead of `tmux new-session -A`. ## Pros - **Agent state detection comes free.** `herdr integration install claude` gives blocked/working/done/idle over a local socket API. That's exactly what abc8169 (#15) just built by scraping Claude's transcript JSONL — replaced by a supported contract. - **The socket API beats shelling out.** `web/tmux_ctl.py` is 289 lines of `tmux` subprocess calls for splits/zoom/kill/lazygit plus transcript parsing. - **Already in nixpkgs** (0.7.5), so packaging is a non-issue. - **Agent-shaped primitives** — pane metadata/titles, native agent resume, live handoff. Closer to where forge would go if it ever wants N agents per repo. ## Cons - **It's a TUI, and we render TUIs through xterm.js.** `modules/shell.nix` is 119 lines of tmux.conf tuned for exactly that (extended keys, OSC 52, mouse scroll, Shift+Enter). All of it would need re-solving against herdr's own keybinding/theme config, with no guarantee its sidebar renders sanely at phone width in an iframe. - **herdr's sidebar duplicates forge's sidebar.** Two channel lists in one viewport. We'd run herdr with its sidebar off — throwing away its headline feature and using it as a state API + multiplexer only. - **Pre-1.0, ~5 months old.** 0.7.x, no sandboxing, breaking changes likely. tmux is the most boring dependency in this repo, which is a feature for something driven from a phone on a train. - **Not a small change.** tmux touches all four nix modules plus `tmux_ctl.py` and `index.html` — ~86 references across ~900 lines. It's a rewrite of the whole session layer. ## Decision — not now The one genuine draw is the state API, and we just solved that ourselves in #15, and it works. Rewriting the session layer to un-solve and re-solve our newest feature, against a 0.7 dependency, on the layer that is hardest to debug from a phone, is a bad trade. There's no partial adoption either: herdr *is* the multiplexer, so `tmux_ctl.py` can't just read its socket while tmux stays underneath. All-or-nothing. **Revisit when** herdr reaches 1.0, or when we actually want multiple agents per channel — that's the point where its model starts paying for the migration. Refs: https://herdr.dev/docs/ · https://github.com/ogulcancelik/herdr
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pedromcaraujo/forge#16
No description provided.