Flash Your Badge
You have a BadgePirates badge in your hand. You want to:
- Update it to the latest firmware
- Switch it to a different firmware (e.g. ESP32Marauder, a different conference's build)
- Recover from a brick
- Hack on the source and load your own build
This page covers all four. The easy path is the browser flasher — most badges are USB-C, plug in, click flash, done. The recovery and dev-mode paths are below if the easy path fails.
The easy way: web flasher (Chrome / Edge / Brave)
- Plug your badge into your computer via USB-C.
- Open https://firmware.badgepirates.com in a Chromium-based browser (Chrome, Edge, Brave). Web flashing requires the WebSerial API; Firefox and Safari don't support it.
- Pick your badge from the list (BSidesKC 2026, CactusCon 14, etc.). Each has a manifest of the firmware variants we publish — production, debug, Marauder where available.
- Click Connect. A serial port picker pops up; pick the one labeled with your badge's chip (usually shows up as a USB JTAG/serial device or
cp210x/ch340). - Click Install and watch the bar. It takes 30–90 seconds depending on the firmware size.
- When it finishes, the badge reboots into the new firmware.
If the badge doesn't show up in the picker:
- Try a different USB-C cable. Cheap charge-only cables don't carry data and are by far the most common cause of "the badge doesn't appear."
- Try a different USB port (some hubs cause issues; direct-to-laptop is most reliable).
- On Windows, you may need the CP210x or CH340 driver depending on the badge. Both are free downloads from Silicon Labs / WCH.
- On macOS, the device should show up automatically as
/dev/cu.usbserial-*or/dev/cu.usbmodem*.
When the easy way doesn't work: esptool
If the browser flasher can't talk to your badge — usually because the badge is in a wedged state — drop down to esptool.py, the official Espressif command-line flasher.
# install (one-time)
pip install esptool
# put the badge into download mode (most BP badges):
# 1. Hold the BOOT button
# 2. Press and release RESET
# 3. Release BOOT
# (Some badges auto-enter download mode when esptool talks to them. Try without the manual dance first.)
# erase + reflash from a downloaded .bin
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 460800 erase_flash
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 firmware.bin
You can grab the same .bin files the web flasher uses from s3://badgepirates-firmware/ (URLs are in each badge's manifest.json — view-source the firmware page to see them, or check the esp32-flasher repo).
OTA: updating without a cable
The BSidesKC 2026 firmware (and any badge that ships with the OTA module enabled) supports over-the-air updates. From the badge:
- Settings → WiFi → connect to a network
- Settings → Updates → Check for Update
- If a new version is available, the badge pulls it from S3 and reboots into the new firmware automatically.
OTA only updates within the same firmware family — it won't switch a CC14 badge to BSidesKC 2026 firmware, or to Marauder. For cross-firmware switches, use the web flasher.
Dev mode: load your own code
The badges are stock ESP32-S3s. If you want to flash your own builds:
- PlatformIO: works out of the box. Use the appropriate
board = esp32-s3-devkitc-1(or matching variant) and the pin map from ESP32-S3 Platform Reference. - ESP-IDF: same — use
idf.py set-target esp32s3and configure the pins. - Arduino IDE: install the ESP32 board package (Espressif), pick "ESP32S3 Dev Module," set Flash Size to 16MB, USB Mode to Hardware CDC and JTAG (or USB-OTG depending on what your sketch uses).
The KiCad project files for each badge are public — see the Catalog for links per badge.
Recovering a brick
If your badge is stuck in a boot loop or won't enumerate:
- Hold BOOT and tap RESET to force download mode.
- From a terminal, run
esptool.py --chip esp32s3 --port <port> chip_id. If esptool can talk to it, the badge isn't bricked — just confused. Reflash with the production firmware. - If esptool can't connect at all, the bootloader may be corrupted. Hold BOOT, plug in, release BOOT after 2 seconds — this enters the ROM bootloader, which always exists. Then reflash.
- If the chip itself is fried (rare — usually requires reverse polarity or shorting power rails), the badge needs replacement. Open an issue on the relevant badge's repo or ping us in Discord.
Need help?
Join the Discord — #firmware-help is the right channel. Bring the badge name, your OS, and the exact error message you're seeing.