Skip to content

v2.73.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 18:06
· 371 commits to main since this release

2.73.0 (2026-09-27)

Features

  • a full-screen radio firmware install screen (8a33501)
  • a status dot and traffic arrows on the footer's link line (2399e20)
  • add a heard MeshCore node as a contact (60596e3)
  • add a MeshCore contact from the signed card the MeshCore app shares (004705b)
  • app: ask a serial or network link which protocol it speaks (51c5ca6)
  • app: connect to MeshCore companion radios (40d7d08)
  • ask a MeshCore contact for its readings (b2c2207)
  • ask a MeshCore repeater or room server for its status (7ed7049)
  • check and install a MeshCore radio's firmware from MeshCore's own releases (948827a)
  • core: a session model another protocol can fill (1cdffbe)
  • core: MeshCore settings - read, write, refresh and reboot (934384a)
  • core: MeshCore's companion conversation (15af741)
  • edit MeshCore channels - a name, a 16-byte key, and clearing a slot (fcf45bf), closes #name
  • install a MeshCore nRF52 over USB by the 1200-baud touch (d9de84c)
  • log in to a MeshCore repeater or room server (33974b3)
  • MeshCore contacts - remove one, and advertise this radio (1ac3542)
  • MeshCore's other parameters - location in adverts, who may request readings, auto-add, multi-acks (d7954c4)
  • messages: ring the focused bubble (b29a8d0)
  • pin a MeshCore contact as the radio's favourite (481c2a2)
  • proto: MeshCore's companion framing and BLE profile (5839b7a)
  • settings: set the client's own section apart from the radio's (d5d57ab)
  • share and add MeshCore contacts by the MeshCore app's link (b9323d6)
  • share and join MeshCore channels by the MeshCore app's link (8c752a1)
  • switch a board between Meshtastic and MeshCore over USB (8056ae3)
  • the 1200-baud touch on the Brick, through usbfs (037aa65)
  • trace the route to a MeshCore contact with its path discovery (759f9dd)
  • ui: add a text size setting to About (cfed5a7)
  • ui: B held goes back to the top of the tab (8685f07), closes mcereal/inkcell#59
  • ui: connect from the empty Messages tab (1e8c646)
  • ui: dim the LoRa rows the preset setting makes the radio ignore (4ac2684)
  • ui: Find on the Nodes list, and a header a line shorter (6cb8b7f)
  • ui: gate Meshtastic-only verbs on the protocol's features (287b707)
  • ui: guard one-press sends and disconnects, keep notices, page flat lists (9384503)
  • ui: jump to the first unread message and the newest with L2/R2 in a thread (155a1fe)
  • ui: keep a draft as a quick reply from the compose sheet (879e42f)
  • ui: MeshCore's settings on the Settings and Radio tabs (425b657)
  • ui: rule the charts at round values and wash under a node's line (0b94c75)
  • ui: set the compose sheet as a grouped list with a quick-replies heading (b930704)
  • ui: size the desktop window for its display (380f54d)
  • ui: the keyboard's triggers move the caret (4db32d9), closes mcereal/inkcell#59
  • ui: type a node search into the heading, with a live match count (b8ba1be)
  • update an ESP32 over a USB cable through its ROM bootloader (3843a48)

