Skip to content

πŸš€ MeshMapper Update (March 8, 2026)ΒΆ

Expect Bugs

This release includes significant changes to how MeshMapper handles repeater identification across the entire solution β€” from data ingestion to map rendering. While extensively tested, edge cases are likely. If you encounter any issues, please report them.

πŸ“± App β€” v1.2.0ΒΆ

✨ New Features¢

  • Discovery Drop Reporting β€” Failed discovery requests can now be reported as failed pings to help map dead zones and noise floor gaps. Enable it in Settings (off by default). Failed discoveries show up as red markers on the map and noise floor chart. Regional admins can also enforce this for their whole region once nodes are updated.

  • Multi-Byte Path Hash Support β€” MeshMapper now fully supports MeshCore firmware v1.14.0+, which expands repeater IDs from 256 unique IDs (1-byte) all the way up to 65K (2-byte) or 16M (3-byte). A long time coming!

    • Repeater ID chips now show hex badges with dynamic sizing
    • Repeaters now render as squares on the map
    • Users can set hop byte count in Settings; regional admins can enforce 2 or 3-byte mode for their region, which automatically configures companion devices on connection
    • ⚠️ Heads up: if your session ends uncleanly while in multi-byte mode, your radio will stay in multi-byte mode until you manually change it back
    • MeshMapper passively detects which repeaters support multi-byte by watching packets. In 1-byte regions, only confirmed repeaters will show multi-byte IDs on the map. Once an admin enforces 2-byte or 3-byte via the admin panel, all repeaters in the region display accordingly
  • Repeater Marker Rotation β€” Repeater markers now rotate with the map and stay upright.

πŸ› Bug FixesΒΆ

  • Subscription leak fixes β€” Big thanks to @robekl for tracking these down and submitting the PRs:

    • PR #6: Guarded startWatching() against stacked subscriptions
    • PR #7: Fixed the last unowned stream listeners in AppStateProvider, consistent with existing cleanup patterns
    • PR #8: Fixed a scan stream with no termination path that could leave callers hanging; cleanup now covers all three exit paths
  • Online mode auth fix β€” the hot-switch path was only doing Stage 1 auth, so unregistered devices would fail with unknown_device. Now runs the full two-stage auth flow matching connectToDevice(). Also adds maintenance mode detection and GPS error short-circuiting. Thanks @dinki

  • GPS subscription leak fix β€” startWatching() wasn't cancelling the existing position subscription before creating a new one. On startup, two callers would race within ~40ms of each other, orphaning the first listener and doubling every GPS event. Effects included 2x position events, 4x "First GPS lock" triggers, 3x zone rechecks, and errno 24 (too many open files) from the cascading resource pressure. Fixed with a 3-line cancel guard in gps_service.dart.

  • Hive corruption no longer silently drops ping data β€” If the api_queue Hive box fails to open, pings now fall back to an in-memory queue instead of being silently dropped. Previously, a corrupted Hive box could cause an entire wardrive session to upload nothing but heartbeats. The memory fallback is drained alongside Hive on every upload batch.


🌐 Server & Map¢

✨ New Features¢

  • Dynamic Hop Bytes Support β€” The MeshMapper backend and map now fully support 1, 2, and 3-byte repeater hop identification across all features. This requires repeaters and companions running firmware v1.14.0 or newer.

    • Collision detection, coverage mapping, leaderboards, all use the hop byte length
    • The region's Hop Bytes setting is configurable in the region admin panel under Settings
  • Per-Repeater Hop Byte Tracking β€” MeshMapper now tracks hop bytes on a per-repeater basis. When a repeater is heard with a longer ID than previously seen, its hop bytes value is automatically updated. This allows regions to transition gradually from 1-byte to multi-byte firmware.

Image

  • Smart Collision Detection β€” Collision detection now uses per-repeater hop bytes to determine if two repeaters are truly in conflict. Two repeaters are only considered colliding if they are indistinguishable at the longer of their two hop byte lengths. For example, AB (1-byte) and AB12 (2-byte) are no longer flagged as duplicates.

  • Hop Bytes Advanced Filter β€” A new "Hop Bytes" dropdown has been added to the advanced search panel on the map, allowing users to filter repeater markers by their hop byte value (1, 2, or 3).

Image

  • Repeater List Grid Update β€” The Repeater List grid in Region Info now filters out multi-byte repeaters from 1-byte cells to avoid false "taken" indicators. New 1-byte, 2-byte, and 3-byte repeater lists are available to help regions in coordinating firmware upgrades.

Image