MeshCore Solo
ForkA 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-26v1.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 contacts — Navigate 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=350andOFFLINE_QUEUE_SIZE=256the 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 …
- Live Location Sharing — broadcast your position over the mesh as
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 contacts — Navigate 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=350andOFFLINE_QUEUE_SIZE=256the 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()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 …
- Live Location Sharing — broadcast your position over the mesh as
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 hardening —
saveChannels()skips unused (all-zero) slots, so/channels2holds only configured channels instead of always writing ~2.7 KB; andfindChannelIdx()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
^/vglyphs 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_assertfails the build ifTrailStore::CAPACITYever outgrows theuint16_tsave-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
RadioPresetPickerandRadioParamsEditor(plusnearestBwIndex()inRadioPresets.h) replace ~6 duplicated methods and several state fields per screen. - Mesh
Dispatchergains generic per-payload-type RX/TX counters and pool-free / queue-length getters; a newDeviceDiaghelper reports nRF52 heap (linker-symbol +sbrk) and stack (FreeRTOS high-water-mark) headroom. build.shtolerates control characters inpio project config's JSON dump.
- 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:
Device compatibility (4)
✓ 4 Supported
| Device | MCU | Radio | Status | Notes |
|---|---|---|---|---|
| Seeed Studio Wio Tracker L1 | nrf52840 | Semtech SX1262 | ✓ Supported | OLED variant (SSD1306/SH1106 128x64) |
| Seeed Studio Wio Tracker L1 Pro | nrf52840 | Semtech SX1262 | ✓ Supported | OLED variant — same firmware target as wio-tracker-l1 |
| Seeed Studio Wio Tracker L1 E-ink | nrf52840 | Semtech SX1262 | ✓ Supported | E-ink variant (GxEPD2 250x122) |
| GAT-IoT GAT562 30s | nrf52 | Semtech SX1262 | ✓ Supported | GAT562 30S Mesh Kit |