you
db884f12eb
fix: 4 bugs - spark bars inline style, My Nodes filter field names, duplicate pin button, map dark mode
...
1. Spark bars: inline style override on td (max-width:none, min-width:80px)
2. My Nodes filter: pubkey→pubKey, to/from→srcPubKey/destPubKey/srcHash/destHash
3. Pin button: guard against duplicates in init, remove in destroy
4. Map page: CartoDB dark/light tiles with MutationObserver theme swap
2026-03-20 09:21:17 +00:00
you
116f0c8dfb
fix: add col-spark class to spark bar cells, min-width 80px
2026-03-20 09:14:19 +00:00
you
b3e8dcaa93
fix: spark bars crushed by max-width:0 on data-table td
...
Override max-width for td cells containing spark bars so they render.
2026-03-20 09:12:27 +00:00
you
920eab04c1
fix: sort observer analytics packets newest-first, fix recentPackets slice
2026-03-20 09:10:16 +00:00
you
d67b531bf2
fix: pass observer name (msg.origin) to packet insert and observer upsert
...
Lincomatic MQTT packets include origin field with friendly name but
we were only using it in status handler. Now both packet and observer
records get the name.
2026-03-20 09:07:39 +00:00
you
5a6847bbf4
fix: remove duplicate crypto require that crashed server
2026-03-20 08:54:35 +00:00
you
034c68c154
feat: auto-derive hashtag channel keys from SHA256(name)
...
Scans DB for known #channel names, derives 16-byte AES keys
algorithmically. No need to manually add hashtag channels to config.
Private channels still need manual config.
2026-03-20 08:53:11 +00:00
you
477dcde82f
fix: analytics shows total packets + signal data count separately
...
RF analytics filtered on snr!=null, showing only 3 packets when most
lincomatic data has no SNR. Now shows total packets prominently and
signal-data count as a separate stat.
2026-03-20 08:42:38 +00:00
you
c997318cd2
fix: recentPackets in health endpoint — show 20 newest DESC, not 10 oldest
2026-03-20 08:39:01 +00:00
you
fa40ede9e7
fix: findPacketsForNode always resolves name, even when called with pubkey
2026-03-20 08:31:07 +00:00
you
8ce2262813
refactor: single findPacketsForNode() replaces 4 duplicate node lookups
...
One method resolves name→pubkey, combines byNode index + text search.
Used in: query fast-path, combined-filter path, health endpoint,
analytics endpoint. Bulk-health still uses index-only (perf).
2026-03-20 08:29:45 +00:00
you
90c4c03ac3
fix: node health endpoint searches by name + pubkey, not just byNode index
...
byNode only has packets where full pubkey appears in decoded_json fields.
Channel messages reference nodes by name, not pubkey. Combined search
finds all 304 packets instead of just 12.
2026-03-20 08:25:06 +00:00
you
87bbd93d12
fix: node-only search path also resolves name→pubkey + text search
...
The fast-path for single node filter was bypassing the name
resolution, using raw name string on pubkey-indexed byNode map
2026-03-20 08:20:43 +00:00
you
e837dba000
fix: node search combines index + text search for name AND pubkey
...
Previous fix only used index OR text, missing packets that reference
nodes by name in decoded_json
2026-03-20 08:13:27 +00:00
you
fa72e6242d
fix: node name search returns all packet types, not just adverts
...
Resolves node name → pubkey, then searches byNode index and paths
table instead of only matching decoded_json text
2026-03-20 08:10:24 +00:00
you
2fcbcd97d1
fix: observer column max-width:none to override td max-width:0
2026-03-20 08:01:15 +00:00
you
311db0285d
fix: bump all cache busters - browser was serving stale JS
2026-03-20 07:58:57 +00:00
you
01df7f7871
fix: observer column min-width 70px to prevent zero-width squeeze
2026-03-20 07:57:43 +00:00
you
90fa755e7d
fix: observer pages scroll - calc(100vh - 56px) for nav bar
2026-03-20 07:53:24 +00:00
you
039d1fc28f
fix: resolve observer names from observers table in packets view
...
observer_name on packets is often NULL; now cross-references
the loaded observers list to display friendly names
2026-03-20 07:51:26 +00:00
you
d8c0e3a156
fix: only backfill observer name if observer already exists
...
Prevents ADVERT nodes from being created as observers
2026-03-20 07:47:37 +00:00
you
bee124e6d2
fix: shrink donut chart, show observer name in dropdown
2026-03-20 07:44:20 +00:00
you
fd919a2a80
fix: spark bar invisible in observers table - max-width:0 override
2026-03-20 07:39:46 +00:00
you
f58728118d
feat: observer detail page with analytics
...
- GET /api/observers/:id — observer metadata + packet count
- GET /api/observers/:id/analytics — timeline, type breakdown, nodes heard, SNR distribution
- observer-detail.js — info cards, 4 Chart.js charts, recent packets table
- Observers list rows now clickable to navigate to detail
- Time range selector (24h, 3d, 7d, 30d)
2026-03-20 07:37:36 +00:00
you
4aa78305d3
feat: backfill observer names from ADVERT pubkey cross-reference
2026-03-20 07:32:46 +00:00
you
8659cda7b7
fix: remove PII from seed data - no real names/coords
2026-03-20 07:30:48 +00:00
you
2713d501b4
feat: MQTT topic arrays, IATA filtering, observer status parsing
...
- mqttSources[].topics is now an array of topic patterns
- mqttSources[].iataFilter optionally restricts to specific regions
- meshcore/<region>/<id>/status topic parsed for observer metadata:
name, model, firmware, client_version, radio, battery, uptime, noise_floor
- New observer columns with auto-migration for existing DBs
- Status updates don't inflate packet_count (separate updateObserverStatus)
2026-03-20 07:29:01 +00:00
you
4ff72935ca
feat: multi-broker MQTT support
...
config.mqttSources array allows multiple MQTT brokers with independent
topics, credentials, and TLS settings. Legacy config.mqtt still works
for backward compatibility.
2026-03-20 07:18:49 +00:00
you
a756517647
fix: set XDG_DATA_HOME so Caddy persists certs to mounted volume
2026-03-20 07:13:52 +00:00
you
74983d3f74
ci: switch to self-hosted runner — no SSH, no secrets, no exposed ports
2026-03-20 07:07:01 +00:00
you
ab35ced2bf
ci: auto-deploy to VM on push to master via GitHub Actions
2026-03-20 07:03:36 +00:00
you
ff86a78480
style: proper themed copy-link button matching existing detail action buttons
2026-03-20 06:59:10 +00:00
you
2a076dfb1d
feat: shareable URLs for channels — update URL on selection, accept route param
...
- selectChannel updates URL to #/channels/<hash>
- init accepts routeParam and auto-selects channel
- Search results use new URL format instead of ?ch= query param
2026-03-20 06:51:54 +00:00
you
fceff15e2f
feat: update URL bar when selecting a packet for easy sharing
2026-03-20 06:49:20 +00:00
you
9c87f0040e
docs: update README — fix duplicate heading, add Docker/perf files to project structure
2026-03-20 06:47:07 +00:00
you
395abc2585
feat: standalone packet detail page at #/packet/ID
...
- New route #/packet/123 shows full packet detail on its own page
- Back link to packets list
- Copy Link button now generates #/packet/ID URLs
- Reuses existing renderDetail() for consistent display
2026-03-20 06:44:18 +00:00
you
e82e4fe05f
fix: copy link URL format — use #/packets/id/N not query param
2026-03-20 06:42:12 +00:00
you
6cf9793706
feat: copy link button in packet detail pane
2026-03-20 06:41:36 +00:00
you
1772b34e8f
fix: copy all JS files in Dockerfile — was missing decoder.js
2026-03-20 06:18:04 +00:00
you
fea8a7e0b5
feat: add Caddy to Docker container — automatic HTTPS
...
- Caddy reverse proxies :80/:443 → Node :3000
- Mount custom Caddyfile for your domain → auto Let's Encrypt TLS
- Caddy certs persisted in /data/caddy volume
- Ports: 80 (HTTP), 443 (HTTPS), 1883 (MQTT)
2026-03-20 06:07:38 +00:00
you
2e486e2a66
feat: Docker packaging — single container with Mosquitto + Node
...
- Dockerfile: Alpine + Node 22 + Mosquitto + supervisord
- Auto-copies config.example.json if no config.json mounted
- Named volume for data persistence (SQLite + Mosquitto)
- Ports: 3000 (web), 1883 (MQTT)
- .dockerignore excludes data, config, git, benchmarks
- README updated with Docker quickstart
2026-03-20 06:06:15 +00:00
you
f0c29b38f1
chore: bump perf.js cache buster
2026-03-20 05:47:29 +00:00
you
46d9b690ee
fix: close if(health) block in perf dashboard — was swallowing all content
2026-03-20 05:47:11 +00:00
you
2e51e5f743
feat: system health + SWR stats in perf dashboard
...
Perf page now shows: heap usage, RSS, event loop p95/max/current,
WS client count, stale-while-revalidate hits, recompute count.
Color-coded: green/yellow/red based on thresholds.
2026-03-20 05:45:51 +00:00
you
11b398cfe1
feat: stale-while-revalidate cache + /api/health telemetry
...
Cache: entries stay valid for 2× TTL as stale. First request after
TTL serves stale data while recompute runs (guarded: one at a time).
No more cache stampedes.
/api/health returns:
- Process memory (RSS, heap)
- Event loop lag (p50/p95/p99/max, sampled every 1s)
- Cache stats (hit rate, stale hits, recomputes)
- WebSocket client count
- Packet store size
- Recent slow queries
2026-03-20 05:43:32 +00:00
you
f4ac789ee9
release: v2.1.0 — Performance
...
Two-layer caching: in-memory packet store + TTL response cache.
All packet reads from RAM, SQLite write-only.
Highlights:
- Bulk Health: 7,059ms → 1ms (7,059×)
- Node Analytics: 381ms → 1ms (381×)
- Topology: 685ms → 2ms (342×)
- RF Analytics: 253ms → 1ms (253×)
- Channels: 206ms → 1ms (206×)
- Node Health/Detail: 133-195ms → 1ms
Architecture:
- In-memory packet store with Map indexes (byNode, byHash, byObserver)
- Ring buffer with configurable max (1GB default, ~2.3M packets)
- Smart cache invalidation (packet bursts don't nuke analytics)
- Pre-warm all heavy endpoints on startup
- Eliminated every LIKE '%pubkey%' full-table scan
- All TTLs configurable via config.json
- A/B benchmark script included
- Favicon added
2026-03-20 05:38:23 +00:00
you
2a2a80b4ea
chore: add A/B benchmark script, remove worker thread experiments
2026-03-20 05:37:08 +00:00
you
6dd077be13
feat: add favicon — mesh network icon (SVG + ICO)
2026-03-20 05:36:32 +00:00
you
2b3597dff1
fix: null guard getElementById in animatePacket
...
Elements don't exist yet when replayRecent fires during init.
2026-03-20 05:34:04 +00:00
you
77b7b218b1
perf: channels endpoint — single pass, no sort, no double filter
...
Was doing two pktStore.filter() calls + sort on each. Now single
loop over all packets with inline type check.
2026-03-20 05:31:03 +00:00