* Fix network map mobile overflow and infer MQTT hops from SNR=0
- Add min-h-0 and flex-shrink-0 to map layout so legend/actions don't
overflow the viewport on mobile
- Infer viaMqtt=true for traceroute hops with SNR exactly 0
- Change MQTT hop color from purple to orange across map, legend, and
node detail badges
https://claude.ai/code/session_01Ffqq7YPCJE28uUFR88eK7C
* Revert MQTT color to purple; keep SNR=0 MQTT inference
The color change was unintended — MQTT hops should stay purple. The
SNR=0 inference in traceroute processing correctly marks those hops
as viaMqtt so they render as purple dashed lines.
https://claude.ai/code/session_01Ffqq7YPCJE28uUFR88eK7C
* Fix test setup: mock URL.createObjectURL for maplibre-gl
maplibre-gl calls URL.createObjectURL during import for its worker
setup, which doesn't exist in jsdom. Add the mock to test setup.
https://claude.ai/code/session_01Ffqq7YPCJE28uUFR88eK7C
* Run go fmt on unformatted files
https://claude.ai/code/session_01Ffqq7YPCJE28uUFR88eK7C
---------
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>
* 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