Q-13: Viable Remote Monitoring GUI
Status: ANSWERED Agent: codex/ext-agent Timestamp UTC: 2026-05-11T03:00:00Z Claim: CLAIMED 2026-05-11T02:55:00Z
Prior Answers Checked
- Q-11 (Remote UI / Observability) — established pi-gui is wrong, pi-agent-dashboard needs wiring, Forgejo needs container
- No prior answer for lightweight alternatives on Pi 4
Short Answer
Use Tailscale Serve + Python HTTP server as the immediate zero-install GUI. Generate a static HTML status page from agent state/wiki files. Add Forgejo (native) as Tier 2 when ready.
| Tier | Tool | Install | Resource | Shows |
|---|---|---|---|---|
| 1 (now) | Tailscale Serve + Python HTTP + static status page | 0 (already installed) | ~20MB RAM | Agent state, claims, research queue, logs |
| 2 (later) | Tailscale Serve + Forgejo native | Extract binary from Docker | ~50MB RAM | Full repo browser, issues, commits, PRs |
| 3 (optional) | ttyd + tmux | apt install tmux + ttyd binary |
~30MB RAM | Live agent panes in browser |
All served over tailnet HTTPS — no port forwarding, no Docker, no public exposure.
Evidence
Environment Check (relik-pi4, 2026-05-11)
- Tailscale v1.96.4: installed, running,
tailscale serveavailable - Python 3.13.5: installed,
http.servermodule available - tmux: NOT installed (
apt install tmuxavailable, ~400KB) - ttyd: NOT in apt repos (would need Go build or binary download from GitHub releases)
- No web server installed (no nginx, apache, caddy, lighttpd)
- RAM: 3.7GB total, 2.5GB available (with Docker containers down)
- Disk: 3.6TB at /mnt/kitchen (29% used)
- Ports: only SSH (22), Samba (139/445), Tailscale (47001, 43274), Python (8642 localhost), containerd (34023 localhost)
Tailscale Serve
Syntax: tailscale serve --bg <port> — serves any local HTTP server over tailnet HTTPS with a *.ts.net domain.
Example:
# Start Python HTTP server serving the LLM-wiki
cd /mnt/kitchen/from-house/workspace/d3-tui-pi-teams-proto/llm-wiki
python3 -m http.server 8080 --bind 127.0.0.1 &
tailscale serve --bg 8080
# Now accessible at https://relik-pi4.<tailnet>.ts.net/
No certificates to manage. No Docker needed. Built-in Tailscale auth controls who can access.
Python HTTP Server
Built-in. Zero install. Can serve: - Static HTML files (status dashboard) - Directory listings (browse wiki, logs, state files) - CGI scripts if needed
Single command: python3 -m http.server 8080
Static HTML Status Page
A simple Python script can generate index.html from:
- /mnt/kitchen/from-house/state/agents/*/pi/ — agent state
- /mnt/kitchen/from-house/workspace/d3-tui-pi-teams-proto/llm-wiki/wiki/research/research-queue.md — research progress
- /mnt/kitchen/from-house/workspace/d3-tui-pi-teams-proto/llm-wiki/wiki/tasks/claim-board.md — active claims
- /mnt/kitchen/from-house/hq/bus/ — inter-agent messages
- docker ps output — container status
- /mnt/kitchen/from-house/repos/d3-tui/ — git log
One script. Scheduled via cron or run on-demand. Output is a single HTML file.
Forgejo Native
Forgejo binary exists inside Docker image (codeberg.org/forgejo/forgejo:14.0.3), not on host. Can be extracted:
CID=$(docker create codeberg.org/forgejo/forgejo:14.0.3)
docker cp $CID:/usr/local/bin/forgejo /usr/local/bin/forgejo
docker rm $CID
Then run: forgejo web --config /mnt/kitchen/from-house/forgejo/app.ini
Expose via: tailscale serve --bg 3001
Resource cost: ~50MB RAM for the Go process (estimate based on similar Go web servers).
ttyd
Single Go binary (~8MB). Shares any command's terminal in browser via WebSocket.
ttyd -p 7681 tmux attach
tailscale serve --bg 7681
Shows live agent panes, terminal output, interactive shell. Needs tmux installed first. More resource-intensive because each browser connection spawns a WebSocket.
Fit For This Pi Workcell
- Three Pi agents: Status page shows each agent's current state, last activity, claim. ttyd shows live terminal panes.
- External agents: Status page shows claim board and research queue (what they already need to read).
- D3-TUI repo: Forgejo native (Tier 2) gives full repo browser with commits, diffs, issues.
- Forgejo issues: Visible in Forgejo UI (Tier 2) or as static links in status page.
- LLM-wiki: Tailscale Serve + Python HTTP directly serves the wiki directory — browse in browser.
- Pi resource constraints: Tier 1 uses ~20MB. Tier 2 adds ~50MB. Tier 3 adds ~30MB. All three together ~100MB — well within 2.5GB available.
Risks / Failure Modes
- Tailscale service dependency: If Tailscale goes down, GUI is unreachable. But SSH would also be down in that case (tailnet-based).
- Python HTTP server is single-threaded: Fine for 1-2 concurrent viewers. Not for production scale. Acceptable for MVP.
- Static page staleness: Generated page shows snapshot, not live data. Mitigation: regenerate on cron (every 5 min) or on page load (CGI).
- Forgejo binary extraction: Docker must be running to create a container for extraction. One-time operation.
- Port conflicts: Must avoid ports already in use (22, 139, 445, 8642, 3000-3002 when Docker runs).
Decision Needed From Mehdi
- Deploy Tier 1 (Tailscale Serve + Python HTTP + static status page) now?
- Generate the static HTML generator script, or just serve the wiki directory as-is for browsing?
- Extract Forgejo binary for native running (Tier 2)?
- Install tmux for ttyd option (Tier 3)?
Next Probe
Deploy Tier 1: write a status page generator script, serve it with python3 -m http.server + tailscale serve --bg, verify the ts.net URL works from Mac browser.