Free web flasher · Nothing to install

ESP32 & Arduino web flasher

Put new firmware on an ESP32, ESP8266, Arduino Uno, Nano, Mega or Raspberry Pi Pico straight from Chrome or Edge. Pick a file, plug in your board, press Flash. That's it.

  • ESP32 · S2 · S3 · C3 · C5 · C6 · H2 · P4
  • ESP8266 / NodeMCU
  • Arduino Uno · Nano · Mega · Leonardo
  • Raspberry Pi Pico (UF2)
  • micro:bit
  1. Pick your firmware file

    This is the program that goes on your board. It ends in .bin, .hex or .uf2.

    Start here
    Drop your file here or click to choose one from your computer .bin for ESP32 / ESP8266 · .hex for Arduino & micro:bit · .uf2 for Pico
    No file? Try a PrintPal project firmware

    Ready-made firmware for the boards in our build guides. Click one to load it.

    Loading…
    Where do I get a firmware file?

    From the Arduino IDE (ESP32, ESP8266 and Arduino): open your sketch, pick your board, then click Sketch → Export Compiled Binary. Open Sketch → Show Sketch Folder and look in the build folder.

    • ESP32: pick the file ending in .merged.bin.
    • ESP8266: pick the file ending in .ino.bin.
    • Arduino Uno, Nano or Mega: pick the .hex file without with_bootloader in its name.

    From PlatformIO: build, then open .pio/build/<your env>/. For an ESP32 drop firmware.bin, bootloader.bin and partitions.bin together. For an Arduino use firmware.hex.

    From ESP-IDF: drop the files from your build folder together with flasher_args.json, which tells us where each one goes.

    Ready-made firmware: MicroPython, CircuitPython, WLED, Tasmota (use a .factory.bin), ESPHome (download in Factory format) and Meshtastic. Pick the file made for your chip.

  2. Plug in your board and connect

    Use a USB cable that can send data. Some cables only charge.

    Next
    A list pops up. Pick your board, then press Connect.
    My board isn't in the list
    1. Try another USB cable. Many cables only charge. If the board lights up but never shows in the list, this is usually why.
    2. Install the driver for your board's USB chip. Look at the small chip next to the USB port: CH340 / CH341 for Windows, CH340 / CH9102 / CH343 for Mac, CP2102 / CP2104, FTDI. Linux and ChromeOS already have them.
    3. Close other programs that use the board: the Arduino IDE, PlatformIO, Cura, other serial monitors and other browser tabs.
    4. ESP32-S3, C3 and C6 with one USB port: hold BOOT while you plug the cable in. A new port appears.
    5. Linux: run sudo usermod -aG dialout $USER, then log out and back in.
    6. Plug straight into the computer instead of a hub, and try a different USB port.
  3. Flash it!

    Press the big button and wait for the green check. Don't unplug the board while it works.

    Last step
    Pick a firmware file in step 1 first.
Technical log

          
        

Board toolbox

Handy extras for the board you plugged in. They don't need a firmware file.

Serial monitor

        

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.

  1. 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.
  2. 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.
  3. 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

BoardFileHow it connects
ESP32, ESP32-S2, S3, C2, C3, C5, C6, C61, H2, P4.binWeb 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.binWeb Serial. ESP-01 modules need a USB adapter and GPIO0 held low
Arduino Uno, Nano, Pro Mini, Duemilanove.hexWeb Serial, STK500 bootloader (Optiboot or the old Nano bootloader)
Arduino Mega 2560, RAMPS 1.4 3D printer boards.hexWeb Serial, STK500v2 bootloader
Arduino Leonardo, Micro, SparkFun Pro Micro.hexWeb Serial, AVR109 (Caterina) bootloader after an automatic reset
Raspberry Pi Pico, Pico W, Pico 2, RP2040 boards.uf2Copied to the RPI-RP2 drive in BOOTSEL mode
Adafruit Feather, Circuit Playground, nice!nano.uf2Copied to the …BOOT drive after a double-tap on RESET
BBC micro:bit V1 and V2.hexCopied 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:

FileESP32, ESP32-S2S3, C3, C6, H2, C2P4, C5
Merged / factory .bin0x00x00x0
bootloader.bin0x10000x00x2000
partitions.bin0x80000x80000x8000
boot_app0.bin (otadata)0xE0000xE0000xE000
firmware.bin (app)0x100000x100000x10000

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.

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 .bin for 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.bin from ota.tasmota.com for an ESP32, or tasmota.bin for 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