|
|
||
|---|---|---|
| img/devices | ||
| js | ||
| devices.js | ||
| flasher.html | ||
| flasher.js | ||
| flasher2.html | ||
| flasher2.js | ||
| index.html | ||
| index2.html | ||
| LICENSE | ||
| README.md | ||
| rmap.css | ||
| server.py | ||
| stats.json | ||
RNode Flasher (RMAP)
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.
✨ What makes it different
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.
Two interfaces (same engine)
| 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.
Features
- 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.
How it works
- 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.
Quick start (local)
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.
Linux: serial port permissions
On Linux, USB serial ports are owned by root:dialout. If the browser
fails with Failed to open serial port, your user likely isn't in the
dialout group.
Fix it permanently:
sudo usermod -aG dialout $USER
# Log out and back in for the change to take effect
Or grant access for the current session (adjust the device path as needed — check with ls /dev/ttyACM* /dev/ttyUSB*):
sudo chmod 666 /dev/ttyACM0
Hosting on your own server (VPS)
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.
Credits
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.
License
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.