Free & Open Source · v1.0

Add a one-click ESP32 firmware installer to any website

A single <script> tag. One custom element. Your visitors flash ESP32, ESP8266, and ESP32-S3 devices directly from the browser — no boot button, no IDE, no drivers, no uploads.

Live Demo

The easiest way to let users flash your ESP firmware

ESP Flash Button is a browser-based firmware installer you embed on your website. It uses the Web Serial API to communicate with ESP32, ESP8266, and ESP32-S3 microcontrollers — no software installation, no IDE, no USB driver configuration.

Built for makers and product teams
Whether you're selling dev boards, running a tutorial blog, or distributing firmware for your open-source project — embed the installer and let your users flash in one click.
100% private — local by design
Firmware files are fetched from your server and written directly to the device in the browser. No data ever passes through a third-party server. Zero telemetry, zero tracking.
Works everywhere on the modern web
A standard HTML web component. Deploy it on WordPress, Ghost, GitHub Pages, Cloudflare Pages, or any static site host. No build step, no npm, no framework.
Significantly faster than alternatives
921600 baud flash speed with hardware compression. Automatic MD5 verification. Chip auto-detection. A 2 MB firmware completes in under 15 seconds — up to 10× faster than legacy tools.

From click to flashed firmware

The entire flash process happens in the browser. Here's what happens when a user clicks your button.

1
User clicks the button
A modal opens showing your firmware name, version, supported chip variants, and a connect button. The user selects their ESP board from the browser's serial port dialog.
2
Chip detection & verification
The tool connects to the device at 921600 baud, identifies the chip family (ESP32 / ESP32-S3 / ESP8266), reads the MAC address, and detects flash size. The correct firmware variant is auto-selected.
3
Firmware download & flash
The firmware .bin files are fetched from your server, compressed in-browser, and written to the device's flash memory with real-time progress. Every byte is verified via MD5 after writing.
4
Device reboots, user sees success
The device is hard-reset to exit bootloader mode and boot the new firmware. A success screen shows the chip details, flash duration, and per-file MD5 hashes for verification.

Two lines of code

Drop these into any HTML page. No build step, no npm, no framework.

1
Add the script tag
Load the component from Cloudflare CDN — one tag, zero dependencies.
<!-- Add this once, anywhere in your page -->
<script src="https://esp-flash-button.pages.dev/esp-flash-button.js"></script>
2
Place the button element
Add the custom element wherever you want the flash button to appear. Point it at your firmware manifest.
<esp-flash-button
  manifest="https://yoursite.com/firmware/manifest.json"
  label="Install My Firmware">
</esp-flash-button>
3
Custom button style (optional)
Use slot="activate" to supply your own button element. The component keeps your styling and adds the flash logic.
<esp-flash-button manifest="https://yoursite.com/firmware/manifest.json">
  <button slot="activate" class="my-custom-btn">
    Download Firmware
  </button>
</esp-flash-button>
4
Listen to flash events
React to success or failure with standard DOM events. Great for analytics, post-flash instructions, or confetti.
<script>
document.querySelector('esp-flash-button')
  .addEventListener('flash-success', (e) => {
    console.log('Flashed!', e.detail);
    // e.detail = { chip, flashSize, duration, filesCount }
  });
</script>

Your firmware manifest

A simple JSON file that tells the component what firmware to flash and for which chips. Host it on your server alongside your .bin files.

Your server must send CORS headers so the browser can fetch the manifest and firmware files cross-origin. Add Access-Control-Allow-Origin: * to your server responses.
Single merged .bin (simplest — address 0x0)
{
  "name": "My ESP32 Project",
  "version": "1.0.0",
  "builds": [
    {
      "chipFamily": "ESP32",
      "parts": [
        { "path": "firmware.bin", "offset": 0 }
      ]
    }
  ]
}
Multi-chip (auto-detected, user can also pick manually)
{
  "name": "My Firmware",
  "version": "2.1.0",
  "builds": [
    {
      "chipFamily": "ESP32",
      "parts": [
        { "path": "bootloader.bin",   "offset": 4096  },
        { "path": "partitions.bin",   "offset": 32768 },
        { "path": "boot_app0.bin",   "offset": 57344 },
        { "path": "firmware.bin",    "offset": 65536 }
      ]
    },
    {
      "chipFamily": "ESP32-S3",
      "parts": [
        { "path": "firmware-s3.bin", "offset": 0     }
      ]
    },
    {
      "chipFamily": "ESP8266",
      "parts": [
        { "path": "firmware-8266.bin", "offset": 0    }
      ]
    }
  ]
}

Attributes

