I turned an M5Stack Cardputer-Adv into a physical control surface for an AI coding agent (Claude Code) over BLE + MCP. Built on top of cardputer-claude-os. [image: device.jpg] Physical approval gate — a hook routes the agent's shell commands and file edits to the Cardputer. Read-only commands pass through; ordinary ones take a single Enter on the device; destructive ones (rm -rf, git push, sudo, editing secrets) need a sustained hold-Y gesture that prompt-injection can't fake. If the device is away, it falls back to the terminal — the Cardputer is an optional gate, never a dependency. Ordinary action — one Enter: [image: approve.jpg] Destructive action — hold Y for ~3s: [image: danger.jpg] Other bits Always-on usage dashboard: today's spend, 5h/7d subscription utilization, battery %, and a resident pixel-crab mascot. notify / ask / confirm tools so the agent can buzz a banner, ask a multiple-choice question, or demand confirmation. Notes for fellow Adv owners The Adv's ES8311 codec only makes sound if your main loop calls M5.update() every iteration — took me a while to track down. The app is big, so it ships as compiled .mpy (source-form import OOMs the launcher), deployed into the cardputer-claude-os launcher bundle. Code (MIT) + setup: https://github.com/loml13/cardputer-claude-mcp Feedback welcome