Flasher
Browser-based firmware flasher for ESP chips, available at
embedhub.com/tools/Flasher. Uses the
WebSerial API, so you flash directly from the browser tab — no esptool.py
install, no driver dance.
Supported chips
Built-in support for the full ESP32 family and ESP8266:
ESP32, ESP32-S2, ESP32-S3, ESP32-C2, ESP32-C3, ESP32-C5,
ESP32-C6, ESP32-C61, ESP32-H2, ESP32-P4, ESP8266.
The chip is auto-detected over serial.
Two ways to flash
Pick an organization and project, and the tool reads that project's releases/
folder.
Guided — the project publishes a config describing its firmware. You choose which firmware from a dropdown and press Flash; the tool detects the chip and works out which binaries go at which addresses. This is the mode to use if you want someone who has never seen the project to be able to flash a board.
Manual — tick .bin files out of the release tree and type the address for
each one under Advanced Options. Always available, and what you get when a
project has no config.
Browser support
Requires a Chromium-based browser (Chrome, Edge, Brave) — WebSerial is not yet available in Safari or Firefox.
Publishing a config
Put a .toml next to your binaries in the project's releases/ folder:
embedhub push launchpad.toml releases/
embedhub push build/app.bin releases/
Any .toml under releases/ is read as a config — the name is yours.
It only decides which one opens by default: releases/launchpad.toml, then
releases/config.toml, then those names in a subfolder, then anything else
alphabetically. Pick another from the panel, or click a specific config in the
releases list to open that one.
A minimal config, for firmware shipped as one merged binary:
esp_toml_version = 1.0
supported_apps = ["blink"]
[blink]
chipsets = ["ESP32-C3"]
image.esp32-c3 = "blink_c3.bin"
offset = "0x0"
description = "Blinks the status LED"
Filenames are resolved next to the config, so a binary sitting beside it in
releases/ is named on its own. The binaries stay private to the project —
whoever flashes needs read access to it, same as anywhere else in EmbedHub.
Several binaries at different addresses
Firmware built as separate bootloader, partition table and application images lists each part with the address it belongs at:
[hal-firmware]
chipsets = ["ESP32-S3"]
image.esp32-s3.parts = ["bootloader.bin", "partition-table.bin", "app.bin"]
image.esp32-s3.addresses = ["0x0", "0x8000", "0x10000"]
parts and addresses pair up by position: the first part is written at the
first address, and so on. Every part states its own address — nothing is
inferred from a filename or a chip family, because an image written to a
guessed offset produces a board that no longer boots.
In TOML a key can't be both a filename and a table, so a chip uses either
image.esp32-s3 = "..." or image.esp32-s3.parts = [...] — never both.
The two lists must be the same length, and no two parts may share an address. The config is checked when it loads, before the tool opens the serial port, so a mistake shows up as a message rather than a bricked board.
Several chips, and specific boards
One app can cover several chips, and a named board can override the generic image for its chip:
[hal-firmware]
chipsets = ["ESP32-S3", "ESP32-C3"]
image.esp32-c3 = "hal_c3.bin"
image.esp32-s3 = "hal_s3.bin"
developKits.esp32-s3 = ["esp32-s3-box", "esp32-s3-box3"]
image.esp32-s3-box = "hal_box.bin"
image.esp32-s3-box3 = "hal_box3.bin"
When the detected chip has boards listed, a Board dropdown appears. Leave
it on the generic option to use image.esp32-s3.
Other keys
| Key | Meaning |
|---|---|
supported_apps | The firmware names to offer, in order |
chipsets | Which chips this firmware supports |
offset | Where a single merged image.<chip> is written; defaults to 0x0 |
description | Shown under the firmware dropdown |
console_baudrate | Pre-selects the baud for the serial monitor |
firmware_images_url | A folder to resolve filenames against, if not beside the config |
image.emulator | Firmware to run in the Emulator rather than write to a board |
ui | A front-end the Emulator loads with the firmware |
Notes
- Everything in the project's
releases/folder is listed automatically — push a new build and it appears. - In the project's releases list, Flash next to a config opens the Flasher on
that config in guided mode; next to a
.binit opens on that one file in manual mode. A config that also declares an emulator target carries an Emulate action beside it. - Guided mode lists every image the config can write, with its address, as soon as you pick a firmware — before a device is even connected. Once the chip is detected the entry that will actually be used is marked.
- The serial monitor below the flasher is separate: connect to it after flashing to watch the device boot.