Brief
What had to change
"A mobile-first PWA dashboard for driving a single VPS through a web browser: multi-pane terminals (up to 16 concurrent ptys), AI agent launchers, host ops, and audit — all behind a single shared secret and a Tailscale-only domain." And the boundary, in the PRD's own words: "It is a single-owner control surface, not a public SaaS or a remote-desktop replacement." The stated goal: "Give a single VPS operator a fast, visual, browser-based control surface for the host — terminals, files, telemetry — without manual SSH for everyday work."
Approach
How the work was shaped
The three-tier split is a real boundary rather than a convention: the frontend never shells out, every privileged call crosses the agent's authenticated HTTP gateway, and the agent binds 127.0.0.1 by default — with no command allowlist at all, written down as a decision (“the perimeter is the security boundary, not per-command sandboxing”) instead of left as an omission. The Bun migration shows how he decides: installs, scripts and the frontend runtime moved on measured numbers, but the PTY-owning agent daemon deliberately stayed on Node 22 after he found that under Bun 1.3.14 node-pty loads and spawns yet `onData` never fires — every terminal silently blank — and that `Bun.Terminal` does stream but gives the child no controlling tty and no `setsid` (`/proc` showing `tty_nr=0`, `tpgid=-1`), which breaks Ctrl-C and the process-group kill in `killSessionTree`. The same commit fixed the hottest path he tripped over on the way in: terminal scrollback did `buffer = truncate(buffer + chunk)` on every PTY chunk, re-copying the full 250 KB cap on the same event loop that serves PTY I/O and SSE across sixteen panes, now a chunk array with a lazily joined cached string so appends are O(chunk).
