37 Commits
Author SHA1 Message Date
n30nex add7acbaa1 Merge remote-tracking branch 'origin/dev' into codex/sync-dev1-web-20261015 2026-10-15 04:30:34 -04:00
MrAlders0n 0367ee5257 Search packet hashes server-side with hashPrefix 2026-10-14 09:13:50 -04:00
n30nex 6f94e88540 Sync dev1 Atlas with current upstream web and paired backend APIs 2026-10-12 14:44:48 -04:00
MrAlders0n b427282b30 Rebuild My Atlas on the shared Analytics cards (2.0.5)
Atlas cards now use the Signal tab StatCard tiles, shared Card, badges,
action buttons, IATA chips and search bar. Polling moves to TanStack Query
with the app retry policy, pauses while rate-limited, and recovers a pin
whose server ID changed by its full public key. Search results show a key
prefix and explain short or non-hex input; heard-by states which packet it
counts. Sparkline component removed in favour of the stats one.
2026-10-12 13:18:24 -04:00
MrAlders0n e4760173c0 Sort top advertisers by flood or direct on the server, bump to 2.0.4 (#155) 2026-10-10 09:39:15 -04:00
MrAlders0n 8ac3e1bd4a Batch route search into two requests and gate old web versions (#152) 2026-10-09 22:20:23 -04:00
MrAlders0n acf46342a1 Fix issues from the 2.0.0 release review (#137) 2026-10-02 19:04:46 -04:00
MrAlders0n 39e921c277 Serve analytics from hourly rollups and handle empty regions (#132) 2026-10-02 08:03:00 -04:00
MrAlders0n a252b953fe List keyed channels up front and load the rest on demand (#125) 2026-10-01 09:18:42 -04:00
MrAlders0n 35d117a636 Region-filtered scope lists (#113) 2026-09-30 22:09:37 -04:00
n30nex d259be512e feat: observer monitoring, retained evidence and channel scopes (#75-#99)
Lands the stacked web PRs #75, #79, #80, #81, #83, #85, #87, #89, #92, #95 and #99 in one squash. Server counterparts #166-#176 are merged. Remaining review items follow in a fix PR.
2026-09-30 08:03:13 -04:00
n30nex 929ba83cf1 feat(stats): add Paths and Hashes analytics (#57) 2026-09-23 20:16:23 -04:00
n30nex 2405e1ac96 feat(stats): add RF and signal analytics (#55) 2026-09-23 20:14:03 -04:00
n30nex e01c090c8e feat(stats): add hourly traffic and region-aware scope analytics (#53)
Adds the Traffic and Scopes analytics tabs. Includes the hourly traffic work from #52, which this PR contains in full.

Closes #50. Closes #51.
2026-09-20 11:41:43 -04:00
n30nex 88e2c0f319 feat(stats): compare flood packets heard by two observers (#48) 2026-09-19 22:58:36 -04:00
n30nex 9ab1a44ae9 fix(channels): load older directory pages without losing selection (#37)
* fix(channels): page the directory without losing the open channel

* fix(channels): prefer precise server page cursors
2026-09-10 09:26:05 -04:00
MrAlders0n 12ddc8a921 Observer tab: airtime as percent, add heard-activity charts
Airtime telemetry is on-air seconds, so chart it as a percent of elapsed time.
Add channel busy, packets heard, SNR heard and payload type charts from the
new per-observer activity endpoint; hidden until the server has it.
2026-09-09 23:21:39 -04:00
MrAlders0n 276ef903fb Handle API rate limiting in the client and back off WS reconnects 2026-09-02 19:50:35 -04:00
MrAlders0n 464e701f76 Add a toggleable IATA border layer to the map
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.
2026-07-24 22:21:12 -04:00
MrAlders0n 8baa562794 Add a Clock Drift analytics tab
List repeaters and room servers whose advert-derived clock has drifted
past the server threshold, worst first, in a sortable table. It's each
node's latest reading, so there's no time range to pick.
2026-07-24 22:20:49 -04:00
MrAlders0n e526c08fa4 Send multi-select packet filters to the server 2026-07-24 08:47:19 -04:00
MrAlders0n 23bacde2b8 Add public key prefix search to the nodes table 2026-07-23 23:10:31 -04:00
MrAlders0n 7bf30da5c1 Add top advertisers to Mesh stats and a Talkers leaderboard tab 2026-07-23 23:05:39 -04:00
MrAlders0n 1b42e023d8 Restore files clobbered by the main merge 2026-07-14 23:30:50 -04:00
MrAlders0n cfe6a8f0ea Merge branch 'main' into dev
Signed-off-by: MrAlders0n <55921894+MrAlders0n@users.noreply.github.com>
2026-07-14 23:17:55 -04:00
MrAlders0n 2e2b845137 Filter packet history on the server when a single type, route or scope is selected 2026-07-14 22:31:50 -04:00
MrAlders0n e50501879a feat: discover renderers, neighbor map lines, live packet flow
- 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).
2026-07-05 22:08:54 -04:00
MrAlders0n 653768dcc8 Fix: github workflow + stats tab + add traces vs pings (#10)
* stats: node-types donut, multi-IATA filtering, preset split

 - 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: traces vs pings
feat: SNR for trace path in list
feat: known niehgbour count

* fix: github workflow, post images publically
2026-06-20 13:23:18 -04:00
MrAlders0n df9f4a07ad stats: node-types donut, multi-IATA filtering, preset split
- 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
2026-06-11 13:34:11 -04:00
MrAlders0n 7e2a4de78f channels: send the singular iata param the backend actually reads
/channels ignores the plural iatas param, so the sidebar was always
global no matter the region — and opening another region's channel
showed an empty panel because the messages endpoint IS region-filtered.
Single-IATA regions filter properly now; multi-IATA stays global until
the backend grows parseIATAs there (ticket).
2026-06-10 07:03:16 -04:00
MrAlders0n f4093cf508 ws: fix subscription leak, stale sockets and half-open links
The big one: updateSubscription before the previous subscribe was acked
never unsubscribed it (the server keeps scopes additively), so a region
change right after connect left the old all-regions sub alive and the
live feed stayed a firehose. Subscribes now carry a tracked id and an
ack for a superseded subscribe is unsubscribed on arrival.

Also:
- doConnect/disconnect tear down the old socket and detach handlers, so
  a late close from a dead socket can't spawn a parallel reconnect loop
  (the StrictMode dev warning came from this)
- subscription ids are cleared per-connection instead of leaking a
  stale id onto the next socket
- pings now double as a liveness check: no pong for two intervals
  forces a reconnect instead of showing LIVE on a half-open link
- a server-sent close 1000 reconnects instead of going permanently dark
- after a reconnect the manager synthesizes a lag notice so live views
  refetch what they missed during the outage
2026-06-10 06:34:28 -04:00
MrAlders0n b8b1f5f27d Feat/scopes routes traces (#7)
* feat: replace getScopeStats with getScopes and update related tests
bug: lastSeen/sentAt was set to string instead of number by mistake

* feat: update timestamp handling and formatting across components

- WS messages carry epoch ms now instead of ISO strings
- new Timestamp component (relative/absolute), used in RouteTable and RouteDetailPanel
- IataChip and ScopeTag chips
- TraceDetailPanel and TraceList for trace drill-down
- tests updated for the timestamp change
2026-06-07 00:19:54 -04:00
MrAlders0n 8e2696b95a feat: loading pill for map and tables
- LoadingPill shows loading/error state in MapView, NodeTable and ObserverTable
- new useInfinitePages hook shares the pagination logic between them
- patchNodeSummary/patchObserverSummary now keep references stable
- tests for loading states, observer updates and infinite paging
2026-06-05 22:59:52 -04:00
MrAlders0n 81bdeec16b feat: implement paginated node fetching and add related tests 2026-06-05 20:23:17 -04:00
MrAlders0n eb961c0c92 Fixed the scrollbar anchoring and some bug fixes 2026-05-29 20:21:59 -04:00
MrAlders0n a0caf65a18 added channel & observers 2026-05-27 19:27:48 -04:00
MrAlders0n 8718bf3563 Initial commit 2026-05-23 21:49:14 -04:00