All firmwares

Offband Mesh

Fork

A 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

CompanionRepeaterObserver

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-26
  1. v1.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 0x0 after 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 *.bin will not boot if flashed at 0x0 — use *-merged.bin for 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

    Full Changelog: https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.1.1

  2. 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 -beta until 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_usb build (#89) — exclude SerialBLEInterface.cpp from the USB companion env (it has no BLE), resolving the NimBLEDevice.h regression from the #288 NimBLE migration.

    Changed

    • CLAUDE.md: no‑upstream‑merge policy (#197) — Offband does not merge from upstream MeshCore; the upstream remote 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 0x0 after 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 *.bin will not boot if flashed at 0x0 — use *-merged.bin for 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

    Full Changelog: https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.2.0-beta1

  3. 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_SUPPORT capability 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_override are 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 brokermqtt://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 0x0 after 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
Show all 14 releases →

Device compatibility (3)

✓ 3 Supported
DeviceMCURadioStatusNotes
Heltec V4esp32-s3Semtech SX1262✓ Supported
Heltec V3esp32-s3Semtech SX1262✓ Supported
Seeed Studio Xiao S3 WIOesp32-s3Semtech SX1262✓ Supported