Offband Mesh
ForkA MeshCore fork for cross-role firmware enhancements and optimization. Active roles include companion/observer with WiFi+MQTT observation publishing, NimBLE migration, web UI, and repeater with MQTT-to-Mosquitto bridging, burst-WiFi telemetry, heap and power tuning.
Fork of MeshCore (Reference)
- Maintainer
- OffbandMesh ↗
- Status
- Active
- Maturity
- Beta
- Lifecycle
- Active
- Latest version
- 1.1.1
- Released
- 2026-06-26
- Runtime
- Arduino · C++
- Distribution
- Community
- Licensing
- Open source
- License
- MIT
Capabilities
Transports
- ✓ BLE
- ✓ USB serial
- ✓ Native TCP
- ✓ Wi-Fi AP
Operations
- ✕ Web flasher
- ✓ OTA updates
Networking
- ✓ Repeater
- ✕ Room server
- ✓ Observer
- ✓ MQTT
- ✕ KISS modem
Hardware
- ✓ GPS
- ✓ Display
- ✕ Sensors
- ✕ Low-power RX
Protocol
- ✓ MeshCore compatible
Node role
Features
- Companion/observer with WiFi+MQTT observation publishing
- NimBLE migration (off Bluedroid)
- CrashLog / boot-survival diagnostics
- MQTT-to-Mosquitto bridging (repeater)
- Burst-WiFi telemetry
- Heap and power optimization for ESP32-S3
- Web UI
Releases
from GitHub · updated 2026-06-26v1.1.1 # Latest 2 days ago · 2026-06-26 05:24 UTC
Urgent patch: the RAK3401 1W companion radio was dead on v1.1.0. Still on the MeshCore 1.16.0 base.
Fixed
- RAK3401 1W companion radio dead on Offband (no TX/RX). Offband's GPS support (#104) probed a pin that doubles as the radio's power-enable on the RAK3401; with no GPS attached it left the radio unpowered, so it couldn't transmit or receive. GPS is now disabled on the RAK3401 companion build until the probe is fixed. (#211)
Which file do I download?
File What it is When to use it *-merged.bin(ESP32 — Heltec V3/V4, XIAO)Full image — bootloader + partition table + app in one, flashed at 0x0after a chip erase. Self-contained, works on a blank chip.First install / clean setup. In a web flasher this is the "Full Firmware" option. *.bin(ESP32)App only — flashed at the app offset ( 0x10000); the bootloader must already be on the chip.Updating an existing node — OTA / "Update Only." Keeps the device identity + WiFi/MQTT config. *.uf2(nRF52 — RAK, T-Echo, XIAO nRF52)Complete self-contained image. First install and updates — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.) ⚠️ ESP32: the app-only
*.binwill not boot if flashed at0x0— use*-merged.binfor a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, never a routine update.What's Changed
- docs(#192): Photon-1W (MeshSmith) support design-of-record by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/195
- chore(#197): CLAUDE.md -- record no-upstream-merge policy by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/198
- fix(#89): exclude SerialBLEInterface.cpp from Xiao_S3_WIO USB companion by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/200
- fix(rak3401): companion GPS probe floats WB_IO2, killing the 1W radio (#211) by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/212
Full Changelog: https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.1.1
v1.2.0-beta1 # Pre-release 3 days ago · 2026-06-25 04:37 UTC
Adds MeshSmith Photon‑1W support (both MCU flavors) plus a NimBLE build fix, on the MeshCore 1.16.0 base. Shipping in
-betauntil the Photon‑1W is bench‑verified on hardware.Added
- MeshSmith Photon‑1W support — ESP32‑C6 + nRF52 (#193, #194) — vendors MeshSmith's MIT Photon
variants (
meshsmith_photon_esp32c6,meshsmith_photon_nrf52; Seeed XIAO ESP32‑C6 / XIAO nRF52840 + Ebyte E22‑900M30S 1 W radio) and wires all roles into CI + the release pipeline. ESP32‑C6 needed minimal MeshCore‑consistent base edits (antenna‑switch virtuals, protected_gps_serial, NimBLE dep); nRF52 needed none. Not yet bench‑verified — vendored drivers kept for round‑1; review findings tracked as bench checkpoints on #193/#194.
Fixed
Xiao_S3_WIO_companion_radio_usbbuild (#89) — excludeSerialBLEInterface.cppfrom the USB companion env (it has no BLE), resolving theNimBLEDevice.hregression from the #288 NimBLE migration.
Changed
- CLAUDE.md: no‑upstream‑merge policy (#197) — Offband does not merge from upstream MeshCore; the
upstreamremote stays fetch‑only for reference. Keep MeshCore nomenclature/coding‑standard consistency for clean rebasing.
Which file do I download?
File What it is When to use it *-merged.bin(ESP32 — Heltec V3/V4, XIAO)Full image — bootloader + partition table + app in one, flashed at 0x0after a chip erase. Self-contained, works on a blank chip.First install / clean setup. In a web flasher this is the "Full Firmware" option. *.bin(ESP32)App only — flashed at the app offset ( 0x10000); the bootloader must already be on the chip.Updating an existing node — OTA / "Update Only." Keeps the device identity + WiFi/MQTT config. *.uf2(nRF52 — RAK, T-Echo, XIAO nRF52)Complete self-contained image. First install and updates — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.) ⚠️ ESP32: the app-only
*.binwill not boot if flashed at0x0— use*-merged.binfor a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, never a routine update.What's Changed
- docs(#192): Photon-1W (MeshSmith) support design-of-record by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/195
- chore(#197): CLAUDE.md -- record no-upstream-merge policy by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/198
- fix(#89): exclude SerialBLEInterface.cpp from Xiao_S3_WIO USB companion by @Strycher in https://github.com/OffbandMesh/meshcore-firmware/pull/200
Full Changelog: https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.2.0-beta1
- MeshSmith Photon‑1W support — ESP32‑C6 + nRF52 (#193, #194) — vendors MeshSmith's MIT Photon
variants (
v1.1.0 # 4 days ago · 2026-06-24 04:41 UTC
The headline is Epic F: the companion-API config command — a WiFi observer can now be configured entirely from the app (WiFi, the full MQTT broker pool, display) over BLE — plus the observer config/NVS-layer hardening that came out of bench-validating it. Still on the MeshCore 1.16.0 base.
Added
- Companion-API config command (Epic F, #159) — configure a WiFi observer from the
MeshCore/Offband app over BLE: WiFi credentials, the full MQTT broker pool (per-slot
url / port / transport / auth / JWT claims / CA-cert / topic-prefix / IATA),
enable / disable / clear a slot, and display settings. Wholly observer-gated and surfaced
behind a new
WIFI_OBSERVER_SUPPORTcapability bit +FIRMWARE_VER_CODE 14, so stock companions are unaffected. (#160–#169) - Per-broker live state in the broker read (#172) — each slot now reports its live
connection state (
connecting/up/backoff/held…) + last-error class, so the app shows whether a broker actually connected, not just that it's enabled. - Resolved-default hints (#173, #186) — when
jwt_owner/iata_overrideare unset, the read shows the value the device will actually use at connect (its own pubkey / the global IATA) as a placeholder instead of a confusing blank — in both the pool dump and the per-field read.
Changed
- Honest observer config writes (SAFELANE §6, #181) — the config / NVS write path used to silently swallow failures (a broker disable could ACK success while nothing changed). Every writer, the live-reload path, and the crash logger itself now surface + log failures with context. This is what root-caused #179.
- Compact broker config storage + seamless migration (#182) — broker config is stored as small per-key entries (no blank fields) rather than one ~1 KB blob, so writes fit a near-full NVS; a one-time invisible boot migration reclaims space on upgrade, so the operator never sees a transient write error.
- CoreScope (okimesh) default broker →
mqtt://mqtt1.okimesh.org:1883(#170). - Offband tell in MQTT (#174) — observer nodes append a 📡 to their display name in MQTT payloads, so feeds / maps can flag Offband observers.
Fixed
- #179 — a broker disable ACK'd success while the dump still reported
enabled=1. Root-caused as a near-full-NVS write failure the old code lied about; fixed by #181 (honest write) + #182 (storage that fits). Verified on hardware. - Observer capped at 1 concurrent TLS broker (#171) — a heap guard stops the OOM reboot when a 2nd TLS/wss broker's ~60 KB mbedTLS context exhausts the Heltec V3 heap. Measured on hardware (1 wss ≈ 63 KB free, 2 wss ≈ crash).
- BLE connect survives the client's reconnect-thrash (#178) — a deeper ESP32 BLE frame queue (4 → 12) + stream terminators on reconnect, so a mid-stream reconnect can't leave the app's contact / settings sync hung. Affects companion and observer. (The root — the client's uncapped reconnect retry — is paced client-side in meshcore-client.)
- Crash log reliable for the whole boot (#183) — the 1 Hz heartbeat was flooding the 4 KB RTC crash-ring (wrapped in ~50 s) and evicting real crash diagnostics; the heartbeat now writes the ring every 30 s / on a sharp heap drop, so a post-reboot dump keeps the evidence that explains a crash past boot+50 s.
CI / build
- Heltec T114 (nRF52) companion added to the CI matrix (#185) — first nRF52-companion build coverage (complements the existing RAK4631 repeater).
Which file do I download?
File What it is When to use it *-merged.bin(ESP32 — Heltec V3/V4, XIAO)Full image — bootloader + partition table + app in one, flashed at 0x0after a chip erase. Self-contained, works on a blank chip.First install / clean setup. In a web flasher this is the "Full Firmware" option. *.bin(ESP32)App only — flashed at the app offset ( 0x10000); the bootloader m… - Companion-API config command (Epic F, #159) — configure a WiFi observer from the
MeshCore/Offband app over BLE: WiFi credentials, the full MQTT broker pool (per-slot
url / port / transport / auth / JWT claims / CA-cert / topic-prefix / IATA),
enable / disable / clear a slot, and display settings. Wholly observer-gated and surfaced
behind a new
Device compatibility (3)
| Device | MCU | Radio | Status | Notes |
|---|---|---|---|---|
| Heltec V4 | esp32-s3 | Semtech SX1262 | ✓ Supported | |
| Heltec V3 | esp32-s3 | Semtech SX1262 | ✓ Supported | |
| Seeed Studio Xiao S3 WIO | esp32-s3 | Semtech SX1262 | ✓ Supported |