MeshCore Ninja Alpha
MeshCore MQTT Live Map

MeshCore MQTT Live Map · Releases

from GitHub · updated 2026-06-23

20 releases

  1. 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.3
      • uvicorn[standard]==0.49.0
      • httpx==0.28.1
    • Added httpx2==2.3.0 for dev tests so FastAPI/Starlette TestClient runs without the deprecated-httpx warning.

    Testing

    • 98 passed, 2 skipped

    What's Changed

    Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.2...v.1.9.3

  2. 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=false so admins can choose whether the Peers tool starts active on page load Related: #72

    • Added 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=false so it now fully disables:

      • History button
      • History panel
      • /snapshot history 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

    Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.1...v1.9.2

  3. v1.9.1 # 2 months ago · 2026-05-08 19:15 UTC

    Fixed

    • Fixed issue #68: ROUTE_HISTORY_ENABLED=false now disables Route History end-to-end instead of only stopping new history recording

    • When Route History is disabled:

      • The History tool button is removed
      • The History panel does not load
      • history=on in the URL no longer re-enables the feature
      • /snapshot no longer returns history_edges or a nonzero history window
      • The realtime WebSocket snapshot no longer publishes history payloads

    Behavior Change

    ROUTE_HISTORY_ENABLED now 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=false

    This 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.py

      • 13 passed
    • node --check backend/static/app.js

    • python3 -m py_compile backend/*.py

    What's Changed

    Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.9.0...v1.9.1

  4. 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:

    /livemap

    instead 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

    • node
    • repeater
    • device
    • device_id
    • public_key
    • pubkey

    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_PATH remains dormant unless explicitly configured

    What's Changed

    Full Changelog: https://github.com/yellowcooln/meshcore-mqtt-live-map/compare/v1.8.6...v1.9.0

  5. 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/amd64
      • linux/arm64
    • Added image-based deployment examples (no local build required):

      • deploy/docker-compose.image.yaml
      • deploy/swarm-stack.yaml
      • deploy/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_bytes is 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
  6. 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.0 regression where some networks stopped showing routes that had previously rendered in v1.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.0 closest/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 through docker-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 false unless your mesh specifically lost route rendering after the stricter prefix logic

    Notes

    • Version metadata and release notes were updated for v1.8.4
    • The dev branch includes the route fix, the new panel controls, LOS Fresnel lines, and the follow-up regression fixes
  7. 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 /los fallback 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=true
    • LOS_CURVATURE_FACTOR=1.333333

    Config and Runtime Fixes

    • Fixed docker-compose.yaml so all LOS-related environment variables are actually passed into the container:
      • LOS_ELEVATION_URL
      • LOS_ELEVATION_PROXY_URL
      • LOS_SAMPLE_MIN
      • LOS_SAMPLE_MAX
      • LOS_SAMPLE_STEP_METERS
      • ELEVATION_CACHE_TTL
      • LOS_CURVATURE_ENABLED
      • LOS_CURVATURE_FACTOR
      • LOS_PEAKS_MAX

    Docs

    • Updated .env.example with the new LOS curvature environment variables
    • Clarified MQTT authentication docs for meshcore-mqtt-broker: the live map normally uses a broker SUBSCRIBER_N username/password pair, not node-style signed publisher auth
    • Updated version, docs, and changelog for v1.8.3

    Validation

    • pytest -q92 passed, 2 skipped
    • node --check backend/static/app.js
    • python3 -m py_compile backend/*.py
  8. 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=true to show a Generate QR Code action
    • The modal shows a clickable truncated public key while still copying the full key
    • Added local /qr PNG generation with existing prod-token protection
    image

    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 route point_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
  9. 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 /waka or /arcade in the search box and pressing Enter
  10. 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.gz archives
    • 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.gz archives. This release also adds backup-specific environment controls, changes the default backup location to /backup, adds retention pruning for older archives, and mounts ./backup:/backup in docker-compose.yaml.

    Backups include live-state files such as:

    • state.json
    • device_roles.json
    • device_coords.json
    • neighbor_overrides.json
    • channel_secrets.json
    • map_boundary.json
    • route_history.jsonl
    • coverage_cache.json

    New backup environment variables:

    • BACKUP_ENABLED
    • BACKUP_INTERVAL_SECONDS
    • BACKUP_DIR
    • BACKUP_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 A LOS workflow, adds Remove 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.

  11. 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 peers action 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.

  12. 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:
        • BIDIR
        • DISC / TRACE
        • TX
        • RX
        • DEAD
        • DROP
    • 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_TOPIC supports comma-separated values for subscribing to multiple topic trees, for example:
      • meshcore/BOS/#,meshcore/CON/#
  13. 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_MODE with support for:

      • radius (default)
      • polygon
    • Added MAP_BOUNDARY_FILE for loading polygon boundary JSON

    • Added MAP_BOUNDARY_SHOW to control boundary overlay visibility

    • Polygon boundaries now apply consistently to:

      • devices
      • routes
      • history
    • Added frontend polygon overlay rendering from backend-injected boundary JSON

    • Added map_boundary.example.json as the reference schema

    • Added 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=polygon is 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
  14. 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 uses PEERS_DEFAULT_LIMIT when 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=25
    

    Notes

    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

  15. 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_FILE support for loading channel secrets from a file instead of a long environment variable
    • Added a shipped channel_secrets.example.json with 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 0 when 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_URL so 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:receiver route ID
    • Made the node popup Location: line clickable to copy Location: <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.json
    

    Copy channel_secrets.example.json to 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
  16. 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 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 N days are served to the map
    • Default coverage window is 30 days

    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
  17. 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 /peers statistics off raw route_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
  18. 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

    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
  19. 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_ids directly 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

    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_label data for easier hop verification

    Notes

    This release focuses on making route-details popups more accurate and reducing prefix/name mismatches in the hop list.

  20. 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-decoder package with meshcore-decoder-multibyte-patch
    • Added route prefix support for:
      • 1-byte prefixes: AB
      • 2-byte prefixes: ABCD
      • 3-byte prefixes: ABCDEF
    • 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, and ABCDEF
    • This release focuses on decoder and routing compatibility and does not introduce UI features