The project's README from github.com/missuo/herdrm. As one markdown file: README.md.
The native macOS console for herdr — see Claude Code, Codex, Gemini, Grok and OpenCode across your Mac and every SSH box you own, and jump into any one of them at full-TUI fidelity.
What it does · Why herdrm? · Install · Quick Start · Architecture
herdr is the runtime your coding agents live on — a background server that owns their terminals and knows which one is working, blocked, or done. herdrm is a native macOS window on top of it, and it's grown well past "attach to a terminal":
| 🖥️ Every device | Local + remote over SSH — keys, Tailscale, or a Keychain password — with auto-reconnect |
| 🧭 Live status | Spaces, Agents & Terminals across every connected device |
| ⌨️ Real terminal | Full PTY attach, not a chat wrapper — native selection, legible fonts, resilient sessions |
| 📎 Paste anything | Files and images land straight in the agent's pane, locally or over SSH |
| 📁 Move files | Browse Local + SSH files side by side and copy in either direction |
| 🔔 Notifications | A system alert the moment an agent needs you — click it to jump right there |
| 🔍 ⌘K search | Every agent, on every device, one keystroke away |
ssh -L, each on its own
reconnect loop (1s → 30s backoff). The sidebar aggregates every device with a tinted OS badge;
the bottom-left switcher filters by device.user@host, user@host:port, ssh:// URIs, and ~/.ssh/config
aliases. Auth falls back OpenSSH keys/agent → Tailscale SSH (1.98.0+) → an in-app password
prompt stored in the macOS login Keychain, never in a file.<host>", a misconfigured
AllowStreamLocalForwarding, or why a disconnected device is unreachable — never a bare
"not connected".herdr agent attach /
herdr terminal attach); grabs
keyboard focus the moment you jump in from ⌘K, the sidebar, or a notification.herdr binaries no longer break attach.Packages/HerdrKit).You already run agents through herdr because the model is right — spaces, live status, real
PTYs, not a chat window pretending to be one. But living in herdr attach and a wall of
terminal panes is its own skill, and not everyone wants to be a tmux person to get the benefit.
herdrm is the same model, built for people who'd rather click:
Homebrew
brew install owo-network/brew/herdrm
Manual — download herdrm-x.y.z.zip from Releases,
unzip, drag herdrm.app into /Applications. Either way it self-updates from then on — HerdrM
→ Check for Updates…, or HerdrM → About HerdrM for the version you're running.
1. Launch herdrm → no local herdr running? herdrm starts it for you
2. Add a device (optional) → you@dev-box · you@dev-box:2222 · a Tailscale machine
3. ⌘N → pick a device + a CLI, you're attached to its live terminal
4. ⌘K → jump to any agent on any device, any time
flowchart LR
A(["🖥️ herdr<br/>background server, owns the PTYs"]) -->|"Unix-socket RPC +<br/>herdr agent attach"| B[["Packages/HerdrKit<br/>RPC client · SSH tunnel · device store"]]
B -->|SwiftUI bindings| C(["Sources/HerdrM<br/>sidebar · terminal · search · notifications"])
style A fill:#161b22,stroke:#E2795B,color:#e6edf3
style B fill:#1f2630,stroke:#3B82F6,color:#e6edf3
style C fill:#161b22,stroke:#2FA35F,color:#e6edf3
Packages/HerdrKit — transport and domain layer, UI-independent and unit-tested on its
own (make kit-test).Sources/HerdrM — the SwiftUI shell built on
SwiftTerm.brew install xcodegen
make build # xcodegen + xcodebuild → build/Build/Products/Debug/herdrm.app
make run
make kit-test # HerdrKit integration tests (needs a running local herdr)
Early-stage software, PRs genuinely welcome — small and single-purpose lands fastest.
herdr --version, and repro steps.make build + make kit-test locally (no CI gate yet — this is the bar),
plus a line under ## [Unreleased] in CHANGELOG.md (release automation requires it).PolyForm Noncommercial 1.0.0 — free to use, modify, and share for any noncommercial purpose. Commercial use requires a separate license from the maintainer. Contributions are accepted under the same terms.
Early stage, without full test coverage — expect bugs. Issues and PRs are very welcome.