Lays the bootloader on a bare ESP32 and proves it landed. WATCHFIRE sails it afterward.
Open the port, walk the board into its ROM bootloader, and find out what is actually on the other end. Every step below is shown separately because on cheap boards the failure is always one specific step.
A flashed board with the wrong pins is a brick that boots cleanly. This is the wiring the stock diy-v1 build expects, and the checks worth making before any of it is powered.
Source: meshtastic/firmware, variants/esp32/diy/v1/variant.h, branch develop, read 2026-08-11. Re-read it before trusting this page — variants move.
SCK D5, MOSI D27, MISO D19, CS D18. Wiring from habit (VSPI 18/23/19/5) puts SCK and CS on each other's pins and the radio never answers.
The ROM bootloader will read and write any register, and the GPIO matrix is just registers — so KEEL can bit-bang SPI over the serial wire and ask the radio to identify itself, with no firmware running on the chip. It is slow (one round trip per clock edge) and it answers in seconds instead of a flash-and-boot cycle.
A pass here means one thing only: the SX127x version register read back exactly 0x12. Anything else is reported as what it saw. This probe has not yet been run against a real radio.
These are checks you make, not checks KEEL makes. Nothing here is verified by this program — ticking a box records that you looked.
Drop the Meshtastic release archive. KEEL reads what is in it, reads the install script that ships inside it, and takes its offsets from that script rather than from anything hard-coded here.
firmware-*.zip here, or loose .bin files — or click to choose
KEEL does not rewrite the flash mode or the size/frequency byte. What the image declares is what gets written. Espressif's tools rewrite these bytes by default; this bench leaves the image alone so that what you verify is what the vendor shipped.
Everything that will happen, before anything happens. Nothing is sent to the board until this page is approved.
No plan yet. Load a release in station 03.
KEEL runs the ROM bootloader only. The ROM cannot erase the whole chip and cannot read flash back, so:
esptool erase_flash and come back.The map is the truth of the run. Bands fill as bytes land and go solid only when the chip's own digest agrees with ours.
What was written, where, and whether the chip agrees. This is the record that makes a node traceable a year from now.
No run yet.
A verified write is not a working node. Two things always come next.
Meshtastic ships with the LoRa region deliberately unset, and holds the transmitter off until someone sets it. This is not a fault to debug. Set it in WATCHFIRE, or over the CLI, before expecting any traffic. Match it to the module you actually soldered on: a 915 MHz part on a 433 MHz region setting is a radio that talks to nothing, and a 433 MHz part told to run US_915 is worse than useless.
KEEL's job ends at the bootloader. Configuration, channels, codeplug and telemetry are WATCHFIRE's. Release the port here before opening it there — two pages cannot hold the same serial port.
A synthetic ESP32 ROM bootloader answering the same command set on the same framing. Pick a fault, then run the whole instrument against it with nothing plugged in.
Offline, in this page, against the simulator. It exercises the codecs, the parsers, the planner, the map, and a whole failing burn.