{
  "id": "fieldmesh",
  "name": "FieldMesh",
  "type": "fork",
  "maintainer": "TogeriX-hub (Tobias Guertler)",
  "maintainers": [
    {
      "name": "TogeriX-hub",
      "url": "https://github.com/TogeriX-hub"
    }
  ],
  "repository": "https://github.com/TogeriX-hub/FieldMesh",
  "website": "https://www.tobiasguertler.de/blog/en/fieldmesh",
  "license": "MIT",
  "description": "A MeshCore firmware fork optimized for outdoor use — festivals, hiking, off-grid events. Adds automatic GPS advertising, dedicated tracking page with distance calculation, Off-Grid mode with legal frequency defaults and one-press toggle, SOS system with buzzer alarms, message history with RAM ring buffer, and text input/send on joystick-equipped devices. Designed to be field-ready: put it in your backpack and trust it's doing its job.\n",
  "status": "active",
  "lifecycle": "active",
  "maturity": "stable",
  "distribution": "community",
  "lineage": {
    "kind": "fork",
    "upstreamFirmwareId": "meshcore-official",
    "upstreamRepository": "https://github.com/meshcore-dev/MeshCore"
  },
  "runtime": {
    "framework": "arduino",
    "language": "cpp"
  },
  "roles": [
    "companion",
    "repeater",
    "standalone-ui"
  ],
  "features": [
    "Automatic GPS advertising (zero-hop, every 5 minutes)",
    "Dedicated tracking page with Haversine distance calculation",
    "Off-Grid mode with Client Repeat on separate legal frequencies",
    "One-press Off-Grid toggle (menu or 5x button press on headless devices)",
    "SOS system with two-step confirmation and buzzer alarm",
    "Message history (RAM ring buffer, up to 32 entries)",
    "Text input and send via joystick (Wio Tracker L1)",
    "Online node counter on home screen",
    "Mode indicators (GPS-SHARE, OFF-GRID)",
    "Headless device support (T1000-E, RAK WiseMesh TAG)",
    "Forced buzzer feedback for all actions on headless devices",
    "Splash screen with version info and FieldMesh branding",
    "Backlight fixes for various displays"
  ],
  "capabilities": {
    "protocol": {
      "meshcoreCompatible": true,
      "rawPacketSend": true,
      "rawPacketObserve": true
    },
    "transports": {
      "ble": true,
      "usbSerial": true,
      "nativeTcp": false,
      "wifiAp": false
    },
    "operations": {
      "webFlasher": false,
      "ota": false,
      "bleDfu": false,
      "configurationBackup": true
    },
    "networking": {
      "repeater": true,
      "roomServer": false,
      "observer": false,
      "mqtt": false,
      "kissModem": false
    },
    "hardware": {
      "gps": true,
      "display": true,
      "sensors": false,
      "lowPowerRx": false
    }
  },
  "changelog": {
    "source": "github",
    "repo": "TogeriX-hub/FieldMesh"
  },
  "devices": [
    {
      "id": "thinknode-m1",
      "status": "supported",
      "target": "thinknode_m1",
      "platformio_board": "thinknode_m1",
      "notes": "E-Ink display, single button; primary development target"
    },
    {
      "id": "wio-tracker-l1",
      "status": "supported",
      "target": "wio-tracker-l1",
      "platformio_board": "seeed-wio-tracker-l1",
      "notes": "OLED display (SSD1306/SH1106 128x64), joystick; text input and send supported"
    },
    {
      "id": "wio-tracker-l1-eink",
      "status": "supported",
      "target": "wio-tracker-l1-eink",
      "platformio_board": "seeed-wio-tracker-l1",
      "notes": "E-ink variant (GxEPD2 250x122)"
    },
    {
      "id": "sensecap-t1000e",
      "status": "supported",
      "target": "t1000-e",
      "platformio_board": "tracker-t1000-e",
      "notes": "Headless device (no display, single button); primary headless reference"
    },
    {
      "id": "rak-wismesh-tag",
      "status": "supported",
      "target": "rak_wismesh_tag",
      "platformio_board": "rak4631",
      "notes": "Headless device; contributions welcome"
    }
  ],
  "popularity": {
    "githubStars": 25,
    "githubForks": 0,
    "githubWatchers": 1,
    "githubOpenIssues": 3,
    "githubContributors": 151,
    "releaseDownloads": 0,
    "latestReleaseDownloads": 0,
    "lastChecked": "2026-06-21"
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "ciBuilds": true,
    "lastChecked": "2026-06-21"
  },
  "source": {
    "path": "data/firmwares/fieldmesh/firmware.yaml",
    "updatedAt": "2026-06-22T21:31:07+02:00"
  },
  "latest_version": "5.3",
  "released": "2026-04-28",
  "releases": [
    {
      "version": "v5.3",
      "name": "FieldMesh v5.3",
      "datetime": "2026-04-28T07:00:54Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v5.3",
      "prerelease": false,
      "notes": "## [5.3] — MeshCore Upstream Sync\r\n\r\n\r\n### Changes\r\n- **MeshCore upstream alignment** — codebase updated to track MeshCore v1.15.0; no FieldMesh-specific feature changes in this release\r\n\r\n\r\n# Download latest build\r\n## EU Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_FieldMeshv5.3.zip](https://github.com/user-attachments/files/27154033/ThinkNode_M1_companion_radio_ble_FieldMeshv5.3.zip)\r\n[WioTrackerL1_companion_radio_ble_FieldMeshv5.3.zip](https://github.com/user-attachments/files/27154037/WioTrackerL1_companion_radio_ble_FieldMeshv5.3.zip)\r\n[t1000e_companion_radio_ble_FieldMeshv5.3.zip](https://github.com/user-attachments/files/27154044/t1000e_companion_radio_ble_FieldMeshv5.3.zip)\r\n\r\n\r\n## US Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_USFieldMeshv5.3.zip](https://github.com/user-attachments/files/27154065/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.3.zip)\r\n[WioTrackerL1_companion_radio_ble_USFieldMeshv5.3.zip](https://github.com/user-attachments/files/27154067/WioTrackerL1_companion_radio_ble_USFieldMeshv5.3.zip)\r\n[t1000e_companion_radio_ble_USFieldMeshv5.3.zip](https://github.com/user-attachments/files/27154071/t1000e_companion_radio_ble_USFieldMeshv5.3.zip)",
      "notesHtml": "<h2>[5.3] — MeshCore Upstream Sync</h2>\n<h3>Changes</h3>\n<ul>\n<li><strong>MeshCore upstream alignment</strong> — codebase updated to track MeshCore v1.15.0; no FieldMesh-specific feature changes in this release</li>\n</ul>\n<h1>Download latest build</h1>\n<h2>EU Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/27154033/ThinkNode_M1_companion_radio_ble_FieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_FieldMeshv5.3.zip</a>\n<a href=\"https://github.com/user-attachments/files/27154037/WioTrackerL1_companion_radio_ble_FieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_FieldMeshv5.3.zip</a>\n<a href=\"https://github.com/user-attachments/files/27154044/t1000e_companion_radio_ble_FieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_FieldMeshv5.3.zip</a></p>\n<h2>US Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/27154065/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_USFieldMeshv5.3.zip</a>\n<a href=\"https://github.com/user-attachments/files/27154067/WioTrackerL1_companion_radio_ble_USFieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_USFieldMeshv5.3.zip</a>\n<a href=\"https://github.com/user-attachments/files/27154071/t1000e_companion_radio_ble_USFieldMeshv5.3.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_USFieldMeshv5.3.zip</a></p>\n"
    },
    {
      "version": "v5.2",
      "name": "FieldMesh v5.2",
      "datetime": "2026-04-09T14:29:21Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v5.2",
      "prerelease": false,
      "notes": "## [5.2] — HomeScreen Redesign & Online Node Counter\r\n\r\n### New features\r\n- **Online node counter** — HomeScreen now shows how many nodes have been\r\n  heard in the last 30 minutes, combining advert senders and message senders\r\n  in a single deduplicated count (16-entry LRU cache)\r\n- **Node counter icon** — the online count is displayed with a filled circle\r\n  icon (●) instead of plain [X] text\r\n- **Real channel name in title bar** — message history and favorite preview\r\n  now show the actual channel name (e.g. \"Public\") instead of the hardcoded\r\n  \"[CH]\" tag\r\n- **Mode indicator** — GPS-SHARE and OFF-GRID modes are now shown on the\r\n  HomeScreen FIRST page\r\n\r\n### Changes\r\n- **M1 HomeScreen layout** — node counter fixed at y=22 regardless of\r\n  connection state; MSG:X replaces `< Connected >` when disconnected;\r\n  nodes_icon y-offset corrected (+3px) to align with text baseline\r\n- **Channel message title bar** — sender name omitted from title bar for\r\n  channel messages (already visible inside the message text)\r\n- **Favorite indicator** — clears correctly after all messages are deleted\r\n  (deleteEntry / clearAll); no longer persists stale data after app sync\r\n- **MSG:X counter** — hidden on HomeScreen while phone app is connected\r\n- **RECENT/TRACKING pages** — row limits now display-height-adaptive via\r\n  max_y variable instead of hardcoded values\r\n\r\n### Bug fixes\r\n- **BLE init: send_queue flood** — between `onSecured()` and `CMD_APP_START`\r\n  async pushes could fill all 12 send_queue slots, causing the app to time\r\n  out. Fixed via `_app_initialized` flag and `isWriteBusy()` guard\r\n- **Double-counting in node counter** — nodes heard via both advert and\r\n  message were counted twice. Fixed via `countOnlineNodesExcluding()`\r\n- **adv_fresh buffer** — was reusing the 4-entry RECENT display array,\r\n  capping the advert-based node count at 4. Now uses a dedicated\r\n  ADVERT_PATH_TABLE_SIZE (16) buffer\r\n- **formatRelTime undefined behavior** — replaced signed int cast with\r\n  safe uint32_t arithmetic\r\n\r\n### Technical notes\r\n- Changes confined to `UITask.cpp`, `UITask.h`, `MyMesh.cpp`, `MyMesh.h`,\r\n  `icons.h`\r\n- `DataStore`, `AbstractUITask`, `platformio.ini` unaffected\r\n\r\n# Download latest build\r\n## EU Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_FieldMeshv5.2.zip](https://github.com/user-attachments/files/26605877/ThinkNode_M1_companion_radio_ble_FieldMeshv5.2.zip)\r\n[WioTrackerL1_companion_radio_ble_FieldMeshv5.2.zip](https://github.com/user-attachments/files/26605890/WioTrackerL1_companion_radio_ble_FieldMeshv5.2.zip)\r\n[t1000e_companion_radio_ble_FieldMeshv5.2.zip](https://github.com/user-attachments/files/26605896/t1000e_companion_radio_ble_FieldMeshv5.2.zip)\r\n\r\n## US Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_USFieldMeshv5.2.zip](https://github.com/user-attachments/files/26605905/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.2.zip)\r\n[WioTrackerL1_companion_radio_ble_USFieldMeshv5.2.zip](https://github.com/user-attachments/files/26605916/WioTrackerL1_companion_radio_ble_USFieldMeshv5.2.zip)\r\n[t1000e_companion_radio_ble_USFieldMeshv5.2.zip](https://github.com/user-attachments/files/26605923/t1000e_companion_radio_ble_USFieldMeshv5.2.zip)",
      "notesHtml": "<h2>[5.2] — HomeScreen Redesign &amp; Online Node Counter</h2>\n<h3>New features</h3>\n<ul>\n<li><strong>Online node counter</strong> — HomeScreen now shows how many nodes have been\nheard in the last 30 minutes, combining advert senders and message senders\nin a single deduplicated count (16-entry LRU cache)</li>\n<li><strong>Node counter icon</strong> — the online count is displayed with a filled circle\nicon (●) instead of plain [X] text</li>\n<li><strong>Real channel name in title bar</strong> — message history and favorite preview\nnow show the actual channel name (e.g. \"Public\") instead of the hardcoded\n\"[CH]\" tag</li>\n<li><strong>Mode indicator</strong> — GPS-SHARE and OFF-GRID modes are now shown on the\nHomeScreen FIRST page</li>\n</ul>\n<h3>Changes</h3>\n<ul>\n<li><strong>M1 HomeScreen layout</strong> — node counter fixed at y=22 regardless of\nconnection state; MSG:X replaces <code>&lt; Connected &gt;</code> when disconnected;\nnodes_icon y-offset corrected (+3px) to align with text baseline</li>\n<li><strong>Channel message title bar</strong> — sender name omitted from title bar for\nchannel messages (already visible inside the message text)</li>\n<li><strong>Favorite indicator</strong> — clears correctly after all messages are deleted\n(deleteEntry / clearAll); no longer persists stale data after app sync</li>\n<li><strong>MSG:X counter</strong> — hidden on HomeScreen while phone app is connected</li>\n<li><strong>RECENT/TRACKING pages</strong> — row limits now display-height-adaptive via\nmax_y variable instead of hardcoded values</li>\n</ul>\n<h3>Bug fixes</h3>\n<ul>\n<li><strong>BLE init: send_queue flood</strong> — between <code>onSecured()</code> and <code>CMD_APP_START</code>\nasync pushes could fill all 12 send_queue slots, causing the app to time\nout. Fixed via <code>_app_initialized</code> flag and <code>isWriteBusy()</code> guard</li>\n<li><strong>Double-counting in node counter</strong> — nodes heard via both advert and\nmessage were counted twice. Fixed via <code>countOnlineNodesExcluding()</code></li>\n<li><strong>adv_fresh buffer</strong> — was reusing the 4-entry RECENT display array,\ncapping the advert-based node count at 4. Now uses a dedicated\nADVERT_PATH_TABLE_SIZE (16) buffer</li>\n<li><strong>formatRelTime undefined behavior</strong> — replaced signed int cast with\nsafe uint32_t arithmetic</li>\n</ul>\n<h3>Technical notes</h3>\n<ul>\n<li>Changes confined to <code>UITask.cpp</code>, <code>UITask.h</code>, <code>MyMesh.cpp</code>, <code>MyMesh.h</code>,\n<code>icons.h</code></li>\n<li><code>DataStore</code>, <code>AbstractUITask</code>, <code>platformio.ini</code> unaffected</li>\n</ul>\n<h1>Download latest build</h1>\n<h2>EU Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/26605877/ThinkNode_M1_companion_radio_ble_FieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_FieldMeshv5.2.zip</a>\n<a href=\"https://github.com/user-attachments/files/26605890/WioTrackerL1_companion_radio_ble_FieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_FieldMeshv5.2.zip</a>\n<a href=\"https://github.com/user-attachments/files/26605896/t1000e_companion_radio_ble_FieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_FieldMeshv5.2.zip</a></p>\n<h2>US Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/26605905/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_USFieldMeshv5.2.zip</a>\n<a href=\"https://github.com/user-attachments/files/26605916/WioTrackerL1_companion_radio_ble_USFieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_USFieldMeshv5.2.zip</a>\n<a href=\"https://github.com/user-attachments/files/26605923/t1000e_companion_radio_ble_USFieldMeshv5.2.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_USFieldMeshv5.2.zip</a></p>\n"
    },
    {
      "version": "v5.1",
      "name": "FieldMesh v5.1",
      "datetime": "2026-04-04T08:18:12Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v5.1",
      "prerelease": false,
      "notes": "## [5.1] — Headless Device Support (T1000-E, RAK WiseMesh TAG)\r\n\r\n### New features\r\n- **Headless device support** — `ui-orig` now fully integrated into FieldMesh; devices with no display and a single button (Seeed T1000-E, RAK WiseMesh TAG) are supported as first-class citizens\r\n- **Off-Grid toggle via 5× click** — 5 presses on the single button toggles Off-Grid mode on/off; buzzer feedback is forced regardless of mute state (ascending tone = on, descending = off)\r\n- **SOS alarm via buzzer** — incoming `!SOS` messages trigger a continuous buzzer siren that overrides quiet mode and loops until acknowledged with a short press\r\n\r\n### Changes\r\n- All button actions (advert, GPS toggle, buzzer toggle, Off-Grid toggle) now produce forced buzzer feedback regardless of quiet mode — essential for display-less operation\r\n- Ascending tone (`c,e`) = feature enabled; descending tone (`e,c`) = feature disabled — consistent across all actions\r\n- `newMsg()` signature updated to include `is_favorite` parameter — compatible with V5 `AbstractUITask` interface\r\n- `refreshDisplay()` and `isOnRecentOrTrackingPage()` added as explicit no-op overrides — required for `MyMesh` compatibility\r\n\r\n### Button mapping (headless devices — single button)\r\n| Press | Action |\r\n|---|---|\r\n| 1× | Wake display / acknowledge SOS alarm |\r\n| 2× | Send advert |\r\n| 3× | Buzzer mute on/off |\r\n| 4× | GPS on/off |\r\n| 5× | Off-Grid mode on/off |\r\n| Long press (first 8 s) | CLI Rescue Mode |\r\n| Long press | Shutdown |\r\n\r\n### Technical notes\r\n- Changes confined to `ui-orig/Button.h`, `ui-orig/Button.cpp`, `ui-orig/UITask.h`, `ui-orig/UITask.cpp`\r\n- `ui-new` (ThinkNode M1, Wio Tracker L1) is completely unaffected\r\n- `_buzzer_restore_quiet` flag ensures non-blocking buzzer playback before quiet state is restored\r\n\r\n# Download latest build\r\n\r\n## EU Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_FieldMeshv5.1.zip](https://github.com/user-attachments/files/26479266/ThinkNode_M1_companion_radio_ble_FieldMeshv5.1.zip)\r\n[WioTrackerL1_companion_radio_ble_FieldMeshv5.1.zip](https://github.com/user-attachments/files/26479268/WioTrackerL1_companion_radio_ble_FieldMeshv5.1.zip)\r\n[t1000e_companion_radio_ble_FieldMeshv5.1.zip](https://github.com/user-attachments/files/26479270/t1000e_companion_radio_ble_FieldMeshv5.1.zip)\r\n\r\n## US Offgrid frequency\r\n[ThinkNode_M1_companion_radio_ble_USFieldMeshv5.1.zip](https://github.com/user-attachments/files/26479519/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.1.zip)\r\n[WioTrackerL1_companion_radio_ble_USFieldMeshv5.1.zip](https://github.com/user-attachments/files/26479520/WioTrackerL1_companion_radio_ble_USFieldMeshv5.1.zip)\r\n[t1000e_companion_radio_ble_USFieldMeshv5.1.zip](https://github.com/user-attachments/files/26479521/t1000e_companion_radio_ble_USFieldMeshv5.1.zip)",
      "notesHtml": "<h2>[5.1] — Headless Device Support (T1000-E, RAK WiseMesh TAG)</h2>\n<h3>New features</h3>\n<ul>\n<li><strong>Headless device support</strong> — <code>ui-orig</code> now fully integrated into FieldMesh; devices with no display and a single button (Seeed T1000-E, RAK WiseMesh TAG) are supported as first-class citizens</li>\n<li><strong>Off-Grid toggle via 5× click</strong> — 5 presses on the single button toggles Off-Grid mode on/off; buzzer feedback is forced regardless of mute state (ascending tone = on, descending = off)</li>\n<li><strong>SOS alarm via buzzer</strong> — incoming <code>!SOS</code> messages trigger a continuous buzzer siren that overrides quiet mode and loops until acknowledged with a short press</li>\n</ul>\n<h3>Changes</h3>\n<ul>\n<li>All button actions (advert, GPS toggle, buzzer toggle, Off-Grid toggle) now produce forced buzzer feedback regardless of quiet mode — essential for display-less operation</li>\n<li>Ascending tone (<code>c,e</code>) = feature enabled; descending tone (<code>e,c</code>) = feature disabled — consistent across all actions</li>\n<li><code>newMsg()</code> signature updated to include <code>is_favorite</code> parameter — compatible with V5 <code>AbstractUITask</code> interface</li>\n<li><code>refreshDisplay()</code> and <code>isOnRecentOrTrackingPage()</code> added as explicit no-op overrides — required for <code>MyMesh</code> compatibility</li>\n</ul>\n<h3>Button mapping (headless devices — single button)</h3>\n<table>\n<thead>\n<tr>\n<th>Press</th>\n<th>Action</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>1×</td>\n<td>Wake display / acknowledge SOS alarm</td>\n</tr>\n<tr>\n<td>2×</td>\n<td>Send advert</td>\n</tr>\n<tr>\n<td>3×</td>\n<td>Buzzer mute on/off</td>\n</tr>\n<tr>\n<td>4×</td>\n<td>GPS on/off</td>\n</tr>\n<tr>\n<td>5×</td>\n<td>Off-Grid mode on/off</td>\n</tr>\n<tr>\n<td>Long press (first 8 s)</td>\n<td>CLI Rescue Mode</td>\n</tr>\n<tr>\n<td>Long press</td>\n<td>Shutdown</td>\n</tr>\n</tbody></table>\n<h3>Technical notes</h3>\n<ul>\n<li>Changes confined to <code>ui-orig/Button.h</code>, <code>ui-orig/Button.cpp</code>, <code>ui-orig/UITask.h</code>, <code>ui-orig/UITask.cpp</code></li>\n<li><code>ui-new</code> (ThinkNode M1, Wio Tracker L1) is completely unaffected</li>\n<li><code>_buzzer_restore_quiet</code> flag ensures non-blocking buzzer playback before quiet state is restored</li>\n</ul>\n<h1>Download latest build</h1>\n<h2>EU Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/26479266/ThinkNode_M1_companion_radio_ble_FieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_FieldMeshv5.1.zip</a>\n<a href=\"https://github.com/user-attachments/files/26479268/WioTrackerL1_companion_radio_ble_FieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_FieldMeshv5.1.zip</a>\n<a href=\"https://github.com/user-attachments/files/26479270/t1000e_companion_radio_ble_FieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_FieldMeshv5.1.zip</a></p>\n<h2>US Offgrid frequency</h2>\n<p><a href=\"https://github.com/user-attachments/files/26479519/ThinkNode_M1_companion_radio_ble_USFieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_USFieldMeshv5.1.zip</a>\n<a href=\"https://github.com/user-attachments/files/26479520/WioTrackerL1_companion_radio_ble_USFieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_USFieldMeshv5.1.zip</a>\n<a href=\"https://github.com/user-attachments/files/26479521/t1000e_companion_radio_ble_USFieldMeshv5.1.zip\" target=\"_blank\" rel=\"noopener noreferrer\">t1000e_companion_radio_ble_USFieldMeshv5.1.zip</a></p>\n"
    },
    {
      "version": "v5.09",
      "name": "Release v5.09 — Message History & Text Input",
      "datetime": "2026-04-03T12:35:15Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v5.09",
      "prerelease": false,
      "notes": "FieldMesh V5 — the first release that makes the node fully standalone for messaging. No phone required.\r\n\r\n## What's new\r\n\r\n### Message History (ThinkNode M1 + Wio Tracker L1)\r\n- Received messages are stored on the device and browsable without the companion app\r\n- Home screen redesigned: shows unread counter and the name + timestamp of the most recent message from a favourite contact\r\n- Long press on home screen opens the message menu (filter: All / Favourites)\r\n- One message per view, newest first — short press = next, long press = clear all\r\n- Channel tag (`[CH1]`, `[DM]`) and timestamp shown per message\r\n- New message while history is open: `+1 new` alert, no automatic screen switch\r\n\r\n### Text Input & Send (Wio Tracker L1 only)\r\n- Compose and send channel messages directly from the device via joystick\r\n- Channel select → character compose → \"Sent!\" confirmation\r\n- Character selection via joystick left/right, confirm with short press, send with long press\r\n- 80 character limit\r\n\r\n## Important notes\r\n- Message history is RAM-only — messages are lost on reboot. This is intentional: smartphone sync via the companion app is never affected by what the device shows or clears.\r\n- Text send is available on Wio Tracker L1 only. Single-button input on ThinkNode M1 does not support text composition.\r\n- No DM sending — channel messages only.\r\n\r\n## Files changed\r\n`UITask.h`, `UITask.cpp`, `MyMesh.h`, `MyMesh.cpp`, `AbstractUITask.h`\r\n\r\n## Full changelog\r\nSee [RELEASE.md](RELEASE.md) for the complete version history.\r\n\r\n[ThinkNode_M1_companion_radio_ble_FieldMeshv5.09.zip](https://github.com/user-attachments/files/26460200/ThinkNode_M1_companion_radio_ble_FieldMeshv5.09.zip)\r\n\r\n[WioTrackerL1_companion_radio_ble_FieldMeshv5.09.zip](https://github.com/user-attachments/files/26460205/WioTrackerL1_companion_radio_ble_FieldMeshv5.09.zip)",
      "notesHtml": "<p>FieldMesh V5 — the first release that makes the node fully standalone for messaging. No phone required.</p>\n<h2>What's new</h2>\n<h3>Message History (ThinkNode M1 + Wio Tracker L1)</h3>\n<ul>\n<li>Received messages are stored on the device and browsable without the companion app</li>\n<li>Home screen redesigned: shows unread counter and the name + timestamp of the most recent message from a favourite contact</li>\n<li>Long press on home screen opens the message menu (filter: All / Favourites)</li>\n<li>One message per view, newest first — short press = next, long press = clear all</li>\n<li>Channel tag (<code>[CH1]</code>, <code>[DM]</code>) and timestamp shown per message</li>\n<li>New message while history is open: <code>+1 new</code> alert, no automatic screen switch</li>\n</ul>\n<h3>Text Input &amp; Send (Wio Tracker L1 only)</h3>\n<ul>\n<li>Compose and send channel messages directly from the device via joystick</li>\n<li>Channel select → character compose → \"Sent!\" confirmation</li>\n<li>Character selection via joystick left/right, confirm with short press, send with long press</li>\n<li>80 character limit</li>\n</ul>\n<h2>Important notes</h2>\n<ul>\n<li>Message history is RAM-only — messages are lost on reboot. This is intentional: smartphone sync via the companion app is never affected by what the device shows or clears.</li>\n<li>Text send is available on Wio Tracker L1 only. Single-button input on ThinkNode M1 does not support text composition.</li>\n<li>No DM sending — channel messages only.</li>\n</ul>\n<h2>Files changed</h2>\n<p><code>UITask.h</code>, <code>UITask.cpp</code>, <code>MyMesh.h</code>, <code>MyMesh.cpp</code>, <code>AbstractUITask.h</code></p>\n<h2>Full changelog</h2>\n<p>See <a href=\"https://github.com/TogeriX-hub/FieldMesh/blob/HEAD/RELEASE.md\" target=\"_blank\" rel=\"noopener noreferrer\">RELEASE.md</a> for the complete version history.</p>\n<p><a href=\"https://github.com/user-attachments/files/26460200/ThinkNode_M1_companion_radio_ble_FieldMeshv5.09.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_FieldMeshv5.09.zip</a></p>\n<p><a href=\"https://github.com/user-attachments/files/26460205/WioTrackerL1_companion_radio_ble_FieldMeshv5.09.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_FieldMeshv5.09.zip</a></p>\n"
    },
    {
      "version": "v4.04",
      "name": "FieldMesh v4.04",
      "datetime": "2026-03-30T20:55:22Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v4.04",
      "prerelease": false,
      "notes": "## V4.04 — Wio Tracker L1 Joystick UI Fixes\r\n\r\n\r\n### target.cpp / target.h\r\n- Added `joystick_up` (`JOYSTICK_UP`) and `joystick_down` (`JOYSTICK_DOWN`) as `MomentaryButton`\r\n\r\n### UITask.cpp — loop()\r\n- Joystick Up → `KEY_PREV`, Joystick Down → `KEY_NEXT`\r\n- Joystick press short → `KEY_ENTER` (confirm in menus)\r\n- Joystick press long → `handleLongPress()` (context action)\r\n\r\n### UITask.cpp — HomeScreen\r\n- Removed dead code: `KEY_ENTER` on Tracking page directly toggled GPS-Share — unused since V2.02 (Outdoor Menu), but accidentally active on Wio Tracker\r\n- Tracking hint text: `\"Settings: press Enter\"` (joystick) instead of `\"Settings: long press\"`\r\n\r\n### UITask.cpp — OutdoorMenuScreen\r\n- Removed footer `\"short=next long=select\"` on joystick devices (self-explanatory)\r\n- Menu navigation: Up/Down instead of Left/Right\r\n\r\n### UITask.cpp — SOSSendScreen\r\n- `handleLongPress()` now sends `KEY_SELECT` instead of `KEY_ENTER` to `SOSSendScreen` to distinguish short and long press\r\n- Short press = always go back (both states)\r\n- Long press = confirm / send (both states)\r\n- Hint text both states: `\"long press: SEND`\r\n\r\n[ThinkNode_M1_companion_radio_ble_FieldMeshv4.04.zip](https://github.com/user-attachments/files/26416861/ThinkNode_M1_companion_radio_ble_FieldMeshv4.04.zip)\r\n\r\n\r\n[WioTrackerL1_companion_radio_ble_FieldMeshv4.04.zip](https://github.com/user-attachments/files/26416618/WioTrackerL1_companion_radio_ble_FieldMeshv4.04.zip)",
      "notesHtml": "<h2>V4.04 — Wio Tracker L1 Joystick UI Fixes</h2>\n<h3>target.cpp / target.h</h3>\n<ul>\n<li>Added <code>joystick_up</code> (<code>JOYSTICK_UP</code>) and <code>joystick_down</code> (<code>JOYSTICK_DOWN</code>) as <code>MomentaryButton</code></li>\n</ul>\n<h3>UITask.cpp — loop()</h3>\n<ul>\n<li>Joystick Up → <code>KEY_PREV</code>, Joystick Down → <code>KEY_NEXT</code></li>\n<li>Joystick press short → <code>KEY_ENTER</code> (confirm in menus)</li>\n<li>Joystick press long → <code>handleLongPress()</code> (context action)</li>\n</ul>\n<h3>UITask.cpp — HomeScreen</h3>\n<ul>\n<li>Removed dead code: <code>KEY_ENTER</code> on Tracking page directly toggled GPS-Share — unused since V2.02 (Outdoor Menu), but accidentally active on Wio Tracker</li>\n<li>Tracking hint text: <code>\"Settings: press Enter\"</code> (joystick) instead of <code>\"Settings: long press\"</code></li>\n</ul>\n<h3>UITask.cpp — OutdoorMenuScreen</h3>\n<ul>\n<li>Removed footer <code>\"short=next long=select\"</code> on joystick devices (self-explanatory)</li>\n<li>Menu navigation: Up/Down instead of Left/Right</li>\n</ul>\n<h3>UITask.cpp — SOSSendScreen</h3>\n<ul>\n<li><code>handleLongPress()</code> now sends <code>KEY_SELECT</code> instead of <code>KEY_ENTER</code> to <code>SOSSendScreen</code> to distinguish short and long press</li>\n<li>Short press = always go back (both states)</li>\n<li>Long press = confirm / send (both states)</li>\n<li>Hint text both states: <code>\"long press: SEND</code></li>\n</ul>\n<p><a href=\"https://github.com/user-attachments/files/26416861/ThinkNode_M1_companion_radio_ble_FieldMeshv4.04.zip\" target=\"_blank\" rel=\"noopener noreferrer\">ThinkNode_M1_companion_radio_ble_FieldMeshv4.04.zip</a></p>\n<p><a href=\"https://github.com/user-attachments/files/26416618/WioTrackerL1_companion_radio_ble_FieldMeshv4.04.zip\" target=\"_blank\" rel=\"noopener noreferrer\">WioTrackerL1_companion_radio_ble_FieldMeshv4.04.zip</a></p>\n"
    },
    {
      "version": "v4.03",
      "name": "FieldMesh V4.03",
      "datetime": "2026-03-30T14:46:33Z",
      "url": "https://github.com/TogeriX-hub/FieldMesh/releases/tag/v4.03",
      "prerelease": false,
      "notes": "## V4.03 – Backlight & Display Logic Overhaul\r\n\r\n### Fixed\r\n- `AUTO_OFF_MILLIS=0` removed from `platformio.ini` – display now correctly sleeps after 15 seconds of inactivity\r\n- 5-minute backlight auto-off timer removed – no longer needed with display sleep active\r\n- Backlight now correctly follows `_backlight_on` state on every `turnOn()` call, overriding GxEPD driver behavior\r\n\r\n### Improved\r\n- Backlight state is fully decoupled from display wake events – incoming messages and adverts wake the display without changing the backlight state\r\n- Added `refreshDisplay()` – wakes display briefly on incoming adverts when on Recent or Tracking page, without affecting backlight\r\n- Advert-triggered display refresh works even when a phone is connected via BLE\r\n\r\n### Technical\r\n- Added `refreshDisplay()` and `isOnRecentOrTrackingPage()` to `AbstractUITask` as virtual methods\r\n- `_backlight_off_at` member removed from `UITask`",
      "notesHtml": "<h2>V4.03 – Backlight &amp; Display Logic Overhaul</h2>\n<h3>Fixed</h3>\n<ul>\n<li><code>AUTO_OFF_MILLIS=0</code> removed from <code>platformio.ini</code> – display now correctly sleeps after 15 seconds of inactivity</li>\n<li>5-minute backlight auto-off timer removed – no longer needed with display sleep active</li>\n<li>Backlight now correctly follows <code>_backlight_on</code> state on every <code>turnOn()</code> call, overriding GxEPD driver behavior</li>\n</ul>\n<h3>Improved</h3>\n<ul>\n<li>Backlight state is fully decoupled from display wake events – incoming messages and adverts wake the display without changing the backlight state</li>\n<li>Added <code>refreshDisplay()</code> – wakes display briefly on incoming adverts when on Recent or Tracking page, without affecting backlight</li>\n<li>Advert-triggered display refresh works even when a phone is connected via BLE</li>\n</ul>\n<h3>Technical</h3>\n<ul>\n<li>Added <code>refreshDisplay()</code> and <code>isOnRecentOrTrackingPage()</code> to <code>AbstractUITask</code> as virtual methods</li>\n<li><code>_backlight_off_at</code> member removed from <code>UITask</code></li>\n</ul>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-06-21T09:55:30.022Z"
}
