mesh-client

mesh-client · Releases

from GitHub · updated 2026-07-19

20 releases

  1. v5.24.0 # 2 days ago · 2026-07-19 00:29 UTC

    [v5.24.0] - 2026-07-18

    Highlights

    Reticulum grows into a full comms suite this release: a new Relay Chat (RRC) IRC-style multi-hub client, a Remote tab for rnsh shells and rncp file transfer, watch-folder Nomad hosting with an upgraded Micron renderer, identity slots, propagation-node rename/delete, and much faster Peers at large path-table sizes. A broad protocol-parity pass adds QR generation/scan, lxm:// deep links, GPX export, LoRa signal metering, Meshtastic module event history, and per-send MeshCore flood-scope presets (now behind a split Send button). Messaging is more resilient (one-click location share, chat outbox drain on reconnect, extended reconnect budgets, humanized send-NAK errors), and cold-start BLE is serialized so an RNode connects before the RF radios. MeshCore MQTT now steers non-Colorado users to LetsMesh by default.

    What's Changed

    Features

    • Reticulum Remote tab (rnsh + rncp) — New Remote tab (Shell / Transfer / Saved / Settings) with an xterm shell, file send/fetch/listen, saved address book + inbound policy, and Chat DM rncp controls; trust-boundary hardening (picker-backed save dirs, size/offer caps, allow/block lists) (#692, implements #688, #689)
    • Reticulum Relay Chat (RRC) — IRC-style multi-pane client with up to 8 concurrent hub sessions, Favourites/Discovered hub picker, rooms + nicklist, /-command router, @mention unread badges + tray/toast notifications, and SQLite-persisted room history with retention pruning (#680, fixes #648)
    • Watch-folder Nomad hosting + Micron rendering — Host bounded static Nomad Network sites from a watched folder with auto-restore and filesystem watching; vendored RFnexus Micron parser adds table/anchor/partial support (#683, closes #613)
    • Protocol parity tools — Meshtastic module event history, LoRa signal metering, GPX export, MeshCore MCU temperature parsing, per-send flood-scope overrides, QR generation + camera/file ingest, custom lxm:// deep links, cross-platform camera permissions, and Reticulum identity slots with restart-based switching + contact fingerprint verification (9890611e, fixes #218, #477)
    • MeshCore flood-scope presets — User-managed scope list (seeded from the radio hashtag, cap 20) replacing Colorado/Denver hardcodes; scope now lives behind a chevron split-Send menu instead of an always-visible select (#692)
    • Messaging resilience — One-click chat location share (OSM text + optional Meshtastic waypoint) with outbox enqueue on failure, chat outbox drain on RF reconnect, extended BLE/serial reconnect budgets (8 attempts) with transport-aware "reconnecting N/M" banner, conservative/aggressive Store & Forward catch-up setting, and a hung-only Reticulum sidecar health watchdog (#692)
    • Reticulum propagation node management — Rename/delete remote propagation nodes with confirm dialog and persistence guards (#679)
    • Scale Reticulum Peers — Incremental peers_updated patches, path-table TTL, forced ?refresh=1 dumps, batched Map updates, and retention parity (hard 100k ceiling / 50k user cap) keep the UI responsive at ~50k peers ([#677](https://github.com/Colorado-Mesh/mesh-client/pull/677
  2. v5.23.0 # 6 days ago · 2026-07-14 14:48 UTC

    [v5.23.0] - 2026-07-14

    Important: Reticulum contacts cleanup (one-time)

    If you use Reticulum and see non-contacts (peers / announce-only destinations) listed under Contacts, that comes from an earlier bug that promoted announces into the contact list. This release stops that pollution going forward, but existing bad rows are not removed automatically.

    One-time fix: App tab → Danger Zone (Reticulum) → Clear all LXMF contacts.
    Peers stay on the Peers tab with their names; chat history is kept. Real contacts return when you message someone or use Save as contact.


    Highlights

    Reticulum gets much more reliable LXMF DMs (delivery announces, Direct/path-aware sends, saturation hardening), a safer contacts model, faster Peers at large path-table sizes, and interface UX fixes (TCP/UDP/I2P auto-restart, copy LXMF hash, mic for voice clips). Official macOS builds can now be Developer ID signed and notarized. Chat hop badges for MeshCore and Meshtastic are fixed, packaging/smoke and long-session stability are hardened, and several flasher / i18n / BT PIN nits land with it.

    What's Changed

    Features

    • Apple code signing and notarization — Official macOS artifacts can be Developer ID signed and notarized when repo secrets are set; fork/local builds still skip gracefully (#657)
    • Reticulum interfaces and chat UX — Auto-restart stack after TCP/UDP/I2P/pipe (and host/port) interface changes; copy full LXMF hash from Network identity; microphone permission path for LXMF voice clips; clearer DM egress badges; DM pills promoted into the main chat row; quieter propagation sync (#674)
    • Reticulum DM path reachability — Active DM destination probe / reachability indicator when the stack is live (#672)

    Bug Fixes

    • Reticulum LXMF delivery and inbound receive — Emit LXMF delivery announces, register inbound destinations, prefer Direct/path-aware signed sends, mark stale queued rows failed (#672)
    • Reticulum contacts vs announces — Named announces no longer create contacts; App Danger Zone can clear all LXMF contacts while keeping Peers and chat (#672)
    • Reticulum under transport saturation — Path-request backoff, diagnostics for link/timeouts/share_instance conflicts, stuck Sending → failed, propagation-node Chat notice (#669)
    • Reticulum identity / Peers / Nomad — Restore Reticulum tab on launch; header shows Network display name; faster Peers at large tables and after announces; JSON/msgpack peer name parsing; stack restart race fixes (#672, #666, #667)
    • Reticulum chat polish — Unread badges clear after reading DMs; hop count restoration; identity/announce defaults (#674, #667)
    • Chat hop badges (MeshCore + Meshtastic) — Companion pathLen → hop count; wider raw-log correlation fallback; Meshtastic viaMqtt / hopStart===0 aligned with node/diagnostics semantics (#670)
    • RNode flasher resilience — KISS command timeouts, ESP32/nRF52 stall watchdogs, BT pairing timeout, humanized errors (#664, #665)
    • Packaging / CI smoke — ZIP+DMG verification (mount before validate), AppImage extract cwd, no raw .app CI uploads, CodeQ …
  3. v5.22.0 # 9 days ago · 2026-07-11 15:01 UTC

    [v5.22.0] - 2026-07-11

    Highlights

    This release adds Reticulum RMAP v4 discovery (publish, per-interface controls, and a local discovery map tab), unified Reticulum identity import, and a much more scannable Sniffer tab across all protocols. It also fixes Meshtastic MQTT messages landing on the wrong channel tab, hardens triple-protocol BLE coexistence when Reticulum uses a Noble RNode alongside Meshtastic/MeshCore, and migrates the Colorado Mesh MQTT preset to port 443.

    What's Changed

    Features

    • Reticulum RMAP v4 discovery — Publish enabled interfaces to RMAP v4 using App GPS coordinates; per-interface discoverable toggles for RNode, KISS, BLE peer, I2P, UDP, and pipe; Connection tab status strip and sync badges; default hub sync with skip/repair/add; new Map tab with local discovery map (Leaflet), filters, path-table reachability, and link to rmap.world (#649)
    • Reticulum identity unification and import — Single unified identity apply path in the sidecar; backup JSON and private key import (hex/base64/file) on the Network tab with replace confirmation (#651)
    • Sniffer tab scanability — MeshCore on-air hop chains and path display; Meshtastic collapsed hops and transport/type badges; sortable columns, quick-filter chips, relative timestamps, and hover tooltips across all protocols (#643)

    Bug Fixes

    • Meshtastic MQTT channel routing — Prefer MQTT topic channel name over sender-local MeshPacket.channel slot for inbound text; add @index hint in Connection panel for MQTT-only setups (#644)
    • Triple-protocol BLE coexistence — Suspend Noble for Reticulum RNode pairing on macOS/Windows; paired yield lifecycle so the scan mutex releases on connect, grace expiry, or sidecar stop; reconnect hardening and quieter logs when Meshtastic/MeshCore resume after yield (#645, #653, #655)
    • Colorado Mesh MQTT preset — Align MeshCore broker preset to TLS WebSocket on port 443; migrate saved settings off legacy port 1883 (#647, #651)
    • Reticulum discovery map resilience — Cap discovery rows (2,000) with 7-day TTL eviction; preserve last-good data on fetch failure; clear stores on disconnect; partial-failure toasts for RMAP apply/disable (#650)
    • Meshtastic TCP connect — 20s timeout aligned with other transports; disconnect orphaned sockets on failed connect (#644)
    • Channel PSK validation — Reject keys shorter than 16 bytes; accept 1-byte default PSK and bare decrypt-only lengths consistent with MQTT manager (#646, #651)
    • Reticulum diagnostics — Omit expected SharedInstanceServer runtime note from actionable faults (#652)
    • I2P peer validation — Accept official 60-char testnet .b32.i2p addresses (#649)
    • MeshCore waiting-messages poll — Gate idle 5-minute safety poll; treat silent sync timeouts as empty queue (#655)
    • Connection banner accessibility — Status region labels, decorative reconnect pulse layer, improved contrast (#655)

    Othe

  4. v5.21.2 # 11 days ago · 2026-07-09 20:06 UTC

    [v5.21.2] - 2026-07-09

    Highlights

    Meshtastic Wi-Fi (TCP, fast) adds a new connection mode on port 4403 — the same native binary stream as USB serial — so a large NodeDB can configure in about a second instead of 40–60+ seconds over HTTP. This patch also fixes Meshtastic HTTP/Wi-Fi connect (host validation and concurrent write locking), continues MQTT channel-slot attribution fixes (prefer MeshPacket.channel over topic mapping), and scopes MeshCore message-sync spinners to the MeshCore tab so other protocol tabs no longer look busy during background drain.

    Features

    • Meshtastic Wi-Fi (TCP, fast) connection option on port 4403 (#640)
      • New Wi-Fi (TCP, fast) transport alongside Bluetooth, USB Serial, and Wi-Fi (HTTP)
      • Main-process meshtastic:tcp-* IPC bridge and renderer TransportTcpIpc using Meshtastic core framing
      • Serialized outbound writes and heartbeat gating (same SDK concurrency fix as HTTP)
      • Reliable disconnect/reconnect: safeDisconnect now tears down HTTP/TCP sockets when the SDK throws before calling transport.disconnect()

    Bug Fixes

    • Validate host:port authority in http:preflight / http:connect — strip port before hostname check so Meshtastic HTTP connect works again (#638)
    • Serialize concurrent Meshtastic transport writes for HTTP connect — fixes "WritableStream is locked" drops that left chat sends unacknowledged (#639)
    • Attribute inbound Meshtastic MQTT text to MeshPacket.channel (0–7) instead of topic-name mapping; fixes public traffic landing in slot 0 when the topic map is stale (#641)
    • Route JSON MQTT text through the same channel-index resolver as protobuf ingest
    • Scope MeshCore message-sync spinner to the MeshCore tab only; queued backlog pill stays cross-tab (#637)
    • Harden IPC and Flatpak sync (#641)
      • 15s timeout on Linux bluetooth-start-scan so hung bluetoothctl scan on cannot block pairing forever
      • Async meshcore:openJsonFile read (no sync I/O on the main thread)
      • CodeQL hardening in sync-flatpak-electron (semver assert, checksum validation, sanitized manifest writes)
    • Auto-merge duplicate GitHub draft releases in CI — merge split assets, delete extra drafts, and gate smoke tests after consolidation (#628 follow-up)

    Other Changes

    • Extend debug snapshot with channelPills, channelConfigsSummary, and mqttChannelKeyEntryCount for support-bundle triage (#641)
    • Document Meshtastic MQTT channel ingest and triage in AGENTS.md and troubleshooting.md
    • Use Set for renderer lib UI fallback lookup in Vitest config (O(1) membership vs linear .includes()) (#642)
    • Bump deps (#641)

    Breaking Changes

    (None)

    Full Changelog

    v5.21.1...v5.21.2

  5. v5.21.1 # 12 days ago · 2026-07-08 23:45 UTC

    [v5.21.1] - 2026-07-08

    Highlights

    Reticulum is now a full third protocol tab alongside Meshtastic and MeshCore — Rust sidecar, complete UI, RNode flasher/BLE/Wi‑Fi, and triple-protocol BLE coexistence (#593 / #596). MeshCore gains per-repeater saved passwords, more reliable repeater admin RPCs, and multi-hop trace/ping fixes. Nomad Network adds a Micron browser and session-persistent browse state.

    This release also fixes Meshtastic MQTT LongFast channel slot attribution (including bare PSK on channel 0), hardens release CI against duplicate draft uploads and tag-move smoke failures, syncs Flatpak Electron archives during release builds, and improves link-preview timeout UX.

    Features

    • Reticulum third protocol — Ratspeak sidecar, MeshChat UX parity, RNode flasher/BLE/Wi‑Fi, triple-protocol BLE, peer graph overhaul & repo-wide i18n (Fixes #593) (#596)
    • Reticulum RNode selection, IPv6 connect, and quality audit hardening (#610)
    • Nomad Micron browser, docs refresh, and large repeater book hardening (#611)
    • Reticulum export diagnostics, default TCP hubs, and MeshCore header waiting-message status (#620)
    • Reticulum hub presets, security hardening, and packaging fixes (#621)
    • Local act CI (container + native) and Flatpak smoke-test fix (#604)

    Bug Fixes

    • Sync Flatpak Electron archives during release
    • Align electronAPI stubs with typed IPC surface (#636)
    • MQTT LongFast slot attribution and regional topic scope (#635)
    • Populate MQTT channel 0 from bare PSK alongside named secondaries (#634)
    • Attribute MQTT LongFast messages to configured channel slot (#633)
    • Link preview timeout dialog and release workflow permissions (#631)
    • Harden release workflow against duplicate drafts and retag races (#628)
    • Pin packaging-smoke checkout to github.sha
    • Filter release workflow matrix via workflow_dispatch platforms
    • Dedupe GitHub draft releases and consolidate split assets
    • Gate release publish on single draft GitHub release (#627)
    • Fail tests on parseStoredJson [object Object] release noise (#626)
    • MeshCore multi-hop trace priming, visible ping errors, and CI/hardening follow-ups (#625)
    • Harden arm64 apt CI setup script for re-runs and release upgrades (#624)
    • Stop MeshCore auto-reconnect after manual disconnect (#623)
    • Audit follow-ups for UX, hardening, i18n, and Reticulum I2P (#622)
    • Reticulum sidecar bundling, support exports, MeshCore drain, and peers/contacts split (#616)
    • Configure apt for Linux arm64 cross-build on Ubuntu 24.04 CI (#617)
    • Linux AppImage smoke test extract directory ENOENT (#618)
    • Extract arm64 AppImages on x64 CI with unsqu …
  6. v5.21.0 # Pre-release 13 days ago · 2026-07-08 00:47 UTC

    [v5.21.0] - 2026-07-07

    Note: GitHub had lots of problems publishing this release. If you find a broken build, please file an issue.

    Highlights

    This release adds Reticulum as mesh-client's third protocol (Ratspeak sidecar, RNode flasher/BLE/Wi-Fi, triple-protocol BLE coexistence, and MeshChat UX parity). MeshCore repeater admin gains per-repeater saved passwords and more reliable RPCs. Nomad Network adds a Micron browser and large-scale mesh hardening. Packaging and CI improvements cover Flatpak, Linux arm64 cross-builds, local act workflows, and safer draft-release publishing.

    Features

    • Reticulum third protocol — Ratspeak sidecar, MeshChat UX parity, RNode flasher/BLE/Wi-Fi, triple-protocol BLE, peer graph overhaul & repo-wide i18n (Fixes #593) (#596)
    • Nomad Micron browser, docs refresh, and large repeater book hardening (#611)
    • Reticulum RNode selection, IPv6 connect, and quality audit hardening (#610)
    • Reticulum export diagnostics, default TCP hubs, and MeshCore header waiting-message status (#620)
    • Reticulum hub presets, security hardening, and packaging fixes (#621)
    • Local act CI (container + native) and Flatpak smoke-test fix (#604)

    Also in this release: MeshCore repeater admin RPC reliability and per-repeater passwords (#614); Nomad Network UX, 10k mesh scale, CI perf, and stack hardening (#612).

    Bug Fixes

    • Gate release publish on single draft GitHub release (#627)
    • Fail tests on parseStoredJson [object Object] release noise (#626)
    • MeshCore multi-hop trace priming, visible ping errors, and CI/hardening follow-ups (#625)
    • Harden arm64 apt CI setup script for re-runs and release upgrades (#624)
    • Stop MeshCore auto-reconnect after manual disconnect (#623)
    • Audit follow-ups for UX, hardening, i18n, and Reticulum I2P (#622)
    • Extract arm64 AppImages on x64 CI with unsquashfs (#619)
    • Linux AppImage smoke test extract directory ENOENT (#618)
    • Configure apt for Linux arm64 cross-build on Ubuntu 24.04 CI (#617)
    • Reticulum sidecar bundling, support exports, MeshCore drain, and peers/contacts split (#616)
    • Protocol-scoped diagnostics, language selector UX, and docs refresh (#609)
    • Harden long MeshCore sessions against RPC races and memory growth (#608)
    • Auto-apply rsReticulum packet-tap overlay for sidecar builds (#607)
    • Stop Reticulum utun beacon log spam and surface Meshtastic PKI send errors (#605)
    • Flatpak sidecar CI and actionlint installer (#603)
    • Use dnf for Reticulum sidecar deps in Flatpak CI (#602)
    • Flatpak Wayland launch, MeshCore queue badge, Reticulum DMs by address, and CodeQL findings (#601)
    • Compare MeshCore firmware updates by semver, not build date (#595)

    Other Changes

    • Generalize App orchestration for N-protocol prep (#597)
    • N-protocol renderer prep + MeshCore multibyte path hash (#594)
    • Consolidate timeConstants shared import for CodeQL (#615)
    • Sync reticulum-sidecar Cargo.lock for rns-interface deps (#606)

    Breaking Changes

    (None)

    Full Changelog

    v5.20.4...v5.21.0

  7. v5.20.4 # 22 days ago · 2026-06-28 20:20 UTC

    Highlights

    Lessons Learned from Amateur Radio Field Day 2026.

    Dual-protocol Noble BLE startup and reconnect get a full pass: direct connect before scan, active-protocol-first auto-connect, wake/sleep recovery, and clearer contention UX. Phantom Chat unread badges from unprogrammed or zero-PSK channels are fixed for both Meshtastic and MeshCore. Connection panel errors are humanized via i18n, and test/infra hardening covers CodeQL findings, vitest worker pools, and Vite browser dev.

    Bug fixes

    Noble BLE auto-connect and reconnect (#588, #591)

    • Direct connect before scan: Startup auto-connect and the reconnect card use reconnectBleWithScan so Noble connects via waitForPeripheralDuringScan instead of waiting only for renderer discovery — fixes false offline timeouts when Bluetooth is on but the saved device never appears in the scan list.
    • Manual Connect opens scanner: On macOS/Windows, manual Connect always starts Noble scanning so users can pick a different radio; reconnect to the last device uses startup auto-connect or the reconnect card.
    • Timeout ownership: Removes the ConnectionPanel 30s auto-connect timeout from Noble paths; reconnectBleWithScan owns wait + scan timing.
    • Active-protocol-first startup (#591): Auto-connect the last-used protocol immediately; defer the inactive protocol until the active one finishes Noble BLE configure (poll up to 30s) instead of a fixed 8s MeshCore-only stagger.
    • Cross-protocol coordination: meshcoreNobleBleConfigureBusy and awaitNobleBleProtocolSettle helpers; info banner when MeshCore auto-connect is skipped because the peripheral is shared with Meshtastic; humanized "already in progress" BLE errors with a dual-protocol contention hint.

    Wake / sleep BLE recovery (#587, #590)

    • Rehydrate Meshtastic/MeshCore connection params from lastConnection storage on Noble disconnect and onPowerResume.
    • Stagger MeshCore power resume 8s after Meshtastic; MeshCore BLE reconnect waits up to 30s for Meshtastic Noble configure to settle.
    • Force-disconnect connecting BLE zombies and evict stale cache entries in noble-ble-manager; guard Meshtastic toDevice stream before getWriter.
    • ConnectionPanel (macOS/Windows): Connect retries last known BLE peripheral; macOS surfaces macWakeRecoveryHint for wake-related BLE failures.
    • MeshCore Connect after failed auto-reconnect: Clear stuck bleConnectInProgressRef on reconnect completion/exhaustion and on power resume so manual Connect works without quitting.
    • Meshtastic BLE reconnect parity (#590): Rehydrate reconnect params on Noble BLE disconnect (same pattern as MeshCore).
    • Noble connecting-zombie fix (#590): Force disconnect when peripheral is stuck in connecting before reconnect.
    • Docs: docs/troubleshooting.md — Windows sleep/wake section, updated stagger/settle timing, phantom chat unread entry.

    If auto-reconnect still fails after wake (Noble):

    • macOS: quit mesh-client (Cmd+Q) → toggle Bluetooth → reopen → wait ~5s → connect MeshCore first, then Meshtastic.
    • Windows: exit fully → toggle Bluetooth (or adapter in Device Manager) → reopen → connect MeshCore first, then Meshtastic.

    Phantom Chat unread badges (#587, #590)

    • Meshtastic: Merge legacy and protocol last-read keys with Math.max per channel; sanitizeMeshtasticChatLastRead; limit App/ChatPanel unread to radio-programmed channel indices.
    • MeshCore: Limit App-level and ChatPanel unread to configured channel slots (non-zero PSK) via meshcoreConfiguredChatChannels; sidebar badges align with Chat channel pills from runtime channels.

    Connection panel error UX (#590)

    • Auto-connect failures (BLE and serial) humanized via i18n; duplicate hardcoded Noble timeout hints removed from main process.
    • Platform detection switched from userAgent to electronAPI.getPlatform().

    Browser dev startup (#586)

    • No-op electronAPI s …
  8. v5.20.3 # 24 days ago · 2026-06-26 18:22 UTC

    Highlights

    USB serial reconnect reliability and dual-protocol BLE coexistence are the main themes: timeouts, silence watchdogs, SerialPort.forget() escalation, a Select serial port banner when auto-reconnect is exhausted, and MeshCore deferring BLE when it would contend with Meshtastic on the same radio. Locales from recent auto-translate batches are corrected, and i18n quality checks are expanded so similar mistakes fail CI instead of shipping.

    Bug fixes

    USB serial reconnect on lockup and zombie ports (#583)

    • Shared serial recovery (serialPortRecovery.ts): 15 s open/reconnect timeouts, port.forget() when supported, persisted port identity cleanup, and debounced global navigator.serial disconnect routing for Meshtastic and MeshCore.
    • MeshCore USB serial: serial watchdog (120 s stale / 180 s dead), transport-loss watch on stalled streams, and last-data tracking.
    • Meshtastic USB serial: 3 min without inbound traffic treated as a dead link.
    • After 5 failed auto-reconnect attempts, sets serialNeedsReselect and shows a connection banner that opens requestPort() (port picker) instead of looping on getPorts().
    • Troubleshooting updated with platform-neutral recovery steps for frozen / stuck "Reconnecting…" USB serial sessions.

    Dual-protocol BLE auto-connect contention (#581)

    • meshcoreTargetsSharedMeshtasticBlePeripheral: when Meshtastic and MeshCore would auto-connect to the same Noble GATT peripheral, MeshCore defers BLE so Meshtastic keeps the radio.
    • ConnectionPanel: skips MeshCore Noble scan on mount, serial→BLE fallback, and device-discovered auto-connect when BLE ids match; migrates stale serial lastConnection to BLE before fallback.
    • Meshtastic connect failures now log the underlying reason in handleRfConnectFailure.

    i18n locale quality audit (#584)

    Fixes bad auto-translate strings from recent batches:

    • es: portopuerto (serial port wording)
    • tr: removed COM… garbage in serial reselect action
    • cs / id: bare "GIF id" wording corrected
    • it: stanzesale (rooms); serialReselectAction casing
    • nl: maasreactiemesh-reactie
    • uk: meshcoreReactionEmojiOption contact vs react confusion; apostrophe spacing (з'єднання, пам'ять, etc.)
    • All locales: RSSI/SNR contact tooltip strings aligned

    check-i18n-quality extended with rules for serialReselectAction, bare GIF id hints, meshcoreReaction false friends, Ukrainian broken apostrophe spacing, and rooms collapse/expand hotel-room wording — plus seven regression tests.

    Diagnostics docs link (#582)

    • DiagnosticsPanel Docs link now points at docs/diagnostics.md (stale DIAGNOSTICS.md path removed).
    • docLinks.test.ts scans UI, root markdown, docs/, and .github/ for broken doc URLs and fails CI when a linked file is missing.

    Infrastructure & housekeeping

    • Vitest project split (#582): renderer-logic (node/threads), renderer-ui (jsdom/forks), and main (node/forks) with per-project worker pools; pure lib tests skip jsdom setup overhead; coverage routing fixes restore orphaned lib tests after the split.
    • connectionStore: expanded selector guidance and mirrorMqttStatusToConnection bridge docs; cross-linked from ConnectionDriver and AGENTS.md.
    • Vitest harness (vitest.harness.ts): worker ratios and shared Vite dep inline lists extracted from magic numbers; computeVitestMaxWorkers validates invalid inputs.
    • i18n quality script: localeStringQualityIssues split into 14 focused checkers; clearer startup error when src/renderer/locales is missing (MESH_CLIENT_LOCALES_DIR override for tests).
    • Shared helpers: docLinks.ts, blePairingError.ts, mqttVirtualNodeId.ts, tcpPort.ts, and RfConnectionTransportOpts discriminated unions for transport-specific connect args.
    • Dependency bumps: motion 12.42.0, …
  9. v5.20.2 # 26 days ago · 2026-06-24 23:56 UTC

    Highlights

    MeshCore USB serial and Linux Web Bluetooth connect reliability is the main theme: serialized writes, ordered init RPCs, and full channel enumeration before post-connect setup. Chat reaction capture after the OS emoji picker is fixed on all platforms. Header layout no longer overlaps at narrow widths, and protocol-switcher unread badges meet WCAG contrast.

    Bug fixes

    Header layout (#575)

    • Restructured the banner as a two-column grid so the protocol switcher and status cluster no longer paint on top of each other at minimum width.
    • Hides TAK/MQTT/connection text below lg and the node label below xl; icons, badges, and aria-label/title tooltips preserve context when labels are hidden.

    MeshCore USB serial connect (#576, #578, #579)

    • Serialized Web Serial writes via createSerializedWritableStream so concurrent init RPCs no longer hit WritableStream is locked or stall getContacts (60s timeouts on macOS/Windows USB companion).
    • Sequential init handshake on USB serial and Linux Web Bluetooth: getSelfInfogetContactsgetChannels before syncDeviceTime, auto-add, and setAdvertLatLong. TCP and Noble BLE keep parallel overlap for speed.
    • Graceful auto-add GET: unsupported Err and silent firmware treated as non-fatal skips instead of connect timeouts.
    • Stale port cleanup: closes leftover Web Serial ports on first connectSerial(), not only on reconnect.
    • Companion TX echo filter extended to USB serial (DeviceQuery echo code 22), shared with Noble IPC.

    MeshCore Linux Web Bluetooth (#579)

    • Serializes toDevice writes during connect-time RPCs (same pattern as USB serial).
    • PopOS / reconnect paths get reliable full channel lists instead of public-only partial enumeration.

    Chat reactions after emoji picker (#577, #578)

    • Typing after closing the OS emoji panel no longer sends keystrokes as tapback reactions (e.g. typing “joey” → j/o/e reactions).
    • Explicit reaction capture lifecycle: clearReactionCapture() on react/dismiss/Escape; reactionCapturePendingRef gates Linux click and native hidden-input handlers.
    • macOS/Windows: printable keys redirected to the composer; isReactionPickerEmojiGlyph rejects plain ASCII letters.
    • Clears stale capture on window focus; clears replyTo when opening React.

    Accessibility

    • Readable green contrast: darkened to #15803d so white-on-green protocol-switcher badges pass WCAG AA 4.5:1; migrates persisted #16a34a overrides on load.
    • ProtocolUnreadBadge: decorative animate-pulse on an aria-hidden layer; text label stays fully opaque for contrast.
    • hydrateAxeThemeColors test helper; expanded vitest-axe coverage for Meshtastic/MeshCore unread badges and App header.

    Infrastructure & housekeeping

    • Dependency bumps: Electron 41.8 → 41.9, Vite 8.1, TypeScript ESLint 8.62, @axe-core/react 4.12, and others; Flatpak vendored Electron archives synced.
    • MeshCore timing constants centralized in timeConstants.ts (dual-Noble BLE, Web Bluetooth, reconnect backoff cap).
    • Shared time constants: MS_PER_HOUR / MS_PER_DAY derived from base units; MS_PER_YEAR documented as non-leap approximation.
    • Timestamp skew tests expanded; ChatPanel imports aligned to shared messageTimestampSkew / timeConstants modules.
    • AGENTS.md: platform parity defaults, pulse-split badge pattern, axe testing guidance.

    Breaking changes

    (None)

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.20.1...v5.20.2

  10. v5.20.1 # 29 days ago · 2026-06-21 14:57 UTC

    Highlights

    MeshCore interop and Rooms UX catch up with Chat: companion-style keyless tapbacks/replies by default, optional MeshCore Open wire compatibility for keyed replies, Open reactions, and GIF send, plus Rooms toolbar parity (search, export, mute, collapse). Channel unread badges recover from RTC-skew poison traffic, and releases stay draft until a maintainer publishes them.

    Features

    MeshCore Open wire compatibility (#568)

    • New App → MeshCore → Open wire compatibility toggle (default off, marked experimental).
    • When enabled: keyed text replies (@[Name#key]), Open r:HASH:INDEX reactions (tapback fallback), and outbound g:GIFID GIF send via Chat GIF modal.
    • Default remains companion keyless @[Name] replies and tapbacks for official app / Discord bridge parity.

    Rooms panel parity (#566)

    • In-panel search with highlight, export, jump-to-date, per-room mute, day separators, compact mode, sender filter, and collapsible room list (localStorage).
    • Muted room:* views excluded from sidebar/tab unread counts; App notified on mute changes.
    • Collapsed rail shows 2-letter room initials, auth status dot, and green selection border (no broken login-all control).

    Chat & media (#566)

    • Clear search filter when Chat search is closed (toggle, Escape, ×).
    • Inbound MeshCore Open g:GIFID wire renders inline Giphy GIFs in chat (with page link fallback).

    Bug fixes

    MeshCore tapbacks & reactions (#494, #565, #566, #567, #569)

    • Outbound reactions use keyless @[Name] emoji companion wire (not @[Name#timestamp], which leaked into Discord/MQTT bridges).
    • Local chat still shows reaction badges; replyId kept for dedup without keyed wire.
    • Inbound emoji-only replies promoted to tapbacks; wider 10 min echo dedup with sec/ms replyId matching.
    • RF replay dedup and UI dedupe stop stacking optimistic + echo rows (#494).
    • Inbound Open r:HASH:INDEX reactions parsed; outbound Open wire removed in favor of companion format.

    MeshCore reply threading & quotes (#568)

    • Outbound channel/DM replies prefixed on wire via shared buildMeshcoreOutboundSendText() (fixes plain-text sends after Protocol migration).
    • Parent lookup matches firmware seconds vs client ms keys; explicit #key no longer falls back to “latest from sender.”
    • Default text replies use keyless @[Name] wire; keyed prefix retained for inbound wire from other clients.

    Channel unread badges (#568, #569)

    • Unread counting aligned with mark-read using effectiveMessageTimestampMs and clamped watermarks.
    • Future-dated / poison traffic no longer inflates ch:N last-read; timestamps clamped at ingest, DB save/load, and hydration.
    • Copy Debug Snapshot extended with last-read triage fields for badge debugging.

    Rooms scroll (#566, #568, #569)

    • Fixes race where pinned-bottom scroll clobbered Go to message / Starred jumps on room switch.
    • Skips live-append scroll while scrollToRowKey or suppress flags are active.

    Timestamps & room login (#570, #571)

    • Explicit <= 0 guards in messageTimestampSkew (zero = missing timestamp / no watermark, not Unix epoch).
    • Hop-scaled MeshCore room login timeouts extracted to named constants in timeConstants.ts.

    Infrastructure & housekeeping

    • GitHub releases stay draft until manual publish (#564) — electron-builder + Flatpak workflow + docs updated.
    • release.sh: single git-log pass, correct feat!: breaking detection, annotated tags.
    • CodeQL hardening: Giphy URL hostname parsing, dead-code cleanup, MeshCore runtime naming/constants.
    • Docs: reply misquote cause, room BBS wire vs chat, AGENTS/troubleshooting/parity updates.

    Breaking changes

    (None)

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.20.0...v5.20.1

  11. v5.20.0 # 1 month ago · 2026-06-19 21:46 UTC

    Highlights

    A major reliability and parity release: virtualized chat scroll is stable on Windows/Linux, Windows on ARM gets dedicated installers and CI smoke tests, Meshtastic/MeshCore feature gaps close (MQTT proxy gateway, per-node key backup, flood scope), and identity-scoped stores no longer leave chat stuck after reconnect.

    Features

    Per-node key backup (#520, #521)

    • Encrypted backup/restore for full public + private key pairs, indexed per Meshtastic nodeNum and MeshCore nodeId (replaces single app-wide Meshtastic slot).
    • Shared Key Backup / Restore UI with Restore from backup… picker for factory reset / node-id changes; legacy mesh-client:key-backup migrates on first Security tab open.
    • MeshCore Security tab enabled for backup/restore, sign, export/import; restore syncs active MQTT identity.

    Meshtastic / MeshCore parity (#532)

    • Meshtastic MQTT proxy gatewayMqttClientProxyMessage bridge over local radio, broker publishProxy IPC, module-config auto-connect, Map Report module section, XMODEM on Radio tab, module debug status panels.
    • MeshCore parity — Regional flood scope (collapsible Radio section), TX Power with firmware max clamp, zero-hop advert + App auto-flood type, waiting-messages Chat badge, Sniffer transport/route legend.
    • Remote-admin UI gating — Hide local-only controls (XMODEM, MQTT proxy hint, DFU/OTA/factory reset) when Configure node targets a remote radio.
    • Sniffer expand-row parity — Meshtastic Raw Packet Log rows show legend hints and decoded MeshPacket details above hex, matching MeshCore.
    • Chat transport badges — Hybrid RF+MQTT messages show Wi‑Fi and globe icons side-by-side.

    UI & notifications (#522, #542, #549)

    • Animated Lucide icons (~140 inline SVGs → lucide-react-motion) with shared icon modules; App → Appearance → Reduce motion toggle suppresses decorative animation while keeping functional spinners and connection pulses.
    • Identity-aware boot sequence — Terminal-style splash on connect reflecting active identity, hardware, channels, and node sync before the protocol one-liner.
    • Typed chat notification sounds — Channel = single 880 Hz pulse; DM/reply = dual-tone chord; batch priority reply > dm > channel; App vs ChatPanel split avoids double beeps when backgrounded.

    MeshCore UX (#531)

    • Contact offload progress UI with cancel support during save/remove/reconcile.
    • RSSI/SNR metrics in node list and detail panel (capability-gated).
    • Rooms panel compact header toolbar; Log in all only targets rooms with saved passwords; per-view mute respected for background toasts/sounds.

    Bug fixes

    Chat scroll & virtualization (#535, #537, #539, #545–#547, #552, #562)

    • TanStack Virtual end-anchored chat/rooms with shared chatScrollUtils helpers; fixes Windows/Linux wheel jitter, unread-divider snap, virtual row overlap, and tab-return scroll jumps.
    • ResizeObserver 0×0 measurements on hidden tabs no longer corrupt row height cache.
    • Decoupled virtualizer scroll-end threshold (30px) from UI pin threshold (200px) to stop Windows bounce after dynamic content grows.
    • Scroll position restored on tab re-entry; pinned-to-bottom auto-scroll preserved.

    Identity & data integrity (#544, #561)

    • Startup DB repairs: stuck MeshCore room sending rows, orphan duplicates, MeshCore contact labels purged from Meshtastic node table, null inbound message status set to acked.
    • Stuck chat after reconnect — Live ingress vs offline identity bucket mismatch fixed; offline store slices merge on connect; Copy Debug Snapshot in App panel for support.
    • Meshtastic ingest skips saving MeshCore contact-type labels; shared meshcoreContactHwLabels constants.

    Windows packaging (#519, #534, #538, #550, #555–#560)

    • Separate x64 and arm64 NSIS installers (Mesh-client Setup {version}.exe and -arm64.exe) instead of broken universal installer.
    • NSIS payloads switched from 7z to zip for reliable …
  12. v5.19.3 # 1 month ago · 2026-06-06 17:20 UTC

    Highlights

    A reliability-focused patch from the dual-protocol audit: MeshCore DMs no longer bleed into wrong tabs or phantom contacts, Meshtastic BLE and MQTT sessions are more stable, and chat/security hardening lands across the stack (virtualized chat, coordinated shutdown, SSRF guard on link previews).

    MeshCore

    • DM sender resolution (#507) — Prefix maps seed from the global pubkey registry on subscribe; SQLite contacts pre-load before ingress so live/queued DMs resolve to the correct peer immediately instead of collapsing under a shared Unknown stub or sender_id 0.
    • Contact & protocol safety (#509) — Clear per-subscription prefix lookup maps on unsubscribe; mergeNode keeps the bucket nodeId over conflicting patches; batch slice totals reject non-integers; clearer error when DM send lacks destination pubkey.
    • Chat pathway hardening (#508) — Channel send throws when no RF/MQTT transport; pubkey 6-byte prefix collision detection; repair sender_id=0 rows after contact sync; tighter wire reply-key regex.
    • Rooms sidebar markers (#508) — Green-filled dot = active session; sky-blue half-circle = saved password but not logged in; status legend, header session badge, and clearer tooltips. i18n fixes across 15 locales for marker strings and false-friend “leave space” translations.

    Meshtastic

    • BLE transport serialization (#511) — Serialized toDevice wrapper now applied on Noble BLE (was serial-only), preventing SDK heartbeat pings from racing Store & Forward writes and locking WritableStream.
    • MQTT auto-connect (#510) — Honors auto-launch when switching back to the Meshtastic tab; treats autoLaunch as explicit opt-in so MeshCore tab no longer silently skips or tears down an opted-in MQTT session.
    • MQTT decrypt reliability (#513) — Rejects false-positive decrypt candidates (wrong PSKs that still parse as protobuf) so key search continues to the correct channel/publish-time PSK; fixes intermittent CI broker-echo failures (~1.8% decoy rate with DEFAULT_PSK).
    • Chat & ingest (#508) — Normalized MQTT chat ingest (broadcast to, dedup fields, "0" payload guard); composite seenPacketIds key; S&F replay content dedup; chat export correctly labels broadcast messages as channel (not DM); cross-transport dedup uses outbound receivedVia + store-backed RF scans; Store & Forward empty-text handling hardened.
    • Diagnostics & PSK (#508) — Split incremental vs full reanalysis debounce timers so they no longer cancel each other; channel URL PSK bytes normalized (empty → default public key, short keys zero-padded to 16 bytes); short named MQTT lines like HamNet= parse as named empty values.

    UI

    • MQTT path icons (#510) — Globe icon changed from purple to sky so it no longer reads like stale-node legend color; lone MQTT-only globes centered in the nodes column; hybrid rows still show RF + globe as a pair; chat transport badge color aligned.

    Security & reliability

    • Coordinated shutdown (#508) — Flush logs, stop TAK/MQTT, close SQLite with dbClosed guard to block late IPC reopen.
    • Link preview SSRF (#508) — Block proxied og:image redirects to private/localhost targets.
    • Input validation (#508) — Reject negative MeshCore MQTT senderNodeId; node hex search so query "0" no longer matches every node.
    • Shared helpers (#508) — Hardened PSK line/URL parsing, contact age cutoff, reaction emoji BMP, correlation suffix.

    Performance & infrastructure

    • Virtualized chat (#508) — ChatPanel messages use @tanstack/react-virtual; MeshCore dedupe O(1) index.
    • Notifications (#508) — Reuse single AudioContext instead of creating one per beep.
    • TAK (#508) — Cap clients at 16 with 24h idle timeout; async cert writes.
    • Lint & types (#508) — Re-enabled no-unsafe-* rules for src/shared/**; typed protobuf boundary via meshtasticProtobufSchemas.ts; tsconfig.strict.json for incremental shared strictness.
    • CI scripts (#508) — GPIO brand check, IPC contract scan scope, log-injection arg detection, document.write XSS check …
  13. v5.19.2 # 2 months ago · 2026-06-05 19:30 UTC

    Highlights

    Dual-protocol reliability fixes from a 36-hour audit: MeshCore large contact lists now persist correctly, node names no longer get wiped by sparse updates, Meshtastic MQTT no longer bleeds into MeshCore-only sessions, and hybrid RF+MQTT connection icons apply to your own node too.

    MeshCore contacts & database

    • Large contact sync (#505) — Radios returning 600+ contacts (e.g. 688 over TCP) no longer fail SQLite persist on connect. Batch saves are chunked at the 500-row IPC limit; all slices persist in one transaction.
    • Identity preservation — mergeNode skips undefined patch keys; MeshCore upsertNode uses preferNonEmptyTrimmedString so empty or sparse advert data cannot wipe hydrated contact names after restart.

    Dual-protocol & MQTT

    • MeshCore-only users — Live Meshtastic MQTT chat/node ingest is gated on the MeshCore tab unless an RF device is connected. Meshtastic MQTT auto-launch runs only when Meshtastic is the stored protocol.
    • Trace-route ingest — Meshtastic MQTT trace-route traffic gated with shouldIngestMeshtasticMqttLive.
    • Log noise — Meshtastic MQTT decrypt-failure debug sampling removed for traffic that cannot be decrypted (expected on public brokers without matching PSKs).

    Meshtastic reliability

    • Tapbacks — Optimistic reactions marked sending and re-keyed on RF echo via PacketRouter + SQLite so only one reaction is shown; dedup window widened for client/radio timestamp skew.
    • Stub nodes — NodeInfo requested after position/telemetry (not only text) when a node lacks display identity; first telemetry from unknown nodes also triggers NodeInfo.
    • Send logging — BLE sendText failures log readable error strings instead of [object Object] in mesh-client.log.

    MeshCore Rooms

    • Auto-sync — Skips when already logged in; defers quietly when multi-hop route bytes are missing (no hourly warn/debug spam).
    • Auth failure recovery — meshcoreRoomAutoLoginFailure cleared when re-enabling auto-login on connect; unified failure handling across connect, scheduler, and loginAllSavedRooms.

    UI & i18n

    • Hybrid self node — Your node in the nodes list and detail modal shows the same RF + purple MQTT path icons as hybrid peers when both transports are up; Source badge shown in node detail.
    • Translations — Hybrid RF+MQTT tooltips corrected for de/tr/pl; new check:i18n cross-key rules guard against regressions.

    Other

    • README — Clarifies that the project is for everyone, everywhere, and welcomes participation.
    • Dependencies — electron-builder bumped to 26.15.0.

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.19.1...v5.19.2

  14. v5.19.1 # 2 months ago · 2026-06-04 16:29 UTC

    Highlights

    MeshCore Rooms gets clearer control over saved passwords and smarter behavior after login failures. Meshtastic BLE/serial transport writes are serialized so pings and Store & Forward no longer race the SDK stream. Room background sync is quieter when routes are missing. Database pruning for MeshCore contacts is safer when favorites are involved.

    MeshCore Rooms

    • Saved passwords — Collapsible Saved passwords list in the Rooms sidebar (collapsed by default). Per room: Stop auto-login (keeps password, stops connect-time retries) and Forget saved password (clears credential and turns off auto-login and auto-sync). Same controls on the login overlay and logged-in header.
    • Auth failure handling — Wrong password or ACL rejection turns off auto-login and periodic auto-sync but keeps the stored password and shows Auto-login failed until you log in again or change settings manually.
    • Connect auto-login — Skips rooms with a recorded auto-login failure until you fix credentials or re-enable Remember password.
    • Room sync scheduler — Single-flight ticks, faster route resolve (skipTrace), cooldown updates lastSyncAt on no-route, and route/trace log noise reduced (warn once per room, then debug).
    • Troubleshooting — docs/troubleshooting.md documents password rotation and saved-password controls.

    Meshtastic connection & transport

    • Serialized toDevice writes — BLE and serial traffic share one virtual writer queue so concurrent SDK getWriter() calls (ping, Store & Forward, queue) no longer throw WritableStream is locked.
    • getMetadata retry — One retry ~8s after configure when NodeDB traffic starves metadata reads on BLE.

    Database & maintenance

    • MeshCore contact count prune — DELETE cap respects non-favorited contacts so favorited nodes cannot leave the DB above maxCount when excess rows are all favorites.
    • Merge errors — Invalid merge sources raise MergeSourceInvalidError (MERGE_SOURCE_INVALID) instead of brittle message-string checks.
    • Prepared statements — getMeshcoreHopHistory and pruneMeshcorePathHistory use prepareOnce.
    • Shared time constants — MS_PER_DAY and related durations live in src/shared/timeConstants.ts so main-process prune cutoffs match renderer helpers.

    Reliability & tooling

    • React hooks lint — react-hooks/refs, set-state-in-effect, and purity are errors; lint runs with --max-warnings 0. Fixes in ModulePanel, RoomsPanel, and useMeshcoreRuntime (hydration race with contact import).
    • i18n quality — New check-i18n-quality script (mojibake, meshtastic:// spacing, false friends) in pre-commit checks.
    • Dependencies — Lockfile refresh from #503.

    Bug fixes

    • MeshCore auth failure no longer clears UI failure state while still retrying auto-sync (#503).
    • Room sync log spam when multi-hop routes are unavailable (#503).

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.19.0...v5.19.1

  15. v5.19.0 # 2 months ago · 2026-06-04 00:29 UTC

    Highlights

    This release completes the renderer dual-protocol architecture (#375, #377) — identity-scoped stores, ConnectionDriver, protocol runtimes mounted once from App, and removal of the legacy useDevice / useMeshCore god hooks. MeshCore Rooms lands as a first-class BBS tab with login, posting, admin CLI, and background sync. Meshtastic Radio/Modules panels gain parity with firmware (Display, Bluetooth, Power, Telemetry, Remote Hardware, Administration). Connection reliability improves across sleep/wake, Noble BLE, USB serial, and MQTT. Chat gets a shared composer, stronger dedup, unread badges, and tapback/reply fixes on both protocols.

    Contributors

    Special thanks to Soord for the heavy lifting on the hook refactor and protocol separation that made the dual-protocol architecture possible, and to WB3IHY (Joe) for Meshtastic Radio/Modules parity work (#493).

    What's Changed

    • Architecture & protocol separation (#475)
    • Remove legacy useDevice and useMeshCore; side effects live in useMeshtasticRuntime / useMeshcoreRuntime (mount once from App).
    • Identity-scoped Zustand stores (identityStore, nodeStore, messageStore, connectionStore) with SQLite hydration via hydrateIdentityStoresFromDb.
    • ConnectionDriver + PacketRouter + Protocol layer (MeshtasticProtocol, MeshCoreProtocol) for driver-first connect and normalized wire events.
    • Thin composition hooks: useProtocolFacade, useProtocolConnection, usePanelActions, useConnectionView, useDualProtocolPanelActions.
    • Feature gates via ProtocolCapabilities / useRadioProvider instead of hardcoded protocol string checks.
    • MeshCore contact batch IPC, startup DB prune single-flight, offline identity slots for pre-connect hydration.
    • Docs: docs/renderer-side-effect-migration.md, updated AGENTS.md / ARCHITECTURE.md.

    Features

    • MeshCore Rooms tab — dedicated BBS panel for room-server login, read-only and guest/admin posting, admin CLI/ACL, credentials, auto-sync, and room post ingest (#483, #491).
    • Shared ChatComposer — drafts, mentions, chunking, and emoji used by Chat and Rooms ([#491](https://github.com/Colorado-* Mesh/mesh-client/pull/491)).
    • Meshtastic Radio/Modules parity (#493) — WB3IHY: Display, Bluetooth, and Power fields on Radio panel.
    • Telemetry moved to Modules panel; Remote Hardware restored with configurable fields.
    • IP Tunnel as status-only section.
    • New Administration tab (Device Commands and Danger Zone moved out of Radio).
    • All 16 locales updated.

    MeshCore Rooms — fixes & polish

    • Read-only → password upgrade, room routing, and docs parity with pyMC/official app (#495).
    • Login reliability, dedup, chat noise filtering, and receivedVia merge (#485, #486).
    • Read-only room login, SignedPlain posts, and chat badge fixes (#490).
    • Shorter login timeouts for TCP and 0-hop paths (#489).
    • Reply previews and tapback echo dedup (#488).
    • Tray unread for Rooms traffic; room admin relogin (#492).
    • Rooms scroll layout locked to viewport; jump-to-unread/latest UX matched to Chat (#499).

    Chat & messaging

    • Dual-protoco …
  16. v5.18.0 # 2 months ago · 2026-05-26 03:01 UTC

    Highlights

    PKC-based Meshtastic remote admin and private MQTT brokers (multi-PSK, correct AES-CTR, MQTT-only identity) are the headline reliability work in this release, with a long tail of fixes across Linux Web Bluetooth, Store & Forward chat history, and an experimental Flathub-ready Flatpak pipeline. Chat gains a chunked composer with a durable outbox; the map and connection UI pick up channel URLs, backlog controls, and clearer disconnect feedback.

    What's Changed

    Features

    Chunked message composer, durable outbox, MeshCore MQTT-only queue guard, and chat fixes (#421) Expose all theme colors in color scheme section (#423) Experimental Flathub-ready Flatpak build support (#434) Pulse header red on error disconnect; MeshCore MQTT reconnect fix (#446) Map UX, channel URLs, backlog, and node ID formatting (#447) PKC remote admin, private MQTT brokers, and Meshtastic reliability (#453)

    Bug fixes

    Harden main process, tighten IPC types, and bump deps (#424) Linux Web Bluetooth first-message ACK, stale watchdog, and auto-reconnect (#429) Hoist readable-stream for Linux asar MQTT packaging (#430) Replace single 100ms BLE safety read with multi-shot probes for LoRa latency (#431) Subscribe to fromNum GATT notify for unsolicited mesh traffic on Linux BLE (#432) 3-second background fromRadio poll between write cycles (#433) Flatpak: node-generator arch flag, aarch64 builder, Flathub remote, CI runners, Electron bundle paths, offline archives, vmwgfx GPU policy (#437–#445) USB C++17 Linux rebuild and Store & Forward chat decode (#448) MeshCore/Meshtastic stability, S&F history, and static GPS sync (#449) Meshtastic last_heard freshness and garbled TEXT_MESSAGE handling (#451) Serialize remote admin fetch and PKI packets (#454) Multiple MQTT channel PSKs in connection panel (#455) MQTT channel PSK/index, uplink encrypt, remote admin over BLE (#456) MQTT PSK parsing, MQTT-only identity, remote admin snapshot (#457–#458) Meshtastic MQTT, PKC remote admin, and tapback reactions (#459) Remote admin stability, MQTT decrypt keys, i18n quality (#460) Correct AES-CTR nonce for MQTT encrypt/decrypt (#461) Remote admin reliability, MQTT outbound identity, i18n (#462) Remote admin PKI fallback, MQTT from guard, snapshot hardening (#463) Remote admin response correlation and channel read hardening (#465) Prioritize publish-time MQTT PSKs for broker echo decrypt (#466)

    Other

    README: chunked outbox, MeshCore TCP port (#422) Docs sync with Flatpak and recent features (#450, #464) Flatpak workflow hardening and Node.js 24 (#435, #436) Dependabot: pin idna and pymdown-extensions (#425)

    New Contributors

    @WB3IHY made their first contribution in https://github.com/Colorado-Mesh/mesh-client/pull/461

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.17.0...v5.18.0

  17. v5.17.0 # 2 months ago · 2026-05-18 01:07 UTC

    Features

    • Flexible MeshCore Connections: Added support for specifying a custom TCP port (defaulting to 5000) when connecting to MeshCore devices.
    • Enhanced Diagnostics:
      • Improved "Foreign LoRa" detection by surfacing nearby MeshCore traffic within the Meshtastic diagnostics panel.
      • Added support for recording MeshCore RF traffic overheard by Meshtastic listeners, including proximity filtering and sender resolution.
      • Added "MeshCore heard on Meshtastic frequency" section to the diagnostics panel.

    Bug Fixes

    • Clipboard Support: Rewrote chat message copying to use main-process IPC, resolving silent failures in the Electron environment on macOS.
    • UI/UX Improvements:
      • Fixed a behavior where the "unread divider" would persist even when messages fit on the screen without scrolling.
      • Replaced relative height calculations with explicit pixel values in PacketDistributionPanel to fix rendering issues.
    • Diagnostics Accuracy:
      • Hop diagnostics are now skipped for MQTT-only nodes to prevent false "impossible hop" alerts caused by hops_away=0 reporting.
      • Hardened "Foreign LoRa" promotion and TCP address parsing, including better handling of bare IPv6 addresses.
    • I18n (Internationalization):
      • Conducted a major repair of over 300 translations across 15 locales that were corrupted by automated auditing tools.
      • Restored technical terms like "Flood Advert," "TAK," "MGRS," and "Router" to their correct forms.
      • Added validation guards to the i18n scripts to prevent technical protocol terms from being translated in the future.

    Refactoring & Maintenance

    • Keyboard Shortcuts Removal: Removed the global keyboard shortcut system (Cmd/Ctrl+1-9, search toggles, etc.) to reduce maintenance overhead and simplify the codebase.
    • Code Quality:
      • Extracted TCP address parsing into a shared utility with comprehensive test coverage.
      • Cleaned up unused components including KeyboardShortcutsModal and SearchModal.
      • Fixed various formatting issues and hardened type guards across the communication hooks.
    • Dependencies: Updated project dependencies to their latest versions.

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.16.0...v5.17.0

  18. v5.16.0 # 2 months ago · 2026-05-16 20:23 UTC

    🌟 New Features

    Chat & Messaging Suite

    • Message Starring: Bookmark important messages with a star icon; view all bookmarks in the new Starred Messages view (accessible via the toolbar star icon).
    • Link Previews: Chat messages now automatically generate rich previews (title, description, image) for URLs using Open Graph metadata.
    • Per-Conversation Mute: Silence specific channels or DMs independently using the new bell toggle in the chat toolbar.
    • Advanced Chat Tools:
      • Draft Persistence: Unsent messages are now automatically saved per conversation and restored when you return.
      • Message Export: Export chat history to formatted .txt files via the new export tool.
      • @mention Autocomplete: Type @ to trigger a node-name autocomplete dropdown with keyboard navigation.
      • Jump to Date: Quickly navigate long chat histories using the new calendar date picker.
      • Sender Filtering: Click any sender's name to filter the current conversation to only their messages.
    • DM Info Header: View real-time battery, SNR, and last-heard status directly above Direct Message conversations.
    • Copy Message: Added a dedicated "Copy" button to message hover actions for quick clipboard access.

    Node Management & Monitoring

    • Node Notes: Save private, persistent notes for any node directly within the Node Detail modal.
    • Watch & Notify: "Watch" specific nodes to receive OS-level notifications whenever they change status (Online/Offline).
    • Node Health Score: A new 0–100 health metric—analyzing signal quality, recency, load, and battery—is now displayed in the node list.
    • JSON Export: Added a button to export the entire node list to a JSON file.

    Visualization & Diagnostics

    • RF Histograms (Cmd/Ctrl + R): New panel visualizing SNR, RSSI, and hop-count distributions across the mesh.
    • Peer Graph (Cmd/Ctrl + G): Interactive force-directed SVG graph showing connectivity between nodes.
    • CU History Chart: A 24-hour timeline chart for Channel Utilization now appears in the Diagnostics panel.
    • CU Leaderboard: A new leaderboard in the Stats tab ranks nodes by their reported channel utilization.

    MeshCore Enhancements

    • Path Diagnostics: Improved detection of path instability and "weak links" using per-hop SNR trace data.
    • RF Signal Analysis: Added automated detection for elevated noise floors and excessive flooding conditions.

    🛠 Improvements & Bug Fixes

    • Message Deduplication: Enhanced cross-transport (RF/MQTT) deduping logic with a 10-minute window to prevent duplicate bubbles for the same content.
    • Notification Hardening:
      • Fixed a bug where the dock badge was missing when the window was hidden while the chat tab was active.
      • Refined sound notification logic to ensure alerts fire correctly when the app is minimized or focused on other tabs.
    • Security:
      • Strengthened Content Security Policy (CSP) and Link Preview fetcher (SSRF protection).
      • Improved JWT hygiene for LetsMesh providers.
    • UI/UX:
      • Added dedicated sidebar icons for Graph and RF panels.
      • Fixed duplicate emojis in node action buttons.
      • Corrected MeshCore last_heard conversion from seconds to milliseconds.
      • Fixed erroneous notification sounds triggered during panel remounts.
    • Localization: Updated translations across all 15 supported languages, including fixes for "hop" terminology and placeholder artifacts.

    🏗 Under the Hood

    • Performance: Optimized the Peer Graph to use connected-node filtering, preventing O(n²) performance issues on large meshes.
    • Tooling: Enforced node/pnpm engine versions via pnpm engine-strict in package.json.
    • Testing: Extensive new test coverage (500+ lines of tests) for link previews, message deduping, notification stores, and diagnostic engines.

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.15.1...v5.16.0

  19. v5.15.1 # 2 months ago · 2026-05-10 19:24 UTC

    Highlights

    • Improved MQTT reconnection reliability with a new exponential backoff schedule and increased retry budget.
    • Hardened Windows builds and resolved a Windows 11-specific crash in the native About panel by implementing an HTML fallback.
    • Added OS notifications for manual update checks and unified the update status UI across the application.

    Bug Fixes

    • Harden Windows builds and MQTT reconnects (#408)
    • Guard native Electron calls to prevent crashes and improved crash reporting diagnosis.
    • Deduplicate @meshtastic/core to fix Meshtastic USB serial transport issues (Fixes #407).
    • Implement capped exponential backoff for MQTT (60s base, 45m cap) with jitter.
    • Fix native About panel and Help links for Windows 11 compatibility (Fixes #406).

    Other Changes

    • Enforce Windows runner for Windows builds in CI.
    • Bump dependencies

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.15.0...v5.15.1

  20. v5.15.0 # 2 months ago · 2026-05-10 00:53 UTC

    Summary

    This release includes significant improvements to internationalization (i18n), MQTT reliability, Meshtastic device connectivity, and a variety of UI/UX enhancements and bug fixes.

    🚀 New Features

    • i18n & Global Support: Completed the initial rollout for internationalization, including the translation framework and updated issue templates.
    • Chat UX Improvements: Enhanced the chat interface for a smoother messaging experience and display hops if we know them.
    • MQTT Mirroring: Added support for MQTT mirroring to improve data redundancy and feed management.
    • Internal Diagnostics: Introduced new diagnostic tools and expanded test coverage across the application.

    🐞 Bug Fixes

    • MeshCore & Console Logging: Fixed contact threshold issues and implemented disk-safe console logging to prevent performance bottlenecks.
    • Meshtastic Serial/Web Streams: Improved error handling for serial and Web Streams connections before the MeshDevice is fully initialized.
    • MQTT Reliability:
      • Fixed UX issues during MQTT reconnection.
      • Improved LetsMesh identity handling within MeshCore.
      • Configuration & Awaits: Corrected await logic in Meshtastic configuration to ensure settings are applied reliably.
    • Documentation & Templates:
      • Updated MeshCore MQTT identity documentation.
      • Updated GitHub issue templates for better clarity.

    🛠️ Maintenance & Chores

    • Dependency version bumps

    Full Changelog: https://github.com/Colorado-Mesh/mesh-client/compare/v5.14.2...v5.15.0