MeshCore MQTT Live Map · Releases
from GitHub · updated 2026-06-2320 releases
v1.9.3 # 15 days ago · 2026-06-09 00:32 UTC
This release focuses on security hardening and dependency maintenance.
Security
- Fixed issue #74 by hardening frontend rendering against stored-XSS style payloads from untrusted MeshCore/MQTT fields.
- Node names, peer names, route labels, search results, permanent labels, node popups, Peers rows, Route Details, History popups, and Coverage popups now escape displayed HTML before rendering.
- Map behavior is unchanged: public keys, coordinates, QR payloads, copy actions, route handling, peer selection, and filters continue using the original data.
Maintenance
- Updated backend dependencies:
fastapi==0.136.3uvicorn[standard]==0.49.0httpx==0.28.1
- Added
httpx2==2.3.0for dev tests so FastAPI/StarletteTestClientruns without the deprecated-httpxwarning.
Testing
98 passed, 2 skipped
What's Changed
- Harden frontend rendering and update to release version 1.9.3 by @yellowcooln in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/75
Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.2...v.1.9.3
v1.9.2 # 27 days ago · 2026-05-28 02:14 UTC
v1.9.2 - Route History Fixes, LOS Coordinates, and Peers Panel Cleanup
Highlights
This release fixes Route History disable behavior, improves LOS point entry, and cleans up the Peers panel with feedback from the community.
Added
Added direct latitude/longitude entry to the LOS panel Related: #71
Added per-pin LOS height input for above-ground-level values Related: #71
Added
PEERS_DEFAULT_OPEN=falseso admins can choose whether the Peers tool starts active on page load Related: #72Added a MQTT-only filter beside the MQTT online legend item
Shows only MQTT-online nodes
Hides:
- Non-MQTT markers
- Trails
- Routes
- Hop markers
- Route details
- Peer lines
Does not save to browser storage
Is not included in share links
Changed
Improved LOS point editing so pins can be:
- Added
- Selected
- Dragged
- Updated directly from the coordinate editor Related: #71
Kept LOS and Propagation as separate tools so obstruction checks and RF coverage planning remain independent workflows Related: #71
Reworked the Peers panel layout based on ideas and testing from Stormlove / @beachmiles Related: #72
Moved Clear peers into the Peers panel header beside Minimize Related: #72
Updated the Peers panel title to use the selected node name, with the 24h window displayed underneath Related: #72
Updated Incoming/Outgoing headings to display:
- Rx/Tx packet totals
- Unique peer counts
- Blue/purple line hints
Updated peer row stats to display:
- Count
- Percent
- Distance
Tuned Peers panel scrolling so long peer lists scroll inside capped Incoming/Outgoing sections instead of forcing the full panel height on mobile Related: #72
Fixed
Fixed Docker Compose deployments not passing Route History environment variables into the container Related: #68
Fixed
ROUTE_HISTORY_ENABLED=falseso it now fully disables:- History button
- History panel
/snapshothistory payloads- WebSocket history payloads
- Route-history file growth from live traffic
Fixed Peers counts going empty when Route History was disabled and older history buckets expired Related: #68
Peers now use dedicated rolling peer-history buckets, so peer counts continue updating from live routes even when Route History is disabled Related: #68
Credits
Thanks to Stormlove / @beachmiles for the Peers panel cleanup ideas, testing, and follow-up feedback in #72.
What's Changed
- fix route history env passthrough by @yellowcooln in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/70
- Enhance peers panel and fix related issues in v1.9.2 by @yellowcooln in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/73
Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.1...v1.9.2
v1.9.1 # 2 months ago · 2026-05-08 19:15 UTC
Fixed
Fixed issue #68:
ROUTE_HISTORY_ENABLED=falsenow disables Route History end-to-end instead of only stopping new history recordingWhen Route History is disabled:
- The History tool button is removed
- The History panel does not load
history=onin the URL no longer re-enables the feature/snapshotno longer returnshistory_edgesor a nonzero history window- The realtime WebSocket snapshot no longer publishes history payloads
Behavior Change
ROUTE_HISTORY_ENABLEDnow behaves as a true feature flag for both:- Backend history payloads
- Frontend History tool/UI
This makes it practical to disable Route History entirely on:
- High-volume meshes
- Lower-resource deployments
Config
Use:
ROUTE_HISTORY_ENABLED=falseThis now fully disables:
- History tool UI
- History snapshot payloads
- History panel activation
- Hidden frontend history state
Validation
pytest -q tests/test_api_auth.py tests/test_websocket_snapshot.py13 passed
node --check backend/static/app.jspython3 -m py_compile backend/*.py
What's Changed
- v1.9.1 disable route history end-to-end by @yellowcooln in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/69
Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.0...v1.9.1
v1.9.0 # 2 months ago · 2026-05-06 18:15 UTC
This release adds proper subpath hosting support and improves node sharing and peer visibility.
Subpath Hosting
Added
APP_BASE_PATH, allowing the map to be hosted from a subpath such as:/livemapinstead of only from
/.This work originated from:
- PR #65 by @chrisdavis2110
Covered Areas
- App shell URLs
- Static asset URLs
- WebSocket path
- Service worker registration and scope
- Manifest URL,
start_url, and scope - Turnstile verification flow
- Auth cookie path
- Preview/share image URLs
This release also includes follow-up fixes so preview and Open Graph image URLs work correctly when using both:
APP_BASE_PATH- Public site URLs
Direct Node Links and Peer Distances
This work originated from:
- PR #66 by @mitchellmoss
Node popups now include direct map-link actions:
- Copy node link
- Copy repeater link
The generated links preserve current map state plus a target device.
Opening a shared link now:
- Automatically enables node visibility if hidden
- Focuses the target device
- Zooms to it
- Opens its popup
Supported Link Parameters
noderepeaterdevicedevice_idpublic_keypubkey
The Peers tool now shows distance when both endpoints have coordinates.
Backend
/peers/{device_id}now includes:distance_m
Frontend
Renders peer distance using the currently selected unit system:
- Kilometers
- Miles
Compatibility
For normal root-hosted installs:
- No configuration changes required
- Existing
/deployments behave the same APP_BASE_PATHremains dormant unless explicitly configured
What's Changed
- feat: APP_BASE_PATH config to set app as subpath by @chrisdavis2110 in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/65
- [codex] Add direct node links and peer distances by @mitchellmoss in https://github.com/yellowcooln/meshcore-mqtt-live-map/pull/66
Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.8.6...v1.9.0
v1.8.6 # 2 months ago · 2026-05-02 17:56 UTC
This release combines the unreleased v1.8.5 container/deployment work with the new v1.8.6 route filtering feature.
Container and Deployment
Published image:
yellowcooln/meshcore-mqtt-live-map
Multi-arch image support:
linux/amd64linux/arm64
Added image-based deployment examples (no local build required):
deploy/docker-compose.image.yamldeploy/swarm-stack.yamldeploy/kubernetes-meshmap.yaml
Adjusted Docker publish workflow:
- Docs-only changes no longer trigger rebuild/publish
- Image-relevant changes still trigger builds
New Route Filtering
Added issue #59: Path bytes filter in the HUD
Routes can now be filtered by decoded path-hash width:
- All
- 1-byte
- 2-byte
- 3-byte
Filter applies consistently to:
- Route lines
- Hop markers
- Route Details
- HUD route counts
Mixed-width paths remain visible if at least one hop matches the selected width
Share links now include:
route_bytes=all|1b|2b|3b
Route Filter Stability Fixes
Fixed route redraw behavior so switching byte filters does not stack stale path lines
Default page loads now reset to All unless
route_bytesis explicitly present in the URL- Prevents stale browser state from hiding routes unexpectedly
Notes
Version metadata and documentation updated for v1.8.6
This release includes:
- v1.8.5 container/deployment work
- v1.8.6 path-byte route filtering
v1.8.4 # 2 months ago · 2026-04-17 19:15 UTC
This release restores route rendering on meshes affected by a regression introduced after
v1.7.0, adds mobile-friendly panel minimization, and brings Fresnel-zone guidance into the LOS profile.Routing Fix
- Fixed the post-
v1.7.0regression where some networks stopped showing routes that had previously rendered inv1.6.6 - The regression came from stricter handling of ambiguous 1-byte hop prefixes in decoded path hashes
- By default, the map still handles colliding 1-byte prefixes conservatively to avoid incorrect hop guesses on larger meshes
- Added a new environment variable:
ROUTE_ALLOW_AMBIGUOUS_ONE_BYTE_FALLBACK - Default:
false - When set to
true, this restores the older pre-v1.7.0closest/time-based fallback for ambiguous 1-byte hop prefixes - Use this if your mesh has valid routes that stopped rendering because multiple nodes share the same first-byte prefix and the conservative resolver is too strict for your network
- This environment variable is documented in the docs, included in
.env.example, and passed throughdocker-compose.yaml
New Features
- Issue #55: LOS and Propagation panels can now be minimized without turning the tool off
- Issue #55: the same minimize/expand control was extended to History, Peers, and Route Details so panels can get out of the way while the feature stays active
- Issue #56: the LOS elevation profile now draws upper and lower Fresnel-zone lines, similar to the MeshCore app
- Issue #56: LOS profile hover now shows Fresnel radius alongside terrain and LOS height
- Fresnel rendering is segment-local for multi-pin LOS routes, so chained LOS paths do not get incorrect full-route Fresnel curves
Follow-up Fixes
- Fixed the panel regression introduced during the new minimize-control work
- History sliders continue to work
- Peers opens correctly again
- Route Details now clears when Show hops is turned off
- LOS point selection works again
- Propagation opens correctly again
Configuration
New environment variable in this release:
ROUTE_ALLOW_AMBIGUOUS_ONE_BYTE_FALLBACK=false
Purpose:
- restores legacy route fallback for colliding 1-byte hop prefixes when needed
Recommended default:
- keep it
falseunless your mesh specifically lost route rendering after the stricter prefix logic
Notes
- Version metadata and release notes were updated for
v1.8.4 - The
devbranch includes the route fix, the new panel controls, LOS Fresnel lines, and the follow-up regression fixes
- Fixed the post-
v1.8.3 # 2 months ago · 2026-04-16 18:21 UTC
This release fixes the LOS tool so it no longer ignores Earth curvature, and it cleans up the related configuration and documentation.
LOS Fixes
- Fixed issue #53: the LOS tool now accounts for Earth curvature instead of using a purely straight terrain-versus-line check
- Applied the same curvature-aware LOS math to both the frontend realtime LOS path and the backend
/losfallback so live interaction and server responses stay consistent - Updated LOS blockage and elevation-profile calculations to use curvature-adjusted terrain samples, which can now correctly mark longer paths as blocked where the previous LOS tool showed clear
New LOS Environment Controls
- Added
LOS_CURVATURE_ENABLED - Added
LOS_CURVATURE_FACTOR
Defaults when unset:
LOS_CURVATURE_ENABLED=trueLOS_CURVATURE_FACTOR=1.333333
Config and Runtime Fixes
- Fixed
docker-compose.yamlso all LOS-related environment variables are actually passed into the container:LOS_ELEVATION_URLLOS_ELEVATION_PROXY_URLLOS_SAMPLE_MINLOS_SAMPLE_MAXLOS_SAMPLE_STEP_METERSELEVATION_CACHE_TTLLOS_CURVATURE_ENABLEDLOS_CURVATURE_FACTORLOS_PEAKS_MAX
Docs
- Updated
.env.examplewith the new LOS curvature environment variables - Clarified MQTT authentication docs for
meshcore-mqtt-broker: the live map normally uses a brokerSUBSCRIBER_Nusername/password pair, not node-style signed publisher auth - Updated version, docs, and changelog for
v1.8.3
Validation
pytest -q→92 passed, 2 skippednode --check backend/static/app.jspython3 -m py_compile backend/*.py
v1.8.2 # 3 months ago · 2026-04-10 03:47 UTC
Release Summary
This release adds node QR and contact sharing support, and fixes several map behavior issues.
New
- Added optional MeshCore-compatible contact QR codes in node popups
- Added
QR_CODE_BUTTON_ENABLED=trueto show a Generate QR Code action - The modal shows a clickable truncated public key while still copying the full key
- Added local
/qrPNG generation with existing prod-token protection
Fixes
- Fixed the popup key flow so the short key shown under the node name is the copy target, without duplicating the full key elsewhere in the popup
- Fixed MeshMapper coverage lag by reusing cached coverage rectangles during pan and zoom instead of rebuilding them on every viewport change
- Fixed peer counts so
/peers/{device_id}still reflects adjacency from routepoint_ids even when a hop cannot be drawn on the map - Fixed stale cleanup so nodes that are still MQTT-online keep their last known map position until MQTT presence expires
v1.8.1 # 3 months ago · 2026-04-07 02:11 UTC
This release resolves the current open issue set and improves live route visualization.
Fixes
- Fixed ghost duplicate nodes by tightening device identity handling to use the advert owner public key for location updates
- Added startup cleanup for persisted duplicate nodes, so stale same-name, same-location ghost entries are removed after restart
- Fixed MeshMapper coverage tiles shifting incorrectly when zooming or panning by rebuilding visible coverage from cached source data on viewport updates
- Removed the hard peer-list cap, so
/peers/{device_id}?limit=now accepts any positive value
New
- Added the upstream-style hidden arcade mode for live route flow visualization
- Arcade mode can be activated by typing
/wakaor/arcadein the search box and pressing Enter
v1.8.0 # 3 months ago · 2026-03-29 20:32 UTC
This release adds automatic backups, expands the LOS tool into a chained path workflow, restores the official MeshCore decoder, and improves MeshMapper coverage behavior.
Highlights
- Added automatic runtime backups as timestamped
.tar.gzarchives - Expanded the LOS tool to support multiple chained pins and full-path elevation profiles
- Switched the runtime decoder back to the official
@michaelhart/meshcore-decoder - Improved MeshMapper coverage rendering to better match the displayed coverage footprint
- Added backup tests covering archive creation and retention pruning
- Full test suite passes with
84 passed, 2 skipped
Backups
Automatic runtime backups are now supported as timestamped
.tar.gzarchives. This release also adds backup-specific environment controls, changes the default backup location to/backup, adds retention pruning for older archives, and mounts./backup:/backupindocker-compose.yaml.Backups include live-state files such as:
state.jsondevice_roles.jsondevice_coords.jsonneighbor_overrides.jsonchannel_secrets.jsonmap_boundary.jsonroute_history.jsonlcoverage_cache.json
New backup environment variables:
BACKUP_ENABLEDBACKUP_INTERVAL_SECONDSBACKUP_DIRBACKUP_RETENTION_DAYS
LOS Tool
The LOS tool now supports multiple chained pins as part of issue #41. Elevation profiles span the full chained path instead of only the active segment, height inputs are stored per pin, and intermediate pin movement now correctly recalculates both adjacent segments.
This release also removes the old
Keep ALOS workflow, addsRemove last pin, and updates helper text and labels to match the chained-pin model.Decoder
The runtime decoder has been switched back to the official
@michaelhart/meshcore-decoder, which now supports the multibyte path decoding needed by the map.MeshMapper Coverage
MeshMapper coverage rendering now expands returned squares to better match MeshMapper’s displayed footprint. Styling was also tuned to keep the fuller footprint while making coverage easier to read.
- Added automatic runtime backups as timestamped
v1.7.8.1 # 3 months ago · 2026-03-25 00:11 UTC
v1.7.8.1
This release fixes issue #38 in the Peers tool.
Changes
- Fixed issue #38: the
Clear peersaction now removes both incoming and outgoing peer lines even when the same peer appears in both directions
Why this release
The Peers tool tracked lines by peer ID only. When the same peer appeared in both incoming and outgoing lists, one line could overwrite the other in the internal line map, so clearing peers did not remove everything.
- Fixed issue #38: the
v1.7.8 # 3 months ago · 2026-03-24 19:42 UTC
v1.7.8
This release improves MeshMapper coverage presentation and reduces browser rendering overhead, especially on larger maps and mobile devices.
Changes
- Adjusted MeshMapper coverage rendering to better match the native MeshMapper look:
- Removed visible square borders
- Increased fill density for a more solid coverage blob
- Added a MeshMapper coverage legend in the HUD:
- Shown only when Coverage is enabled and the active provider is MeshMapper
- Includes:
BIDIRDISC / TRACETXRXDEADDROP
- Improved browser-side rendering performance:
- Enabled Leaflet canvas-backed rendering where it does not change visible behavior
- Kept animated route and trail lines on SVG so existing visual motion remains unchanged
- Added viewport culling for off-screen nodes and coverage tiles
- Batched realtime WebSocket updates using
requestAnimationFrame - Batched stats updates to avoid repeated recalculation during burst traffic
Notes
- These performance changes are browser-side only and do not increase server load
- MeshMapper rendering changes apply only when the Coverage provider is MeshMapper
- Legacy coverage rendering remains unchanged
Docs
- Clarified that
MQTT_TOPICsupports comma-separated values for subscribing to multiple topic trees, for example:meshcore/BOS/#,meshcore/CON/#
- Adjusted MeshMapper coverage rendering to better match the native MeshMapper look:
v1.7.7 # 3 months ago · 2026-03-23 01:38 UTC
v1.7.7
This release adds optional polygon-based map boundaries while keeping the existing radius filter as the default.
Changes
Added
MAP_BOUNDARY_MODEwith support for:radius(default)polygon
Added
MAP_BOUNDARY_FILEfor loading polygon boundary JSONAdded
MAP_BOUNDARY_SHOWto control boundary overlay visibilityPolygon boundaries now apply consistently to:
- devices
- routes
- history
Added frontend polygon overlay rendering from backend-injected boundary JSON
Added
map_boundary.example.jsonas the reference schemaAdded a standalone boundary builder:
tools/map-boundary-builder.html
Added hosted boundary builder:
Boundary JSON Format
{ "name": "Example Boundary", "points": [ [42.4705, -71.2902], [42.4112, -71.4046], [42.2987, -71.3651] ] }
Example Config
MAP_BOUNDARY_MODE=polygon MAP_BOUNDARY_FILE=/data/map_boundary.json MAP_BOUNDARY_SHOW=true
Notes
- Default behavior is unchanged unless
MAP_BOUNDARY_MODE=polygonis set - Radius mode remains the fallback/default
- The standalone builder is not part of the live app UI; it is a separate utility for generating boundary JSON files
Testing
Added boundary module tests
Added frontend config injection coverage for boundary mode
Test suite passing:
82 passed, 2 skipped
v1.7.6 # 3 months ago · 2026-03-22 23:54 UTC
v1.7.6
This release makes the Peers tool default list size configurable via environment variable. #31
Changes
- Added
PEERS_DEFAULT_LIMIT /peers/{device_id}now usesPEERS_DEFAULT_LIMITwhen no?limit=query is provided- Explicit
?limit=still overrides the environment default - Both the environment default and query override are clamped to a maximum of
50 - Updated example env, compose, and docs to include the new setting
Example
PEERS_DEFAULT_LIMIT=25Notes
Default remains 8 if the environment variable is not set This change only affects the default number of peers returned and does not impact peer counting logic
- Added
v.1.7.5 # 3 months ago · 2026-03-22 22:31 UTC
This release improves Route Details, adds channel secret file support for decrypting sender names, and introduces optional packet analyzer links.
Changes
- Added
CHANNEL_SECRETS_FILEsupport for loading channel secrets from a file instead of a long environment variable - Added a shipped
channel_secrets.example.jsonwith example channel entries - Replaced per-packet Node decoder process spawning with a persistent decoder worker
- Reused the loaded channel key store across packets to reduce decode overhead
- Route Details can now show a display-only sender-name row as hop
0when the packet includes a decrypted sender name but not a stable sender identity - Route Details now preserves companion endpoints more accurately, including non-spatial endpoint rows for companions without GPS coordinates
- Route Details hop counts now match the visible rows when sender companion rows are present
- Route Details now shows the full packet hash in the header instead of truncating it
- Route Details now prefers the MQTT packet hash over a shorter decoder
messageHash - Added optional
PACKET_ANALYZER_URLso packet hashes in Route Details can link to an external analyzer - Fixed the production route payload so Route Details keeps the packet hash and sender name instead of falling back to the internal
hash:receiverroute ID - Made the node popup
Location:line clickable to copyLocation: <lat>, <lon>to the clipboard
New ENVs
Optional channel secrets file (for decrypting sender names from supported group-text packets):
CHANNEL_SECRETS_FILE=/data/channel_secrets.jsonCopy
channel_secrets.example.jsonto your chosen path and keep only the channels you want to ship.Optional packet analyzer link base (used for Route Details hashes):
PACKET_ANALYZER_URL=https://analyzer.letsmesh.net/packets?packet_hash=Testing
- Added channel secret decoder coverage
- Added route identity regression coverage for packet hash preference and production payload behavior
- Test suite passing:
76 passed, 2 skipped
- Added
v1.7.0 # 3 months ago · 2026-03-20 17:28 UTC
v1.7.0
This release adds MeshMapper coverage support, maintains legacy coverage map compatibility, and improves route accuracy on older 1-byte networks.
New in v1.7.0
All new ENV's in https://github.com/yellowcooln/meshcore-mqtt-live-map/blob/main/VERSIONS.md#v170-03-20-2026
Coverage API support
- Added support for two coverage providers:
- Legacy coverage maps using
/get-samples - MeshMapper using
https://meshmapper.net/coverage.php
- Legacy coverage maps using
- Legacy coverage map support remains unchanged and fully compatible
- MeshMapper API documentation:
- https://wiki.meshmapper.net/coverage-api/
- Access requires a Coverage API key provisioned by a Master administrator
- Each key is scoped to a specific region or multiregion group and includes a daily rate limit
- To avoid exhausting API limits:
- The server caches MeshMapper data hourly
- All user requests are served from the cached dataset instead of hitting the API directly
MeshMapper server-side caching
- Added server-side MeshMapper coverage sync
- Coverage data is downloaded and stored locally on the server
- Map requests now use the local cache instead of querying MeshMapper directly
- Added cooldown handling for MeshMapper API rate limits
- Added MeshMapper-specific configuration options:
- API key
- Cache file path
- Sync interval
- Rate-limit cooldown
Coverage age filtering
- Added
COVERAGE_MAX_AGE_DAYS - Full MeshMapper dataset is cached locally
- Only the most recent
Ndays are served to the map - Default coverage window is
30days
Safer 1-byte route resolution
- Tightened handling of ambiguous 1-byte route prefixes
- Removed weak matching when multiple nodes share the same first byte
- Ambiguous 1-byte hops now require stronger validation before rendering
- Reduces false long-distance links on large 1-byte meshes
Timing consistency fixes
- Improved route expiry behavior after page load
- Improved MQTT online indicator timing
- Route and MQTT timing now align with server time instead of relying solely on the browser clock
Testing
- Added coverage tests for:
- Legacy coverage maps
- MeshMapper integration
- Cache behavior
- Rate-limit cooldown handling
- Coverage age filtering
- Added regression tests for ambiguous 1-byte route handling
- Added support for two coverage providers:
v1.6.6 # 3 months ago · 2026-03-19 17:37 UTC
v1.6.6
This release fixes a long-standing peer history retention bug that caused the Peers tool to lose older data prematurely on high-volume meshes.
Changes
- Moved
/peersstatistics off rawroute_history_segments - Added dedicated rolling peer-history buckets for directional peer counts
- Made peer counts independent of
ROUTE_HISTORY_MAX_SEGMENTS - Added pruning logic so peer-history buckets remain bounded by time
- Added state persistence so peer-history survives restarts
- Added rebuild logic to reconstruct peer buckets from saved route history when needed
Why this release
On larger meshes, the Peers tool could report a 24-hour window while actually only retaining a few hours of data due to early truncation by
ROUTE_HISTORY_MAX_SEGMENTS.
This release separates peer statistics from route segment limits, ensuring accurate long-term visibility.Testing
- Added regression tests to ensure peer counts remain accurate when route history reaches segment limits
- Added regression tests for peer-history persistence across restarts
- Full test suite passing:
57 passed
- Moved
v1.6.5 # 3 months ago · 2026-03-17 01:30 UTC
This release improves device role detection accuracy, makes it easier to verify the running version, and fixes low-range multibyte route hash handling.
Changes
- Made MQTT role detection strict for accuracy
- Roles are now assigned only from explicit role fields and numeric MeshCore role codes
- Removed weak role guessing from names, model strings, origin text, and descriptions
- Added runtime version logging
- Server startup logs now print the running map version
- Browser console now prints the running map version
- Version is sourced from
VERSION.txt
- Fixed backend route hash normalization to respect decoder
pathLength- Preserves low-range 2-byte IDs like
00AB - Preserves low-range 3-byte IDs like
0000AB - Prevents these values from collapsing to shorter prefixes and failing route lookup
- Preserves low-range 2-byte IDs like
Why this release
Some nodes were being mislabeled due to weak MQTT metadata, and low-range multibyte repeater IDs could silently fail route resolution #26 . This release makes role detection more reliable and fixes width-aware route hash handling for multibyte paths.
Testing
- Added regression tests for:
- Strict role detection
- Version injection into the frontend
- Low-range 2-byte and 3-byte route hash padding
- Full test suite passing:
55 passed
- Made MQTT role detection strict for accuracy
v1.6.2 # 3 months ago · 2026-03-11 19:37 UTC
v1.6.2
This release improves route-details accuracy and strengthens device role detection from MQTT data.
Fixed
- Fixed route-details hop ordering in the UI
- Removed frontend route reversal and name-guessing heuristics
- Route details now use backend
point_idsdirectly for hop attribution - Fixed Show Hops so each row displays the matched node’s true prefix
- Fixed hop-prefix display for:
- 1-byte prefixes:
AB - 2-byte prefixes:
ABCD - 3-byte prefixes:
ABCDEF
- 1-byte prefixes:
Improved
- Improved device role detection from MQTT payloads by accepting:
- nested role fields
- numeric role codes
- model/client hints from status and decoded packet data
Testing / Debug
- Added decoder role tests for nested MQTT role hints and numeric-string role codes
- Dev route debug output now includes resolved
point_id/point_labeldata for easier hop verification
Notes
This release focuses on making route-details popups more accurate and reducing prefix/name mismatches in the hop list.
v1.6.1 # 3 months ago · 2026-03-11 15:32 UTC
v1.6.1
This release updates the map to use a patched MeshCore decoder with multibyte repeater-prefix support, preparing the app for upcoming 2-byte and 3-byte routing changes.
Highlights
- Replaced the official
@michaelhart/meshcore-decoderpackage withmeshcore-decoder-multibyte-patch - Added route prefix support for:
- 1-byte prefixes:
AB - 2-byte prefixes:
ABCD - 3-byte prefixes:
ABCDEF
- 1-byte prefixes:
- Updated route normalization and matching so mixed-width paths can be resolved in the same network
- Expanded route tests to cover mixed 1/2/3-byte path handling and exact-prefix matching
Why this release
MeshCore is moving toward multibyte repeater prefixes. The previous official decoder was a blocker for that rollout.
This release switches the map to a patched decoder that can ingest and decode those path formats now.Current support status
- Multibyte path ingest is working in development
- Live path strings with 1-byte, 2-byte, and 3-byte segments have been observed during testing
- The app is intended to be ready for upcoming multibyte repeater rollouts
- Not tested in a mixed-network environment. I am currently unable to test this in my mesh. Please open an Issue if you encounter any problems related to this feature.
Notes
- Show Hops now documents and expects plain prefix display such as
AB,ABCD, andABCDEF - This release focuses on decoder and routing compatibility and does not introduce UI features
- Replaced the official