Claude Approver ๐Ÿ›Ž๏ธ

A little hardware bell that tells me when Claude is done thinking.

The Problem

I run a lot of long Claude Code tasks in the background. Builds, refactors, tests โ€” anything that takes more than a minute. The annoying part is the polling: am I done yet? Did it finish? Did it get stuck?

I needed a physical, in-the-room signal. Something I'd notice without staring at a terminal.

The Build

A tiny ESP32 XIAO S3 board running custom firmware, paired to my Mac over Bluetooth Low Energy. When Claude finishes a task โ€” or wants approval for something risky โ€” the device:

The Architecture

It's a small stack but it has more layers than you'd expect.

What I Learned

macOS does not let userspace apps write HID output reports to a bonded BLE keyboard โ€” IOKit blocks it for security. I burned an evening proving that, then pivoted the control channel to HTTP over WiFi, which works perfectly. That whole detour ended up being its own little research project.

Tech

ESP32 NimBLE Arduino MCP macOS PyObjC Python