Packet Deduplication
Normalized packet storage: each unique transmission is stored once with linked observation records from every observer that saw it.
Highlights
- 8.19× dedup ratio on production — 117K observation rows → 14K unique transmissions
- New schema:
transmissionstable (unique packets) +observationstable (per-observer sightings) - 👁 Observation badges on packets page showing how many observers saw each packet
- Deduped API responses — packets endpoint returns unique transmissions by default
?expand=observationsquery param for full observation detail- Live map deeplinks — node detail panel links through to full detail, observer pages, and filtered packets
Migration
Existing databases need a one-time migration:
node scripts/migrate-dedup.js /path/to/meshcore.dbThe migration is non-destructive — the original packets table is preserved. New data is dual-written to both old and new tables.
API Changes
- Health endpoints now return
totalTransmissionsandtotalObservationsalongside legacytotalPackets - Packets API returns transmissions (1 row per unique packet) instead of inflated observations
- WebSocket broadcasts include
observation_count
Bug Fixes
- Packet expand showing only collapsed row instead of observations
- Live page "Heard By" showing "undefined pkts"
- Recent packets deeplinks not filtering correctly
- CI deploy workflow missing Node.js setup