bordr pixel-art border collie mark bordr v1.1.1
bordr for Herdr · Self-hosted PWA over Tailscale

Read and drive every coding agent on your machine, from your phone.

bordr is a self-hosted mobile web workspace for Herdr, served privately over Tailscale. Your faithful, playful, roaming sheepdog: herd your flock from anywhere.

Blocked agents pin to the top of the list with their choices inline. Tap an option, read the real session transcript as clean chat, or flip to Terminal mode for the exact pane and split layout.

Works with: Claude Code codex pi omp agy grok copilot

A blocked agent, answered from the list. No typing, no terminal.

Three reasons it beats a phone SSH client

Built for one thumb, real harness transcripts, and multiple concurrent sessions.

1 · Blocked first

Answer without opening anything

The moment an agent blocks on a permission or question, bordr pins it to the top of the list with tappable options inline, and sends a Web Push notification carrying those exact choices.

2 · Chat + Terminal

Read clean chat, or drive the real TUI

Sessions render as structured chat with VS Code syntax highlighting, folded tool calls, and diffs. When a TUI needs raw keys, switch to Terminal mode for the exact pane, split strip, and `/` skill autocomplete.

3 · Whole estate

Every machine, workspace, and worktree

Follows Herdr's workspaces, nested git worktrees with PR check badges, tabs, and panes across your host and SSH-connected machines, plus full-text session search and sandboxed file previews.

Before you install: the tailnet is the security boundary

Read SECURITY.md

bordr deliberately has no login. Anyone who can reach its port can run commands on your machine, reach every SSH machine bordr connects to, and read configured file roots.

Serve, never Funnel Use tailscale serve to keep bordr inside your tailnet. Never use tailscale funnel, which publishes loopback to the public internet.
Shared tailnet? Use Grants Restrict who can reach the host and port with Tailscale grants, and set BORDR_ALLOWED_USERS so bordr verifies caller identity.
Loopback or Unix socket only bordr binds to 127.0.0.1 or a mode-0600 Unix socket and refuses public interfaces unless explicitly overridden.

What it looks like

Light and dark throughout. Use the theme button in the top bar to switch all six screens.

The agents list in light mode, with a blocked agent pinned at the top and its options inline The agents list in dark mode, with a blocked agent pinned at the top and its options inline
The list Blocked agents first, answerable in place.
A conversation rendered as chat in light mode, with highlighted code, folded tool calls and the picker card A conversation rendered as chat in dark mode, with highlighted code, folded tool calls and the picker card
A conversation Prose first, code highlighted, tools folded away.
Terminal mode in light mode, showing the pane as the machine draws it with the key strip below Terminal mode in dark mode, showing the pane as the machine draws it with the key strip below
Terminal mode The pane and split strip as the machine draws them.
The session panel in light mode, listing machines, workspaces, nested worktrees and agents The session panel in dark mode, listing machines, workspaces, nested worktrees and agents
The panel Machines, workspaces, nested worktrees, and PR checks.
The file browser in light mode, previewing rendered Markdown The file browser in dark mode, previewing rendered Markdown
Files Browse and preview Markdown, images, PDFs, and HTML.
Settings in light mode, with a live preview under each control Settings in dark mode, with a live preview under each control
Settings Every control shows what it does live.

How it works & quickstart

Runs locally on Bun alongside Herdr on Linux or macOS.

Architecture

herdr (this host) ──unix socket──┐
                                 ├─> bordr (Bun) ──HTTPS/SSE──> phone
herdr (named machines) ──ssh -L──┘
  • Read: Each harness's own session transcript straight off disk, with a cleaned terminal fallback.
  • Write: Through Herdr's socket API (agent.prompt, agent.send_keys, pane.send_text).
  • Live & Push: One Herdr event stream fanned out over SSE, plus Web Push when any agent turns blocked.

Install from GitHub

git clone https://github.com/AnnasCookies/bordr.git
cd bordr
bun run setup

bun run setup checks Bun, Herdr, and Tailscale, generates VAPID keys in .env, builds the production server, and prints the exact tailscale serve command for your tailnet.