diff --git a/AGENTS.md b/AGENTS.md index cc05035..174744d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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). diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index d3d815d..a803d1f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -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`). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2d59438..6c0360b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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. diff --git a/README.md b/README.md index 13cdd8d..20c8d9d 100644 --- a/README.md +++ b/README.md @@ -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  @@ -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 diff --git a/VERSION.txt b/VERSION.txt index 90a27f9..af0b7dd 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -1.0.5 +1.0.6 diff --git a/VERSIONS.md b/VERSIONS.md index 18b74fb..42455a9 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -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) diff --git a/backend/static/app.js b/backend/static/app.js index 59a886c..21fd8cf 100644 --- a/backend/static/app.js +++ b/backend/static/app.js @@ -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); diff --git a/backend/static/index.html b/backend/static/index.html index bdb1bdc..343b407 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -163,6 +163,7 @@