Releases: mcereal/mesh-client
Releases · mcereal/mesh-client
Release list
v2.74.0
2.74.0 (2026-09-30)
Features
- a silent radio's chosen board can take Meshtastic instead of MeshCore (1605692)
- app: keep the lifetime stats (693bad4)
- backup: back up a MeshCore radio, contacts and all (2c223d8)
- backup: compare two backups of a radio, and list and remove them on the card (433e331)
- backup: keep a radio's settings on the card, starting with Meshtastic (ac48b3a)
- backup: plan a Meshtastic restore and send it as one edit transaction (6a5aa73)
- backups: carry a radio's identity key in a backup asked for with it (a4184a5)
- backups: restore a MeshCore radio from a backup and check it took (500960b)
- backups: restore a MeshCore radio's contacts from a backup (e6fd5ea)
- backups: restore a Meshtastic radio from a backup and check it took (e340447)
- backup: take backups on first connect, before writes and firmware, and on request (0c38aa7)
- install MeshCore onto a radio that answers nothing on USB (3558be1)
- lifetime: count what the client has seen across every run and radio (fe07e96)
- map: draw every installed pack as one map (d8f3588)
- map: draw past a pack's deepest level by enlarging its tiles (f6b8338)
- maps: download map packs from the catalog, in resumable pieces (7e9a9a5)
- maps: download, update and delete map packs from Settings > Maps (99624a7)
- maps: hold a catalog of every country (c53bd5e)
- meshcore: plan a restore of a radio's settings from a backup (1d36cfe)
- meshcore: send a repeater commands and ask it for its neighbours (0326066)
- messages: name a sender in the tint their avatar wears (4fe66a3)
- move a MeshCore radio on its cable to the Bluetooth build (0666796)
- nodes: badge the Nodes tab and announce newly discovered nodes (e3fcc15)
- nodes: stand a node's facts in two columns where there is room (6fc3154)
- pair a radio moved to Bluetooth with the PIN it kept (1ee9829)
- profiles: make a profile from a backup, apply it, and carry it as a .cfg (acad52b)
- profiles: make, list, compare, apply and share profiles on screen (2d2dc79)
- send a crash report to Sentry when the user asks (eae7e59)
- session: announce messages and nodes as they are recorded (356d855)
- set a MeshCore radio's Bluetooth PIN from Settings (709cbac)
- split: preview the row under the list's cursor beside it (0e3a213), closes mcereal/inkcell#84
- stats: count delivered and undelivered messages (78813eb)
- stats: count MQTT and private messages, and record the farthest node heard and weakest signal (1a3caf3)
- stats: name who set each record, and when (95e52ed)
- status: show how many nodes this client has ever heard (cb577e5)
- ui: a MeshCore repeater's thread is its console, and its sheet asks for neighbours (75a1c0c)
- ui: a side rail the reader folds to icons or unfolds into labelled tabs (fb17e67)
- ui: a Stats page for the lifetime counts (f33d4b1)
- ui: a window's cursor, hover, sidebar clicks and a message field (ee44047)
- ui: carry the whole node roster in the Nodes list (a5bb507)
- ui: centre a split frame's empty detail, and ring one place while typing (37d78b9)
- ui: dock the keyboard under the thread on a wide frame (ac7cd54)
- ui: give the map and the waypoints a tab of their own (948ec81)
- ui: head a direct conversation with the peer's long name (01b9419)
- ui: lay the tapback sheet out as a row of faces over a delete button (bfc1ade)
- ui: list, open, compare and delete the radios' backups on the card (92851bd)
- ui: open a node's detail on its signal and battery (3cdad96)
- ui: put the Nodes list's search, filter and sort on one chip bar (ed3bc2c)
- ui: say a radio-reported switch as a state, not a control (8603df6)
- ui: stop heading our own channel bubbles with "You" (2168e19)
- ui: take inkcell's vector emoji (8dab891)
- ui: use a wide window's room on the Status and Map tabs (1076ce3)
Bug Fixes
- a PIN typed over a pending Random makes MeshCore pairing Fixed (ac22b08)
- actions: name A on a Radio page only when the row is a verb (74833cb)
- admin: stop an edit transaction whose begin fails, and count a refused commit (d26d82b)
- an erased MeshCore PIN takes its Fixed edit with it (40129d1)
- app: count the attached radio again after a stats reset (e024fc1)
- app: size the BLE handoff addresses by INKWELL_BLE_ADDRESS_MAX (da3a791)
- backup: compare what a MeshCore radio advertises itself as (cf490e6)
- backup: keep every contac...
v2.74.0-rc.3
v2.74.0-rc.2
v2.74.0-rc.1
2.74.0-rc.1 (2026-09-30)
Features
- a silent radio's chosen board can take Meshtastic instead of MeshCore (1605692)
- app: keep the lifetime stats (693bad4)
- backup: back up a MeshCore radio, contacts and all (2c223d8)
- backup: compare two backups of a radio, and list and remove them on the card (433e331)
- backup: keep a radio's settings on the card, starting with Meshtastic (ac48b3a)
- backup: plan a Meshtastic restore and send it as one edit transaction (6a5aa73)
- backups: carry a radio's identity key in a backup asked for with it (a4184a5)
- backups: restore a MeshCore radio from a backup and check it took (500960b)
- backups: restore a MeshCore radio's contacts from a backup (e6fd5ea)
- backups: restore a Meshtastic radio from a backup and check it took (e340447)
- backup: take backups on first connect, before writes and firmware, and on request (0c38aa7)
- install MeshCore onto a radio that answers nothing on USB (3558be1)
- lifetime: count what the client has seen across every run and radio (fe07e96)
- map: draw every installed pack as one map (d8f3588)
- map: draw past a pack's deepest level by enlarging its tiles (f6b8338)
- maps: download map packs from the catalog, in resumable pieces (7e9a9a5)
- maps: download, update and delete map packs from Settings > Maps (99624a7)
- maps: hold a catalog of every country (c53bd5e)
- meshcore: plan a restore of a radio's settings from a backup (1d36cfe)
- meshcore: send a repeater commands and ask it for its neighbours (0326066)
- messages: name a sender in the tint their avatar wears (4fe66a3)
- move a MeshCore radio on its cable to the Bluetooth build (0666796)
- nodes: badge the Nodes tab and announce newly discovered nodes (e3fcc15)
- nodes: stand a node's facts in two columns where there is room (6fc3154)
- pair a radio moved to Bluetooth with the PIN it kept (1ee9829)
- profiles: make a profile from a backup, apply it, and carry it as a .cfg (acad52b)
- profiles: make, list, compare, apply and share profiles on screen (2d2dc79)
- send a crash report to Sentry when the user asks (eae7e59)
- session: announce messages and nodes as they are recorded (356d855)
- set a MeshCore radio's Bluetooth PIN from Settings (709cbac)
- split: preview the row under the list's cursor beside it (0e3a213), closes mcereal/inkcell#84
- stats: count delivered and undelivered messages (78813eb)
- stats: count MQTT and private messages, and record the farthest node heard and weakest signal (1a3caf3)
- stats: name who set each record, and when (95e52ed)
- status: show how many nodes this client has ever heard (cb577e5)
- ui: a MeshCore repeater's thread is its console, and its sheet asks for neighbours (75a1c0c)
- ui: a side rail the reader folds to icons or unfolds into labelled tabs (fb17e67)
- ui: a Stats page for the lifetime counts (f33d4b1)
- ui: a window's cursor, hover, sidebar clicks and a message field (ee44047)
- ui: carry the whole node roster in the Nodes list (a5bb507)
- ui: centre a split frame's empty detail, and ring one place while typing (37d78b9)
- ui: dock the keyboard under the thread on a wide frame (ac7cd54)
- ui: give the map and the waypoints a tab of their own (948ec81)
- ui: head a direct conversation with the peer's long name (01b9419)
- ui: lay the tapback sheet out as a row of faces over a delete button (bfc1ade)
- ui: list, open, compare and delete the radios' backups on the card (92851bd)
- ui: open a node's detail on its signal and battery (3cdad96)
- ui: put the Nodes list's search, filter and sort on one chip bar (ed3bc2c)
- ui: say a radio-reported switch as a state, not a control (8603df6)
- ui: stop heading our own channel bubbles with "You" (2168e19)
- ui: take inkcell's vector emoji (8dab891)
- ui: use a wide window's room on the Status and Map tabs (1076ce3)
Bug Fixes
- a PIN typed over a pending Random makes MeshCore pairing Fixed (ac22b08)
- actions: name A on a Radio page only when the row is a verb (74833cb)
- admin: stop an edit transaction whose begin fails, and count a refused commit (d26d82b)
- an erased MeshCore PIN takes its Fixed edit with it (40129d1)
- app: count the attached radio again after a stats reset (e024fc1)
- app: size the BLE handoff addresses by INKWELL_BLE_ADDRESS_MAX (da3a791)
- backup: compare what a MeshCore radio advertises itself as (cf490e6)
- backup: keep ev...
v2.74.0-beta.1
2.74.0-beta.1 (2026-09-30)
Features
- a silent radio's chosen board can take Meshtastic instead of MeshCore (1605692)
- app: keep the lifetime stats (693bad4)
- backup: back up a MeshCore radio, contacts and all (2c223d8)
- backup: compare two backups of a radio, and list and remove them on the card (433e331)
- backup: keep a radio's settings on the card, starting with Meshtastic (ac48b3a)
- backup: plan a Meshtastic restore and send it as one edit transaction (6a5aa73)
- backups: carry a radio's identity key in a backup asked for with it (a4184a5)
- backups: restore a MeshCore radio from a backup and check it took (500960b)
- backups: restore a MeshCore radio's contacts from a backup (e6fd5ea)
- backups: restore a Meshtastic radio from a backup and check it took (e340447)
- backup: take backups on first connect, before writes and firmware, and on request (0c38aa7)
- install MeshCore onto a radio that answers nothing on USB (3558be1)
- lifetime: count what the client has seen across every run and radio (fe07e96)
- map: draw every installed pack as one map (d8f3588)
- map: draw past a pack's deepest level by enlarging its tiles (f6b8338)
- maps: download map packs from the catalog, in resumable pieces (7e9a9a5)
- maps: download, update and delete map packs from Settings > Maps (99624a7)
- maps: hold a catalog of every country (c53bd5e)
- meshcore: plan a restore of a radio's settings from a backup (1d36cfe)
- meshcore: send a repeater commands and ask it for its neighbours (0326066)
- messages: name a sender in the tint their avatar wears (4fe66a3)
- move a MeshCore radio on its cable to the Bluetooth build (0666796)
- nodes: badge the Nodes tab and announce newly discovered nodes (e3fcc15)
- nodes: stand a node's facts in two columns where there is room (6fc3154)
- pair a radio moved to Bluetooth with the PIN it kept (1ee9829)
- profiles: make a profile from a backup, apply it, and carry it as a .cfg (acad52b)
- profiles: make, list, compare, apply and share profiles on screen (2d2dc79)
- send a crash report to Sentry when the user asks (eae7e59)
- session: announce messages and nodes as they are recorded (356d855)
- set a MeshCore radio's Bluetooth PIN from Settings (709cbac)
- split: preview the row under the list's cursor beside it (0e3a213), closes mcereal/inkcell#84
- stats: count delivered and undelivered messages (78813eb)
- stats: count MQTT and private messages, and record the farthest node heard and weakest signal (1a3caf3)
- stats: name who set each record, and when (95e52ed)
- status: show how many nodes this client has ever heard (cb577e5)
- ui: a MeshCore repeater's thread is its console, and its sheet asks for neighbours (75a1c0c)
- ui: a side rail the reader folds to icons or unfolds into labelled tabs (fb17e67)
- ui: a Stats page for the lifetime counts (f33d4b1)
- ui: a window's cursor, hover, sidebar clicks and a message field (ee44047)
- ui: carry the whole node roster in the Nodes list (a5bb507)
- ui: centre a split frame's empty detail, and ring one place while typing (37d78b9)
- ui: dock the keyboard under the thread on a wide frame (ac7cd54)
- ui: give the map and the waypoints a tab of their own (948ec81)
- ui: head a direct conversation with the peer's long name (01b9419)
- ui: lay the tapback sheet out as a row of faces over a delete button (bfc1ade)
- ui: list, open, compare and delete the radios' backups on the card (92851bd)
- ui: open a node's detail on its signal and battery (3cdad96)
- ui: put the Nodes list's search, filter and sort on one chip bar (ed3bc2c)
- ui: say a radio-reported switch as a state, not a control (8603df6)
- ui: stop heading our own channel bubbles with "You" (2168e19)
- ui: take inkcell's vector emoji (8dab891)
- ui: use a wide window's room on the Status and Map tabs (1076ce3)
Bug Fixes
- a PIN typed over a pending Random makes MeshCore pairing Fixed (ac22b08)
- actions: name A on a Radio page only when the row is a verb (74833cb)
- admin: stop an edit transaction whose begin fails, and count a refused commit (d26d82b)
- an erased MeshCore PIN takes its Fixed edit with it (40129d1)
- app: count the attached radio again after a stats reset (e024fc1)
- app: size the BLE handoff addresses by INKWELL_BLE_ADDRESS_MAX (da3a791)
- backup: compare what a MeshCore radio advertises itself as (cf490e6)
- backup: kee...
v2.73.0
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](https://github.com/mcereal/mesh-client/comm...
v2.73.0-beta.1
2.73.0-beta.1 (2026-09-26)
Features
- messages: ring the focused bubble (b29a8d0)
- settings: set the client's own section apart from the radio's (d5d57ab)
- 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: 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: 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: 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)
Bug Fixes
- help: describe the Nodes list's default order as it is (579bf23)
- 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)
- ui: a security prompt over the Find keyboard is drawn, not the search (9a228cb)
- 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: keep an unsent draft with the conversation it was written for (6d193f6)
- ui: label our own bubbles "You" rather than "sent" (4df2034)
- 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: say it in the reader's terms on the node detail and three other screens (77233cf), closes #Trail
- ui: step the text size from a window's display-sized scale (d316df5)
Documentation
v2.72.0
2.72.0 (2026-09-25)
Features
- ble: Bluetooth on macOS, over inkwell's CoreBluetooth backend (e86a153), closes mcereal/inkwell#12
- ble: wait on FromNum's subscribe across turns instead of in the connect (6bcf398)
- build, test and run the UI natively on macOS (d12166f), closes inkwell#10 inkcell#28
- devices: honest signal readings, a visible auto-connect radio, safer radio switches (4cbcb9a), closes mcereal/inkwell#39
- firmware: install nRF52 radios over BLE through their DFU bootloader (6cc8b53)
- focus: a dialog's answers are reached by where they are, not by counting (9f83bbd), closes mcereal/inkcell#19
- help: the notes are a body in pixels, under a heading that collapses (1ccfebf)
- lists: the body travels between windows instead of flicking (9b2484c)
- overlays: the two questions arrive on layers, over what they are about (af2a001)
- release: app icon for the macOS and Windows installs (abcfbd0)
- release: ship a macOS .dmg and a Windows installer (2962f42)
- serial: find USB serial ports on macOS (7def11d)
- settings: a row's gutter says how it is changed, not just that it can be (726687b), closes inkcell#3
- sheets: a node's verbs and a message's faces come up over what they are about (b7bca59)
- ui: a one-row footer - the screen's verbs and the link, nothing the chrome already says (81b932e)
- ui: a right-click on a row opens its menu (20d686b)
- ui: a window's action bar is a toolbar, and back is the arrow (3a73660), closes mcereal/inkcell#36
- ui: bind desktop shortcuts to commands (562e2b3)
- ui: draw the focus ring and lift the focused row instead of filling it (a68d642)
- ui: drive the running client by its keys and look at what it drew (24818d0), closes inkcell#30
- ui: follow inkcell onto a proportional face (fe34156)
- ui: leave the on-screen keyboard grid out of a desktop window (42276a8)
- ui: merge Devices and Status into one Radio tab (c23f673)
- ui: MESHCLIENT_UI_BACKEND=sdl draws the UI in a window (ec9be92)
- ui: Messages stands a thread beside its conversations on a wide window (8ce276b)
- ui: move About radio and Radio actions onto the Radio tab (2551438)
- ui: move Waypoints into the Nodes tab as a row (e37eeb4)
- ui: name a node row once and put what else it knows on the line under it (9e2941d)
- ui: Nodes stands a node beside its roster on a wide window (399061a)
- ui: place the frame with inkcell's scaffold (92a32c8)
- ui: put the Mac window's buttons in the tab strip (8762102), closes inkcell#29 inkcell#29
- ui: route SDL hints through commands (a08a003)
- ui: set every list by what it is for - inset sections, an accent cursor, tiered type (5b9915e)
- ui: Settings stands a section beside the section list on a wide window (6acdb56)
- ui: size label columns and the code caption from measured text (42f2a4e), closes mcereal/inkcell#53
- ui: tabs, rows and dialog answers are clicked (8daf923)
- ui: the sheet and the context menu stand off the page; the node's verbs are a menu (96e3cd3)
- ui: type directly into SDL keyboard drafts (fec131b)
- ui: verbs in the heading for a pointer, a one-row foot on the device (ba6e616)
- update: install updates on macOS and Windows (b282f12)
- update: say which network failure a check or download hit (81c6284)
- windows: connect to a radio over Bluetooth (275990f)
- windows: connect to a radio over USB serial (e3153ca)
- windows: hand TCP sockets to native stream (2de9114)
- windows: open SDL UI by default (a28098b)
- windows: support TCP hostnames (a03c44e)
- windows: TLS and HTTPS, through Mbed TLS (0ef3fbd)
Bug Fixes
- ble: address review on scan memory and the preferred-radio streak (4cc4205)
- ble: demote on revoked Bluetooth access, size OTA addresses for macOS (412325f)
- ble: don't reset the controller over the link a pairing made (2911db1)
- build: a clean build, under both compilers (887f64e)
- build: compile inkwell the way this client's own sources are (bb56ccc)
- build: the no-TLS build must still link (f596271), closes #267
- clear the no-TLS and MinGW build warnings (20e7cf4), closes #ifdef
- devtools: every scene verb plays out what it set moving (9fba6d0)
- **dev...
v2.72.0-beta.2
v2.72.0-beta.1
2.72.0-beta.1 (2026-09-25)
Features
- ble: Bluetooth on macOS, over inkwell's CoreBluetooth backend (e86a153), closes mcereal/inkwell#12
- ble: wait on FromNum's subscribe across turns instead of in the connect (6bcf398)
- build, test and run the UI natively on macOS (d12166f), closes inkwell#10 inkcell#28
- devices: honest signal readings, a visible auto-connect radio, safer radio switches (4cbcb9a), closes mcereal/inkwell#39
- focus: a dialog's answers are reached by where they are, not by counting (9f83bbd), closes mcereal/inkcell#19
- help: the notes are a body in pixels, under a heading that collapses (1ccfebf)
- lists: the body travels between windows instead of flicking (9b2484c)
- overlays: the two questions arrive on layers, over what they are about (af2a001)
- release: app icon for the macOS and Windows installs (abcfbd0)
- release: ship a macOS .dmg and a Windows installer (2962f42)
- serial: find USB serial ports on macOS (7def11d)
- settings: a row's gutter says how it is changed, not just that it can be (726687b), closes inkcell#3
- sheets: a node's verbs and a message's faces come up over what they are about (b7bca59)
- ui: a one-row footer - the screen's verbs and the link, nothing the chrome already says (81b932e)
- ui: a right-click on a row opens its menu (20d686b)
- ui: a window's action bar is a toolbar, and back is the arrow (3a73660), closes mcereal/inkcell#36
- ui: bind desktop shortcuts to commands (562e2b3)
- ui: draw the focus ring and lift the focused row instead of filling it (a68d642)
- ui: drive the running client by its keys and look at what it drew (24818d0), closes inkcell#30
- ui: follow inkcell onto a proportional face (fe34156)
- ui: leave the on-screen keyboard grid out of a desktop window (42276a8)
- ui: merge Devices and Status into one Radio tab (c23f673)
- ui: MESHCLIENT_UI_BACKEND=sdl draws the UI in a window (ec9be92)
- ui: Messages stands a thread beside its conversations on a wide window (8ce276b)
- ui: move About radio and Radio actions onto the Radio tab (2551438)
- ui: move Waypoints into the Nodes tab as a row (e37eeb4)
- ui: name a node row once and put what else it knows on the line under it (9e2941d)
- ui: Nodes stands a node beside its roster on a wide window (399061a)
- ui: place the frame with inkcell's scaffold (92a32c8)
- ui: put the Mac window's buttons in the tab strip (8762102), closes inkcell#29 inkcell#29
- ui: route SDL hints through commands (a08a003)
- ui: set every list by what it is for - inset sections, an accent cursor, tiered type (5b9915e)
- ui: Settings stands a section beside the section list on a wide window (6acdb56)
- ui: size label columns and the code caption from measured text (42f2a4e), closes mcereal/inkcell#53
- ui: tabs, rows and dialog answers are clicked (8daf923)
- ui: the sheet and the context menu stand off the page; the node's verbs are a menu (96e3cd3)
- ui: type directly into SDL keyboard drafts (fec131b)
- ui: verbs in the heading for a pointer, a one-row foot on the device (ba6e616)
- update: install updates on macOS and Windows (b282f12)
- update: say which network failure a check or download hit (81c6284)
- windows: connect to a radio over Bluetooth (275990f)
- windows: connect to a radio over USB serial (e3153ca)
- windows: hand TCP sockets to native stream (2de9114)
- windows: open SDL UI by default (a28098b)
- windows: support TCP hostnames (a03c44e)
- windows: TLS and HTTPS, through Mbed TLS (0ef3fbd)
Bug Fixes
- ble: address review on scan memory and the preferred-radio streak (4cc4205)
- ble: demote on revoked Bluetooth access, size OTA addresses for macOS (412325f)
- build: a clean build, under both compilers (887f64e)
- build: compile inkwell the way this client's own sources are (bb56ccc)
- build: the no-TLS build must still link (f596271), closes #267
- clear the no-TLS and MinGW build warnings (20e7cf4), closes #ifdef
- devtools: every scene verb plays out what it set moving (9fba6d0)
- devtools: make
syncing offend the replay it names (90aaa1f) - devtools: refuse a verb row the runner answers first, and keep --delay 0 ([4fcddc3](4fcddc3...