1Connect over USB
Only the speed of this conversation with the bootloader — it has nothing to do with the baud rate your firmware uses. If a read fails partway, come down to 115 200.
Plug the board in over USB, then click Read chip info and pick the serial port.
If the chip isn't detected, hold BOOT while connecting.
The board is reset and left running when the read finishes.
2What the chip says
3What's flashed
Partition table · read from 0x8000| Label | Type | Subtype | Offset | Size | Flags |
|---|
You know what's on it. Now update it from anywhere.
Reading a version over a USB cable is fine for the board on your desk. It stops being fine at the tenth board, in a cabinet, in another building. Synacl turns this ESP32 into a managed gateway: you can see its firmware version, push an update over the air, and keep its Wi-Fi and settings through the upgrade.
- OTA with settings kept. The same two-slot layout this page just read, driven from a dashboard instead of a cable.
- Version and rollback history per gateway, so "which build is that one on?" is a glance, not a trip.
- Open-source firmware for any ESP32 you already own — flash it from the browser.
- Free for five devices. No card, no sales call.
What it reads, and where each number comes from
Everything on this page is read straight off the chip by Espressif's own esptool-js, running in this tab. There are three layers, and it is worth knowing which is which, because they can disagree:
- The chip itself. Type, revision, features, crystal, MAC and the flash chip's JEDEC id come from eFuses and from the SPI flash's own identity command. This is hardware; firmware cannot fake it.
- The partition table at
0x8000, up to0xC00bytes of 32-byte records. Each one carries a magic word, a type and subtype, an offset, a size, a 16-character label and a flags word whose bit 0 means the partition is encrypted. - The application images. Each app partition starts with a 24-byte
esp_image_header_t— magic0xE9, segment count, flash mode and size, entry address and the chip id the image was built for — and ESP-IDF puts a 256-byteesp_app_desc_tat offset0x20holding the project name, version, ESP-IDF version, build date and time, secure-version counter and the SHA-256 of the ELF it came from.
The one piece of arithmetic is the OTA slot. The otadata partition holds two copies of a record: a sequence number, a state and a CRC-32 of that sequence number. The bootloader takes the highest sequence number whose CRC is right and runs slot (seq − 1) mod n, skipping any copy marked INVALID or ABORTED. This page shows both copies, the CRC it expected, and the sum it did — so if the board is booting something you did not expect, you can see why instead of guessing.
A useful sanity check: if the image's chip id does not match the chip you are plugged into, the board will not boot that image, and the page says so loudly. That is the usual explanation for an ESP32-S3 sitting in a boot loop with a perfectly good-looking firmware.bin on it.
Questions people ask before plugging a board in
The short version: it reads, it never writes, and nothing about your board reaches us.
Does this tool write anything to my board?
No. It only reads. It talks to the ROM bootloader, asks the chip to identify itself, reads a few kilobytes of flash, and then resets the board so it runs again. Nothing is erased, flashed or reconfigured, and no partition is modified.
If you want to write firmware, that is the separate web flasher.
What gets uploaded when I read a board?
Nothing you type or read leaves your browser. The only network request the tool makes is one anonymous ping (a GET to /tools/_/…, no cookies, no identifiers) when a decode or read succeeds, so we know the tool is used.
The firmware version, MAC address and partition layout stay in the tab. The copy and download buttons hand them to you, not to us.
Which browsers and boards does it work with?
It needs the Web Serial API, which today means Chrome, Edge, Opera or another Chromium browser on a desktop. Firefox, Safari and mobile browsers do not have it.
Any ESP32 family chip works — ESP32, S2, S3, C2, C3, C5, C6, C61, H2, P4 — over a USB-UART bridge or native USB. The ESP8266 is detected and identified, but it has no partition table or OTA descriptor to read, so the deep read is skipped.
It says it could not connect, or the read failed halfway.
Hold the BOOT button while you click Read chip info and release it once the chip is detected; some boards also need a tap of EN or RST.
If the chip is found but reading flash fails, drop the baud rate to 115200 — a long or unpowered USB cable often will not survive 460 800. Close anything else holding the port, such as the Arduino Serial Monitor or a PlatformIO monitor: only one program can open a serial port at a time.
How does the ESP32 decide which app to boot?
By reading the otadata partition, which holds two 32-byte copies of a record containing a sequence number, a state and a CRC-32 of that sequence number. The bootloader takes the highest sequence number whose CRC checks out and boots OTA slot (seq − 1) mod n, where n is the number of OTA app partitions.
A copy marked INVALID or ABORTED is skipped — that is how rollback works. If neither copy is valid, or there is no otadata partition at all, the bootloader runs the factory app. This page shows both copies and the exact arithmetic it used, so you can check the answer rather than trust it.
Why does a partition show no project name or version?
Because the version comes from esp_app_desc_t, a 256-byte structure ESP-IDF places at offset 0x20 of the application image. Projects built with ESP-IDF or Arduino-ESP32 always have it; a raw image, a bootloader-only flash or an image from a different toolchain may not.
An OTA slot that has never been written simply reads 0xFF and is reported as empty — which is normal for the second slot on a board that has never taken an update. The tool says which of those it found rather than inventing a version.