Chorus Badge

A little round screen that listens to the room. Ten of them, all watching the same beat, all drawing the same thing at the same time. This page is how it gets better.

This browser can’t talk to USB devices. Flashing needs WebSerial, which only Chrome or Edge on a desktop computer have. Firefox and Safari don’t support it, and neither does any browser on iPhone or iPad. Open this page in Chrome and the button will appear. This page needs to be served over HTTPS. Browsers only allow USB access from a secure origin (or from localhost). If you got here over plain http://, try the https:// version of the same address.

Plug the badge in with a USB-C data cable, press the button, and pick the port that appears. Takes about a minute.

Everything below still applies — you just need Chrome or Edge to run it.

What you’re holding

An ESP32-S3 with a 1.28″ round colour display. It has no buttons you need, no app, and no account. It wakes up, finds the other badges over a direct radio link (ESP-NOW — no wifi, no router, no internet), and they agree on what the music is doing. Then they all draw it.

It runs off USB power or a small battery. If it ever stops doing anything interesting, come back to this page and give it a new brain.

Flashing it

  1. Use Chrome or Edge, on a laptop or desktop. Firefox and Safari can’t do this. Phones and tablets can’t either.
  2. Plug the badge into your computer with a USB-C cable. It has to be a data cable. Plenty of USB-C cables only carry power — those look identical and will silently do nothing.
  3. Press Connect & flash and choose the badge from the list your browser shows. It usually shows up as a USB serial device. If there’s only one entry, that’s it.
  4. Wait. The screen may go dark while it writes. Don’t unplug it. When it finishes, the badge restarts on its own and the display comes back.

If the board doesn’t show up

The recovery gesture

There are two tiny buttons on the board, BOOT and RESET. This sequence forces the chip into download mode, where it will always accept a flash even if the firmware on it is completely broken:

hold BOOT → tap RESET → release BOOT

Do that with the cable plugged in, then press Connect & flash again. The port will reappear. This is the fix for almost everything.

No ports appear at all in the browser’s picker

Nine times out of ten this is the cable. Swap it for one you know moves data (the one that came with a phone or a hard drive, not a charger-only cable) and try a different USB port — ideally one directly on the machine, not through a hub or a dock.

If you’re on Windows and still nothing, you may need the USB-serial driver for the board’s bridge chip. Look in Device Manager for an unknown device while the badge is plugged in; the name it shows tells you which driver (CH34x or CP210x) to install.

The port appears but connecting fails or times out

Something else already has the port open — a serial monitor, the Arduino IDE, PlatformIO, a terminal running screen. Close it and retry.

Otherwise: do the recovery gesture above, then connect without unplugging.

It flashed, but the screen stays dark

Give it ten seconds — the first boot after a flash sets up the display and can be slow. If it’s still dark, unplug and plug it back in.

If it’s dark every time, flash it again and choose Erase device when the installer offers. That wipes leftover settings from the previous firmware, which occasionally confuse a fresh build.

It works, but it isn’t syncing with the other badges

All the badges need to be on the same firmware version to agree on the protocol. Flash them all from this page, then power-cycle them together. They find each other in a few seconds — there is nothing to pair.

I’d rather do this from a terminal

Each release ships a single merged image alongside the split parts. With esptool installed:

esptool.py --chip esp32s3 --port /dev/ttyACM0 \
  write_flash 0x0 merged.bin

The individual parts and their offsets are listed below if you’d rather flash them separately, and manifest.json is the machine-readable version of the same thing.

Flash layout

For the curious and for anyone rebuilding this. These are ESP32-S3 offsets — note the bootloader sits at 0x0, not at 0x1000 the way it does on the original ESP32.

offsetimagewhat it is
0x0000 bootloader.bin second-stage bootloader
0x8000 partitions.bin partition table
0xe000 boot_app0.bin OTA selector — points at app0
0x10000 firmware.bin the badge itself