AttributeDefaultDescription
manifestrequiredAbsolute URL to your firmware manifest JSON file.
label"Install Firmware"Label on the default button. Ignored when using a slotted button.
erase-firstfalseBoolean attribute. When present, erases the entire flash before writing.
baud921600Flash baud rate. 921600 is fastest. Use 115200 for boards with problematic cables.
EventDetailDescription
flash-success{ chip, flashSize, duration, filesCount }Fired after firmware is written and device has reset.
flash-error{ title, message }Fired if the flash process fails.

Built on the SKR Flasher engine

The same battle-tested flash engine from SKR Electronics Lab's professional flasher, now available as an embeddable web component.

No BOOT button hold required
The SKR engine handles ROM bootloader entry via DTR/RTS automatically. Most boards flash without holding any buttons.
Chip + MAC + flash size auto-detection
Probes chip type, MAC address, and flash size on connect. Auto-selects the correct firmware variant from your manifest.
Fastest flash speed (921600 baud)
Default 921600 baud with compression enabled. Typical 2 MB firmware in under 15 seconds. MD5 verification after every write.
100% local — private by design
All flashing happens locally in the browser. Firmware and device data never touch any server. Zero telemetry.
Works in any CMS or static site
Pure HTML custom element. Embed in WordPress, Ghost, Notion, GitHub Pages, or any static host. No npm, no build step.
Modern dark-mode UI
Premium flash dialog with smooth animations, real-time progress, animated success feedback, and detailed MD5 verification.

ESP Flash Button vs ESP Web Tools

A detailed feature comparison. ESP Flash Button is the more capable, faster, and better-looking alternative.

ESP Flash Button
Auto bootloader entry — no BOOT button hold
Chip + MAC + flash size auto-detection
Fastest flash speed: 921600 baud with compression
MD5 verification after every write
Modern dark-mode UI with animated feedback
DOM events (flash-success / flash-error)
Same manifest format (fully compatible)
ESP Web Tools
Requires holding BOOT button on most boards
Basic chip family detection
Slower default baud rate
No MD5 verification
Dated, light-themed UI
DOM events
Improv Wi-Fi standard support

Supported chips & boards

ESP Flash Button supports all ESP32-family chips supported by esptool-js. Any board with a USB-to-serial converter works.

ESP32
ESP32-S2
ESP32-S3
ESP32-C3
ESP32-C6
ESP32-H2
ESP8266
ESP8285
Browser requirement: Chrome 89+, Edge 89+, or Opera 76+ (desktop). Web Serial API is not available in Firefox or Safari.
USB-serial chips: CP2102, CP2104, CH340, CH341, FTDI FT232R, and any CDC-ACM serial adapter.

Frequently asked questions

What is ESP Flash Button?
ESP Flash Button is a free, open-source web component that adds a one-click firmware installer to any website. It uses the Web Serial API to flash ESP32, ESP8266, and ESP32-S3 microcontrollers directly from the browser. It's built by SKR Electronics Lab and powered by Espressif's esptool-js.
How is this different from ESP Web Tools?
ESP Flash Button is built on the SKR Flasher engine which automatically handles ROM bootloader entry — most boards flash without holding any buttons. It also runs at 921600 baud (fastest supported), performs MD5 verification after every write, detects chip type + MAC + flash size, and features a modern dark-mode UI with real-time progress and animated feedback.
Which browsers are supported?
Google Chrome 89+, Microsoft Edge 89+, and Opera 76+ on desktop. The Web Serial API is required, which Firefox and Safari do not currently support. Mobile browsers are not supported.
Do I need to hold the BOOT button?
In most cases, no. The SKR Flasher engine manages bootloader entry automatically via DTR/RTS serial handshake lines. Simply plug in your board, click Connect, and the tool handles the rest. Some boards with non-standard USB-serial chips may still need manual button intervention.
Is my firmware uploaded to your servers?
No. Everything happens locally in your browser. Firmware files are fetched directly from your own server and written to the device via the Web Serial API. No data passes through any third-party server. Zero telemetry.
What's the flash speed?
Default flash speed is 921600 baud with hardware compression enabled. A typical 2 MB firmware completes in under 15 seconds. You can reduce to 115200 baud via the baud attribute if you have a problematic USB cable.
Can I use my own button styling?
Yes. Use the slot="activate" attribute to supply your own button element. The component keeps your existing styles and adds the flash behavior.

CORS configuration

Your manifest and .bin files must allow cross-origin requests from the page embedding the button. Add these headers to your server:

# Apache (.htaccess)
Header set Access-Control-Allow-Origin "*"

# Nginx
add_header Access-Control-Allow-Origin *;

# Cloudflare Pages (_headers)
/firmware/*
  Access-Control-Allow-Origin: *

# Express / Node.js
app.use('/firmware', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  next();
});