Click the map to drop a pin. Drag it to move. Click the button again to remove it. Search is capped to ~35km for speed.
Planning tools
Show on map
Planned repeaters
Adjusted repeaters
Line-of-sight hops
Connect repeaters
Cover an area
LoRa flood simulator
Send simulated flood packets from chosen nodes and see where
floods collide, using MeshCore's real airtime/relay-delay
formulas (compiled from the same Go code as the server).
Showing
Click the map to place a virtual companion device (originates/receives traffic like a handheld, but doesn't relay). Drag it to move; click the button again to stop placing.
Click the map to place a hypothetical repeater (relays traffic like a real one). Drag it to move; click the button again to stop placing. Any node's type can be changed later in ⚙ Repeaters & settings.
Searching…
🛰️ Validate against real traffic
Replay a real CoreScope packet
Reconstruct what actually happened on the real network: every
relay
CoreScope
observed proof of, alongside what our own
model predicts should have happened from the same origin —
so a gap between the two points at where a flood likely
collided or got blocked.
Searches composite multi-rule policies (dense/sparse, hilltop, articulation-point, MPR-style and more) ranked by actual delivery, not just collision rate.
The optimizer stops at whichever of the two limits above it reaches first.
Experimental (try one at a time)
Each is independent and off by default — land and measure one at a time rather than stacking several, since each changes the search trajectory in a way that makes it hard to tell which change actually helped.
Pushes synthetic offered load (randomly-originated messages, not
your own senders above) up through the load levels below and
measures delivery at each — the "knee" is the highest level this
network still delivers acceptably at, i.e. how many messages/minute
it can actually handle.
Sweeping…
Repeaters & settings
Edit a node's delay/power/loop-detect/scope/radio settings, then Apply. Changes take effect on the next run.
Set all repeaters to:
Node
Type
Scopes
Allow unscoped
Flood max
Unscoped max
Radio
Tx delay
Direct tx
Rx delay
Tx power
Loop detect
Hash size
Duty cycle
Received
Message senders
Each sender fires a batch of messages: how many, how long each
one is, and how far apart they go out (a random gap picked
fresh between every consecutive pair, so a real, slightly
irregular stream instead of a metronome).
to
to
Results
Sent messages
In time order. Click a row to show its own path and collisions on the map — green where it arrived cleanly, red where it collided. Click "Details" for the full per-hop breakdown and flood time.
Reception log
Proven vs. predicted — possible bottlenecks
Replay real activity (±30s)
Every real packet CoreScope observed within the configured window either side of this one (see "Surrounding activity window" above), played back in the order it actually happened — the replayed packet itself is highlighted; everything else is context for what else was going on at the time.
This modal covers the map, so the same controls are docked on the map itself — close this and use them there to actually watch the replay.
Predicted but never confirmed
Our model expects this hop to work, and this packet's real observations do cover the receiving repeater — they just never record it being reached this way. That makes it a candidate for where a collision or interference happened.
Real links our model doesn't predict
CoreScope proved this hop actually happened, but our model never even considers it possible — likely means the real link is longer/better than this tool's default planning assumptions (range cap, antenna heights, terrain), not that anything is wrong with the real network.
Episode analysis — actual vs predicted
Reconstructed from real CoreScope observations. Second-resolution timestamps mean this reproduces the traffic load with plausible sub-second timing, not the exact instant every packet collided — a settings win is worth confirming across a few seeds (change the seed above and re-run).
This packet: did our simulation deliver where reality did?
Observer
Heard it (real)
Our sim delivered
Verdict
Where did the flood die?
Delivery probability (timing-jittered runs)
CoreScope stamps whole seconds, so within-second ordering — and therefore collision outcomes — is partly arbitrary. This replays the same episode 10× with ±1 s timing jitter and fresh seeds, reporting how often the target actually got through.
Problems — before vs after your changes
Run once to see the baseline, then change settings (or run the optimizer) and run again. "Set current as baseline" pins a reference so the delta always compares against the state you chose.
Problem
Baseline
Now
Change
Predicted settings
Per repeater
Applying the top-ranked rule below to each node. A node the rule's condition doesn't cover keeps the baseline defaults.
Every candidate tried, ranked
🧬 Policy search results
Profile breakdown — what the winning policy labelled each repeater
Click a profile to see which repeaters it labelled, and why.
Action list — repeaters that need a change
Only repeaters where the winning policy's own recommendation differs from what's currently set. Copy-paste the CLI line straight into that repeater's own console.
Adaptive optimization
Every repeater, ranked by contention
All repeaters, worst first. "Score" is what the optimizer ranks on (collisions caused + own collisions + wasted relays + duty cycle). Click a row for the full diagnosis and what to do about it.
Repeater
Score
txdelay
Caused
Collided
Wasted relays
Relayed
Diagnosis
Improvement over time
One row per round. ✓ marks a round whose change was kept; the rest were measured, rejected, and reverted.
Round
Kept
Targeted
Move
Candidates tried
Delivery
Collisions
Contention
What changed, and why
Each row is one repeater the optimizer specifically backed off, in the order it found them — not a class-based rule, a targeted exception on top of the policy search result above.
Capacity curve
Load (msgs/min)
Delivery
Collision rate
Packets
Delivery checklist
Every repeater/companion/observer in this scenario — click one to see its own full history with this packet.