chore: bump version and doc propagation/peers updates

This commit is contained in:
yellowcooln 2026-01-13 21:13:13 +00:00
parent 3f61aa79ed
commit 5e216ff3de
12 changed files with 86 additions and 16 deletions

View file

@ -1,6 +1,6 @@
# Repository Guidelines
Current version: `1.0.5` (see `VERSIONS.md`).
Current version: `1.0.6` (see `VERSIONS.md`).
## Project Structure & Module Organization
- `backend/app.py` wires FastAPI routes, MQTT lifecycle, and websocket broadcast flow.
@ -17,7 +17,7 @@ Current version: `1.0.5` (see `VERSIONS.md`).
- `docker-compose.yaml` runs the service as `meshmap-live`.
- `data/` stores persisted state (`state.json`), route history (`route_history.jsonl`), and optional role overrides (`device_roles.json`).
- `.env` holds dev runtime settings; `.env.example` mirrors template defaults.
- `VERSION.txt` tracks the current version (now `1.0.5`); append changes in `VERSIONS.md`.
- `VERSION.txt` tracks the current version (now `1.0.6`); append changes in `VERSIONS.md`.
## Build, Test, and Development Commands
- `docker compose up -d --build` rebuilds and restarts the backend (preferred workflow).

View file

@ -1,7 +1,7 @@
# Architecture Guide
This document explains how the Mesh Live Map codebase is organized and how the components interact.
Current version: `1.0.5` (see `VERSIONS.md`).
Current version: `1.0.6` (see `VERSIONS.md`).
## High-Level Overview
@ -355,4 +355,4 @@ npx eslint backend/static/app.js
```
Versioning:
- See `VERSIONS.md` for the changelog; `VERSION.txt` mirrors the latest entry (`1.0.5`).
- See `VERSIONS.md` for the changelog; `VERSION.txt` mirrors the latest entry (`1.0.6`).

View file

@ -8,7 +8,7 @@ Thanks for helping improve the MeshCore Live Map. This repo is intentionally lig
3) Verify: `curl -s http://localhost:8080/snapshot`
## Versioning
- Current version: `1.0.5` (see `VERSIONS.md`).
- Current version: `1.0.6` (see `VERSIONS.md`).
- Update `VERSION.txt` when adding features.
- Append a new section to `VERSIONS.md` describing the change set.

View file

@ -1,6 +1,6 @@
# Mesh Live Map
Version: `1.0.5` (see [VERSIONS.md](VERSIONS.md))
Version: `1.0.6` (see [VERSIONS.md](VERSIONS.md))
Live MeshCore traffic map that renders nodes, routes, and activity in real time on a Leaflet map. The backend subscribes to MQTT over WebSockets + TLS, decodes MeshCore packets with `@michaelhart/meshcore-decoder`, and streams updates to the browser via WebSockets.
@ -8,8 +8,6 @@ Live example sites:
- https://live.bostonme.sh/ - Greater Boston Mesh Map
- https://map.eastmesh.au/ - Aus Eastern Mesh Live Map
- https://mesh-map.e-l33t.org/ - NSW Mesh - Live Mesh Traffic Map
- https://livemap.wcmesh.com/ - West Coast Mesh Live Map
- https://mapa.meshcore.cz - Czech Republic Live Map
![Live map preview](example.gif)
@ -23,7 +21,7 @@ Live example sites:
- Heat map for the last 10 minutes of message activity (includes adverts)
- Persistent device state and optional trails (disable with `TRAIL_LEN=0`)
- 24-hour route history tool with volume-based coloring, click-to-view packet details, a heat-band slider, and a link-size slider
- Peers tool showing incoming/outgoing neighbors with on-map lines
- Peers tool showing incoming/outgoing neighbors with on-map lines (blue = incoming, purple = outgoing)
- Coverage layer from a coverage map API (button hidden when not configured)
- Update available banner (git local vs upstream) with dismiss
- UI controls: legend toggle, dark map, topo map, units toggle (km/mi), labels toggle, hide nodes, heat toggle
@ -35,7 +33,7 @@ Live example sites:
- Embeddable metadata (Open Graph/Twitter tags) driven by env vars
- Preview image renders in-bounds device dots for shared links
- Route pruning via closest-hop selection + max hop distance (configurable)
- Propagation panel lives on the right and keeps the last render until you generate a new one
- Propagation panel lives on the right and keeps the last render until you generate a new one (click an origin marker to remove it)
- Installable PWA (manifest + service worker) for Add to Home Screen
- Click the logo to hide/show the left HUD panel while tools stay open