Bug Fixes

  • a cancelled ROM write pulses a reset out on the way (555a17e)
  • a dispatched action is wiped once handled, and a masked caret at the start stays there (6c7a359)
  • a failed ROM write resets the chip back into its app before closing (28a400c)
  • a masked MeshCore password's counter counts the bytes it really is (1aea446)
  • a MeshCore add's OK does not write over another key heard meanwhile under the same number (22fef00)
  • a MeshCore answer is its build's; the handover holds a radio to its name; any known ESP chip (3ef3851)
  • a MeshCore answer that came straight back is drawn as a way back (ad7b8fe)
  • a MeshCore channel is editable only once this handshake read it, and a chosen zero key is a key (37de8be)
  • a MeshCore contact brought back by the radio's OK is heard as of the OK (5399e53)
  • a MeshCore contact brought back without network time is stamped by the radio's clock (b2eb408)
  • a MeshCore contact leaves the list when the radio agrees, and only a contact offers Remove (df88648)
  • a MeshCore contact link is checked against adds still waiting, not only the roster (d16412d)
  • a MeshCore contact link whose key starts as another node's is refused, not stored over it (ddeb245)
  • a MeshCore contact the radio accepted is stored from the record sent, even if the roster let it go meanwhile (7d4324c)
  • a MeshCore contact the radio dropped is no longer pinned, and Pin is not named over this radio itself (bca9e8e)
  • a MeshCore favourite's write runs where its lookup stood, and the list names Pin only over a pinnable row (ace11d1)
  • a MeshCore node heard again is the newest kept advert, not the next evicted (3281ec4)
  • a MeshCore password is masked as it is typed and wiped when the keyboard closes (4ab49b3)
  • a MeshCore password is published masked, so no snapshot holds it (3c95748)
  • a MeshCore request answered by anything but a readable SENT ends as not sent (9586415)
  • a MeshCore request ends when its write fails or the link drops, and a login's password leaves the queue (c4d6dae)
  • a MeshCore request queued behind a reboot stays open through the handshake's restart (2e18561)
  • a MeshCore telemetry answer ahead of its SENT does not leave the radio locked (7ab983a)
  • a MeshCore telemetry answer marks its node heard (670e776)
  • a named port that is gone falls back only to finish a write; a retry keeps earlier damage (0d37dee)
  • a prompt the radio raises over a MeshCore login closes it rather than parking the password (c62f98f)
  • a serial update cancelled after its erase stays a radio to recover (da85de2)
  • a switch's recovery press is the switch's, and it is drawn (7078776)
  • a whole-flash image's bootloader slot must hold a bootloader, not an app (86a61c4)
  • Add from a link waits for the MeshCore handshake, and a heard node added by link stays heard (9f2d637)
  • an added MeshCore contact carries the sender's advert stamp and its whole 32-byte name (23d0527)
  • an early MeshCore telemetry answer counts only for a request already written (3017dfd)
  • any MeshCore add checks the adds still waiting under its number, whether or not the key has a row (021b780)
  • app: clear a MeshCore advert location, and refuse a frequency finer than a kHz (d9cdfe0)
  • app: MeshCore max power is the radio's maximum, and a cleared location clears the fix (72012bd)
  • app: pass over a muted host before the network retry is due (1839b37)
  • bound a whole image by its app partition; a resumed switch keeps its destination (98fa6df)
  • cli: speak the app's conversation in --status and --send-text (b2b3ea5)
  • core: a MeshCore command the link refuses on the spot is the caller's answer (1881654)
  • core: a MeshCore save refused on the spot is the call's answer; OK moves the baseline (38ad60e)
  • core: a post-reboot MeshCore handshake the link refuses drops the link (06ae083)
  • core: MeshCore stamps, room authors and an unreadable SENT (a2d60b3)
  • core: no MeshCore save queued behind a reboot (3baafd1)
  • core: no MeshCore save while a SELF_INFO read is queued (6d6a010)
  • core: one MeshCore reboot at a time, and a refused one says so (6b80bb0)
  • core: settle a MeshCore settings command the link refuses (ca508ed)
  • core: show an accepted MeshCore write without its read-back; refuse a Set that rounds to 0,0 (c324c58)
  • drop a firmware answer the moment the link speaks the other protocol (b859e8a)
  • each MeshCore favourite lookup carries its own answer, and its write takes the slot the lookup leaves (44494cd)
  • every copy of a MeshCore login's password is wiped, with a store the compiler keeps (fe9d780), closes mcereal/inkwell#49
  • every row of a repeater's status fits its row, in every language (ae9f8cb)
  • give link traffic its own update flag (6c550aa)
  • give the crash report's real path on the Brick (8b70d64)
  • help: describe the Nodes list's default order as it is (579bf23)
  • latch an erase where it is sent; a resume falls back to the only bridge (e38e221)
  • MeshCore adverts kept for adding are cleared when a connection begins (a9da322)
  • MeshCore current and voltage are signed, each answer replaces the environment, a queued request holds the lock (b080c1a)
  • MeshCore current in mA, GPS off the globe refused, one telemetry request at a time (0bffbbd)
  • nodes: make node detail read less like a protocol dump (b25a95d)
  • nodes: round coordinates for every stated precision, not only the table's (3564cb6)
  • nodes: shorten the empty Waypoints row (3266565)
  • offer a firmware switch only where it erases, which is an ESP32 (411a3e7)
  • only a MeshCore contact the roster let go is re-stamped as heard on the OK (a1c008e)
  • only the asked MeshCore node's answer frees the telemetry lock, and a 0,0 fix is a position (635a7db)
  • put the submodule pointers back where main has them (9a77350)
  • read a flasher device's builds once its name and type are known, in any key order (3ca53de)
  • refuse a whole-flash table declaring past the largest ESP32 flash (704f508)
  • refuse the 1200-baud touch on a generic-driver port it cannot reach (3c99b36)
  • refuse USB to an ESP32 on its own USB before the install; reset out after a port failure too (a89cdb3)
  • remove a MeshCore contact only once the radio is named, and word the advert as asked (71f506c)
  • resume a direct-image install; refuse a partition overlapping the image (f400f1a)
  • the install screen keeps its release and title through the result (096ae50)
  • the keyboard holds the longest MeshCore contact card whole (1974503)
  • the MeshCore channel import walks its slots with a counter as wide as its bound (398486d)
  • the Spanish add-contact row fits its label (cfbd9e9)
  • the write's progress is not full until the trailing erases verify (9187dc7)
  • transport: bound notified frames by the profile, list every profile in full (b16f753)
  • transport: list a Nordic UART device only when it is named like MeshCore (c8e2fc6)
  • ui: a list heading counts only what the list is not showing (70b12a6)
  • ui: a security prompt over the Find keyboard is drawn, not the search (9a228cb)
  • ui: arm a disconnect against its radio; page with a map left on Nodes (a6cf715)
  • ui: colour a device's disc only when the colour means something (268831c)
  • ui: count conversations, not rows, and say when one is empty (8e13fe2)
  • ui: gate the Nodes pin shortcut on the protocol's node flags (e50ceba)
  • ui: hold a MeshCore draft to what the radio will send whole (1abcfc6)
  • ui: keep an unsent draft with the conversation it was written for (6d193f6)
  • ui: label our own bubbles "You" rather than "sent" (4df2034)
  • ui: list MeshCore's channel slots as facts, not rows that open the editor (30c16d6)
  • ui: MeshCore power in literal signed dBm, and its frequency to the exact kHz (0dc865a)
  • ui: MeshCore's full bandwidth and spread ranges; round coordinates; a lost link is no reply (638f3d5)
  • ui: name no keycap an empty thread or a one-row picker cannot use (7063d5f)
  • ui: name only the presses that work, and give the empty Nodes tab a way out (4b911f0)
  • ui: name the answer A gives in a confirm dialog (d91b0b6)
  • ui: offer X delete only on a conversation row (929fc7b)
  • ui: refuse the Waypoints row out loud on a protocol without waypoints (8fcd147)
  • ui: say it in the reader's terms on the node detail and three other screens (77233cf), closes #Trail
  • ui: say when a dimmed LoRa row's edit will count (56529f6)
  • ui: step the text size from a window's display-sized scale (d316df5)
  • ui: stop MeshCore's power row at the radio's own maximum (fcddd06)
  • ui: the Waypoints heading says how many places the book evicted (4888a89)
  • whether a re-added MeshCore contact was heard comes from where the add came from, not its stamp (a029e80)

Documentation

  • cli: the window's scale and size are the display's (6a86bb9)
  • mark the macOS and Windows builds as experimental (2cfd7a7)
  • MeshCore as it is spoken, and MESHCLIENT_PROTOCOL (a54409c)
  • refresh the listing screenshots (603ba50)

Code Refactoring

  • size a contact link's id for either app's spelling, asserted (1e5e9a3)
  • transport: BLE link speaks the protocol's GATT profile (1e0b31f)
  • transport: links talk to a protocol, not to mesh_session (e4fe7f6)