mirror of
https://github.com/yellowcooln/meshcore-mqtt-live-map.git
synced 2026-04-20 23:23:36 +00:00
chore: bump version and doc propagation/peers updates
This commit is contained in:
parent
3f61aa79ed
commit
5e216ff3de
12 changed files with 86 additions and 16 deletions
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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`).
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
1.0.5
|
||||
1.0.6
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
7
docs.md
7
docs.md
|
|
@ -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 24‑hour 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).
|
||||
|
|
|
|||
2
howto.md
2
howto.md
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue