A browser-based flasher for Reticulum RNode firmware. Flash, provision and configure LoRa boards over USB directly from the browser - no drivers, no Python install, nothing to set up on the user side.
Built for rmap.world.
Pick your board, pick the firmware, plug in over USB, click Flash. Done.
Compared to other RNode / LoRa web flashers, this one adds:
- 📥 Automatic firmware download - firmware is fetched live from each project's
official GitHub releases (with a version picker), cached server-side and streamed.
No hunting for
.zipfiles, no manual uploads. - ⚡ True one-click flash - a single button runs flash → automatic EEPROM provisioning → firmware-hash setup in sequence (for RNode Official / CE). Most flashers leave provisioning as separate manual steps.
- 🎛️ In-browser after-flash config - Bluetooth on/off & pairing, display
rotation & brightness, and full LoRa / TNC (standalone) setup - no
rnodeconf. - 🧩 Many projects & boards in one place - Official, CE, microReticulum/TN, RTNode and the SenseCAP T1000-E; ESP32 and nRF52 (DFU).
- 💾 Remembers your choices across reloads · 🌍 built-in page translator · 📊 usage stats · two clean interfaces (card / dropdown).
- 🔌 100% browser (Web Serial) - nothing to install for the end user.
| File | Style |
|---|---|
index.html |
Card + accordion UI (visual, step-by-step in one screen) |
index2.html |
Simple dropdown UI (minimal) |
Both share the same flashing engine and the same features, and link to each other from the top bar.
- Flashes ESP32 boards (via esptool-js) and nRF52 boards via DFU (Heltec T114, LilyGO T-Echo, RAK4631, SenseCAP T1000-E).
- Automatic RNode EEPROM provisioning + firmware hash for RNode Official / CE; other firmware is flashed as-is, with manual provisioning available if needed.
- Multiple firmware sources, versions fetched live from GitHub releases: RNode Official (markqvist), RNode CE (Liberated Embedded Systems), microReticulum / Transport Node (attermann), RTNode v4 (jrl290), RNode T1000-E (idan2025).
- After-flash tools: Bluetooth on/off + pairing, display rotation & brightness, LoRa parameters & TNC (standalone) mode, plus manual flash / provision / wipe / full-erase.
- Remembers your selections across reloads, page translator (any language), console/log, usage stats (visits & devices flashed), credits.
- ~20 supported boards: Heltec LoRa32 v2/v3/v4, Heltec T114, the LilyGO LoRa32 / T-Beam / T3S3 / T-Deck / T-Echo family, RAK4631, Seeed XIAO ESP32S3 & SenseCAP T1000-E, generic homebrew, and the RNode handheld.
- The browser talks to the board over the Web Serial API.
- ESP32 flashing is done in-browser with esptool-js; nRF52 with a JS port of Adafruit's DFU tool. Provisioning uses rnode.js (Liam Cottle).
- Firmware is not bundled. A tiny Python server (
server.py) acts as a proxy: it fetches the requested release.zip/.binfrom the project's official GitHub release and streams it to the browser.- This proxy is required because GitHub release assets do not send CORS headers, so the browser cannot download them directly.
- On the server, firmware for a specific version is cached on disk
(
fw_cache/) and streamed in 64 KB chunks, so RAM usage stays tiny even with many users. In the browser it lives only in RAM and is discarded after flashing.
Requirements: Python 3 (standard library only - no pip packages), and a
browser with Web Serial: Chrome, Edge, or Firefox (with dom.serial.enabled).
cd flasher
python server.py # serves on http://localhost:8000 (or: python server.py 8080)Then open:
- Card UI: http://localhost:8000/index.html
- Dropdown UI: http://localhost:8000/index2.html
Web Serial works on
localhostwithout HTTPS. Plug your board in over USB, press Connect, choose the port, then Flash now.
The app is fully portable: it uses relative URLs, so it works from any path.
-
Upload the whole
flasher/folder (HTML,rmap.css, the*.jsfiles,devices.js, thejs/libraries, theimg/folder andserver.py) to your server, e.g.wwwroot/flasher. -
Install: only Python 3. Nothing else.
-
Run the proxy server (e.g. with
screen,tmuxor a systemd service):cd /var/www/flasher python3 server.py 8000 -
HTTPS is mandatory. Web Serial only works in a secure context - on a public domain that means HTTPS (on
localhostit's fine without). Put a reverse proxy with TLS in front ofserver.py.Caddy (automatic HTTPS, simplest):
flasher.example.com { reverse_proxy localhost:8000 }nginx (sub-path under an existing site):
location /flasher/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; }
Then the entry point is
https://example.com/flasher/index.html.
The fw_cache/ folder is created automatically and can be cleared anytime.
Built on the great work of:
- rnode.js & the original web flasher - Liam Cottle (MIT) - the flashing & provisioning engine.
- esptool-js - Espressif.
- RNode Firmware & Reticulum - Mark Qvist / markqvist.
- RNode Firmware CE - Liberated Embedded Systems.
- microReticulum / Transport Node - attermann.
- RTNode v4 - jrl290.
- RNode T1000-E firmware - idan2025 (SenseCAP T1000-E).
EEPROM provisioning is community (unsigned) - perfectly fine for normal Reticulum use.
This project's own code is licensed under CC BY-NC-ND 4.0 (share with
attribution, no commercial use, no modifications/derivatives). Bundled
third-party libraries in js/ keep their own licenses. See LICENSE.