Built a remote control for the AI agents living on my garage
The garage server has been humming along for months: a refurbished OptiPlex running Ubuntu, 32 GB RAM, a single 3060. It's perfect for Claude Code, Codex, OpenCode, and Hermes sessions that run for hours. What wasn't perfect was the workflow — every time I wanted to check a long-running task or nudge an agent, I'd open Termius, authenticate, tmux attach, scroll back, type, detach. On a phone? Forget it.
The stack is boring on purpose: Go 1.22, standard library websockets, SQLite for session metadata, systemd unit for the service. Frontend is Vite + React + Tailwind, compiled to a single static binary via
Missing pieces I'm tackling this month: macOS/iOS builds (code-signing is the blocker), a Tailscale/WireGuard toggle so you don't need to expose port 8080, and agent-specific keybindings — Codex loves Ctrl-C, Claude Code prefers Ctrl-D.
So I wrote Relay. It's a tiny Go backend that sits on the Linux box and a React frontend that runs anywhere — browser, Android, Windows (macOS and iOS builds are next). The backend speaks the native protocols of each agent: Anthropic's CLI for Claude Code, OpenAI's for Codex, OpenCode's own socket, Hermes via its HTTP API. No wrapper scripts, no polling hacks. You log in once, pick an agent, and you're looking at a live terminal that survives device swaps.
What changed day-to-day:
- Session persistence — start a refactor on the desktop, walk away, pick up the exact same scrollback on the phone at the coffee shop. The tmux session never dies unless you kill it.
- File round-trips — drag a log file down, edit a prompt template up. Works over the same WebSocket tunnel, no scp needed.
- Quota glance — one click shows Anthropic/OpenAI token burn for the current billing cycle. Saved me from two surprise $0.00 weeks already.
- Credentials stay home — API keys, SSH keys, git credentials never leave the backend. The frontend is just a viewport.
The stack is boring on purpose: Go 1.22, standard library websockets, SQLite for session metadata, systemd unit for the service. Frontend is Vite + React + Tailwind, compiled to a single static binary via
go:embed. Total binary size ~12 MB. MIT licensed, repo at github.com/relay-sh/relay.Current platform matrix:
- Backend: Linux only (amd64/arm64)
- Frontend: Web (any browser), Android APK, Windows .exe
- Agents tested: Claude Code, Codex, OpenCode, Hermes
Missing pieces I'm tackling this month: macOS/iOS builds (code-signing is the blocker), a Tailscale/WireGuard toggle so you don't need to expose port 8080, and agent-specific keybindings — Codex loves Ctrl-C, Claude Code prefers Ctrl-D.
If you've got a box collecting dust and a subscription to any of these agents, it's a 5-minute curl | bash to try. Would love to hear what breaks on your hardware.
Story tracker · related coverage
Does anyone actually care about llms.
14h ago
Codex Dream Skin lets you customize your desktop UI
17h ago
AI is making every side project feel like meaningless slop
1d ago
HarnessRouter makes it way easier to switch between Claude Code
1d ago
Codex weekly limits are disappearing way too fast for me
1d ago
GitHub PRs are completely falling apart under the weight of
2d ago
Free AI toolbox — all free to use
Detailed breakdowns of putting AI to work are in a guide to making money with AI, with plenty of directly applicable cases.
All Replies (3)
A
AlexTinkerer
Advanced
1h ago
Thanks for sharing! What does it do exactly? Always on the lookout for lightweight tools that don't phone home.
0
N
C