Repository navigation
Beacon Web - v1.3.0
Beacon v1.3.0
A big release for the packet analyzer: the packet list becomes a full table with expandable per-observer detail, packet routes get a self-contained path map, Analytics gains Talkers and Clock Drift tabs, and the map picks up an IATA border overlay.
✨ Highlights
- Packet list is now a table. On desktop the list is a proper table with one-line rows under a sticky header, and expanding a row opens an inline per-observer breakdown in place of the old card.
- See a packet's route on a map. "View path on map" opens a self-contained mini-map of the packet's resolved route(s), floating over the analyzer so closing it returns you exactly where you were.
- Two new Analytics tabs. Talkers ranks top advertisers and sender names, and Clock Drift flags repeaters and room servers whose clock has drifted past the server threshold.
📥 Packets (new table layout)
- Single-line rows. Each packet is one row under a sticky header showing hash, type, route, observation count, hops, hash size, source → destination, IATA and age. Mobile keeps the card layout on narrow screens.
- Expand a row for per-observer detail. Opening a row reveals a timing strip (observer, first/last heard, spread) and a per-observer table with SNR, RSSI, propagation, hops and resolved path for each observer, plus loading, error/retry and empty states.
- Source → destination chips. The Src → Dst column shows a packet's resolved endpoints as confidence-tinted chips (high / ambiguous / unresolved) and truncates cleanly on narrow screens. Historical rows read n/a, since endpoints are only resolved on the live feed for now.
- Jump straight to an observation. Clicking an observation opens the analyzer on that exact observation.
- Separate link states for rows and the analyzer. ?hash expands a row and ?analyze=1 opens the analyzer drawer, independently. Closing the analyzer leaves the row expanded, and a reload no longer reopens a drawer you closed.
- Live detail while open. While a row is open, its detail refreshes on each new observation, so the table keeps pace as the count ticks up.
🧭 Packet path map
- View path on map. From the analyzer or an expanded row, this opens a self-contained mini-map of the packet's resolved route(s). It floats over the analyzer instead of switching tabs, so closing returns you where you were.
- A path per observation. One coloured route per observation, sorted fastest first. "All paths" overlays every route, and clicking an observer isolates theirs. Path nodes are tappable for name and coordinates.
- Full chain, no guessing. Paths draw source → relay hops → destination. Endpoints are only plotted when they resolved unambiguously, so an ambiguous 1-byte prefix is left off rather than guessed.
- Shareable. ?path= deep links open a specific route. On mobile, attribution collapses to a small (i) so it doesn't cover the observer list.
- Accurate live animation. The live map flow now follows the same source → hops → destination chain, so packets animate from where they originated instead of the first relay.
📊 Analytics
- Talkers tab. Top advertisers with a flood/direct split, per-day rate, and node type and IATA per row, beside a top-talkers leaderboard grouped by decrypted sender name.
- Clock Drift tab. Repeaters and room servers whose advert-derived clock has drifted past the server threshold, worst first, with anything 1h or more off flagged red. It isn't time-windowed, so there's no range selector.
- Clock drift on node detail. The node detail panel now shows a node's clock drift (+42s ahead, -1h 1m behind, or in sync).
- Overview sparklines match their number. Overview KPI sparklines are pinned to a fixed 24h window instead of following the selected range, so the figure and its sparkline agree.
📡 Nodes
- Search by public-key prefix. The Nodes table now searches by public-key prefix as well as name. Switching field clears the box, and non-hex characters are ignored rather than sent, which previously errored the whole table.
🗺️ Map
- IATA border overlay. Toggleable region outlines with a themed legend, remembered like your other map settings and shareable via ?borders=. Borders load only while the layer is on, and IATAs with no configured border are skipped.
🐛 Fixes
- Multi-select packet filters now apply server-side. Previously a filter only took effect server-side when exactly one value was picked, so paging through multi-select results pulled unfiltered history.
- ?hash is no longer stripped on load, so deep links to older packets work again.
- Live re-observations now widen a packet's heard window instead of replacing it, so an expanded row's spread no longer reads 0 for re-heard packets.
- ?path deep links restore correctly when ?analyze is absent.
- Message bodies keep their line breaks in channel messages and in TEXT, RESPONSE and GROUP_TEXT payloads.
- TRACE paths now resolve like every other path, showing real hop names instead of raw hex.
- From/To/Dest hashes in encrypted-envelope and anonymous-request payloads now resolve to clickable node blocks, like path hops.
- The analyzer closes on a mobile tab change, and expanded rows now have a copy-link button.
- The region picker can be filtered by IATA code, airport name or region name.
- Row-height estimates match the new one-line desktop rows, so the list no longer jumps while scrolling.