MeshCore Solo
ForkA fork of the official 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 (Official)
- Maintainer
- MarekZegare4 ↗
- Status
- active
- Maturity
- stable
- Lifecycle
- active
- Latest version
- 1.20
- Released
- 2026-06-22
- Runtime
- Arduino · C++
- Distribution
- community
- 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 roles
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-22v1.20 # Latest 11 hours 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:
v1.19 # 6 days ago · 2026-06-16 08:11 UTC
MeshCore Solo Companion Firmware v1.19
What's new
- Message delivery status — outgoing messages now show an end-to-end delivery marker, auto-scaled to the font (legible on landscape e-ink), in both the history list and the fullscreen view:
- Direct messages (and room servers): pending → delivered (✓) → failed (✗), driven by the real end-to-end ACK. While pending, a row of dots shows one per send so auto-resend progress is visible.
- Auto-resend — a pending DM whose ACK times out is re-sent automatically (reusing the original timestamp) until resends run out. Configurable count under Settings › Messages › Resend (0–5, default 2). Runs in the background, independent of which screen is open; incoming duplicates from retries are dropped.
- Channels — ✓ appears only once a repeater echo confirms the message was relayed into the mesh. No echo is normal (flood has no recipient ACK), so no pending/fail is shown.
- Auto-reply bot overhaul — the trigger/reply bot grows into a small auto-responder:
- Query commands — a DM or monitored-channel message is scanned for
!tokens (!ping !batt !loc !time !temp !hops !status !help) and answered in one combined reply. - Away / reply-to-all — a lone
*trigger replies to every message. - Separate DM and channel triggers, each with its own reply text.
- Quiet hours — silence push replies during a chosen window (wraps midnight).
- Throttling & anti-loop — per-contact DM throttle so one sender can't starve others; channel echo guard so the bot never answers itself; reply counter shown in the bot screen header.
- Query commands — a DM or monitored-channel message is scanned for
- Keyboard overhaul — one shared keyboard across all screens (reclaims duplicate RAM), icon keys (⇧ caps, ⎵ space, ⌫ delete, ✓ OK), and a second symbols page toggled with
#@/abc. - UI refresh
- Proportional scrollbar with up/down triangle caps replaces the old
^/varrows, scaling with the font (1× OLED, 2× landscape e-ink); used by every scrollable list and the fullscreen message view. The redundant>selection marker is gone and rows shifted left to reclaim space. - Status-bar single-letter indicators (M/B/A/G) replaced with scalable mini-icons (mute, bluetooth, advert, trail).
- Proportional scrollbar with up/down triangle caps replaces the old
- Nearby Nodes reorganized — one list over two sources (stored contacts + live discover scan) with a unified detail/action menu. Type filter and sort are independent axes and persist across re-entry; the active filter is shown in the title and in empty-list messages.
- Tools › Trail reorganized — a short two-level action menu (Hold Enter) replaces the flat ~12-item list; view-aware settings; a fitted square map grid; and the waypoint manager split out into its own component. No change to trail recording itself.
- OTA updates — each solo release now ships a DFU
.zip(solo-<ver>-<device>-ota.zip) for over-the-air / BLE-DFU updates, alongside the.uf2for USB flashing.
Fixes
- GPS battery drain on shutdown — GPS is powered off before
SYSTEMOFF, and uses the correct active-level (!PIN_GPS_EN_ACTIVE) instead of a hardcoded level. - Buzzer octave 8 — the RTTTL parser now fully accepts octave 8 instead of clamping it away (which could leak a digit into the next note's duration).
- Trail file robustness —
Waypoint/trail readers check every header read, so a truncated file is rejected instead of using a garbage count.
Under the hood
- OTA DFU zip is named and attached to releases by the
_solo_dualbuild workflow; the per-build Actions artifact already carried it. - Large UI consolidation: shared
drawList/ header / key-decode helpers, deduplicated status-bar indicators, reusable scalable mini-icon facility (icons.h), and an audit-pass cleanup premoving dead code and redundant scroll-clamp logic.
- Message delivery status — outgoing messages now show an end-to-end delivery marker, auto-scaled to the font (legible on landscape e-ink), in both the history list and the fullscreen view:
v1.18 # 8 days ago · 2026-06-14 08:22 UTC
MeshCore Solo Companion Firmware v1.18
New device support
- GAT562 30S Mesh Kit — the firmware now supports the GAT562 30S alongside the Wio Tracker L1 family. Pre-built
.uf2files for all supported devices are published with each release — see the Supported Devices table.
What's new
- GAT562 30S Mesh Kit support — see above.
- Battery saving (radio) — two new independent toggles under Settings › Radio:
- Pwr save — hardware duty-cycle receive (SX126x
SetRxDutyCycle): the radio cycles RX↔sleep autonomously and wakes on a preamble, cutting average RX current with only a small increase in receive latency - Auto pwr — Adaptive Power Control: trims TX power on strong links (based on ACK SNR) and ramps back up on weak or lost links; the home screen shows the live transmit power
- Pwr save — hardware duty-cycle receive (SX126x
- BLE disconnect icon fix — the BLE status icon now updates immediately when the connection drops (e.g. out of range, supervision timeout). Previously it could stay active until the next UI polling cycle.
- Bot trigger preserves case — the auto-reply trigger phrase is now stored exactly as typed. Matching remains case-insensitive, so
Ping,pingandPINGall trigger the bot, but the trigger no longer gets silently lowercased when saved. - Screenshot support in all solo builds —
ENABLE_SCREENSHOTis now enabled in every solo firmware build. No need to use a separate_devenvironment. Use the Solo Tools web app to capture screenshots directly from the browser.
Under the hood
- CI matrix for solo firmware builds is now fully dynamic — new devices are picked up automatically from
platformio.inibased on the_solo_dualenv suffix, no workflow changes required. AbstractUITask::onBLEDisconnected()virtual hook added — called bysetHasConnection()on transition to disconnected;UITaskoverrides it to set_next_refresh = 0.build.shgainsbuild-solo-firmwarescommand, backed bybuild_all_firmwares_by_suffix "_solo_dual".
- GAT562 30S Mesh Kit — the firmware now supports the GAT562 30S alongside the Wio Tracker L1 family. Pre-built
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 |