n30nex
5fbba24a4a
fix(observers): separate packet metrics from presence updates
2026-09-30 07:19:02 -04:00
MrAlders0n
dec643a2ad
feat(ws): opt-in allowed origins and observer key ( #170 )
2026-09-27 11:41:11 -04:00
MrAlders0n
91b4b457b5
perf(db): resolve packet endpoints at read time ( #163 )
...
Storing a full candidate snapshot on every observation was the wrong call. The same node lists got copied thousands of times, about 22 GB on prod. Resolve endpoints live like path hops and drop the column.
2026-09-25 13:59:07 -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
951b79bf6e
refactor(api): stabilize router settings and admin route wiring ( #155 )
2026-09-19 21:10:45 -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
dab228e9bb
feat(logging): configure levels and structured runtime output ( #144 )
...
* feat(logging): configure levels and structured runtime output
* fix(logging): bound request-derived log fields
* fix(logging): retain malformed IATA source attributes safely
* test(logging): capture structured REST rate-limit records
2026-09-19 10:36:26 -04:00
n30nex
595ef4442b
feat(api): rate limit REST requests by trusted client IP ( #140 )
2026-09-19 08:43:24 -04:00
n30nex
93f85cab51
feat(auth): protect the admin subtree with a bearer key ( #146 )
2026-09-18 06:18:27 -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
b21279c747
feat(db): add operator account lifecycle storage ( #148 )
2026-09-18 06:17:59 -04:00
MrAlders0n
e15f873597
fix(api): return JSON 500 when bucketed telemetry query fails ( #137 )
2026-09-10 07:55: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
22410cf4a6
fix(api): trust client IP headers only from configured proxies ( #133 )
2026-09-09 20:42:35 -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
99d7eb0bab
feat: add node stale/delete config
...
closes : #93
2026-07-24 13:09:51 -07:00
Enot (ded) Skelly
3f2506fc8b
feat: add geojson for iatas
...
closes #66
2026-07-24 12:59:48 -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
Enot (ded) Skelly
f07edf9fb6
feat: include source and destination in path data where available
...
realted to #85
2026-07-23 09:44:27 -07:00
MrAlders0n
30772da2c5
perf(packets): drive IATA-filtered list from the observation index
...
Quiet sites probed hundreds of thousands of packets to fill a page.
Walk idx_observations_iata_heard per requested site and dedup instead.
Filtered lists now order by site-local recency; the cursor follows.
2026-07-20 09:07:05 -07:00
Enot (ded) Skelly
a14a0ac658
feat(paths): included resolved path in ws observation events
...
changes to shared helper for resolve paths
2026-07-02 09:39:10 -07:00
Enot (ded) Skelly
4e2ee62bad
feat(nodes): add ?neighbors to list nodes
...
inlcudes neighbor IDs in node details list
2026-07-02 09:12:23 -07:00
Enot (ded) Skelly
7b39160ff5
feat(neighbors): add optional snr column
2026-06-16 12:54:31 -07:00
Enot (ded) Skelly
89fde4868f
tests(handlers): few more things to cover
2026-06-15 15:08:38 -07:00
Enot (ded) Skelly
e9d4a336ea
tests(handlers): add some happy path tests everywhere
2026-06-15 15:02:17 -07:00
Enot (ded) Skelly
c86bad3875
chore: typo in refresh view comment and add note about node type func
...
NodeTypeName is fine as is with possible concatenation
of the value as there is unlikely to be more than 256
node types
2026-06-12 08:49:41 -07:00
Enot (ded) Skelly
b6e33ca460
docs(routes api): correct list handler cursor docs
2026-06-12 08:31:59 -07:00
Enot (ded) Skelly
5315af205c
feat(traces): embed max-hop observation path and SNR in list response
2026-06-11 15:45:08 -07:00
Enot (ded) Skelly
b58e5a1edc
feat(api): differentiate traces and pings
2026-06-11 14:52:31 -07:00
Enot (ded) Skelly
ad8e410856
feat(api): add knownNeighborCount to nodesummary and publicKey to node neighbor
2026-06-11 13:47:58 -07:00