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