Offband offband-v1.1.0-rc1
Pre-release
Pre-release
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 newWIFI_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 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*.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
- fix(#151): harden backup-device-key.py (key-leak + capture robustness) by @Strycher in #155
- feat(#153): Offband-first OLED boot splash + dev-only heap readout by @Strycher in #156
- feat(#154): surface Offband version in companion API + rebrand default BLE name by @Strycher in #157
- feat(#152): sync device clock from GPS (provider-agnostic) + gps time/sync readout by @Strycher in #158
- docs: release approval gate by @Strycher in #140
- Epic F: Offband companion-API config command (+ observer config-layer hardening) by @Strycher in #184
Full Changelog: offband-v1.0.0...offband-v1.1.0-rc1