Skip to content

v1.3.0 - #27

Merged
MrAlders0n merged 86 commits into
mainfrom
dev
Jul 29, 2026
Merged

v1.3.0#27
MrAlders0n merged 86 commits into
mainfrom
dev

Conversation

@MrAlders0n

Copy link
Copy Markdown
Member

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.

MrAlders0n and others added 30 commits June 11, 2026 13:34
 - node-types: new /stats/node-types endpoint + useNodeTypes; donutOption
   replaces the "Coming soon" card with a live donut
 - stats endpoints take iatas[] instead of a single iata, so multi-IATA
   regions filter instead of falling back to all (drops useStatsIata)
 - radio presets keep the node/observer split via stacked presetBarsOption
 - drop client-side telemetry ms-normalization (backend now emits epoch ms
   on both paths); charts pick delta-vs-raw counters off the response interval
 - MeshTab: range-driven charts lead, all-time charts follow; KPI window
   from overview.windowHours instead of a hardcoded 24h
 - ci: docker-publish builds a :dev image on dev-branch pushes
feat: SNR for trace path in list
feat: known niehgbour count
Bumps [undici](https://github.com/nodejs/undici) from 7.27.2 to 7.28.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](nodejs/undici@v7.27.2...v7.28.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.28.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
- Discover packets decoded: DISCOVER_REQ/DISCOVER_RESP render real fields
  (type-filter roles, tag, node-to-node request SNR) instead of a raw dump.
- Neighbor lines on the map: On/Selected/Off control draws links between nodes
  and their known neighbors.
- Live packet flow: a play button animates packets hop-to-hop between repeaters
  in real time (off by default).
Deep-linked ?node/?observer selections now survive load: the region
reset watches the raw selection instead of the async-resolved regionKey,
so slug expansion no longer wipes a restored panel.
Draw each active IATA's GeoJSON region border as an outline over a faint
fill beneath the node markers, behind a Map Settings toggle that's off by
default and shareable via a URL param. IATAs with no border answer 204
and are skipped.
…pec gaps

- Stop resetting selectedObservationId when opening the analyzer, so picking an
  observation inside an expanded row lands the drawer on it instead of observations[0]
- Disable View path on map in the expanded row when the detail has no resolvable path,
  matching the drawer's existing button
- Strip a ?hash deep link once the first page has loaded and it matches no packet
The analyzer drawer and path-map restore both read the live ?hash and
fetch by hash directly, independent of whether the packet is in the
loaded list. Deleting the param once the first page settles without a
match unmounts the drawer and can drop path-map restores, for any
shared link more than a couple of minutes old.
The header and the rows are separate grids, so the shared track list can't use ch or auto — each resolved them differently and the columns drifted apart. Observer moves into the expansion to free the column.
Drops the Open analyzer and Copy link buttons from the expansion; the analyzer popup keeps its own copy link. Table rows butt up against each other now, so the whole strip is a click target.
Typing narrows both groups: airports match on code or display name,
regions match on their name or on any member code — a code-only match
tags the row with the code that hit, so it doesn't look like a stray
result. Empty groups drop their headers so the divider never dangles.

The panel body moves into its own component so the query dies with the
dropdown, and focus returns to the trigger on close.
Share the endpoint-gating chain builder with the path map so both plot
source and destination when the backend resolved them unambiguously.
origin/main is the squash-merge of PR #20 (v1.2.1). Its tree is identical to
dev's bc62d28, which dev already builds on, so the conflicts were an artifact of
the squash rather than real divergence -- keep dev's tree wholesale.
@MrAlders0n
MrAlders0n merged commit 5ac36ce into main Jul 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant