MrAlders0n
2042c1617f
feat(stats): roll hourly scope observers and advertising nodes
2026-10-02 15:24:33 -04:00
MrAlders0n
53d9f86dd4
feat(stats): split /stats/scopes packet counts by hour
2026-10-02 13:57:54 -04:00
MrAlders0n
3e0b6c074c
feat(stats): report the longest path per hour in /stats/paths
2026-10-02 13:57:54 -04:00
MrAlders0n
98006a9364
feat(stats): serve historical stats from hourly rollups
...
Stats endpoints read hourly rollup tables filled once per closed hour by one
advisory-locked task, instead of materialized views that re-scanned every
observation on each refresh. IATA-set tables give exact distinct counts for any
IATA set or region. Cleanup holds raw rows for unrolled hours (up to 24h).
Adds /stats/series; ingest keeps packet observation counts, observer last IATA,
channel message counts and trace tag summaries. 001_baseline.sql is rewritten,
so pre-release 2.0 databases must be recreated. See docs/historical-stats.md.
2026-10-02 07:43:56 -04:00
MrAlders0n
119be44c0d
feat(channels): filter channel list by keyKnown
...
Also seed the cursor integration test with MeshMapper membership; it still
used channel_iatas after channel lists moved to region scoping.
2026-10-01 09:06:50 -04:00
MrAlders0n
f8ee1ac884
feat(meshmapper): import regional channels and scope channel lists by region
2026-09-30 23:09:40 -04:00
MrAlders0n
e2b64f2a36
chore: version bump v2.0.0
2026-09-30 22:14:11 -04:00
MrAlders0n
2f49ffb3a3
feat(api): filter scope lists by region and catalogue membership
...
Region-filtered /scopes and /stats/scopes now list manual scopes configured
for the region and imported scopes whose MeshMapper catalogue includes the
IATA, instead of inferring membership from observed traffic. Filtered
/scopes returns string[] like the unfiltered call.
Manual scopes now require a region in config.
2026-09-30 22:05:04 -04:00
MrAlders0n
f6fe177a4e
docs: regenerate swagger
2026-09-30 10:31:08 -04:00
n30nex
6bf58acb80
fix: address maintainer review for #176
2026-09-30 07:19:03 -04:00
n30nex
2abed6c195
feat(channels): expose recorded packet scope in message delivery
2026-09-30 07:19:03 -04:00
n30nex
7e01abf5a0
docs(api): refresh generated contract after stack update
2026-09-30 07:19:03 -04:00
n30nex
574bba4e13
fix: address maintainer review for #174
2026-09-30 07:19:03 -04:00
n30nex
c18e059e0d
feat(scopes): import cached regional MeshMapper catalogues
2026-09-30 07:19:03 -04:00
n30nex
c448a04ea0
feat(routes): add bounded retained observation evidence
2026-09-30 07:19:03 -04:00
n30nex
551f061f9c
docs(api): refresh generated contract after stack update
2026-09-30 07:19:02 -04:00
n30nex
d3c330e8fb
fix: address maintainer review for #169
2026-09-30 07:19:02 -04:00
n30nex
5fbba24a4a
fix(observers): separate packet metrics from presence updates
2026-09-30 07:19:02 -04:00
n30nex
c02317a4ac
feat(packets): summarize ACK and trace references ( #161 )
2026-09-23 20:18:48 -04:00
n30nex
20691dc5a3
feat(backup): verify native archives offline without extraction ( #160 )
2026-09-23 20:18:45 -04:00
n30nex
8a3fa7e6bf
feat(stats): add bounded path and hash-width analytics ( #159 )
2026-09-23 20:18:41 -04:00
n30nex
6107578c25
feat(stats): add bounded reception signal analytics ( #157 )
2026-09-23 20:16:22 -04:00
n30nex
a25e2675c8
feat(backup): add protected database and config download ( #154 )
2026-09-23 20:13:40 -04:00
n30nex
4d2642abec
feat(admin): add protected account lifecycle endpoints ( #149 )
2026-09-23 20:10:35 -04:00
n30nex
6aba17c75e
feat(nodes): indicate repeaters outside configured local borders ( #153 )
2026-09-19 15:27:34 -04:00
n30nex
775aedfd2a
feat(admin): update runtime CORS origins consistently ( #150 )
...
* feat(admin): update runtime CORS origins consistently
* test(admin): preserve rate-limit headers after CORS updates
* test(admin): preserve router connection budget after rebase
2026-09-19 15:27:25 -04:00
n30nex
c7ace0ce0e
feat(ws): limit connection attempts and signal capacity shedding ( #141 )
2026-09-19 13:28:47 -04:00
n30nex
cf5ff7a974
feat(stats): compare flood packets reported by two observers ( #152 )
...
* feat(stats): compare distinct flood packets across observers
* test(stats): use the migrated observation deduplication key
2026-09-19 10:36:39 -04:00
n30nex
6540b9253d
feat(admin): expose selected startup configuration ( #147 )
2026-09-19 10:36:30 -04:00
n30nex
595ef4442b
feat(api): rate limit REST requests by trusted client IP ( #140 )
2026-09-19 08:43:24 -04:00
n30nex
85b1c3961d
feat(packets): populate advert summaries in history and live events ( #143 )
2026-09-18 06:18:19 -04:00
n30nex
bcdea76c26
feat(stats): filter scope counts by IATA and region ( #142 )
...
* feat(stats): filter scope counts by IATA and region
* perf(stats): aggregate region observations before counting scopes
2026-09-18 06:18:06 -04:00
n30nex
9164659544
feat(backup): export private database and saved-config bundles ( #151 )
...
* feat(backup): export bounded database and saved-config bundles
* test(backup): preserve synthetic channel keys in exports
* fix(backup): check writable file closure before publication
2026-09-18 06:17:52 -04:00
MrAlders0n
d202205659
fix(observers): rename telemetry airtime fields to seconds ( #136 )
2026-09-10 07:17:29 -04:00
MrAlders0n
b66573b3b7
feat(observers): per-observer activity endpoint ( #135 )
2026-09-10 06:53:00 -04:00
n30nex
f390086058
fix(channels): preserve timestamp ties in page cursors ( #132 )
2026-09-09 20:25:07 -04:00
n30nex
04fc0266d1
fix(packets): preserve captured endpoint names in history ( #128 )
2026-09-09 18:45:52 -04:00
n30nex
30327cd98d
fix(api): bound list limits consistently ( #112 )
2026-09-06 10:20:45 -04:00
Enot (ded) Skelly
ae0669ccbe
enrich packet observations
2026-07-27 09:41:11 -07:00
Enot (ded) Skelly
336b734a42
feat: add stats api for new clock drift tracking
...
closes : #91
2026-07-24 14:01:12 -07:00
Enot (ded) Skelly
d8371f04d0
feat: split top adverts into flood/direct
...
closes : #90
2026-07-24 13:49:40 -07:00
Enot (ded) Skelly
201cd9e364
chore: version bump v1.6.0
2026-07-24 13:31:23 -07:00
Enot (ded) Skelly
99d7eb0bab
feat: add node stale/delete config
...
closes : #93
2026-07-24 13:09:51 -07:00
MrAlders0n
ba0e85c44e
fix(channels): review fixes for channel_iatas
...
Refresh last_heard on duplicate observations too, capped at hourly, so
steady traffic can't age a channel out of the filter while its packets
stay retained (dedup key has no heard_at). Guard the seed join against
the docker /dev/shm cap like the trace one, and drop the unused
last_heard index column so the upserts stay HOT.
2026-07-24 12:07:05 -07:00
MrAlders0n
dff9c6cf00
perf(channels): track channel activity per IATA in its own table
...
The IATA filter ran a correlated EXISTS over packets/observations with
ILIKE, which skipped the iata index and took ~7s live. Keep a small
channel_iatas table at ingest (like node_iatas) and filter against it.
Also honor the iatas= param so multi-site regions stop getting the
global list. Filter now ages out with packet retention rather than
matching any retained packet.
2026-07-24 12:07:05 -07:00
Enot (ded) Skelly
b33ebc007b
feat: add plural value filter params
...
closes #76
2026-07-23 14:26:16 -07:00
Enot (ded) Skelly
8e2798612b
feat: add clock drift tracking
...
closes #71
2026-07-23 13:34:41 -07:00
Enot (ded) Skelly
b38663d3a1
feat: add stats for top advertiser and talkers
...
closes #75
closes #74
2026-07-23 10:41:16 -07:00
Enot (ded) Skelly
0ca28cc6a8
feat: node prefix search
...
pubkeyPrefix takes any even length prefix string case-insensitive
and returns all matches
2026-07-23 10:14:47 -07:00
Enot (ded) Skelly
d8c622316d
fix: radio frequency precision
...
closes #77
2026-07-23 09:58:43 -07:00