Personal build · MIT source AI dev tooling

ArcBench.

AI coding agent · remote-controlled

Drive a full Claude-powered coding agent from your phone. The desktop does the heavy lifting; your phone is a clean remote with voice input, streaming diffs, and per-hunk approve/reject — over a zero-config encrypted mesh.

Python · FastAPI Aider Flutter WebSockets Tailscale / WireGuard Claude API
Desktop host · 24/7 FastAPI + Aider
branch session/3f8a
● running · :8000
owens-mbp.tail-net ArcBench
🎙 voice Add rate limiting to the /sessions endpoint
backend/main.py streaming
@app.post("/sessions") async def create_session(req): + await limiter.check(req.client) + if limiter.exceeded: + raise HTTPException(429) s = Session.new()
Session tokens1.2k · $0.03
01 Architecture

Your laptop runs the agent. Your phone runs you.

A 24/7 desktop host pairs with a mobile remote over a private WireGuard mesh — no cloud relay, no port-forwarding, no exposed servers. Just your two devices, end-to-end encrypted.

1 DESKTOP HOST

FastAPI + Aider

A Python service runs your repo 24/7. It calls the Claude API, drives Aider to edit code, and opens a fresh git branch per session so every change is isolated and reversible.

2 THE MESH

Tailscale / WireGuard

Phone and desktop join one private network. The remote talks to the host over WebSocket + REST, authenticated with an API key — encrypted, zero-config, works from anywhere.

3 MOBILE REMOTE

Flutter app

Hold to speak a prompt, watch diffs stream in with syntax highlighting, then approve or reject per hunk. Offline prompts queue and auto-send on reconnect.

02 What it does

A coding agent that respects your review.

Voice-first input

Hold the mic, dictate the change, release to send. Speech-to-text on device; no typing on a phone keyboard.

Streaming diffs

Edits arrive in real time, syntax-highlighted, hunk by hunk — so you watch the agent think, not just the result.

Per-hunk approve / reject

Expand each file, accept the good changes, reject the rest. Nothing touches your tree until you say so.

Git branch per session

Every session auto-branches. Apply commits the work, reject reverts it, undo soft-resets the last commit.

Offline queue

Lose signal mid-prompt? It queues locally and fires the moment the WebSocket reconnects.

Cost & token tracking

Per-prompt and per-session token counts with live cost, plus configurable budget warnings.

03 The backend

A clean API behind the remote.

FastAPI serves REST for session lifecycle and a WebSocket channel for live streaming — every endpoint key-authenticated.

GET/statushealth + server info
POST/sessionscreate · auto-branches git
GET/sessions/{id}detail + history
POST/sessions/{id}/applycommit changes
POST/sessions/{id}/rejectrevert changes
POST/sessions/{id}/undosoft-reset last commit
GET/usagetoken + cost breakdown
WS/wslive diff stream
04 Engineering

How it's built.

Desktop host

LanguagePython 3
ServerFastAPI · Uvicorn
AgentAider + Claude API
TransportWebSocket + REST
VCSgit branch / session
Runs asLaunchAgent / systemd

Mobile remote

FrameworkFlutter (Dart)
Stateproviders
RealtimeWS auto-reconnect
VoiceSTT + TTS
NetworkTailscale / WireGuard
LicenseMIT

Want the deeper walkthrough?

ArcBench is a personal build — happy to demo it live or talk through the architecture, the streaming protocol, and the trade-offs.