MeshCore Solo Companion Firmware v1.27
What's new
- Long names and labels scroll into view when selected instead of staying stuck behind an ellipsis. Any selected row that would otherwise truncate — contacts, channels, messages, settings values, and more — now pauses, scrolls to reveal the full text, then swings back to the start and repeats, for as long as it stays selected; unselected rows keep the plain static ellipsis. E-ink gets its own slower cadence to suit the panel.
- Messages sent from the phone app now show up in the device's own chat history, not just on the phone — open a DM, room, or channel on the device and a message you just sent from the app is right there, with the same delivery-confirmation markers (pending/delivered for DMs, pending/relayed for channels) a message composed on the device itself gets.
- The Favourites Dial takes channels and room servers, not just contacts. Pinning an empty tile now opens the Messages screen's own Direct/Channels/Rooms browse — the same list you already use to open a conversation — instead of a picker built on the dial, and the tile opens the right thing: a DM, a channel history, or a room (running its login handshake first, which the dial used to skip). Channel tiles are marked with a leading
#and carry their own unread badge. You can also pin straight from the Messages context menus, which every kind now has, and the dial itself gained Unpin / Replace under Hold Enter on a filled tile. - Favourites now behave the same on every list. A favourite is marked with a ★ on its row and sorted above everything else — in Messages (contacts, rooms, channels) and in Tools › Nodes alike, and the Locator target picker marks them too. New Settings › Contacts › Favs top turns the sorting off if you'd rather keep the natural order; it's on by default. On Nodes, the old
Favouritemenu row actually pinned to the dial despite its name — it's now split into a realFav: ON/OFFand a separatePin to dial. - Contacts and rooms can be marked as favourites from the device.
Fav: ON/OFFjoins the contact and room context menus, alongside the one channels already had. It's the same starred flag the phone app shows, so it syncs both ways — and it's what the Settings › Contacts ›DMs/Rooms=Favlist filters read, which previously could only be satisfied by starring someone in the app. - "Path" / "Relayed by" — see which repeaters actually carried a message. Hold Enter on a message (list or fullscreen) and, when the data is available, the Options menu gains a new row: Path (N hops) on a received message lists the repeaters it actually travelled through, in order; Relayed by (N) on your own channel post lists every distinct repeater heard echoing it back into the mesh. Each hop resolves to a contact's name where known, or a short hex tag otherwise.
- Settings › Sound gains "Msg wake". Turn it off if you don't want an incoming message to turn the screen back on when it was off and no phone/app is connected. On by default — today's behaviour is unchanged either way.
- A brand-new (or factory-reset) device now shows every Home page by default, instead of a curated 5-page carousel (Clock, Tools, Shutdown, Favourites, Map) that made the rest opt-in only. Existing devices' own saved Home Pages selection is untouched.
- Repeater builds now default to a 6-minute local advert interval (was 2 minutes) — quieter out of the box for a unit sitting on a desk or freshly deployed. Change it anytime under Settings › Radio.
- The lock screen now shows a title bar (status icons and battery, node name deliberately left off so a locked device doesn't announce whose it is) and its clock is left-aligned instead of centred. Contributed by @3urobeat.
- The Clock page's data fields gain a
Satsoption — GPS satellite count, or--without a fix.
Fixes
-
Changing a setting and then rebooting or powering off without first backing out of that screen could silently lose the change — most commonly hit via the low-battery auto-shutdown, which can fire mid-edit regardless of which screen is open. Every settings screen already saved correctly on its own Back/Cancel path, but the actual reboot/power-off code itself never flushed anything on its own. It now does, unconditionally, on every real shutdown/reboot path (including the phone app's and the serial CLI's reboot commands) — a deliberate factory reset is the one reboot that still wipes settings, as intended.
-
A low-battery auto-shutdown (or long-press power-off) could lose recently learned contacts — new contacts, path updates, favourites — leaving only Public channels behind after the device came back up. Contact writes are deliberately debounced to spare the flash, and under regular mesh traffic that debounce timer can stay pending for the device's whole uptime; the low-battery/power-off path never flushed it before shutting down. Every shutdown, power-off and reboot path (device menu, phone app, serial CLI) now flushes it first, the same as the settings fix above.
-
A device with its own working clock (a board with a real RTC, or the browser demo) could have its time dragged backwards on boot by a contact's older saved timestamp, instead of that timestamp only ever being used as a floor when the clock had no better source. Fixed so an already-correct clock is never rolled back.
-
Diagnostics › Live always showed "N/A" for Heap free / Stack free on ESP32 boards (Heltec V3/V4 and others) — those stats only had an implementation for nRF52. Now reported correctly on ESP32 too.
-
Hovering a "Path" / "Relayed by" repeater name too long to fit could look stuck — a letter or two in, then crawling, before snapping back to the start. Its marquee shared the same single animation slot as the row underneath it (by design, only one thing animates at a time) but both could end up drawing "selected" in the same frame, each resetting the other's state every redraw. The popup's own faster redraw request was also being silently discarded by its callers, capping the actual redraw rate far below what the animation needed. Both fixed.
-
Remote Bot's channel auto-replies showed up in the device's own history as if someone else had sent them, labelled with the device's own name. The reply was stored with the device's node name as the sender prefix instead of the
"Me: "convention the history view uses to tell an outgoing post apart from an incoming one, so the bubble rendered left-anchored like an incoming message. Now framed the same way an on-device or app-originated channel post is. -
A room server could end up pinned to the Favourites Dial and then never be removed. The pin picker's "recent conversations" tier didn't filter by contact type, and room posts share the DM history, so a room could appear there; opening it from the dial then skipped the login handshake, and Unpin only existed in the chat contact list, which rooms never appear in. Rooms are now pinned deliberately (and open correctly), and any tile can be unpinned from the dial itself.
-
Bluetooth connect/disconnect/reconnect cycles (e.g. a phone drifting in and out of range) could make the device nearly unresponsive for a few seconds at a time, including briefly after turning BLE off. A failed BLE notify was retried on a fixed short interval, repeatedly hitting a blocking wait deep in the BLE stack while the link stayed marginal. Failed sends now back off exponentially (capped at 2s) instead of hammering the same blocking call.
-
Enter on a
Notif:/Melody:/Fav:/Sort:row in a context menu now changes the value instead of closing the menu. Those rows show a value you step through with LEFT/RIGHT, but Enter treated them as ordinary menu picks and dismissed the popup, so changing two of them meant reopening the menu in between. Enter now advances the value and the menu stays open — only Back closes it — across the Messages contact/room/channel menus, Tools › Nodes, and the Ringtone editor, matching what Trail › Settings already did. The NodesFavrow was the worst of it: LEFT/RIGHT did nothing there at all, so the only way to toggle a favourite was an Enter that closed the menu on every flip. -
Settings rows Auto-off, Low battery, GPS pwr and Battery ignored Enter, even though their options wrap around exactly like the melody, keyboard and clock rows next to them, where Enter has always stepped to the next value. They now accept Enter too. Rows that ramp between fixed ends instead of wrapping — Brightness, Volume, TX Pwr, Timezone, SF/BW/CR — stay LEFT/RIGHT-only, since there is nothing to wrap to.
-
The Settings › Contacts filter rows read
DM,allandfavin three different casings from each other and from the rest of the screen. NowDMs,AllandFav. -
The four navigate views behaved differently from each other. They all draw the same screen — distance, bearing to target, your heading — but only two (Nodes › Navigate and Trail › Track back) showed the closing-speed/ETA line, and each left the view on a different key. All four now show the ETA line, and Back is the only way out of any of them.
-
A location shared in a message could be navigated to and saved as a waypoint, but not set as the Locator target — the one row that Nodes and Waypoints both offer for a coordinate. Set as target now joins Navigate and Save waypoint in the message Options menu.
-
Tools › Nodes refused to make a Locator target out of a node whose full public key it didn't have, even with a perfectly good position on screen — e.g. someone sharing their location on a channel without being a contact. Set as target is now offered whenever the node has a position: with an identity it follows them as they move, without one it pins the place they were last seen.
-
Tools › Locator's target picker listed the people pinned to the Favourites Dial as its top tier, which stopped making sense once pinning and favouriting became separate things — pinning puts something on a home page, and has nothing to say about who you'd geofence. The picker now leads with your favourites instead (still offered before they have a known position, so you can arm ahead of time); everyone else with a resolvable position follows, as before.
-
Hold Enter no longer doubles as a second Back key. On several screens (Tools, Locator, Live Share, Repeater, Remote Bot, Auto-Advert, GPIO, Compass, Dashboard config, the Messages navigate view) and inside any open popup, Hold Enter quietly meant "go back" instead of opening a context menu like everywhere else. It now only opens a menu, or does nothing where there is none — Back is the single way back. The keyboard's Space / OK-Done /
{}cells got the same fix: Hold Enter there no longer closes the keyboard like Cancel. -
Deleting a channel, deleting a saved radio preset, Trail's "Reset trail", and Diagnostics' "Reset counters" all fired immediately on a single Enter, with no way back. Deleting a contact already asks first and defaults to Cancel; these four didn't, and Reset trail was the worst of them — it wipes the entire recorded GPS trail with no undo short of a prior manual Save, more destructive than the GPS-off prompt already sitting one menu over in the same screen. All four now confirm the same way contact-delete does.
-
Tools › Repeater hid its Network mode, profile and every flood filter until the Repeater switch itself was turned ON, so setting one up meant enabling it first, configuring blind, and only then seeing what you'd set — every other on/off tool (Bot, Live Share, Locator) already leaves its settings visible and editable while off. Repeater now does too.
-
Tools › Admin's Reboot fired a remote node's reboot immediately on a single Enter, with no way back, unlike Start OTA right next to it on the same tab, which already asks first — an unattended repeater you can't physically power-cycle deserves at least as much caution as a DFU update it will resume normal operation from either way. Reboot now confirms the same way.
-
The one alert after a successful advert or message send didn't match the rest of the app's toasts.
"Advert sent!"/"Advert failed.."and"Sent!"were the only alerts anywhere with trailing punctuation; every other confirmation ("Preset saved","Contact added","Target set", …) is bare. Also, unpinning something from the Favourites Dial reported which slot it came out of on some screens but not others — pinning always said so, unpinning only did from the Messages screens. Both now match the rest.