# MeshCore Observer - Changelog
Changes to the MQTT observer / bridge work that powers the firmware offered on
[observer.gessaman.com](https://observer.gessaman.com/). Newest changes are at the top.
**Legend:** **New** = new capability * **Fix** = bug fix * **Improvement** = enhancement to
existing behavior * **Internal** = refactor / under-the-hood * **Docs** = documentation *
**Build** / **CI** = build system & automation. **[UP] Upstream sync** marks a merge of the
upstream MeshCore `dev` branch, which generally pulls in a new MeshCore software version.
### August 2026
- **New** - Added Heltec V4 R8 OLED and TFT MQTT observer targets, including portrait TFT variants 2026-08-28
- **New** - Added a dark R8 TFT observer dashboard with a rolling 20-minute RF activity graph and partial row redraws 2026-08-28
- **New** - Added live, persisted `display.timeout` and relative 180-degree `display.flip` observer controls 2026-08-28
- **Fix** - Corrected the R8 TFT backlight polarity and made blank/wake preserve the reset line shared with its touch controller 2026-08-28
- **Fix** - Preserved rollback-readable Companion MQTT preferences and added a strict, one-time `/mqtt.json` observer migration without deleting the source file 2026-08-28
- **Improvement** - Made Companion command `0x42` framed CLI the canonical hardware-settings path while retaining both older binary command ranges as receive-only aliases 2026-08-28
- **Fix** - Strengthened observer OTA shutdown gating and enabled the WiFi/WebConfig overlay consistently for ESP32 Full Companion builds 2026-08-28
- **Improvement** - Added a WebConfig CLI terminal, tightened command failure/reboot handling, stopped secret reads, and enforced the setup password 2026-08-08 * `d7109c18`, `c831e599`, `8abe26ba`
- **New** * `mqtt` - Added IdahoMesh, GoMesh, okimesh, and atvirastinklas presets; expanded the built-in preset table to 31 entries 2026-08-08 * `da37b6eb`, `3b11540e`, `73faa30c`, `dbee39b5`
- **New** - Enabled online OTA for Station G3 observer builds 2026-08-08 * `5000391c`
- **New** - Configurable repeater telemetry history plus the browser decoder 2026-08-05 * `3ba0fb18`, `64f99420`
- **Improvement** * `mqtt-neighbors` - Enabled neighbor publication on opted-in non-PSRAM observers and fixed unusable heard ages 2026-08-03 * `a3a0a94d`, `5828a3c5`
- **Fix** - Restored nRF52 builds after observer-only dependencies leaked into the common build path 2026-08-03 * `45379ad7`
- [UP] **Upstream sync** - Promoted the observer channel onto MeshCore v1.17.0-era upstream changes 2026-08-09 * `b744b42a`
### July 2026
- **New** * `webconfig` - Added the ESP32 WebConfig portal, request/result correlation, batch-state tests, and administrator-password management 2026-07-21 * `a7c1cc63`, `dc44311e`, `cece565e`, `675bc6b5`
- **Fix** * `mqtt` - Added cooperative MQTT shutdown, a clean-stop OTA barrier, and a hardware-derived slot-scaled stop timeout 2026-07-19 * `2e1a1410`, `7767760f`
- **New** * `mqtt` - Added periodic neighbor publication, host-tested JSON construction, preferences, and WebConfig controls 2026-07-19 * `de320bc4`, `e36aee04`, `8d7a47ab`, `d6f8a871`
- **Fix** * `mqtt` - Made preference migration power-loss recoverable, restored PSRAM buffers after restart, and added representative CI firmware guardrails 2026-07-18 * `1be09b9b`, `b5deaf93`, `7b60ee70`
- **New** * `mqtt` - Added per-slot packet allowlists with named payload types and downgrade-safe preference handling 2026-07-28 * `e00b29b4`, `52bd2719`, `ecbb5005`
- **New** - Added standalone WebConfig CLI controls and shared Wi-Fi OTA-seeder policy for Full ESP32 roles 2026-07-29 * `a6ace607`, `e6abf3ea`
- **Fix** * `mqtt` - Preserved observer capture and remote administration when duty-cycle throttling fills the packet pool 2026-07-09 * `1c9c6292`, `847be34e`
- [UP] **Upstream sync** - Synced the observer development channel with upstream dev through 2026-07-30 2026-07-30 * `612c5213`
### June 2026
- **Fix** * `kiss_modem` - Prevented USB TX backpressure from stalling the modem and added its separate native CI suite 2026-06-23 * `fb2c61f8`, `39ff5b87`
- **New** - AlertReporter integration in MyMesh for Room Server 2026-06-17 * `985fda13`
- **Improvement** - Cumulative packet statistics (`packets_sent` / `packets_received`) added to the status message 2026-06-16 * `8bf590b1`
- **Improvement** - Packet path now published as an array of lowercase hex hop tokens 2026-06-16 * `e80a5ded`
- **CI** - Sync documentation files to the flasher site from the build workflow 2026-06-16 * `0844eee1`
- **CI** - Reworked the GitHub Actions workflow for rolling releases 2026-06-08 * `8fa38707`
- **New** - Radio Watchdog feature for the MQTT observer 2026-06-08 * `002e8d4a`
- **Improvement** - Firmware build-date format and UTC timestamps (always emit `+00:00`) 2026-06-06 * `b45373a3`
- **CI** - Build observer firmwares across 14 shards (up from 4) 2026-06-06 * `c29ede05`
- **CI** - Cache PlatformIO toolchains in CI 2026-06-06 * `6723776f`
- **CI** - Automated firmware builds via GitHub Actions 2026-06-06 * `981ed246`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev (brings MeshCore v1.16.0) 2026-06-06 * `dcc8f826`
### May 2026
- **New** - NZ Analyzer MQTT preset 2026-05-25 * `c0c845f5`
- **Internal** - Region definition helpers; docs refresh 2026-05-21 * `1296aa77`
- **Docs** - Clarified WiFi configuration instructions (password optional for open networks) 2026-05-21 * `38568eb1`
- **Improvement** - Alert PSK access now restricted by sender timestamp 2026-05-17 * `f717d673`
- **Docs** - Trimmed the fault-alert section in the implementation guide 2026-05-17 * `c41805d0`
- **Change** - Renamed CLI command `region bulk` -> `region def` 2026-05-16 * `f3c6c348`
- **Internal** - Timestamp handling in MQTTMessageBuilder 2026-05-15 * `5a004f37`
- **New** - T-LoRa V2.1-1.6 observer configurations 2026-05-13 * `3cde9c10`
- **Fix** * `mqtt` - Hardened the T-LoRa MQTT observer and trimmed MQTT task stack usage 2026-05-13 * `daf9ee47`
- **Internal** - Alert PSK handling is now hex-only 2026-05-12 * `a8668840`
- **Improvement** - Alert PSK accepts both base64 and hex 2026-05-12 * `a865d0a3`
- **New** * `cli` - Bulk region hierarchy command 2026-05-12 * `19f95001`
- **Improvement** - Path hash size included in AlertReporter flood messages 2026-05-11 * `6a3ed5d4`
- **New** - T-Beam 1W observer support and partition handling 2026-05-11 * `fc99d6b3`
- **Improvement** - Fault alerts gained region-based scoping and banned channels 2026-05-11 * `16dc49fa`
- **New** - Fault alerts for WiFi and MQTT disconnections 2026-05-10 * `80355f32`
- **New** - ColoradoMesh MQTT preset 2026-05-10 * `08847342`
- **New** - MQTT origin handling and a string utility 2026-05-09 * `b9f478c9`
- **Improvement** - Repeat status included in the MQTT status message 2026-05-09 * `303cf8c2`
- **Internal** - MQTT origin now uses effective-origin logic 2026-05-09 * `ff031f48`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-05-09 * `b37db668`
- **New** * `mqtt` - T-LoRa V2.1-1.6 observer environments 2026-05-02 * `78e1500a`
### April 2026
- **Fix** * `mqtt` - Corrected ColoradoMesh preset details 2026-04-30 * `9f8f2d05`
- **New** * `platformio` - PSRAM support for the TBeam Supreme SX1262 variant 2026-04-28 * `0b05aede`
- **New** * `mqtt` - ColoradoMesh preset 2026-04-28 * `457edf69`
- **Fix** * `mqtt` - Added missing MQTTBridge error codes 2026-04-27 * `5a5e5373`
- **New** * `mqtt` - EastIdahoMesh preset and richer CLI preset listing 2026-04-25 * `753eb72f`
- **Fix** * `mqtt` - Removed errant `clearLastWill` from PsychicMqttClient 2026-04-25 * `32449e62`
- **Fix** * `mqtt` - Restored `origin` field position in packet messages 2026-04-25 * `673361b6`
- **Internal** * `mqtt` - Reorganized packet message structure 2026-04-25 * `8be27e4e`
- **Internal** * `mqtt` - Default TX packet settings and documentation 2026-04-25 * `bfcf0176`
- **New** * `platformio` - MQTT observer configs for the Heltec V4 expansion kit 2026-04-24 * `0a4f002f`
- **New** * `cli` - Radio watchdog command 2026-04-24 * `7b21be3e`
- **Internal** * `mqtt` - Standardized MQTT preset formatting 2026-04-24 * `6211885c`
- **Internal** * `heltec_tracker_v2` - Aligned FEM with meshcore-dev KCT8103L 2026-04-24 * `0d280257`
- **New** * `heltec_tracker_v2` - Restored LoRaFEMControl for GC1109 2026-04-24 * `255fce7f`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-04-24 * `c1989d6f`
- **New** * `mqtt` - chimesh and meshat.se presets 2026-04-24 * `ee4e39bc`
- **Fix** * `mqtt` - Restored legacy outbox behavior for QoS0 async publishes 2026-04-23 * `70722a58`
- **Fix** * `mqtt` - Config marked dirty on setter calls; applied on connect/reconnect 2026-04-23 * `bb67b04e`
- **Improvement** * `mqtt` - Better QoS handling and retry logic 2026-04-23 * `7d0c5bce`
- **Internal** * `mqtt` - Removed legacy `mqtt.server`/`port`/`username`/`password` CLI 2026-04-21 * `cfec3a5b`
- **Fix** * `mqtt` - Legacy CLI aligned with slot prefs; restored `isConfigValid` 2026-04-21 * `ac2662c5`
- **Internal** - PsychicMqttClient memory management; fixed-size callback arrays (v0.2.2) 2026-04-21 * `e9ff1ae0`
- **Improvement** - MQTTBridge memory management, deferred logging, and QoS on publish 2026-04-19 * `1ff9437f`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-04-19 * `563d9a7d`
- **Build** - Disabled MQTT debug config for heltec_v4 builds 2026-04-17 * `0ed29cb7`
- **Change** - gitignore generated cert files; meshmapper timeout reset to 0 2026-04-17 * `ab121708`
- **Change** - MeshMapper preset update; removed generated cert files 2026-04-17 * `074ac3e7`
- **Improvement** - Critical heap monitoring and deferred TLS; hard restart on prolonged low memory 2026-04-17 * `f4a4fd7c`
- **Internal** - Inline `StaticJsonDocument` allocations to reduce heap fragmentation 2026-04-16 * `ab6685a1`
- **New** - nashmesh preset 2026-04-14 * `13fbcd91`
- **Internal** - MQTTMessageBuilder takes an external JsonDocument to cut stack usage 2026-04-14 * `ff2df2b7`
- **Internal** - Removed the raw-data mutex in favor of core-specific staging 2026-04-14 * `0c190dac`
- **Improvement** - Radio watchdog avoids false alarms in quiet meshes 2026-04-14 * `961f8293`
- **New** - Radio diagnostics in MyMesh and CommonCLI 2026-04-10 * `7e4f75c9`
- **Improvement** - Internal heap stats in status messages 2026-04-06 * `74e45a79`
- **New** - TennMesh preset (fixed username/password auth) 2026-04-05 * `3b46e9ee`
- **Docs** - Single `set radio` command in the guide 2026-04-04 * `1c524a93`
- **Internal** - RX/TX packet logging controlled by MQTT settings (`mqtt_rx_enabled` pref) 2026-04-04 * `47b632aa`
- **Improvement** - Runtime-configurable MQTT slot limits based on PSRAM 2026-04-04 * `258a0d72`
- **Improvement** - Disconnect count/time diagnostics; per-variant WiFi TX power 2026-04-02 * `f0962eff`
### March 2026
- **Improvement** - Pre-allocated status JSON buffer in PSRAM; non-blocking NTP refresh 2026-03-31 * `cf4ec3f6`
- **New** - WiFi disconnect diagnostics 2026-03-31 * `0e82271e`
- **Fix** - Audience command parsing handles the 9-character prefix 2026-03-30 * `a4324a83`
- **New** - JWT audience configuration for custom slots 2026-03-30 * `1263e71d`
- **Improvement** - Partition-table guidance, merged-firmware flashing, embedded CA bundle 2026-03-30 * `da775bb2`
- **Docs** - Removed obsolete MQTT design docs 2026-03-28 * `384b80fc`
- **Docs** - README links to the MQTT Implementation Guide 2026-03-28 * `ff49d28f`
- **New** - Optional SNMP monitoring; concurrent MQTT slots 3 -> 5 2026-03-28 * `202acacf`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-03-28 * `cc17c6b7`
- **New** - meshomatic preset; disable slots with no server configured 2026-03-27 * `3eacf56e`
- **Improvement** - Pre-allocated JSON publish buffer in PSRAM 2026-03-26 * `47dd2182`
- **New** - `reconnect()` added to PsychicMqttClient 2026-03-25 * `1b5884bd`
- **Improvement** - Lightweight JWT reconnect (token refresh without full teardown) 2026-03-25 * `af52a989`
- **Internal** - Full teardown/setup for JWT slots on reconnect 2026-03-24 * `e29c3d96`
- **Internal** - Standardized MQTT slot log format 2026-03-24 * `2bbca206`
- **New** - cascadiamesh preset; keepalive configuration 2026-03-24 * `eaf5fcbc`
- **Improvement** - Re-create JWT tokens when NTP reveals stale time 2026-03-24 * `1c98d1c6`
- **Internal** - Serial-availability checks before logging; circuit-breaker reconnect logic 2026-03-23 * `4a60f166`
- **New** - MeshRank preset (token auth, custom topic templates) 2026-03-22 * `95874f0c`
- **Fix** - Dynamic MQTTBridge allocation to avoid an ESP32 static-init crash 2026-03-21 * `c67fb12b`
- **Build** - Build script: cached project config, artifact handling, ESP32 binary merge 2026-03-21 * `bf8a3a7a`
- **Improvement** - Active connection slots limited by available memory (PSRAM-aware) 2026-03-20 * `542f8a31`
- **New** - Up to 3 configurable connection slots with built-in presets (LetsMesh US/EU, MeshMapper) 2026-03-20 * `b43e9618`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-03-20 * `abe6e046`
- **Change** - Stopped enabling MQTT analyzer servers by default in the example sketches 2026-03-07 * `304719e8`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-03-06 * `db8b4419`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-03-04 * `56ac85fa`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-03-03 * `dcbbe5a6`
### February 2026
- [UP] **Upstream sync** - Synced with upstream MeshCore dev (Packet.cpp fix) 2026-02-26 * `8b359452`
- **Internal** - Multibyte path handling in Packet / MQTTMessageBuilder 2026-02-25 * `c8e220b1`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-02-25 * `51e9907f`
- **Change** - Removed an unused preprocessor directive in MyMesh 2026-02-25 * `ee1a9b4a`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-02-24 * `397a48fc`
- **Improvement** - Keepalive set to 45s to hold WebSocket connections through Cloudflare 2026-02-16 * `2d4b7a64`
- **Build** - heltec_v4 uses the `heltec_v4_oled` config for observer / room-server 2026-02-16 * `88ce0d33`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-02-15 * `e89cbee8`
- **Improvement** - Simplified KISS noise-floor sampling 2026-02-07 * `776131e2`
- **Fix** * `kiss_modem` - Improved RX delivery and noise-floor sampling 2026-02-06 * `f445b5ac`
- **Improvement** - Better NTP synchronization in MQTTBridge 2026-02-06 * `ba4243b5`
- **Improvement** - WiFi management and fragmentation recovery 2026-02-04 * `26aaace9`
- **New** - PSRAM-backed memory management in MQTTBridge 2026-02-04 * `1d0d33f9`
- **New** - PSRAM diagnostics at MQTTBridge init 2026-02-04 * `abcfe609`
- **Build** - mbedTLS configuration tuned across variants 2026-02-04 * `21158e1f`
- **Fix** * `kiss` - Periodic noise-floor calibration and AGC reset 2026-02-03 * `0fb57033`
- **Fix** - Memory use and status reporting in the MQTT bridge 2026-02-02 * `498566e6`
### January 2026
- **Internal** - Clarified packet ownership / memory management in MQTTBridge 2026-01-31 * `f91b715e`
- **New** - `recv_errors` in the `CMD_GET_STATS` packets response 2026-01-29 * `019bbf74`
- **New** - Receive-error tracking in Dispatcher and the message builder 2026-01-29 * `ee577314`
- **Fix** - Display header include for heltec_v4 when `DISPLAY_CLASS` is set directly 2026-01-27 * `bb27cded`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-01-27 * `d96c900f`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-01-26 * `2a84e58b`
- **Improvement** - MQTTBridge memory usage and NTP handling 2026-01-24 * `9e1ce23e`
- **Improvement** - MQTTBridge status handling and publish logic 2026-01-23 * `c67c3295`
- **Internal** - MQTTBridge connection handling for stability / responsiveness 2026-01-22 * `c055228c`
- [UP] **Upstream sync** - Synced with upstream MeshCore dev 2026-01-21 * `39ba020f`
- **Internal** - MQTTBridge moved onto a FreeRTOS task for responsiveness 2026-01-21 * `ed27ebd0`
- **New** - Configurable WiFi power-save mode preference 2026-01-18 * `56f98997`
- **Internal** - HeltecTrackerV2 / HeltecV4 init for GC1109 FEM 2026-01-13 * `3eaca31f`
- **Docs** - Owner configuration commands documented 2026-01-12 * `58cdd60c`
- **Internal** - Advert timer type consistency in MyMesh / SensorMesh 2026-01-08 * `ffa2a1ec`
- **New** - Device metadata setup at bridge init / restart 2026-01-03 * `2bd61c13`
- **Internal** - Config validation allows optional username / password 2026-01-03 * `d1093b43`
- **Internal** - JWTHelper / MQTTBridge efficiency cleanup 2026-01-02 * `e754317c`
- **Fix** - MQTT connection stability and CLI responsiveness 2026-01-02 * `98f176c7`
- **New** - Neighbour-info sorting; MQTTBridge memory tuning 2026-01-01 * `2185523d`
### December 2025
- **Docs** - WiFi power-save configuration documented 2025-12-30 * `915f8b8e`
- **Internal** - `loadPrefs` handles fresh installs and upgrades; migrates old prefs 2025-12-30 * `8fa99611`
- **Improvement** - Loop prioritizes radio RX for responsiveness 2025-12-29 * `617e3b17`
- **Internal** - Defer broker connect until WiFi + NTP ready; socket error logging 2025-12-17 * `5d4f1e4c`
- **Improvement** - Event-driven WiFi diagnostics and faster reconnect 2025-12-12 * `f7f1f838`
- **New** - WiFi power-save mode configuration (none / min / max) 2025-12-08 * `34c8bea7`
- **Fix** - LPS22HB pressure now reported in hPa (was kPa) 2025-12-08 * `b91b854a`
- **New** - WiFi TX power configuration (default 11 dBm) 2025-12-07 * `b82d7e43`
- **New** - Default bridge settings for fresh installs; JSON reuse to avoid fragmentation 2025-12-07 * `0b7c0888`
- **Improvement** - MQTT debug macros check Serial to prevent hangs 2025-12-06 * `3589043b`
- **Change** - Removed redundant settings writes in `savePrefs` 2025-12-04 * `03d519f8`
- **Build** - Source filter for the Xiao S3 WIO variant 2025-12-01 * `4f548ffc`
### November 2025
- **New** - `adc_multiplier` added to NodePrefs 2025-11-23 * `8fbdc98a`
- **Change** - IATA codes uppercased for consistency 2025-11-23 * `5cadf3d9`
- **Change** - `CMD_GET_STATS` split into core / radio / packet sub-types 2025-11-17 * `a3c9a073`
- **New** - IP address shown for MQTT bridge devices in UITask 2025-11-16 * `6b0c0e93`
- **New** - T-Beam ESP32 support; error log when source = tx but TX logging is off 2025-11-16 * `3c7ac9d1`
- **Build** - `MQTT_DEBUG` enabled for several build configs 2025-11-16 * `3726c472`
- **New** - MQTT observer support for Room Servers 2025-11-15 * `0cd0c36a`
- **Change** - Switched MQTT configs to observer mode across variants 2025-11-13 * `304a32db`
- **Internal** - Client version string generation 2025-11-13 * `aa242e78`
- **Improvement** - WiFi power-save + reduced TX power to limit LoRa interference; retry fix when no brokers connected 2025-11-10 * `bafa5426`
- **Internal** - Statistics use binary frames instead of JSON 2025-11-09 * `80d6dd43`
- **New** - IATA validation blocks publishing without an IATA code 2025-11-08 * `25d40f02`
- **Fix** - Restored status-publish retry delay to prevent server spam 2025-11-08 * `9e06fffc`
- **New** - Added missing token-expiration / reconnection member variables 2025-11-08 * `453c4184`
- **Change** - Removed WiFi credentials from platformio.ini (use CLI / build flags) 2025-11-08 * `921c6112`
- **Internal** - MQTT preferences handling in CommonCLI 2025-11-08 * `5a816be8`
- **Internal** - `formatStatsReply` uses the new member variables 2025-11-08 * `c9aa536c`
- **Build** - Explicit `paulstoffregen/Time` dependency to fix PIO compile 2025-11-07 * `72ca50b9`
- **Build** - Dropped the CayenneLPP patch script; updated ArduinoJson 2025-11-07 * `fef9225b`
- **Fix** - Timezone command parsing lengths corrected 2025-11-07 * `b89ceeea`
- **New** - Statistics commands and response handling in MyMesh 2025-11-07 * `df4dab85`
- **New** - MQTT email support in CommonCLI / JWTHelper 2025-11-06 * `1ed18f9e`
- **New** - MQTT owner public-key support 2025-11-06 * `e5dbd56b`
- **Improvement** - Status reporting and stats collection 2025-11-01 * `e4ff06cb`
### October 2025
- **Improvement** - MQTTBridge logging and connection handling 2025-10-31 * `7df28557`
- **Improvement** - Packet handling and memory management in MQTTMessageBuilder / MQTTBridge 2025-10-31 * `eee02025`
- **New** - Memory monitoring and queue-size reporting 2025-10-29 * `e77beff0`
- **Internal** - In-place base64url encoding; cleanup frees queued packets / timezone objects 2025-10-27 * `1219668f`
- **Change** - Defer MQTT connect until WiFi credentials are valid (requires reboot) 2025-10-27 * `3851a84b`
- **Improvement** - Dynamic build date and client versioning 2025-10-26 * `c23663da`
- **New** - CLI config for `mqtt.server` / `username` / `password` / `port` 2025-10-26 * `eab70c3c`
- **New** - Let's Mesh Analyzer integration 2025-10-26 * `a6453556`
- **New** - Station G2 repeater bridge build target; docs 2025-10-26 * `f6a77d2f`
- **New** - Timezone handling; raw-data packet output with proper hashes / timestamps 2025-10-25 * `787af7b0`
- **New** - Timezone support in the MQTT Bridge and CLI 2025-10-25 * `26c4b970`
- **New** - Initial MQTT Bridge implementation with WiFi CLI configuration 2025-10-25 * `efc15eb6`