A passive counter-surveillance detector for the Seeed XIAO ESP32S3 and the dual-band ESP32-C5. It sits in one place, learns what is normally there, and reports what is new.
Two boards can share a chip and still need different firmware: a XIAO ESP32-C5 and a Waveshare C5 put different LEDs on the same pin, and only one of them has a UART bridge. Three boards here are C5s, and one of those is a 2.8" Cheap Yellow Display — which looks exactly like the plain-ESP32 one, so go by the chip marking rather than the shape of the board. The installer still checks the chip, so choosing a profile for the wrong chip is refused rather than flashed; this picker is for telling apart boards that share one.
The installer failed to load: This is a fault with this page, not with your browser or your board.
Please open an issue. In the meantime the firmware can be flashed from a terminal. The commands are further down this page.
Brave blocks Web Serial by default: this is a Brave setting, not a fault with your board or this page. Brave ships the capability and gates it.
Open this address, set Serial API to Enabled, then relaunch Brave and reload this page:
brave://flags/#brave-web-serial-api
Brave links cannot be clicked from a web page, so copy that line into the address bar. If the flag is not there, your Brave is older than the setting. Update it, or use Chrome or Edge for the two minutes this takes.
Plug the board in over USB-C first. It appears as a serial device on its own, with no driver and no button to hold. Choose your board above; the installer checks the chip as well, and refuses a mismatch.
C5 boards have two USB-C ports: a native one and a UART bridge. Either flashes, and the log appears on both.
The installer connects to the board and asks it what it is running.
You will only see “Erasing device” if you ticked that box. If you see it without having done so, that is a bug — please tell us.
After the firmware is written the board restarts, and a moment later the installer offers to connect it to Wi-Fi. Pick your network, type the password, and the board joins it and tells you its address. That step is the one thing this page can do that a bare terminal cannot, so it is worth waiting for.
If the Wi-Fi step never appears, the board most likely did not restart into the firmware after flashing. Unplug it, plug it back in, and press Install again: the second time it will find Observore running and go straight to Wi-Fi. This is a quirk of the chip's own USB port rather than anything you did, and the XIAO ESP32-S3 in particular is prone to it.
Each device generates its own console password on first boot and prints it on the serial log, and it is the only place it appears:
console SoftAP: "console-XXXXXX" password: xxxxxxxxxxxx
Use Logs & Console on the button above to read it without any other software. It is both the Wi-Fi password for the device's setup network and the password that unlocks its web console, so it is worth writing down before you close this page.
console-XXXXXX Wi-Fi network with that password and open
192.168.4.1.The full walkthrough, and an honest list of what this device cannot see, is in the README.
Every release carries a bootloader, partition table and
application for each supported chip, named with the target, plus a
SHA256SUMS. The bootloader offset differs per chip, so these
are not interchangeable.
# Seeed XIAO ESP32S3
esptool.py --chip esp32s3 -p /dev/ttyACM0 write_flash \
0x0 bootloader-xiao-esp32s3.bin \
0x8000 partition-table-xiao-esp32s3.bin \
0x10000 ota_data_initial-xiao-esp32s3.bin \
0x20000 observore-xiao-esp32s3.bin
# ESP32-C5-DevKitC-1 / Waveshare
esptool.py --chip esp32c5 -p /dev/ttyACM0 write_flash \
0x2000 bootloader-devkit-esp32c5.bin \
0x8000 partition-table-devkit-esp32c5.bin \
0x10000 ota_data_initial-devkit-esp32c5.bin \
0x20000 observore-devkit-esp32c5.bin
# Seeed XIAO ESP32-C5
esptool.py --chip esp32c5 -p /dev/ttyACM0 write_flash \
0x2000 bootloader-xiao-esp32c5.bin \
0x8000 partition-table-xiao-esp32c5.bin \
0x10000 ota_data_initial-xiao-esp32c5.bin \
0x20000 observore-xiao-esp32c5.bin
# Seeed XIAO ESP32C6
esptool.py --chip esp32c6 -p /dev/ttyACM0 write_flash \
0x0 bootloader-xiao-esp32c6.bin \
0x8000 partition-table-xiao-esp32c6.bin \
0x10000 ota_data_initial-xiao-esp32c6.bin \
0x20000 observore-xiao-esp32c6.bin