A tiny, purpose-built Reticulum LoRa transport repeater firmware for low-power nRF52 boards. Flash it from your browser, configure over USB or Bluetooth, and your node is on the air.
Web flasher: https://thatSFguy.github.io/reticulum-lora-repeater/
Target user: already running Meshtastic or MeshCore on an nRF52840 + SX1262 board, curious about Reticulum, and wants to try running a dedicated repeater without a toolchain install.
- Visit https://thatSFguy.github.io/reticulum-lora-repeater/
- Pick your board and version, click Select firmware
- Double-tap the reset button on the board to enter bootloader mode
- Click Flash and pick the new port that appears
- After flashing, click Connect USB or Connect BLE to open the console
- Edit your config (frequency, display name, TX power, location, etc.) and click Commit & Reboot
The node boots, starts relaying Reticulum packets over LoRa, and announces itself on the mesh.
Configure one node, click Export config to save an rlr-config.json
file. For each additional node: flash, connect, click Import config,
change the display name, commit. Under 2 minutes per node after the first.
- Transport repeater. Relays Reticulum DATA packets, announces, and delivery proofs over LoRa. Supports RNode-compatible split-packet reassembly and transmission for messages up to 508 bytes.
- Runtime-configurable. All settings — frequency, bandwidth, SF, CR, TX power, display name, battery calibration, location, Bluetooth — live in internal flash, not build flags. Edit via the web console, BLE, or serial terminal.
- Web-flashable. Visit the hosted page, plug in USB, click Flash.
No PlatformIO, no toolchain, no
rnodeconf. Under 5 minutes from bare board to on-air node. - Bluetooth Low Energy (BLE) configurable. Connect from your phone via Web Bluetooth in Chrome — no USB cable needed. Custom GATT service for reliable config read/write, optional PIN pairing for security.
- Observable. Announces on
lxmf.deliveryso MeshChat / Sideband show it by name. Periodic telemetry announces report battery voltage, uptime, heap, packet counters, and GPS location. - Location-aware. Configure latitude, longitude, and altitude (MSL) — included in telemetry announces. Use the "Use my location" button in the webapp to auto-populate from your phone's GPS.
- Not a KISS RNode replacement. If you need a USB-connected RNode
for Sideband on your laptop, use the upstream
RNode_Firmware. - Not a LoRa chat client. There's no user interface on the device.
- Not a bridge to Meshtastic/MeshCore. Reticulum is a different protocol at the LoRa framing level.
| Board | Radio | Status |
|---|---|---|
| Faketec (Nice!Nano clone + Ebyte E22-900M30S) | SX1262 + ext PA | Bench-validated |
| RAK4631 (WisBlock Core) | Integrated SX1262 | Shipping in releases |
| XIAO nRF52840 Kit (Seeed XIAO + Wio-SX1262 daughter) | SX1262 | Shipping — flash via UF2 drag-and-drop |
| Heltec Mesh Node T114 | Integrated SX1262 | Shipping in releases |
| RAK3401 1-Watt (WisBlock + 1W PA) | SX1262 + 1W PA | Shipping in releases |
All five boards share the same firmware source — each board is just
one header file in include/board/. Adding a new nRF52840 + SX1262
board is a ~100-line header + one env block in platformio.ini.
See docs/ADDING_A_BOARD.md.
The firmware operates as a full Reticulum transport node:
- DATA forwarding — receives messages destined for non-local nodes and rebroadcasts them on all interfaces
- ANNOUNCE rebroadcasting — forwards announces from other nodes so the mesh learns paths through the repeater
- PROOF forwarding — delivery proofs are forwarded so senders get confirmation their message was received
- RNode split-packet support — messages larger than 254 bytes are automatically split into two LoRa frames on TX and reassembled on RX, compatible with standard RNode firmware framing
- Automatic radio recovery — if the SX1262 becomes unresponsive after flash I/O, the firmware hardware-resets and reconfigures it
- Custom GATT service with three characteristics:
- CONFIG (read/write) — pipe-delimited config string, atomic reads/writes
- COMMIT (write) — write
0x01to persist config and reboot - COMMAND (write) — text commands (ANNOUNCE, STATUS, DFU, REBOOT)
- Nordic UART Service (NUS) for real-time log streaming
- PIN pairing — optional 6-digit static passkey with MITM protection
- LoRa paused during BLE — radio activity is suspended while a BLE device is connected to prevent SoftDevice supervision timeouts
- Web Bluetooth — connect from Chrome on Android, macOS, Linux, or ChromeOS
All settings persist across reboots in internal flash (Config schema v2):
| Field | Range | Description |
|---|---|---|
display_name |
1-31 chars | Node name (shown in Sideband/MeshChat) |
freq_hz |
100-1100 MHz | LoRa frequency |
bw_hz |
7.8-500 kHz | LoRa bandwidth |
sf |
7-12 | Spreading factor |
cr |
5-8 | Coding rate (4/5 to 4/8) |
txp_dbm |
-9 to +22 dBm | TX power at SX1262 core |
batt_mult |
0.01-10.0 | ADC-to-mV calibration multiplier |
tele_interval_ms |
any | Telemetry announce interval |
lxmf_interval_ms |
any | LXMF presence announce interval |
telemetry |
on/off | Enable battery/health announces |
lxmf |
on/off | Enable LXMF presence announces |
heartbeat |
on/off | Enable heartbeat LED |
bt_enabled |
on/off | Enable BLE advertising |
bt_pin |
0-999999 | BLE pairing PIN (0 = no PIN) |
latitude |
-90 to 90 | Node latitude (degrees) |
longitude |
-180 to 180 | Node longitude (degrees) |
altitude |
-100000 to 100000 | Altitude in meters MSL |
Config v1 records are automatically migrated to v2 on first boot.
The hosted web app at https://thatSFguy.github.io/reticulum-lora-repeater/ provides:
- Flash firmware directly from the browser via Web Serial DFU
- Connect USB or Connect BLE to configure the node
- Configuration form with validation and human-friendly units
- Battery calibration — enter a multimeter voltage, firmware computes the multiplier
- Config export/import — save/load
rlr-config.jsonfor fleet provisioning - "Use my location" button — auto-populate lat/lon/altitude from browser GPS
- Status and Announce buttons for on-demand diagnostics
- DFU mode entry via serial command
- Real-time log streaming via NUS (BLE) or serial (USB)
Connect via the web console or any serial terminal at 115200 8N1:
PING - liveness check
VERSION - firmware version
STATUS - runtime status (uptime, radio, packets, battery)
HELP - list all commands
REBOOT - NVIC system reset
DFU - reboot into DFU bootloader
ANNOUNCE - force LXMF + telemetry announce now
CONFIG GET - print staged config (key=value lines)
CONFIG GETP - print staged config (pipe-delimited single line)
CONFIG SET <key> <value> - stage a field change
CONFIG RESET - reseed staging from board defaults
CONFIG REVERT - reseed staging from live config
CONFIG COMMIT - persist staging + reboot
CALIBRATE BATTERY <mv> - derive batt_mult from measured voltage
git clone https://github.com/thatSFguy/reticulum-lora-repeater
cd reticulum-lora-repeater
pio run -e Faketec -t upload --upload-port COMxx
pio device monitor -e Faketec --port COMxx
pio test -e native # run unit tests (host-side, Unity framework)Available build environments: Faketec, RAK4631, XIAO_nRF52840,
Heltec_T114, RAK3401, native (tests only).
Every tagged version (v*) triggers a GitHub Actions workflow that:
- Builds firmware for all five boards in parallel
- Creates a GitHub Release with
.zip,.hex, and.uf2assets per board - Publishes firmware to
docs/firmware/<tag>/for the web flasher - Regenerates the firmware manifest so the web flasher auto-discovers new versions
- Mark Qvist for Reticulum, RNode_Firmware, and LXMF
- Chad Attermann for microReticulum and microStore — the C++ Reticulum stack and persistence layer this firmware runs on
- Liam Cottle for rnode-flasher — the web flasher's DFU protocol implementation is based on his work
- Meshtastic and MeshCore projects for nRF52840 variant pin maps and TCXO references during board bring-up
MIT. See LICENSE for details and upstream attribution notices.