claude-monitor

A desk status light for Claude Code on the M5Stack AtomS3R (ESP32-S3) and Tab5 (ESP32-P4). Firmware v1.4.0.

Plug the AtomS3R into a USB-C cable and click the button. Works in Chrome and Edge (Web Serial); Firefox and Safari cannot talk to serial ports.

This browser has no Web Serial: use Chrome or Edge, or flash with esptool as described in the README. This page must be served over HTTPS for Web Serial to work.
  1. A board that has never been flashed may need download mode: hold the side reset button for about 2 seconds before clicking, until the screen goes dark.
  2. On Windows, if the claude-monitor daemon is already running it owns the port. Free it first: Invoke-RestMethod -Method Post http://localhost:47831/release, then flash within two minutes.
  3. When the browser asks, pick the port named USB Serial Device or USB JTAG/serial debug unit.
  4. After the reset the screen shows a green check. Next: set up the daemon and the Claude Code hooks, see the README.

Tab5 (ESP32-P4)? This page flashes the AtomS3R only. The Tab5's images are attached to the same release; write the three parts with esptool (pip install esptool), with the bootloader at 0x2000 as the ESP32-P4 expects, then set up the daemon as for the cube:

python -m esptool --chip esp32p4 -p COM7 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x2000 claude-monitor-tab5-v1.4.0-bootloader.bin 0x8000 claude-monitor-tab5-v1.4.0-partition-table.bin 0x10000 claude-monitor-tab5-v1.4.0.bin

Replace COM7 with the tablet's port (/dev/ttyACM0 on Linux, /dev/cu.usbmodemXXXX on macOS). No button needed: esptool resets it into download mode over USB.

The files written here are the bootloader, partition table and app attached to the GitHub release, each at its own offset, so a calibration stored on the device survives an update. Tick Erase device in the dialog to start from a blank flash instead. Sources, protocol and hook mapping: github.com/icefoxj/claude-monitor.