All firmwares

MeshCore Solo

Fork

A fork of the reference MeshCore companion radio firmware with extended features and UI enhancements. Adds GPS navigation (waypoints, compass, trail recording with GPX export), battery power-saving (hardware RX duty-cycle + adaptive power control), favourite contacts dial, extended language support with native Unicode rendering, message delivery status, screen lock, auto-reply bot, repeater mode with diagnostics, and more — all optimized for joystick-only navigation on small displays.

Fork of MeshCore (Reference)

Maintainer
MarekZegare4 ↗
Status
Active
Maturity
Stable
Lifecycle
Active
Latest version
1.21-rc2
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
  • BLE DFU
  • Config backup

Networking

  • Repeater
  • Room server
  • Observer
  • MQTT
  • KISS modem

Hardware

  • GPS
  • Display
  • Sensors
  • Low-power RX

Protocol

  • MeshCore compatible
  • Raw packet send
  • Raw packet observe

Node role

CompanionRepeaterStandalone UI

Features

  • Extended Unicode support with Lemon font and native input
  • GPS navigation suite (waypoints, compass, backtrack, trail recording)
  • GPX export via USB serial
  • Screenshot capture over USB
  • Favourites dial for pinned contacts
  • Message delivery status indicators
  • DM auto-resend and incoming deduplication
  • Screen lock with time and sensor display
  • Auto-reply bot with command responses
  • Auto-advert for location sharing
  • Battery power saving (RX duty-cycle + APC)
  • Companion repeater mode with diagnostics
  • Ping functionality in Nearby Nodes
  • SOS broadcast with configurable target
  • Quiet hours for sound suppression
  • Mark-all-read at type level
  • Lock-screen unread count
  • Channel scanner home page
  • Contact distance sorting
  • Signal stats screen
  • Display test pattern
  • Power profile presets
  • Solo Tools web app for screenshot capture and GPX export (https://marekzegare4.github.io/Solo-tools/)

Releases

from GitHub · updated 2026-06-26
  1. v1.21-rc2 # Latest Pre-release 22 hours ago · 2026-06-26 22:52 UTC

    MeshCore Solo Companion Firmware v1.21 Release candidate 2

    What's new

    • Live Location Sharing — broadcast your position over the mesh as [LOC] messages, movement-gated, to a channel or a single contact. Others who share theirs show up as pins on the map with live distance/bearing in Nearby Nodes, and a status-bar indicator appears while your own share is active. [LOC] is parsed in DMs, channel messages and room messages; DM shares name the sender.
    • Locator (geofence) — arm a geofence around a target — a saved waypoint or a person (their live [LOC] or last-known position) — and get an alert when you arrive/leave or they get near/far, with an optional homing beeper that ticks faster the closer you get (and overrides a muted buzzer). Arm it from Tools › Locator or straight from Nearby Nodes / Waypoints; pick the target from a list (favourites first, then any contact), and clear it via a "None" entry. The active target is drawn as a flag on the map.
    • One active target across Locator / Navigate / Map — a single "Set as target" action everywhere, backed by a shared resolver that prefers a live [LOC] share over the last-advertised GPS, so the three features always agree on where you're headed.
    • Follow live contactsNavigate to a contact who is live-sharing and the view follows them as they move, adding an ETA line. Quick-share your own position straight from the Map.
    • Map & status-bar upgrades — the home mini-map gains a north marker and a scale tick; the status line shows the tracked-node count and, with a fix, an arrow + distance to the nearest tracked contact (e.g. Track:3 →120m); a GPS fix icon sits in the top status bar (boxed once a fix is valid, plain while searching), shown only on GPS boards while GPS is enabled in Settings.
    • Trail auto-pause — recording freezes on stops (banking elapsed time and breaking the map line across the idle gap) and resumes on movement without ending the session; the home-screen blink keeps going while paused.
    • Collapsible Tools — tools are grouped into fold-in-place Location / Comms / System sections, the same model as Settings (Tools always opens folded to the section list), and the home carousel now uses page-indicator icons instead of dots.
    • Waypoint coordinate editor — add a waypoint by scroll-editing its latitude/longitude digit by digit.
    • On-device room login with saved passwords — log in to a room server straight from the device (no phone app): pick the room and the password prompt appears automatically (a blank password works for open rooms), or re-login any time via the room's context-menu "Login…". The password is remembered across reboots, so a room you've used before logs back in without retyping; a failed login (e.g. the server's password changed) forgets the stale password so the next attempt prompts again. Saved passwords are written with the same atomic, crash-safe persistence as contacts and channels.

    Fixes

    • Critical — low-heap hang and contact loss on RAM-tight builds. With MAX_CONTACTS=350 and OFFLINE_QUEUE_SIZE=256 the device ran with very little free heap; an allocation in the input/menu path could then fail and hang the UI (notably when entering Diagnostics), and a crash or reset mid-save could wipe all contacts. Fixed by two independent changes:
      • Right-sized message-history rings — the on-device scrollback rings were halved (96→48 channel, 64→32 DM), recovering ~14 KB of free heap (measured 3 → 17 KB). History is RAM-only, so the only cost is shorter on-device scrollback.
      • Atomic persistence — contacts, channels and prefs are now written to a temp file and atomically renamed into place; an interrupted save (crash, reset, full flash) leaves the previous good file intact instead of truncating it.
    • USB host stall — `Serial.write …
  2. v1.21-rc1 # Pre-release 2 days ago · 2026-06-25 17:17 UTC

    MeshCore Solo Companion Firmware v1.21 Release candidate 1

    What's new

    • Live Location Sharing — broadcast your position over the mesh as [LOC] messages, movement-gated, to a channel or a single contact. Others who share theirs show up as pins on the map with live distance/bearing in Nearby Nodes, and a status-bar indicator appears while your own share is active. [LOC] is parsed in DMs, channel messages and room messages; DM shares name the sender.
    • Locator (geofence) — arm a geofence around a target — a saved waypoint or a person (their live [LOC] or last-known position) — and get an alert when you arrive/leave or they get near/far, with an optional homing beeper that ticks faster the closer you get (and overrides a muted buzzer). Arm it from Tools › Locator or straight from Nearby Nodes / Waypoints; pick the target from a list (favourites first, then any contact), and clear it via a "None" entry. The active target is drawn as a flag on the map.
    • One active target across Locator / Navigate / Map — a single "Set as target" action everywhere, backed by a shared resolver that prefers a live [LOC] share over the last-advertised GPS, so the three features always agree on where you're headed.
    • Follow live contactsNavigate to a contact who is live-sharing and the view follows them as they move, adding an ETA line. Quick-share your own position straight from the Map.
    • Map & status-bar upgrades — the home mini-map gains a north marker and a scale tick; the status line shows the tracked-node count and, with a fix, an arrow + distance to the nearest tracked contact (e.g. Track:3 →120m); a GPS fix icon sits in the top status bar (boxed once a fix is valid, plain while searching), shown only on GPS boards while GPS is enabled in Settings.
    • Trail auto-pause — recording freezes on stops (banking elapsed time and breaking the map line across the idle gap) and resumes on movement without ending the session; the home-screen blink keeps going while paused.
    • Collapsible Tools — tools are grouped into fold-in-place Location / Comms / System sections, the same model as Settings (Tools always opens folded to the section list), and the home carousel now uses page-indicator icons instead of dots.
    • Waypoint coordinate editor — add a waypoint by scroll-editing its latitude/longitude digit by digit.

    Fixes

    • Critical — low-heap hang and contact loss on RAM-tight builds. With MAX_CONTACTS=350 and OFFLINE_QUEUE_SIZE=256 the device ran with very little free heap; an allocation in the input/menu path could then fail and hang the UI (notably when entering Diagnostics), and a crash or reset mid-save could wipe all contacts. Fixed by two independent changes:
      • Right-sized message-history rings — the on-device scrollback rings were halved (96→48 channel, 64→32 DM), recovering ~14 KB of free heap (measured 3 → 17 KB). History is RAM-only, so the only cost is shorter on-device scrollback.
      • Atomic persistence — contacts, channels and prefs are now written to a temp file and atomically renamed into place; an interrupted save (crash, reset, full flash) leaves the previous good file intact instead of truncating it.
    • USB host stallSerial.write() is bounded so a stalled USB host can no longer hang the device indefinitely.

    Under the hood

    • Streaming trail simplification — GPS points are simplified as they're recorded via a fixed-corridor (Reumann–Witkam) pass: straight runs collapse to their two endpoints while curves stay bounded to within the Min dist tolerance of the real track, so the 512-point buffer covers a far longer route than a flat point budget would suggest.
    • A UITask-decoupled active-target resolver (resolvePersonPos / activeTargetPos) replaces the duplicated target-resolution logic that lived sepa …
  3. v1.20 # 6 days ago · 2026-06-22 08:51 UTC

    MeshCore Solo Companion Firmware v1.20

    What's new

    • Repeater mode — a solo companion can now opt in to relaying mesh traffic, configured from a dedicated Tools › Repeater screen that consolidates the toggle, the forwarding filters, live forwarding stats, and a separate radio profile:
      • Forwarding filters (all flood-only, off by default) — skip-advert (don't re-flood the highest-volume advert traffic), max-hops (drop a flood once it has travelled too far), yield (extra retransmit-delay so a mobile node defers to better-sited fixed repeaters), and min-SNR (don't re-flood marginal fringe packets). Plus overhear suppression, which cancels a queued retransmit if a peer relays the same packet first.
      • Dedicated radio profile — an optional "Custom" Freq/SF/BW/CR used only while relaying, separate from the companion's own network and band-matched to the companion frequency by default. It's applied everywhere a radio change can happen (boot, on-device toggle, app-driven CMD_SET_RADIO_PARAMS, Settings edits) so the device never silently relays on the wrong params.
      • While relaying, Adaptive Power Control is pinned to the ceiling and duty-cycle RX is forced off — a repeater needs to hear and relay at consistent power.
    • Radio settings overhaul (Settings › Radio) — 16 community-suggested presets plus manual Freq/SF/BW/CR tuning (digit-by-digit frequency editor), and 4 persisted user preset slots. Presets and the manual editor are now shared between Settings and the Repeater screen — a preset saved from either place shows up in both, and you can save the current profile as a named preset or delete one from either screen.
    • On-device Diagnostics (Tools › Diagnostics) — a single scrollable screen showing packet counts by category (RX/TX), radio noise floor / RSSI / SNR, packet-pool free count and outbound queue length, actually-forwarded packet count, uptime, and live heap/stack headroom, with a reset-counters popup.

    Fixes

    • Channel storage hardeningsaveChannels() skips unused (all-zero) slots, so /channels2 holds only configured channels instead of always writing ~2.7 KB; and findChannelIdx() rejects an all-zero secret so a corrupted/empty channel can't match an unused slot and misroute messages.
    • e-ink UI scaling — self-sizing popup menu scaled for landscape e-ink (no stray header gap, tighter row tiling); popup menu uses the shared proportional scroll indicator instead of raw ^/v glyphs and stops the selection bar before the scrollbar gutter; compass tape ticks/pointer and trail-map markers scale for e-ink, with wrap-around map navigation.
    • Joystick rotation is now persisted on e-ink builds.
    • Trail capacity guard — a static_assert fails the build if TrailStore::CAPACITY ever outgrows the uint16_t save-header count, instead of silently truncating.

    Under the hood

    • Packet pool bumped 16 → 32 so queued retransmits no longer starve incoming-packet allocation while relaying.
    • Shared, UITask-decoupled RadioPresetPicker and RadioParamsEditor (plus nearestBwIndex() in RadioPresets.h) replace ~6 duplicated methods and several state fields per screen.
    • Mesh Dispatcher gains generic per-payload-type RX/TX counters and pool-free / queue-length getters; a new DeviceDiag helper reports nRF52 heap (linker-symbol + sbrk) and stack (FreeRTOS high-water-mark) headroom.
    • build.sh tolerates control characters in pio project config's JSON dump.
Show all 20 releases →

Device compatibility (4)

✓ 4 Supported
DeviceMCURadioStatusNotes
Seeed Studio Wio Tracker L1nrf52840Semtech SX1262✓ SupportedOLED variant (SSD1306/SH1106 128x64)
Seeed Studio Wio Tracker L1 Pronrf52840Semtech SX1262✓ SupportedOLED variant — same firmware target as wio-tracker-l1
Seeed Studio Wio Tracker L1 E-inknrf52840Semtech SX1262✓ SupportedE-ink variant (GxEPD2 250x122)
GAT-IoT GAT562 30snrf52Semtech SX1262✓ SupportedGAT562 30S Mesh Kit