The One Step No Script Can Skip.

The m5-onboard skill detects, identifies, flashes and installs an M5Stack ESP32 board with one command. The video explains why one step, the button sequence on native USB boards, always stays with a person.

2:23 video3 min readWatch on YouTube

Someone might assume one script can flash a board with zero exceptions. This video, about the m5-onboard skill for Claude Code, shows why that is not quite true. A single command handles the whole cold-start provisioning of an M5Stack ESP32 board, with one step that stays a human job: the button dance.

One command, four stages

The whole workflow runs through one command, onboard.py with the apps option set to buddy. Underneath are four stages.

  • Detect finds the board over USB. The port name differs by system: usbmodem on macOS, ttyACM or ttyUSB on Linux, and COM on Windows. It then confirms the actual chip.
  • Identify checks hardware signatures for a likely firmware match, but the final choice is always stated explicitly, never guessed.
  • Flash writes the firmware itself.
  • Install copies the real program files onto the board and restarts it.

Two smaller tools cover narrower jobs: pushing just the app bundle to a board that is already flashed, and running a hardware check afterward.

Three things that matter in practice

First, two boards share the exact same USB signature, so the script cannot tell them apart on its own. Guessing the variant wrong makes the device boot-loop. Second, a full run takes two to three minutes, so it goes in the background with its output streamed to a log file, since a silent terminal for three minutes looks exactly like a crash. Third is the flash step itself on boards that connect over native USB.

The button dance

On native USB boards there is no software line the script can pulse to reset the chip into flashing mode, so the reset is physical. You hold one button, tap reset while still holding it, hold for one more second, then let go. The script waits for the person to actually do that.

Native USB versus a bridge chip

The physical step is not universal. It is needed only because native USB boards have no control line to pulse, so the standard software trick of toggling two control lines does nothing there. Boards that connect through a separate USB-to-serial bridge chip skip the button dance entirely, because the same software trick works normally and the flash runs without anyone touching the board. The command is the same; the path depends on which USB hardware is inside.

Key takeaways

  • One command, onboard.py with the buddy app, runs detect, identify, flash and install.
  • Identify never guesses the firmware variant, because two boards share a USB signature and a wrong guess causes a boot loop.
  • A full run takes two to three minutes, so it runs in the background with a log file.
  • Native USB boards need a manual button sequence to enter flashing mode.
  • Boards with a USB-to-serial bridge chip flash hands-off.
  • The script can do every stage but one; no flag replaces a thumb.

Try it yourself

Paste this into Claude: you are using the m5-onboard skill to set up a new M5Stack board, and before running anything it should tell you exactly which stage needs you to physically touch the device and what the button sequence is. Then watch whether Claude names the button dance before it starts, or just launches the script and waits.

Chapters

  1. 0:00The naive framing: "zero exceptions?"
  2. 0:11One command, four stages
  3. 0:47The button dance
  4. 1:22Native USB vs. bridge
  5. 1:51Carry-out
  6. 2:01Your turn
  7. 2:20Outro
Full transcript(auto-generated, with timestamps)

The naive framing: "zero exceptions?"

[0:00]Someone assumed one script flashes this board with zero exceptions. It doesn't. The button dance is the one exception done by hand. So, flash my board with one script, one exception. The whole workflow runs through one

One command, four stages

[0:12]Command on board Pi apps buddy. Underneath that's four stages. Detect finds the board over USB. The port name differs by system. Usbmodem on Mac OS, TTYACM or TTYUSB on Linux, COM on Windows, then confirms the actual chip. Identify checks hardware signatures for a likely firmware match, but the final choice is always stated explicitly, never guessed. Flash writes the firmware itself. Install copies the real program files onto the board and restarts it. Two smaller tools exist for narrower jobs, pushing just the app bundle to a board that's already flashed or running a hardware check afterward. Three things

The button dance

[0:47]Matter once you're actually running this. First, two boards share the exact same USB signature, so the script can't tell them apart on its own. Guess the variant wrong and the device boot loops. Second, a full run takes two to three minutes, so it goes in the background with its output stream to a log file. A silent terminal for three minutes looks exactly like a crash. Third, the flash step itself on boards that connect over native USB. There's no software line the script can pulse to reset the chip into flashing mode, so it's a physical dance. Hold one button, tap reset while still holding it, hold one more second, then let go. The script waits for person to actually do that. That physical step

Native USB vs. bridge

[1:23]Isn't universal. It's needed only because native USB boards have no control line the script can pulse to force a reset. The standard software trick toggling two control lines is simply a no-op there. Boards that connect through a separate USB serial bridge chip skip the button dance entirely. That same software trick works normally and the whole flash step runs through without anyone touching the board. Same script, same command. Which path it takes depends entirely on which USB hardware happens to be inside. One

Carry-out

[1:51]Script can detect, identify, flash, and install this board every stage but one. The button press stays a human's job. No flag replaces a thumb. Your turn, paste

Your turn

[2:01]This into Claude. I'm using the M5 on board skill to set up a new M5 stack board. Before you run anything, tell me exactly which stage needs me to physically touch the device and what that button sequence actually is. Then watch, does Claude name the button dance before it starts or does it just launch the script and wait? The one step no script can skip, lay them in for bear.

More from Extending Claude — Skills, Plugins & Connectors

Humanitarians AI Lyrical Literacy Project