- Fix __publicField runtime error from pre-compiled npm packages by
defining the helper in vite optimizeDeps esbuildOptions
- Compact attribution control on LocationMap thumbnails so it doesn't
dominate small maps
- Remove duplicate accuracy overlay in MapReportPacket (caption +
accuracy div both at bottom-0 overlapping); accuracy still shown
in the KeyValuePair section below
- Fix NodeLocationMap height: min-h-[300px] doesn't give ReactMap a
resolved height, changed to h-[300px]
- Add short name lookup to TraceroutePacket hops (same pattern as
NeighborInfoPacket)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the flat circular buffer with NodeAwareCache, a smarter eviction
strategy for historical mesh packet data:
- Packets younger than 1 hour are never evicted (recent traffic preserved)
- Under pressure, evict from the lowest-priority type first (neighbor-info
outlasts node-info; chat messages outlast everything)
- Within a priority tier, evict from the most recently active source node —
that node will resend soonest, so its old packet is cheapest to lose
(Bélády approximation; protects flaky/distant node history)
- Node retention window still applies: silent nodes' packets are excluded
from GetAll and pruned proactively before priority eviction runs
Also:
- Add --cache-retention flag (default 3h) and raise --cache-size default to 5000
- Fix decoder error strings (replace verbose Go errors with short codes)
- Add HTTP security headers middleware to server
- Fix broker dispatchLoop deadlock on source channel close
- Fix make gen-proto scanning web/node_modules for .proto files
- Fix tools target always reinstalling protoc-gen-go (handles stale arch binary)
- Move server port from 8080 to 5446; update Dockerfile, docker-compose, moat.yaml
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migrate all three map components (Map, GoogleMap, NetworkMap) to MapLibre GL JS
- Extract shared CARTO_DARK_STYLE constants into lib/mapStyle.ts
- Move buildCircleCoords to lib/mapUtils.ts (was duplicated across components)
- Rename exports: Map → LocationMap, GoogleMap → NodeLocationMap
- Remove dead props (width, height, nightMode) from LocationMap interface
- Lazy-mount GL contexts via IntersectionObserver to prevent WebGL exhaustion
- Fix Math.spread RangeError in NetworkMap bounds calculation
- Remove showLinks conditional render in favour of visibility layout property
- Remove cursor state; set canvas cursor style directly on map interactions
- Remove Google Maps API key env vars from .env.example and .env.local
- Move Vite dev server to port 5747 (avoids cached redirect on 3000)
- Fix CORS/404: set VITE_API_BASE_URL="" so browser uses Vite proxy
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Convert plain function declarations inside component body to useCallback
with correct deps, eliminating the eslint-disable-react-hooks banner.
Extract buildMarkerContent to module level (pure, no state/refs).
Reorder fitMapToBounds before resetAutoZoom to avoid TDZ reference.
Replace innerHTML SVG in marker with DOM-API construction.
Replace showInfoWindow innerHTML template with .textContent DOM APIs
to eliminate XSS risk from node name/status fields.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove unused mustParseDuration from main.go
- Replace http.Error calls after SSE headers with plain returns;
skip bad packets instead of killing the stream on marshal error
- Change processedPackets/seenPackets from boolean to timestamp values
and prune entries older than 24h on each packet to prevent unbounded
memory growth in long-running sessions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers link inference from traceroute, zero-hop MQTT, NeighborInfo,
and relay_node fields. Includes multi-gateway correlation, hop bounding,
SNR-colored polyline rendering on the map, and node detail connections.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Split routers on dashboard and extend retention periods
- Add Router node type with 12-hour stale timeout (vs 30 min for regular nodes)
- Create RouterList component to display router nodes separately
- Update NodeList to filter out routers (similar to gateways)
- Add yellow color scheme for router nodes to distinguish from gateways (green) and nodes (blue)
- Extend mesh traffic retention across the board:
- Client-side packet age filter: 12h → 24h
- Broker cache size: 50 → 200 packets
- Messages per channel: 100 → 500
* Update regular node activity threshold to 60 minutes
* Fix TypeScript errors in router filtering logic
* Fix docker-build to use buildx explicitly with --load flag
* Add default empty value for MESHSTREAM_GOOGLE_MAPS_API_KEY in docker-build
* Restructure docker buildx command to fix path argument parsing
* Remove trailing backslash before build context path in docker-build
* Quote build args and separate path argument in docker-build