English | 简体中文
A beautiful Flutter client for herdr: a status board for the coding agents running on your own machines, a live terminal one tap behind each, and a plain SSH terminal for any machine you have saved.
Cross-platform: mobile and desktop, from one Flutter codebase.
The board. Every agent on every machine, grouped by what it needs — needs you first. Answer the ones that are waiting on you from their own screen.
The tree. Workspaces, tabs and panes, the way herdr sees them.
The terminal. A real character grid for any pane: scrollback, selection and copy, bracketed paste, a key bar, and the whole tab's split layout mirrored.
A shell of its own. The same terminal on any machine you have saved, herdr or
not — tmux if it is installed, a login shell if it is not.
The composer. Type a whole message and send it in one write, with / for
skills and MCP and @ for files.
Files. Browse a pane's working directory, read a file in it, download it to the phone.
Git changes. The pane's directory as a repository: staged, unstaged, untracked, conflicted, ahead/behind, and a diff for any file — newly added, deleted and binary ones included. Browsing the working directory marks the files and folders that have changed.
Starting an agent. Pick a directory and an agent — in a fresh git worktree
if you want one. Or drop an agent into an idle shell pane.
Attaching a file. Paste text, pick a photo, or take one; it is uploaded and its path typed into the terminal.
Machines. SSH hosts, credentials in the platform keystore, pairing by QR code.
Notifications. A local alert when an agent starts waiting on you.
Updating itself. Settings → Check for updates: it downloads the new APK and hands it to the system installer.
flutter pub get
flutter run -d macos # development: talks to a local daemon directly
flutter run -d <device-id> # any connected deviceThe app does not discover machines; you add them.
Pair by QR code (recommended) — run hdp pair on the machine and scan it. See
Pairing a phone.
Or add it by hand:
- Open the board and tap the machines icon (top left).
- Add machine: label, host, port, username.
- Choose Private key and paste an OpenSSH private key, or Password.
- Save. The app selects the new machine and connects.
On first connection you are shown the machine's host key fingerprint, to check against the machine before trusting it.
- herdr 0.9.0 or newer, running.
- An SSH server with stream-local forwarding on — the OpenSSH default; if it is
off, add
AllowStreamLocalForwarding yes. - The SFTP subsystem, only to move whole files: downloading one to the phone, or attaching one to an agent.
Nothing else — no bridge binary, no helper script, no port to open.
flowchart LR
phone["phone (Flutter)"]
subgraph machine["your machine"]
sock["herdr.sock"]
daemon["herdr daemon"]
cli["herdr CLI"]
sh["a shell"]
sftp["sftp-server"]
end
phone -- "SSH · direct-streamlocal<br/>board · tree · answering" --> sock
phone -- "SSH · exec<br/>herdr terminal session" --> cli
phone -- "SSH · exec, or a PTY<br/>files · git · skills/MCP · the shell" --> sh
phone -- "SSH · SFTP<br/>downloads · attachments" --> sftp
sock --- daemon
cli --- daemon
One SSH connection, four ways in, and nothing installed on the machine for the
app's sake. The daemon's Unix socket is reached with SSH's
direct-streamlocal@openssh.com channel — no helper, which is what makes this
work against stock herdr. herdr has no filesystem, git or skills API, so those
go through the machine's shell; whole files move over SFTP.
flutter analyze && flutter test # ~1000 tests, ~45s
sh tool/ci_tests.sh # the same suite, and it fails if anything skipped
patrol test -d <device> # on-device smoke tests; by hand, needs patrol_cli
sh tool/ios_sim_test.sh # platform tests on a booted iOS simulatorflutter test skips the tests that need a live daemon and a live SSH server;
tool/ci_tests.sh starts both and fails if anything skipped — that is what CI runs.
patrol_test/ cannot be run with flutter test; those tests need Android's own
instrumentation runner.
curl -sSL https://raw.githubusercontent.com/weekitmo/herdr-pocket/main/cli/hdp/install.sh | sh
hdp pairIt prints a QR code. Scan it from the app and the phone's key is installed on that machine and the address saved.


