MeshCore Ninja Alpha
← All firmwares

MeshCore Solo

Fork

A 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-22
  1. v1.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 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.
  2. 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.
    • 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 ^/v arrows, 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).
    • 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 .uf2 for 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 robustnessWaypoint/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_dual build 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.
  3. 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 .uf2 files 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
    • 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, ping and PING all trigger the bot, but the trigger no longer gets silently lowercased when saved.
    • Screenshot support in all solo buildsENABLE_SCREENSHOT is now enabled in every solo firmware build. No need to use a separate _dev environment. 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.ini based on the _solo_dual env suffix, no workflow changes required.
    • AbstractUITask::onBLEDisconnected() virtual hook added — called by setHasConnection() on transition to disconnected; UITask overrides it to set _next_refresh = 0.
    • build.sh gains build-solo-firmwares command, backed by build_all_firmwares_by_suffix "_solo_dual".
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