- Flash an ESP32
- Supported boards
- Which file and address
- Upload HEX to Arduino
- Pico and micro:bit
- MicroPython, WLED, Tasmota
- Troubleshooting
- Serial monitor
- FAQ
How to flash an ESP32 from your browser
This ESP32 web flasher does the same job as esptool.py or the Espressif Flash Download Tool, but inside a web page. Your browser talks to the board over USB with the Web Serial API, so there is nothing to install, no Python and no drivers on most computers. It works the same way for ESP8266 boards like the NodeMCU and Wemos D1 mini.
- Pick your firmware file. Drop a .bin file for an ESP32 or ESP8266, a .hex file for an Arduino, or a .uf2 file for a Raspberry Pi Pico into step 1. The flasher reads the file and works out which board it is for.
- Plug in and connect your board. Plug your board into the computer with a USB data cable, press Connect board and pick it from the list your browser shows.
- Press Flash my board. Press Flash my board and wait for the green check. The flasher writes the firmware, checks it and restarts your board.
Before writing anything, the flasher reads your file, checks that it was built for the chip on your board (an ESP32-S3 file will not be written to an ESP32-C3), checks that it fits in the board's flash memory and works out the right flash address. After writing, the board itself checks every byte with an MD5 hash, and the flasher then restarts it so your new firmware starts running.
Boards you can flash
| Board | File | How it connects |
|---|---|---|
| ESP32, ESP32-S2, S3, C2, C3, C5, C6, C61, H2, P4 | .bin | Web Serial through the USB chip (CP2102, CH340, CH9102, CH343) or the chip's own USB port |
| ESP8266: NodeMCU, Wemos D1 mini, ESP-01, ESP-12 | .bin | Web Serial. ESP-01 modules need a USB adapter and GPIO0 held low |
| Arduino Uno, Nano, Pro Mini, Duemilanove | .hex | Web Serial, STK500 bootloader (Optiboot or the old Nano bootloader) |
| Arduino Mega 2560, RAMPS 1.4 3D printer boards | .hex | Web Serial, STK500v2 bootloader |
| Arduino Leonardo, Micro, SparkFun Pro Micro | .hex | Web Serial, AVR109 (Caterina) bootloader after an automatic reset |
| Raspberry Pi Pico, Pico W, Pico 2, RP2040 boards | .uf2 | Copied to the RPI-RP2 drive in BOOTSEL mode |
| Adafruit Feather, Circuit Playground, nice!nano | .uf2 | Copied to the …BOOT drive after a double-tap on RESET |
| BBC micro:bit V1 and V2 | .hex | Copied to the MICROBIT drive |
The Arduino Uno R4, Nano Every, Due, Nano 33 and other non-AVR Arduinos use different upload systems. Use the Arduino IDE or Arduino Cloud for those.
Which ESP32 .bin file do I pick, and at what address?
An ESP32 needs three things in its flash memory: a bootloader, a partition table and your app. A merged (or "factory") .bin has all three in one file and goes to address 0x0. That is the easiest file to flash, and it is what Arduino IDE 2 makes when you use Sketch → Export Compiled Binary (look for .merged.bin). If you only have separate files, drop them all at once and the flasher places each one:
| File | ESP32, ESP32-S2 | S3, C3, C6, H2, C2 | P4, C5 |
|---|---|---|---|
| Merged / factory .bin | 0x0 | 0x0 | 0x0 |
| bootloader.bin | 0x1000 | 0x0 | 0x2000 |
| partitions.bin | 0x8000 | 0x8000 | 0x8000 |
| boot_app0.bin (otadata) | 0xE000 | 0xE000 | 0xE000 |
| firmware.bin (app) | 0x10000 | 0x10000 | 0x10000 |
Those are the defaults. When you include partitions.bin or flasher_args.json, the flasher reads the real addresses from them instead, including where a SPIFFS or LittleFS file system image goes. An ESP8266 .bin from the Arduino IDE or PlatformIO always goes to 0x0. Turn on Expert mode to see and change every address, or to set the flash mode, frequency, size and upload speed yourself.
Upload a HEX file to Arduino Uno, Nano or Mega without the Arduino IDE
Sometimes you just want to put a ready-made program on an Arduino: a classroom of Chromebooks, a friend's project, or a Marlin update for a RAMPS 1.4 3D printer board. This page works as an online Arduino HEX uploader, an easy XLoader or avrdude alternative. Drop the .hex file, pick your Arduino in step 2 (or let it detect the board) and press Flash.
- Uno and newer Nanos use the Optiboot bootloader at 115200 baud.
- Older and clone Nanos often use the old bootloader at 57600 baud. If you see "not in sync" in the Arduino IDE, choose Nano (old bootloader) here.
- Mega 2560 boards, including RAMPS 1.4 and other Mega-based 3D printer controllers, use the STK500v2 bootloader at 115200 baud.
- Leonardo, Micro and Pro Micro restart into their bootloader with a 1200-baud "touch". The browser then asks you to pick the new port, and you have about 8 seconds to click it.
After writing, the flasher reads the whole program back from the board and compares it byte by byte. To make a .hex from your own sketch, use Sketch → Export Compiled Binary and pick the file without with_bootloader in its name. The bootloader can't overwrite itself, so a file that includes one won't flash.
Flash a Raspberry Pi Pico, Pico W or micro:bit
Boards like the Raspberry Pi Pico don't need a serial flasher at all: they pretend to be a USB stick. Hold the BOOTSEL button while you plug in the Pico and a drive called RPI-RP2 appears (RP2350 on a Pico 2). Copy a .uf2 file onto it and the Pico flashes itself and restarts. The BBC micro:bit always shows a MICROBIT drive and takes .hex files the same way.
Drop your .uf2 or micro:bit .hex in step 1. The flasher reads which chip the UF2 is for and shows the right steps. Then press Copy to board and save the file onto the drive, or download it and drag it there yourself. If your Pico is already running an Arduino sketch, the "put it in drive mode" button restarts it into BOOTSEL mode for you.
Install MicroPython, WLED, Tasmota, ESPHome or Meshtastic
Most popular open-source firmware comes as a ready-made .bin you can flash right here:
- MicroPython: download the .bin for your board from micropython.org/download. Tick Erase everything first, then flash. Afterwards, the serial monitor at 115200 shows the
>>>prompt. - CircuitPython: on ESP32-S2 and S3 boards, flash the TinyUF2 bootloader .bin once, then copy CircuitPython's .uf2 to the drive that appears. On other ESP32 boards, flash the CircuitPython .bin directly. Downloads are at circuitpython.org.
- WLED (LED strips): grab the
.binfor your chip from the WLED releases. A first install on an ESP32 also needs the bootloader, so tick Erase everything first and use a full image if one is offered. - Tasmota: use a
.factory.binfrom ota.tasmota.com for an ESP32, ortasmota.binfor an ESP8266. This makes the page an easy Tasmotizer alternative. - ESPHome: in the ESPHome dashboard choose Install → Manual download → Factory format, then flash that file here.
- Meshtastic: download the release zip, unzip it and flash the
-factory.bin(or the merged .bin) for your exact board.
Troubleshooting
"Failed to connect to ESP32: Wrong boot mode detected" or "No serial data received"
The ESP32 has to be in download mode to accept new firmware. Most boards switch automatically, but some, including many ESP32-CAM, ESP-01 and cheap clone boards, need help. Hold the BOOT button (also called IO0 or FLASH), press Flash my board, and let go once the progress bar moves. If that doesn't work, hold BOOT, tap EN or RESET, then let go of BOOT, and try again. The drawing on this page lights up the BOOT button when you need it.
"avrdude: stk500_getsync(): not in sync" or "programmer is not responding"
The Arduino bootloader didn't answer. Pick the right board type in step 2, because a Nano with the old bootloader won't answer at the Uno's speed. Then close the Arduino IDE, unplug anything wired to pins 0 and 1 (RX and TX), and try a different cable. If the flasher detects an Uno R4, Nano Every or another board that doesn't use a .hex upload, it says so.
My board doesn't show up in the list
Nine times out of ten it's a charge-only USB cable, so try another one first. Next, check the driver for the USB-to-serial chip next to the USB port: CH340 / CH341 and CH9102 / CH343 from WCH, CP2102 / CP2104 from Silicon Labs, or FTDI. Windows 10 and 11 install most of them automatically. On Linux, add yourself to the dialout group. Only one program can use a serial port at a time, so close the Arduino IDE and other monitors.
It flashed, but my board doesn't do anything
Press the board's RESET button once. ESP32-S2 and S3 boards flashed through their own USB port in download mode need that every time. If it still does nothing, you probably flashed only the app part to a board without a matching bootloader. Flash the merged .bin instead and tick Erase everything first. Then open the serial monitor at 115200 and restart the board: the boot messages usually say exactly what's wrong.
Flashing from a Chromebook, Mac or Linux
The Espressif Flash Download Tool only runs on Windows, and XLoader is Windows only too. This flasher runs anywhere Chrome or Edge does, including ChromeOS, so it works for school labs and makerspaces where you can't install software.
Online serial monitor
The serial monitor in the toolbox is a full web serial terminal: pick a baud rate, read what your sketch prints with Serial.println(), send commands back with your choice of line ending, add timestamps and save the log to a file. Use 74880 baud to read an ESP8266's boot messages, and press Restart board to see an ESP32 boot from the very first line. It's handy for debugging on computers without the Arduino IDE.
Private and safe by design
Everything happens on your computer. Firmware files are read by your browser and sent straight to the board, never uploaded to PrintPal. The browser only lets this page use the one serial port you pick, and only while the page is open. ESP flashing uses Espressif's open-source esptool-js library (Apache 2.0). The Arduino, UF2 and micro:bit support is built by PrintPal.
Frequently asked questions
Is this ESP32 web flasher free and safe to use?
Yes. It is free, needs no account and installs nothing. Your firmware file never leaves your computer: the page reads it in your browser and sends it straight to your board over USB with the Web Serial API. The flasher can only talk to the one port you pick, and it cannot touch other files on your computer.
Which browsers can flash an ESP32 or Arduino?
Google Chrome, Microsoft Edge, Opera and other Chromium browsers on Windows, macOS, Linux and ChromeOS. Safari, Firefox and iPhone or iPad browsers do not support Web Serial, so use one of the browsers above on a computer. Copying a UF2 file to a Raspberry Pi Pico or a micro:bit works in any browser.
Which boards does it support?
Every ESP32 type (ESP32, ESP32-S2, S3, C2, C3, C5, C6, C61, H2 and P4), ESP8266 boards such as the NodeMCU, Wemos D1 mini and ESP-01, the Arduino Uno, Nano, Mega 2560, Pro Mini, Leonardo, Micro and Pro Micro, 3D printer boards built on the Arduino Mega such as RAMPS 1.4, and drag-and-drop boards such as the Raspberry Pi Pico, Pico W, Pico 2, Adafruit Feathers and the BBC micro:bit.
What file do I need to flash an ESP32?
A .bin file. The easiest is a single merged or factory .bin, which holds the bootloader, the partition table and your program together. In the Arduino IDE, use Sketch, Export Compiled Binary and pick the file ending in .merged.bin. You can also drop the separate bootloader.bin, partitions.bin and firmware.bin files together, and the flasher puts each one at the right address.
What address should I flash my ESP32 .bin file to?
Usually you do not need to know, because the flasher reads the file and picks the address for you. For reference, a merged .bin goes to 0x0. The bootloader goes to 0x1000 on the ESP32 and ESP32-S2, 0x2000 on the ESP32-P4 and C5, and 0x0 on the S3, C3, C6 and H2. The partition table goes to 0x8000, boot_app0 to 0xE000 and the app to 0x10000. Turn on Expert mode to type your own addresses.
Why does it say Failed to connect or Wrong boot mode detected?
Your ESP32 did not switch into download mode by itself. Hold the BOOT button (sometimes marked IO0 or FLASH), press Flash my board, and let go once the progress bar starts moving. On some boards you hold BOOT, tap RESET or EN, then let go of BOOT. Also try a different USB cable, because many cables only charge.
My board does not show up in the list. What do I do?
First try another USB cable, since charge-only cables are the most common cause. Then install the driver for the USB chip on your board: CH340 or CH9102 from WCH, CP2102 from Silicon Labs, or FTDI. Close the Arduino IDE and any other serial monitor, plug the board straight into your computer, and on Linux add your user to the dialout group.
Can I upload a HEX file to an Arduino without the Arduino IDE?
Yes. Drop the .hex file in step 1, pick your Arduino in step 2 and press Flash. The flasher speaks the same bootloader protocols as avrdude (STK500 for the Uno, Nano and Mega, AVR109 for the Leonardo, Micro and Pro Micro), then reads the program back to check it. It is an easy XLoader or avrdude alternative that also works on a Chromebook.
Why does my Arduino say stk500_getsync not in sync?
The bootloader did not answer. Most often the wrong board type is picked: many Nano clones use the old bootloader, so choose Nano (old bootloader). Also close the Arduino IDE, unplug anything wired to pins 0 and 1, and try another cable. The Arduino Uno R4, Nano Every and other non-AVR Arduinos cannot be flashed with a .hex file.
How do I flash a Raspberry Pi Pico or micro:bit?
Hold the BOOTSEL button while you plug in the Pico, and it shows up as a USB drive called RPI-RP2 (RP2350 on a Pico 2). A micro:bit always shows up as a drive called MICROBIT. Drop your .uf2 or .hex file in step 1, press Copy to board and save it onto that drive. The board restarts by itself when the copy finishes.
Can I flash MicroPython, WLED, Tasmota or ESPHome with it?
Yes. Download the .bin for your chip from the project's website (MicroPython, WLED, a Tasmota factory image or an ESPHome factory download), drop it in step 1 and tick Erase everything first so old settings do not get in the way. The flasher checks that the file matches your chip before it writes anything.
Can flashing brick my ESP32 or Arduino?
Practically never. The ESP32 and ESP8266 download mode is built into the chip and cannot be overwritten, and Arduino bootloaders protect themselves, so you can always flash again. The flasher also refuses firmware built for a different chip. If a board stops working after flashing, tick Erase everything first and flash a known good file.
Does it work on a Chromebook?
Yes. Chrome on ChromeOS supports Web Serial, so students can flash ESP32 and Arduino boards in class without installing anything. Most boards work right away, because ChromeOS already has drivers for the common CH340, CP2102 and FTDI USB chips.
Is there a serial monitor?
Yes, in the Board toolbox. Pick a baud rate (115200 for most ESP32 sketches, 9600 for many Arduino examples, 74880 for ESP8266 boot messages), read what your board prints, send text back, restart the board, add timestamps and save the log.
How is this different from esptool, the Espressif Flash Download Tool or ESP Web Tools?
It speaks the same protocol as esptool.py and is built on Espressif's open-source esptool-js library, but runs in a web page with nothing to install. Unlike the Flash Download Tool it works on macOS, Linux and ChromeOS, picks addresses for you and checks the chip. Unlike ESP Web Tools you can flash any file from your own computer, and it also flashes Arduino and Pico boards.
Ready to flash?
Pick your firmware file, plug in your board and press Flash. Most boards are done in under a minute.
Go to the flasher