# Pi Dashboard — Build Plan & Checklist ## Task Checklist - [x] **Step 1: dashboard.ts extension** — written, tested, deployed to .13 (.51 offline) - [x] Event hooks: agent_start, agent_end, tool_call - [x] Write agent state JSON files atomically (`~/.pi/agent/dashboard/.json`) - [x] Task tools: register_task, complete_task, list_tasks (todo.txt format) - [x] NTFY + Apprise notifications on completion - [x] Session name detection (tmux aware, configurable via PI_SESSION env) - [x] Tested: state files written correctly, no crashes - [x] **Step 2: Install companion tools** — Tuxedo (built from source via nix), Hunk (already available) - [x] Tuxedo: `/home/sam/bin/tuxedo` (NixOS-compatible nix build) - [x] Hunk: available via nix profile at `/etc/profiles/per-user/sam/bin/hunk` - [x] **Step 3: Go TUI viewer** — built and deployed to .27 and .13 - [x] Initialize Go module at ~/src/pi-dashboard/ (Go 1.26) - [x] Local state file reader + TUI table rendering (Bubble Tea + Bubbles table) - [x] Keyboard controls: Enter (attach), d (Hunk), Tab (Tuxedo), r (refresh), q (quit) - [x] 2s polling loop - [x] Built to ~/bin/pi-dashboard (5.4MB static binary) - [x] Deployed to .13 via scp - [x] `--list` mode for non-TTY testing, `--help` for usage - [x] **Step 4: Cross-machine SSH pull** - [x] YAML config file at ~/.config/pi-dashboard.yaml (remotes: .13, .51) - [x] SSH remote state reader (shells out to `ssh user@host cat .../*.json`) - [x] Remote attach (local: `tmux attach`, remote: `ssh -t user@host tmux attach`) - [x] Viewer deployed to .13 - [ ] **Step 5: Try Herdr** - [ ] Install Herdr via nix - [ ] Create test layout on WS 2 - [ ] Run pi inside Herdr, verify dashboard picks it up - [ ] Evaluate migration vs keeping Zellij --- ## Architecture ``` ┌─────────────────────────────────────────────────────────────────┐ │ pi sessions (each machine) │ │ │ │ pi (with dashboard.ts extension) │ │ ├── agent_start → track: status, model, duration, tokens │ │ ├── agent_end → notify: NTFY/Apprise + mark complete │ │ ├── tool_call → track: last tool, tokens consumed │ │ └── register_task / complete_task → write to todo.txt │ │ │ │ │ └── Writes to: │ │ ~/.pi/agent/dashboard/.json (agent state) │ │ ~/.pi/agent/dashboard/tasks/todo.txt (task list) │ │ │ │ On agent_end / error: │ │ └── curl → NTFY server (phone notification) │ │ └── apprise → Slack/Telegram/email (configured routes) │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ pi-dashboard viewer (Go + Bubble Tea) │ │ │ │ Reads: ~/.pi/agent/dashboard/*.json (local + SSH remote) │ │ Renders: agent status table with cost, duration, location │ │ Controls: │ │ Enter → tmux attach -t (jump to agent) │ │ d → hunk diff (review agent's worktree changes) │ │ Tab → launch Tuxedo (task list in todo.txt) │ │ r → force refresh │ │ q → quit │ └─────────────────────────────────────────────────────────────────┘ ``` ## Key Decisions | Decision | Choice | Why | |----------|--------|-----| | State transfer | SSH pull Phase 1 → HTTP collector on .13 Phase 2 | Zero infra to start, resilient later | | TUI framework | Go + Bubble Tea | Single binary, fast, portable | | Web UI | Phase 2, optional | SSH from Termux works for Phase 1 | | Task board | Use Tuxedo — don't build custom | Already polished with vim keys, phone capture | | Diff review | Use Hunk — don't build custom | Purpose-built for agent changeset review | | Notifications | Use NTFY + Apprise — don't build custom | Both already available, extension calls curl/apprise | | Polling | 2s intervals, no file watcher | Simple, no edge cases | | Session naming | pi- (pi-work, pi-explore) | Consistent jump target | | Herdr | Try alongside, no special integration | Dashboard is multiplexer-agnostic |