View file

@ -1 +1 @@
1.0.5
1.0.6

View file

@ -1,10 +1,16 @@
# Versions
## v1.0.6 (01-13-2026)
- Peers panel now labels line colors (blue = incoming, purple = outgoing).
- Propagation origins can be removed individually by clicking their markers.
- HUD scrollbars styled in Chromium for a cleaner look.
- Bump PWA cache version to force asset refresh.
- Suggestions from Zaos.
## v1.0.5 (01-13-2026)
- Resolve short-hash collisions by choosing the closest node in the route chain (credit: https://github.com/sefator)
- Drop hops that exceed `ROUTE_MAX_HOP_DISTANCE` to avoid unrealistic jumps
- Add `ROUTE_INFRA_ONLY` to restrict route lines to repeaters/rooms
- New envs: `ROUTE_MAX_HOP_DISTANCE`, `ROUTE_INFRA_ONLY`
- Document new route env defaults in `.env.example`
## v1.0.4 (01-13-2026)

View file

@ -1768,6 +1768,25 @@
propagationOriginMarkers.clear();
}
function removePropagationOrigin(origin) {
if (!origin) return;
const key = getPropagationOriginKey(origin);
if (key && propagationOriginMarkers.has(key)) {
propagationLayer.removeLayer(propagationOriginMarkers.get(key));
propagationOriginMarkers.delete(key);
}
propagationOrigins = propagationOrigins.filter((item) => getPropagationOriginKey(item) !== key);
updatePropagationSummary();
if (!propagationOrigins.length) {
setPropStatus('Select a node or click the map to set a transmitter.');
} else {
markPropagationDirty('Origin removed. Click "Render prop" to update.');
}
if (propagationRasterMeta && !propagationNeedsRender) {
updatePropagationStatusFromRaster();
}
}
function upsertPropagationOriginMarker(origin) {
const key = getPropagationOriginKey(origin);
if (!key) return;
@ -1779,6 +1798,14 @@
fillOpacity: 0.95,
weight: 2
}).addTo(propagationLayer);
marker.on('click', (ev) => {
if (ev && ev.originalEvent) {
ev.originalEvent.preventDefault();
ev.originalEvent.stopPropagation();
}
L.DomEvent.stop(ev);
removePropagationOrigin(origin);
});
propagationOriginMarkers.set(key, marker);
} else {
const marker = propagationOriginMarkers.get(key);

View file

@ -163,6 +163,7 @@
<div class="small"><strong>Node peers</strong></div>
<div class="small" id="peers-status">Select a node to view peers.</div>
<div class="small" id="peers-meta"></div>
<div class="small">Blue lines = incoming. Purple lines = outgoing.</div>
<div class="peer-section">
<div class="small peer-heading">Incoming (heard from)</div>
<div class="peer-list" id="peers-in"></div>
@ -235,6 +236,7 @@
<span>WebGPU (experimental)<span class="prop-hint" title="GPU-accelerated render (terrain off)" data-tooltip="GPU-accelerated render (terrain off)">?</span></span>
<input id="prop-webgpu" type="checkbox" />
</label>
<div class="small">Tip: click an origin marker to remove it.</div>
<button class="map-toggle" id="prop-clear-origins" type="button">Clear origins</button>
<label class="prop-field">
<span>Auto resolution<span class="prop-hint" title="scale grid to stay within target cells" data-tooltip="scale grid to stay within target cells">?</span></span>

View file

@ -16,6 +16,40 @@
overflow-x: hidden;
box-sizing: border-box;
}
.hud,
.prop-panel,
.peers-panel,
.node-search-results {
scrollbar-width: thin;
scrollbar-color: rgba(148,163,184,.7) rgba(15,23,42,.35);
}
.hud::-webkit-scrollbar,
.prop-panel::-webkit-scrollbar,
.peers-panel::-webkit-scrollbar,
.node-search-results::-webkit-scrollbar {
width: 10px;
}
.hud::-webkit-scrollbar-track,
.prop-panel::-webkit-scrollbar-track,
.peers-panel::-webkit-scrollbar-track,
.node-search-results::-webkit-scrollbar-track {
background: rgba(15,23,42,.35);
border-radius: 8px;
}
.hud::-webkit-scrollbar-thumb,
.prop-panel::-webkit-scrollbar-thumb,
.peers-panel::-webkit-scrollbar-thumb,
.node-search-results::-webkit-scrollbar-thumb {
background: rgba(148,163,184,.7);
border-radius: 8px;
border: 2px solid rgba(15,23,42,.35);
}
.hud::-webkit-scrollbar-thumb:hover,
.prop-panel::-webkit-scrollbar-thumb:hover,
.peers-panel::-webkit-scrollbar-thumb:hover,
.node-search-results::-webkit-scrollbar-thumb:hover {
background: rgba(226,232,240,.85);
}
.hud-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.hud-brand { display: flex; align-items: center; gap: 8px; }
.hud-toggle {

View file

@ -1,4 +1,4 @@
const CACHE_NAME = 'meshmap-pwa-v3';
const CACHE_NAME = 'meshmap-pwa-v4';
const CORE_ASSETS = ['/', '/manifest.webmanifest'];
self.addEventListener('install', (event) => {

View file

@ -1,13 +1,13 @@
# Mesh Map Live: Implementation Notes
This document captures the state of the project and the key changes made so far, so a new Codex session can pick up without losing context.
Current version: `1.0.5` (see `VERSIONS.md`).
Current version: `1.0.6` (see `VERSIONS.md`).
## Overview
This project renders live MeshCore traffic on a Leaflet + OpenStreetMap map. A FastAPI backend subscribes to MQTT (WSS/TLS), decodes MeshCore packets using `@michaelhart/meshcore-decoder`, and broadcasts device updates and routes over WebSockets to the frontend. Core logic is split into config/state/decoder/LOS/history modules so changes are localized. The UI includes heatmap, LOS tools, map mode toggles, and a 24hour route history layer.
## Versioning
- `VERSION.txt` holds the current version string (`1.0.5`).
- `VERSION.txt` holds the current version string (`1.0.6`).
- `VERSIONS.md` is an append-only changelog by version.
## Key Paths
@ -66,6 +66,7 @@ This project renders live MeshCore traffic on a Leaflet + OpenStreetMap map. A F
- History legend swatch is hidden unless the History tool is active.
- Peers tool shows incoming/outgoing neighbors for a selected node, with counts and percentages pulled from route history.
- Peers tool skips nodes listed in `MQTT_ONLINE_FORCE_NAMES` (observer listeners).
- Peers panel legend clarifies line colors (incoming = blue, outgoing = purple).
- Coverage tool only appears when `COVERAGE_API_URL` is set; it fetches tiles on demand.
- Trail text in the HUD is only shown when `TRAIL_LEN > 0`; `TRAIL_LEN=0` disables trails entirely.
- Hide Nodes toggle hides markers, trails, heat, routes, and history layers.
@ -73,6 +74,7 @@ This project renders live MeshCore traffic on a Leaflet + OpenStreetMap map. A F
- HUD logo uses `SITE_ICON`; if unset or broken it falls back to a small “Map” badge so the toggle still works.
- History line weight was reduced for improved readability.
- Propagation overlay keeps heat/routes/trails/markers above it after render; the panel lives on the right and retains the last render until you generate a new one.
- Propagation origin markers can be removed individually by clicking them.
- Heatmap includes all route payload types (adverts are no longer skipped).
- MQTT online status shows as a green marker outline and popup status; it uses `mqtt_seen_ts` from `/status` or `/packets` topics (configurable).
- `MQTT_ONLINE_FORCE_NAMES` can force named nodes to show as MQTT online regardless of last seen.
@ -86,6 +88,7 @@ This project renders live MeshCore traffic on a Leaflet + OpenStreetMap map. A F
- Update banner dismissal relies on `.hud-update[hidden]` to ensure the banner actually disappears.
- URL params override stored settings: `lat`, `lon`/`lng`/`long`, `zoom`, `layer`, `history`, `heat`, `labels`, `nodes`, `legend`, `menu`, `units`, `history_filter`.
- Service worker uses `no-store` for navigation requests so env-driven UI toggles (like the radius ring) update without clearing site data.
- HUD scrollbars are custom styled in Chromium for a cleaner look.
## LOS (Line of Sight) Tool
- LOS runs **server-side only** via `/los` (no client-side elevation fetch).

View file

@ -1,7 +1,7 @@
# How-To: MQTT Broker + Live Map
This guide covers two parts: stand up a MeshCore MQTT broker and point the live map at it.
Current version: `1.0.5` (see `VERSIONS.md`).
Current version: `1.0.6` (see `VERSIONS.md`).
## 1) MQTT broker (meshcore-mqtt-broker)