v1.0.2 Changelog

v1.0.2 Changelog

This update dramatically improves routing and mesh sync capabilities.

Mesh routing now picks paths by link quality, not hop count.

If you've ever set up a four-node chain and watched the originator stubbornly send to a marginal direct neighbor instead of the much healthier two-hop path through its closer peers, this release is for you. The mesh routing layer has been re-engineered around Expected Transmission Count (ETX), the same metric used by 802.11s mesh, RPL, and Babel. Three good hops now beat one bad direct hop every time.

This was field-tested on real elevated-surface deployments at 70 to 100 meters per hop. Default-mode range covered the tested perimeter cleanly with twelve nodes.

TL;DR

v1.0.2 makes the mesh smarter about which path to send messages through. Before, nodes always picked the most direct neighbor, even when that connection was weak and dropping messages. Now, nodes measure how reliable each connection actually is and pick the path most likely to get through, even if that means going through two or three other nodes first. A strong indirect path beats a weak direct one.

In plain terms: fewer dropped commands, more reliable range, especially after you power nodes on together and then spread them out.

To get the full benefit, update every node in your mesh. Older nodes still show up and stay connected, but won't help relay messages until updated. All your saved settings, pairings, scripts, and captures stay intact.

Problem & Solution

The old mesh routed by hop count. A direct neighbor always won, regardless of how unreliable that direct link actually was. In practice this meant: the moment a far peer crossed the admission threshold, even briefly, it was admitted as a one-hop neighbor and every command after that fired down the marginal link. A three-hop chain through your closer, healthier peers was never considered, even when it would have delivered far more reliably.

The fix is metric-aware routing. The new layer measures each link's Expected Transmission Count from the rolling Packet Reception Ratio (PRR) and accumulates path cost across hops. The originator picks the lowest-cost path. A clean three-hop chain at 95% per-link PRR scores better than a one-hop link at 30%, and routing decisions follow.

What changed (the technical details)

ETX as the path metric

Each route entry now carries an accumulated path cost (ETX*64, fixed-point). Forwarders add their inbound link's cost as RREQ and RREP (Shiver uses AODV as a routing protocol; RFC 3561) control frames propagate through the mesh, so the originator sees the real end-to-end cost and not just hop count. Path comparison prefers the lowest cost; ties break on fewer hops.

A 75% PRR floor on direct delivery

When a direct neighbor's PRR drops below the floor, routing demotes that link in favor of any available multi-hop alternative. The neighbor stays admitted and continues to participate in heartbeats and gossip; only routing decisions change. If no multi-hop alternative exists, direct is used anyway. The floor sits comfortably above the field-observed boot artifact and below typical clean-link PRR.

Asymmetric PRR EMA

Failure samples decay PRR fast (alpha ~= 0.4); success samples raise it slow (alpha ~= 0.1). A freshly bad link demotes within three to five frames rather than the twenty-plus frames the old symmetric EMA needed.

This directly addresses the boot-then-distribute pathology. You power on all your nodes near each other (admission floods every route table with one-hop entries), then carry them apart to their actual deployment positions, and on the old firmware those stale "neighbor" routes kept firing sends down dead links for a minute or more before aging out. Now they demote in seconds.

Edge-triggered re-discovery

When a previously good neighbor's PRR crosses below the floor, the routing layer immediately fires re-discovery for any active route that goes through it. By the time the next CMD goes out, the alternate path is already in the table. Hysteresis prevents oscillation around the floor from triggering repeated discovery floods.

500 ms RREP collection hold

Instead of locking in the first reply that arrives during route discovery, the originator now waits 500 ms of mesh-window-open time, collects every RREP that comes back, and picks the lowest-cost path. The wait is in open-window time rather than wall-clock so a hold landing in the closed phase of the radio's TDM schedule still gets a fair chance to receive replies.

UI hover prefetch

Hovering a target in the Execute, Sync, or peer pickers fires a discovery if the route is missing or older than 30 seconds, so by the time you press select the route is fresh. The 500 ms hold latency overlaps human reaction time and is invisible.

Diagnostics

The serial route-table dump now shows path cost (raw fixed-point) and rendered ETX with two decimals alongside hop count, last-used age, and the LOCAL/VALID flag glyphs. The on-device diag screen continues to show per-neighbor PRR percentage so links below the floor are visible at a glance.

Compatibility

The wire format for routing control frames bumped to V2. For best results, upgrade every node in your mesh to v1.0.2. Older firmware stays online via heartbeat and gossip and you'll still see those nodes in your dashboard, but they won't forward V2-routed traffic. Mixing firmware versions in the same mesh works, just with reduced routing reach until everyone is on v1.0.2.

Everything else is preserved: settings, paired BLE HID devices, DuckyScripts, captured handshakes, Wi-Fi networks, IR remotes, and your paired-Nano list all transfer over without action.

Known: Long Range mode

Long Range mode is regressing range below default-mode performance in field testing. This is anomalous: LR should provide a sensitivity gain over default, not the opposite. The likely cause is in the LR PHY engagement path, not in this release's routing changes. We're investigating and will fix in a follow-up. Default mode is unaffected and is the recommended setting for v1.0.2.

Release builds are available for US, EU, UK, CA, and ROW on both stable and beta tracks.

Back to blog