Are my firmware files uploaded?
No. Files are read in your browser and sent only to the board over the USB serial connection.
Flash ESP32, S2, S3, C3, C6 and H2 firmware from the browser with esptool-js: chip detection, offset presets, overlap and chip-mismatch checks, erase, and MD5 verification.
Loading ESP32 Flasher…
Loading ESP32 Flasher…
Flashing an ESP32 usually means installing Python and esptool, or the Arduino IDE, just to write a few files to a board. This page does it from the browser using esptool-js, Espressif's JavaScript port of esptool, over Web Serial. Connect, and it resets the board into the bootloader, identifies the chip (ESP32, S2, S3, C2, C3, C5, C6, H2 or P4), and reads its MAC address, flash size and features. Add one merged .bin or the separate bootloader, partition table, boot_app0 and application files, pick a layout preset, and the offsets are filled in for that chip. Before anything is written, the tool checks every file: overlapping address ranges, files that run past the end of the flash, a bootloader at the wrong offset for the connected chip, and images compiled for a different chip are all blocked with an explanation. Flashing shows progress per file, verifies each region with an MD5 checksum computed by the chip, and hard-resets the board so the new firmware starts. Firmware files are read locally and written to the board over Web Serial; nothing is sent to a server.
The second-stage bootloader lives at 0x1000 on ESP32 and ESP32-S2, at 0x0 on ESP32-S3, C2, C3, C6 and H2, and at 0x2000 on ESP32-C5 and P4. The partition table is at 0x8000, Arduino's OTA data (boot_app0.bin) at 0xE000, and the first app partition usually at 0x10000. A merged image already contains everything at the right place and goes at 0x0.
ESP images start with the magic byte 0xE9 and an extended header that records the target chip ID. The tool reads it to detect bootloaders, applications and merged images and the chip they were built for; partition tables are recognized by their 0xAA50 magic.
esptool-js loads a small flasher stub into the chip's RAM, switches to the chosen baud rate, writes compressed data, and then asks the chip for the MD5 of each written region, which is compared with an MD5 computed locally. After writing, it toggles RTS to reset into the new firmware.
Because the ROM bootloader can't be erased, an interrupted flash only leaves invalid data in flash. Holding BOOT while resetting enters download mode again. Boards with native USB (S2, S3, C3, C6) re-enumerate after reset and may appear as a different port.
Short answers for the things developers usually ask before trusting a tool.
No. Files are read in your browser and sent only to the board over the USB serial connection.
Practically no. The first-stage bootloader is in ROM and can't be overwritten, so a failed or interrupted flash can always be redone: hold BOOT, tap RESET, and flash again. What you can lose is data — "Erase entire flash" also wipes saved Wi-Fi credentials, NVS and filesystems. (Burning eFuses, which this tool never does, is the only truly irreversible operation.)
For a merged binary (one .bin file, e.g. from esptool merge_bin or the Arduino "Export compiled binary" merged output) use 0x0. For separate files: the bootloader goes at 0x1000 on ESP32 and ESP32-S2, and at 0x0 on ESP32-S3, C3, C6 and H2; the partition table at 0x8000; Arduino's boot_app0.bin at 0xE000; and the application at 0x10000. The presets fill these in for the connected chip, and flashing is blocked if a bootloader is at the wrong address.
Put the board in download mode by hand: hold the BOOT (IO0) button, press and release EN/RESET, then release BOOT, and connect again. Also check the cable (many are charge-only), that no serial monitor has the port open, and on Windows that the CP210x or CH340 driver is installed. If flashing fails partway, try a lower baud rate.
Desktop Chrome and Edge 89+ and other Chromium-based browsers, because flashing needs Web Serial. Firefox, Safari and mobile browsers can't flash, but can still use the tool to check file offsets.
ESP firmware images record which chip they were compiled for. Flashing an ESP32 image to a C3 (or vice versa) will not boot, so the tool blocks it. Rebuild for the right target (in Arduino, select the matching board; in ESP-IDF, idf.py set-target).
Useful follow-ups when one conversion usually turns into three more.
Convert PNG, JPG, BMP or GIF images into C byte arrays for SSD1306/SH1106 OLEDs and TFT displays — 1-bit, RGB565 and grayscale — with a preview rendered from the bytes.
A serial monitor and plotter in the browser for Arduino, ESP32 and any USB-serial device: baud presets, DTR/RTS reset, text or hex, send, filter, timestamps and log export.
Calculate CRC-8, CRC-16 (Modbus, CCITT, XMODEM), CRC-32 and custom CRCs over text, hex bytes or files, with wire byte order and generated C code.