Releases: Colorado-Mesh/mesh-client
5.10.0
🚀 Highlights
- MQTT Robustness & Compatibility: Major overhaul of MQTT handling to support lowercase JSON fields and improved Protobuf decoding, significantly increasing compatibility with various Meshtastic firmware configurations.
- New MQTT Preset: Added a built-in preset for the Colorado Mesh community.
- macOS 26 Readiness: Stabilized ad-hoc packaging and signing specifically for macOS 26.
- Database Resilience: Improved schema migration logic to be more robust and self-correcting during updates.
🛰 MQTT & Networking
- Lowercase Field Support: Now correctly parses longname, shortname, and hardware fields in MQTT JSON NodeInfo regardless of casing.
- Robust Decoding: Implemented surgical trimming of trailing null bytes during ServiceEnvelope decoding to prevent parsing failures.
- Fixes #341: Resolved issues regarding MQTT connectivity and state synchronization.
- UI Synchronization: Updated the ChatPanel and NodeDetailModal to reflect real-time MQTT data updates better.
🏗 Build & Packaging
- macOS 26 Stabilization: Fixed issues with ad-hoc packaging and signing on the latest macOS version.
- Linux AppImage: Added missing system dependencies to ensure AppImages run out-of-the-box on more distributions.
- Signing Improvements: Optimized the macOS signing workflow to use identity-based signing for non-notarized ad-hoc
builds.
🗄 Database
- Improved Migrations: Schema updates are now more robust, reducing the need for manual schema tracking changes
during development. - Dev Init Fix: Resolved a bug where dev init would occasionally skip column creation in the local database. Fixes #347
🔧 Maintenance & CI
- Linting Alignment: Fixed pre-commit hook environments and resolved assertion-related linting failures to ensure
consistent CI results. - MD Lint Optimization: Updated Markdown linting configuration to ignore build directories (dist), speeding up local
development checks. - New Contributor: Welcomed soord to the project contributors with PR #348
- Documentation: Refreshed the README and technical docs for the 5.9.x series.
Full Changelog: v5.9.4...v5.10.0
5.9.4
What's Changed
Features
- add Flood Advert to Node List panel
Bug Fixes
- expire no-route ping error after display timeout
- register update IPC when electron-updater is unavailable
Other Changes
- add MeshCore connectivity troubleshooting section
Full Changelog: v5.9.2...v5.9.4
5.9.2
What's Changed
This update includes several critical bug fixes for UI state persistence and protocol handling, alongside
documentation updates and dependency maintenance. It also has all the goodies that shipped in the 5.9.0 pre-release.
✨ UI & UX Improvements
- Protocol Navigation: Fixed an issue where the sidebar tab and panel state would reset when switching between
protocols; your last active view is now correctly restored. - Notifications: Prevented duplicate "Firmware Upgrade" toasts from appearing simultaneously.
🛰️ MeshCore & Protocol Refinements
- Contact Management: Improved MeshCore contact rebuilding from radio data to ensure hop counts are accurately
preserved. - Packet Distribution: Refined the handling of null sender buckets within MeshCore to ensure more reliable packet
distribution.
📚 Documentation & Maintenance
- Credits: Added Mesh Monitor to the project credits.
- Internal: Updated various project dependencies to their latest stable versions.
Full Changelog: v5.9.0...v5.9.2
5.9.0
✨ New Features
- UI Panel Changes from horizontal to vertical sidebar
- Node Hardware Display — Display node hardware model in node modal, MeshCore radio model, and MQTT trace replies
- Two visual Easter Eggs
- UI Improvements — Protocol switcher scoped to main panel with sidebar-aligned spacer
- Last Read Scroll — Replaced Latest button with Last Read scroll behavior
- New Graphs
- Auto-Traceroute
- ....and lots more.
🐛 Bug Fixes
MeshCore Multi-Hop Improvements:
- Preserve hop count in DB when Ping returns 0 hops
- Preserve hop counts when saving contacts to DB during rebuild
- Preserve node list hops during contact rebuild after trace
- Multi-hop trace path slicing and route refresh
- Relax Ping/Trace UI gate
- Refresh radio path when storedPath is 1-byte and node is multi-hop
- Persist hops_away to database on node save
- Load hops_away from meshcore_contacts on startup
- Load meshcore hops_away from database on startup
- Save and load meshcore hops_away from both tables
Map & Visualization:
- Stabilize map rendering with route weight updates
- Fix map blanking issue by refactoring RouteWeightPolylines
- Restore full-height map layout
- Fix undefined showRouteWeights by moving routeWeightPolylines inside MapPanel
- Darken locate-me cross-hairs for better visibility
MeshCore & Traceroute:
- Allow traceroute to nodes with stored path history from previous sessions
- Persist MeshCore hops and quiet useMeshCore debug noise
- Persist MeshCore traceroute hops and survive contact rebuilds
- Meshtastic traceroute correlation and concurrent trace flows
- Fix MeshCore map route weights and GPS origin
Diagnostics:
- Persist auto-traceroute per protocol
- Preserve meshcore battery telemetry on partial stats failures
Security & Validation:
- Harden meshcore:tcp-connect hostname validation and cap TAK node cache
- Sanitize error message in networkDiscovery traceroute warn log
WebBluetooth:
- Harden GATT and notify teardown guards
🔧 Maintenance
- Major Upgrades: Electron 41, Vite 8, ESLint 10, TypeScript 6
- ESLint: Adopted eslint-plugin-react-hooks v7 flat preset
- Dependencies: Bumped all dependencies
Full Changelog: v5.8.0...v5.9.0
5.8.0
Release Notes: v5.8.0
This release introduces the Sniffer (formerly Raw Packet Log) for deep packet inspection, advanced Path History tracking with weighted route scoring, and numerous improvements to MeshCore protocol handling.
🚀 New Features
- The Sniffer (Packet Log Viewer):
- A dedicated "Sniffer" tab for real-time and historical deep packet inspection.
- In-house RF packet parsing and persistence for high-performance logging.
- Deep decoding for both MeshCore RF packets and Meshtastic MQTT envelopes.
- Keyboard Shortcut: Quickly jump to the Sniffer using Cmd/Ctrl+S (Issue #318).
- Navigation: Click on long_name labels within the sniffer to jump directly to a node's detail view.
- Path History & Route Scoring:
- Weighted Route Scoring: Identifies and ranks the most reliable paths in your mesh (Issue #223).
- Trip Scoring: Tracks and visualizes how packets traverse the network across multiple hops.
- Local Timezone Support: Log timestamps now automatically use your local timezone instead of UTC for easier correlation with real-world events.
- Payload Classification: Validation-first LoRa classifyPayload with MeshCore parse priority for more accurate identification of incoming traffic.
- MeshCore Reboot: Added the ability to trigger a remote reboot for MeshCore devices (Issue #318).
🛠️ Bug Fixes & Improvements
- MeshCore Protocol Polish:
- Fixed decoding for flood adverts and CONTROL payloads in the sniffer.
- Improved sender clarity with ANON_REQ resolution and RF ID fallback.
- Better correlation between chat events (event 7/8) and raw packet logs for accurate sender attribution.
- Coalesced duplicate self-flood adverts to reduce log noise.
- UI & UX:
- Renamed "Raw Packets" to Sniffer to better reflect its diagnostic capabilities.
- Unified "Empty State" messaging across all log panels.
- Fixed sniffer panel width issues and node modal display bugs.
- Improved label formatting, including GRP_TXT payload nibbles and inner u32 value displays.
- System & Stability:
- Sampled Meshtastic MQTT decryption logs to reduce console noise.
- Improved pre-commit hooks to catch failures earlier in the development cycle.
- Refined path history scoring and RX handler logic.
📝 Documentation & Style
- General refactoring of JSX indentation and className templates for better maintainability.
Full Changelog: v5.7.0...v5.8.0
5.7.0
Highlights
- MeshCore trace routing is much more reliable: multi-hop traces decode correctly (including multiplexed path data), and path history can be stored and shown in diagnostics.
- The transmit queue is easier to trust: header badge reflects queue depth sooner, degrades gracefully when stats fail, and uses clearer tooltips.
- MQTT (including LetsMesh over WebSocket) is steadier: keepalive behavior, fewer reconnect loops, and logs prefixed by protocol for filtering.
- Repeaters stay correctly classified when RF adverts and contact sync would previously overwrite hardware type.
- Accessibility: main app content no longer uses a conflicting landmark (axe-cleaner).
Added
- MeshCore trace payload support (PAYLOAD_TYPE_TRACE) with routing through the MeshCore device API.
- Trace path multiplexing and improved TraceData parsing (signed/unsigned tags, array-like SNR/hash buffers as emitted in production).
- SQLite-backed MeshCore path / hop history for diagnostics and history views.
- queueStatus exposure from the MeshCore hook and immediate queue polling after sends.
- Help tooltip on the main-window transmit queue badge.
- Docs: trace/ping troubleshooting (e.g. timeouts when the remote node does not have you as a contact), and cross-links for MeshCore vs Meshtastic parity.
Fixed
- Trace routes: correct outPath handling (including destination hash), direct-contact path selection, SNR handling (no double conversion), and NACK (0x81) with hop-aware DM timeouts.
- Transmit queue: correct curr_tx_queue_len, STATS CORE queue_len, badge when stats RPCs fail, and badge on connect for both protocols.
- MQTT: WebSocket keepalive for LetsMesh, keepalive reschedule for MeshCore LetsMesh, and reconnect loop on LetsMesh broker.
- BLE: serialized writes per session to avoid listener warnings under load.
- Repeaters: preserve hw_model on RF advert (event 128) and contact push (event 138); avoid repeater rows being overwritten as generic chat nodes; ignore invalid 62+ hop contact values.
- Diagnostics / DB: trace history when id column is missing; refreshContacts cleanup and typed trace history IPC.
- Logging: MQTT lines prefixed with meshtastic or meshcore.
- Accessibility: role="main" instead of nested/problematic usage.
Changed
- AGENTS, ARCHITECTURE, CONTRIBUTING, and ignore files (.cursorignore, .claudeignore, .geminiignore) trimmed or aligned for maintainability and AI context.
- Dependency updates; meshcore.js carries a companion patch for trace-related behavior—verify when upgrading that dependency.
Full Changelog: v5.6.0...v5.7.0
5.6.0
Features
- show channel utilization in Node Detail Modal (Meshtastic)
- implement MeshCore PATH packet decoding and SQLite storage for routing metadata
- auto-apply MeshCore contact management settings and remove Apply button
- add public key indicator to node list ID column for MeshCore
- add contact management for MeshCore with radio/DB tracking
Bug Fixes
- preserve pubkey in DB when incoming MeshCore contact key is empty/invalid
- add main landmark and h1 for axe accessibility compliance
- handle dynamic offset for MeshCore PATH (0x08) decoder
- set contactsFromRadio during initConn so contacts are saved as on-radio
- schedule proactive JWT refresh before LetsMesh token expiry
- show correct contact status in NodeDetailModal for MeshCore
- restore MeshCore node state persistence and add Sync/On Radio UI badges
- disable Message button in NodeDetailModal for MeshCore nodes without encryption key
- resolve 'undefined' error when saving MeshCore channels
- resolve nodes without names and role (#307)
- properly delete MeshCore contacts from radio and DB
- delete meshcore contacts that lack pubKey
- pass timeout to tracePath RPC (ref #304)
- update repeater login timeout test (ref #304)
- update repeater command timeout tests (ref #304)
- increase MeshCore RPC timeouts and add missing timeout param to getNeighbours
Other Changes
- update channel utilization in node detail and add proactive JWT refresh
- add App accessibility test with axe
- bump deps
- eliminate duplicated error handling in useMeshCore.ts (#305)
- improve code quality in PR #305
Full Changelog: v5.5.8...v5.6.0
5.5.8
This release (spanning v5.4.3 to v5.5.8) focuses heavily on Windows compatibility and ASAR module resolution, ensuring a much smoother experience for Windows users. It also introduces several UI refinements for node diagnostics and trace routes.
🚀 Features
- Node Detail UI: Added hop count directly to the node detail modal header for quicker diagnostic reference (#337a091
(337a091)).
🐛 Bug Fixes
Windows Compatibility & ASAR Stability
We have implemented several deep-level fixes to resolve "Module Not Found" errors and resolution failures on Windows:
- ASAR Disabled on Windows: Temporarily disabled ASAR for Windows builds to resolve persistent module resolution failures (#9527f17
(9527f17)). - Module Inlining: Inlined the ms module into debug@4.4.3 and externalized process to ensure compatibility within the Electron environment (#3c1ec9a
(3c1ec9a), #84f5329 (84f5329), #72b7152
(72b7152)). - Hoisted Node Linker: Switched Windows builds to pnpm hoisted mode to further stabilize module lookups (#b8945a0
(b8945a0)). - Electron-Builder v26: Updated extraMetadata configuration to support changes in electron-builder v26 (#4a1492f
(4a1492f), #3997c26 (3997c26)). - Stream Patching: Applied patches to readable-stream@4.7.0 to fix process/ resolution issues on Windows (#883b631
(883b631)).
UI & Diagnostic Fixes
- Trace Route Accuracy: Improved hop count display by syncing trace pathLen to node hops_away and ensuring accurate counts for MeshCore trace routes
(#37b82cb (37b82cb), #6ff4a1a (6ff4a1a)). - Timestamp Warnings: Added thresholds, node names, and time deltas to future timestamp warnings in formatRelativeTime to help diagnose clock-drift
issues (#e114575 (e114575), #a2724ea
(a2724ea)).
Build & Infrastructure
- Node 22 Support: Downgraded jsdom to 25.0.1 to resolve ESM/JSDOM interop issues specifically in Node 22 environment (#93278ee
(93278ee)). - Native Patching: Migrated from patch-package to pnpm native patching for better build performance and reliability (#754bf89
(754bf89)). - CI Enhancements: Corrected artifact upload paths and introduced a build-only workflow for faster PR validation (#fbf76b0
(fbf76b0)).
🧹 Chores
- Updated CI workflows to preserve build artifacts for 30 days on manual dispatch.
- Removed redundant debug logging from the trace route service.
5.4.3
Summary
This release focuses on stability improvements, enhanced MeshCore integration, security hardening, and better node management capabilities. Key highlights include proactive JWT token refresh for LetsMesh connections, improved MQTT packet handling, and comprehensive security enhancements including IPC validation hardening and log rotation.
🚀 Features
- MeshCore Integration: Added MeshMapper preset to MeshCore connection panel
- Node Management: Expose node source (RF/MQTT) in NodeDetailModal for better visibility
- Auto-Prune Settings: Added per-protocol startup auto-prune settings in App panel
🔧 Fixes
Connectivity & MQTT
- MeshCore: Improved channel saving error handling and validation
- MeshCore: Fetch waiting messages on connect and poll every 5 minutes
- LetsMesh: Implemented proactive JWT token refresh to prevent disconnections
- LetsMesh: Repaired broken JWT refresh for connections
- LetsMesh: Improved stability and added telemetry/neighborinfo handlers
- MQTT: Extract hop count from binary ServiceEnvelope packets
- MQTT: Handle numeric from field and root-level node info in JSON handlers
- MQTT: Add protocol field to node updates for better filtering
Node Management
- Nodes: Prune all unnamed nodes regardless of source
- Nodes: Start new nodes with empty long_name instead of placeholder
- Nodes: Correct online/stale/offline thresholds and add prune offline button
- Nodes: Update last_heard on message receive for both Meshtastic and MeshCore
- Nodes: Clarify prune no-fix/zero island button wording
Meshtastic
- Meshtastic: Restore mqtt-only status on database load
- Meshtastic: Fix JSON nodeinfo role handling
- Meshtastic: Show connected self node as online
- Diagnostics: Restore Meshtastic detection in foreign LoRa classifier
UI & Display
- Radio: Correct bandwidth display for 62.5 and 31.25 kHz
- UI: Clarify MeshCore contact autoprune wording (unheard contacts only)
🔒 Security
- Security: Hardened IPC validation across all channels
- Security: Added log rotation to prevent log bloat
- Security: Expanded test coverage for security-critical paths
- Dependencies: Updated transitive dependencies to patch security vulnerabilities
🏗️ Infrastructure
- Build: Fixed release script and pre-commit hook issues
- Dependencies: Updated all dependencies and deduplicated packages
- Package Management: Replaced all npm references with pnpm throughout codebase
- Testing: Fixed CodeQL always-false warnings in computeNodeInfoLastHeardMs
- Type Safety: Aligned electron-api.types.ts with actual implementations
📚 Documentation
- Architecture: Extracted project structure to ARCHITECTURE.md
- Contributing: Simplified CONTRIBUTING.md with task-specific sections
- AGENTS.md: Added task-specific sections and made more compact
- CLI: Updated act command usage documentation
🛠️ Developer Experience
- Scripts: Use pnpm dlx instead of npx for vitest commands
- Git: Updated .gitignore to include .windsurfrules
- Lockfile: Added pnpm lockfile integrity verification
- Testing: Improved test coverage and fixed test utilities
Full Changelog: v5.2.1...v5.4.3
5.2.1
Bug Fixes
- reduce noisy MQTT logs for undecryptable packets
Other Changes
- update README for v5.2.0 features
- silence expected console output in tests
- add pnpm update to release script