ITADN
MeshAddicts/meshinfo

版本发布 8

v4.3.4
? · 2026-07-02

## MeshInfo 4.3.4 Patch release focused on the map's spiderfy (overlapping-marker fan-out) behavior and altitude data accuracy. ### Map — spiderfy overhaul (#514) Expanded cluster/stack markers no longer collapse on their own. Previously, fans could disappear moments after opening — triggered by cursor movement or live data updates — making individual nodes hard to select. - **Fans you open by clicking now stay open** until you select a node, click away, press Escape, or zoom out below where you opened them. Background reconcile passes (hover repaints, live SSE data ticks) can no longer tear them down. - **Clicking a fanned marker reliably selects it.** Fan-leaf clicks now take priority over the cluster donut and stacked originals rendered underneath — no more selection being wiped, the details panel closing, or the camera zooming away right after a click. Fan labels are clickable too. - **Dismissal now sticks in both clustering modes.** Clicking empty space or pressing Escape remembers what you closed, so the auto pass can't immediately re-open it (previously cluster-mode fans popped straight back open). - **Re-clicking a fanned cluster's donut toggles the fan closed.** - Fixed races where a slow cluster lookup or a stale animation frame could replace or destroy a fan mid-flight, sometimes leaving no fan at all. - Fan geometry corrected for MapLibre 5 (512px world tile) with cos(lat) compensation — fans render at their intended size and stay round at all latitudes. - Switching basemaps or leaving the map page no longer leaves a phantom fan that silently disabled auto-spiderfy until reload. ### Nodes — altitude accuracy - Altitude datum and provenance (HAE, geoidal separation, location/altitude source) are now persisted from position packets; the node panel and RF tools (LOS, scan, coverage merge) normalize HAE→MSL instead of mixing datums. - The "suspect altitude" flag is now gated on position precision, eliminating false warnings for nodes with coarse/truncated positions. - Schema: four new `node_positions` columns, applied automatically on startup (`ADD COLUMN IF NOT EXISTS`) — no manual migration needed. ### Dependencies - Frontend dependency refreshes (#501, #507, #510–#513), including undici 7.28.0 and @babel/core 7.29.7. - emscripten/emsdk Docker tag → v6.0.1 (#509); GitHub Actions updates (#502). **Full changelog:** https://github.com/MeshAddicts/meshinfo/compare/v4.3.3...v4.3.4

v4.3.0
? · 2026-06-08

# v4.3.0 The map comes alive: real-time packet animation, a live traceroute tracer, and per-node/cluster liveness — all driven by the existing SSE stream. ## Highlights - **Live packet arcs.** Each received packet animates a comet from the transmitter to the gateway(s) that actually heard it — real `from → sender` RF paths, colored by packet type and weighted by signal strength. On by default; toggle in Settings → Animations. - **Live traceroute tracer.** Traceroutes replay as a comet hopping node-to-node along the real discovered route. ## Added - Packet-arc animation layer driven by the live `/v1/events` stream: per-transmission fan-in (deduped across gateways), packet-type color key, and cluster-aware endpoints (arcs snap to the cluster a node is in). - Traceroute multi-hop path animation, including a new `traceroute` SSE event from the backend. - Node activity sparkline in the node details panel (last 15 minutes; seeded from packet history, then live). - Settings → Animations: master on/off for all live map motion (default on). ## Changed - Map legend refreshed: live-packet type colors, node recency, and traceroute entries; redundant entries removed. ## Performance - Single self-stopping WebGL animation layer. - Vsync-aligned (requestAnimationFrame) pacing and batched GPU uploads to eliminate comet stutter on busy meshes; 30fps cap keeps the UI responsive. - Comet travel is constant on-screen speed regardless of zoom or distance. - Cluster donuts re-drape terrain only on camera movement. - Honors `prefers-reduced-motion`.

v3.9.1
? · 2026-05-20

## What's Changed * chore(deps): update dependency eslint-plugin-simple-import-sort to v13 by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/431 * fix(nodes): scope click-outside deselect to desktop so mobile details sheet taps don't clear selection by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/470 **Full Changelog**: https://github.com/MeshAddicts/meshinfo/compare/v3.9.0...v3.9.1

v3.9.0
? · 2026-05-16

### Bug fixes **MQTT decoder** - Fixes the "Unknown" nodes class of bug: malformed packets used to crash a handler, propagate up through the aiomqtt loop, and drop other in-flight messages — including the very NODEINFOs that would have named those nodes. All six handlers now have defensive guards behind a per-handler safe-wrap. - Decoder hardened against missing `User.id`, missing `from`, partial JSON payloads, and stale gateway IDs. - Canonical node-id normalization: int from protobuf, string from JSON, uppercase, `!`-prefixed and short hex all collapse to one canonical 8-char lowercase form. Rejects out-of-uint32 ints and embedded `!` characters. **Coverage map** - Antimeridian-crossing bboxes now fetch tiles correctly across all four sources (landcover / canopy / buildings / Tilezen DEM). East-of-seam regions no longer render empty. - Origin pixel uses the real link budget instead of a hardcoded 50 dB, so the "Link budget fails everywhere" panel warning fires correctly when configured TX/sensitivity can't close a link. - `MapScanPanel`: all hooks called before early returns (React rules-of-hooks). - Coverage detail constants extracted from the panel. **API** - `/v1/nodes/{id}/...` lookups for all-digit hex node IDs (e.g. `99005060`) now resolve to the right row instead of an `int()`-converted decimal interpretation. Same fix that was applied to the storage layer in February now applied here. - `CORS` parses `ALLOW_ORIGINS` correctly when set (and skips middleware cleanly when unset). Stray quote chars from docker-compose YAML are stripped. - Bad `int()` query params return `400`, not `500`, on `/v1/nodes`, `/v1/messages`, `/v1/mqtt_messages`. - Null-Island (`lat=0&lon=0`) static maps no longer rejected. - Consistent `!`-prefix handling across all `/v1/nodes/{id}/*` routes via a shared coercion helper. - Short hex inputs (e.g. `abc`) are left-padded to the 8-char schema so they actually match the row. **Postgres / storage** - Postgres pool defaults aligned to `1/5` across `DEFAULT_CONFIG`, `config.toml.sample`, and the asyncpg fallback. Operators not setting the keys no longer silently get `5/20`. - Background `_backfill_mqtt_node_ids` task is tracked and cancelled before the pool closes, eliminating `InterfaceError: pool is closing` on container restart. - `schema.sql` resolved relative to its module so the process no longer depends on the working directory. - `find_nodes_needing_enrichment` no longer issues an N+1 `get_node_cached()` per row. - Stats labels corrected for Postgres-backed totals; modem-preset card populated. **MQTT pipeline plumbing** - Geocoding offloaded to a worker thread; no longer stalls the asyncio loop on every new-position node. - Node pruning moved from per-packet to a 60 s periodic background task. - Inner MQTT reconnect loop dropped; `main.py`'s `supervise()` is the sole retry policy with proper exponential backoff. - Discord bridge backpressure now logs a WARNING every 100 dropped events instead of silently dropping. - Geocoding/enrichment writes no longer leak into the raw `mqtt_messages` log (deep-copy of `position` in `update_node`). **Frontend** - `NodesList` no longer re-renders 600+ Virtuoso rows per second on the wall-clock tick. A localized `TimeTickerProvider` + memoized `NodeRow` mean only the relative-time span re-renders. - Avatar sizing actually works (the previous `w-${size}` template string wasn't visible to Tailwind's JIT). - Caddy proxy: `/tiles/*` and `/api/tiles/*` correctly reverse-proxy to the backend. ### Enhancements **Enrichment** - New multi-provider list at `server.enrich.providers = ["bayme", ...]`. The legacy single-string `server.enrich.provider` is still accepted (`bayme` upgrades; the dead `world.meshinfo.network` is dropped with a warning). - URL templates supported for arbitrary upstream MeshInfo instances: `"https://other.meshinfo.example/api/v1/nodes?ids={ids}"`. Missing `{ids}` placeholder is rejected at startup. - Per-request timeout (10 s) and a 10-failure circuit breaker per cycle so a downed provider doesn't stall enrichment for hours. - Per-cycle INFO summary log; WARNING on full failure ("0/N requests succeeded — upstream may be unreachable"). - ±10 % jitter on the supervised interval so multiple deployments don't synchronize their hits. - Previous 200-node cap is gone — full backfill is bounded by pacing now. **Bot** - Bridge node cache simplified: no more FIFO-disguised-as-LRU duplicate of the storage cache. - Discord bot `base_url` access hardened against missing/None config. **Build & infra** - Backend Dockerfile reordered so the pip layer caches across source-only changes. - `requirements.txt` pinned to current-major ranges (was unpinned). - Prod compose gained a `meshinfo` healthcheck and `depends_on: condition: service_healthy` for postgres + meshinfo so Caddy doesn't race startup. - Redundant `ci.yml` deleted; `yarn build` (asset / dynamic-import check) folded into `tests.yml`. - `.dockerignore` expanded to keep `.git`, `tests`, `docs`, `*.md`, etc. out of the image. ### Internal cleanup - Removed the no-op `data_store.save()` tick, four orphan postgres `load_*` methods (~250 lines), commented-out `bot.discord.main()`, dead module-level encryption keys, and `'since': now - now` defaults from the in-memory→Postgres migration. - `_JSONDecoder` only strips `!` from id-style keys (id / sender / from / to / gateway); free-form text containing `!` is preserved. - `range_seconds` for `/v1/chat?range=all` no longer silently downgrades to 24 h. ### Docs - README + CONTRIBUTING updated to Python 3.14 / Node 25 / MapLibre GL. - `API.md` filled in with the actual endpoint reference (was "Coming soon"). - `schema.sql` header updated to reflect the Postgres-only storage model. ### Tests - Test suites grew from **4 backend / 106 frontend** to **87 backend / 110 frontend**, all behavioral. New coverage for the MQTT handlers, node-id normalization, enrichment providers, API helpers, and antimeridian tile fetch. ### Upgrade notes - No required config changes. Operators can update at their convenience. - If your `config.toml` still has `server.enrich.provider = "world.meshinfo.network"`, you'll see a one-time WARNING on startup; consider switching to `providers = ["bayme"]` (or another working MeshInfo URL). Enrichment is otherwise no-op until you do. - Legacy `storage.read_from` / `storage.write_to` keys in `config.toml` are now ignored; remove them at your convenience. - Existing duplicate node rows from before the storage-layer hex/decimal fix (Feb 27) become naturally unreachable through the API in 3.9.0. They'll age out of the 7-day default window, or you can `DELETE FROM nodes WHERE ...` to clean up immediately. **Full changelog**: https://github.com/MeshAddicts/meshinfo/compare/v3.8.1...v3.9.0

v3.3.5
? · 2026-04-03

## What's Changed * fix: truncate gateway lists at line boundaries to prevent broken markdown links by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/387 * build(deps): bump brace-expansion from 2.0.2 to 2.0.3 in /frontend by @dependabot[bot] in https://github.com/MeshAddicts/meshinfo/pull/388 * build(deps): bump minimatch from 9.0.5 to 9.0.9 in /frontend by @dependabot[bot] in https://github.com/MeshAddicts/meshinfo/pull/389 * build(deps-dev): bump vite from 7.3.1 to 8.0.2 in /frontend by @dependabot[bot] in https://github.com/MeshAddicts/meshinfo/pull/376 * fix: use Vite env, add mosquitto.conf.sample, update README by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/390 * build(deps-dev): bump typescript from 5.9.3 to 6.0.2 in /frontend by @dependabot[bot] in https://github.com/MeshAddicts/meshinfo/pull/375 * fix: calculate hops_away from protobuf for correct gateway hop grouping in Discord bot by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/391 * fix: improve gateway display layout, add metrics, and fix log level filtering for Discord integration by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/392 * chore: Configure Renovate by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/395 * chore: enable Renovate automerge for minor and patch updates by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/397 * chore: add node-version group and enable Renovate self-merge by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/405 * chore(deps): update dependency python to v3.14.3 by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/400 * chore(deps): update frontend-deps by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/398 * chore: add automergeSchedule to allow merging outside weekend window by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/406 * chore: scope node-version automerge to minor/patch updates only - RenovateBot by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/408 * chore(deps): update node-version by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/407 * chore(deps): update dependency @vitejs/plugin-react to v6 by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/402 * Commit title: chore: align .nvmrc and .tool-versions to node 25.8.2 by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/409 * chore(deps): update node-version to v25.9.0 by @renovate[bot] in https://github.com/MeshAddicts/meshinfo/pull/411 * feat: Meshinfo Discord bot: gateway detail button, full-size position maps, and topnodes leaderboard fixes by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/412 ## New Contributors * @renovate[bot] made their first contribution in https://github.com/MeshAddicts/meshinfo/pull/395 **Full Changelog**: https://github.com/MeshAddicts/meshinfo/compare/v3.3.4...v3.3.5

v3.3.2
? · 2026-03-27

## What's Changed * fix: Mapbox tile fallback and size mismatch for static map generation via Discord bot by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/381 **Full Changelog**: https://github.com/MeshAddicts/meshinfo/compare/v3.3.1...v3.3.2

v3.0.2预发布
? · 2026-03-19

> ⚠️ **Breaking Change** — Requires PostgreSQL and a `config.toml` file as of `v3.0.0` > Existing deployments using JSON file storage or `config.json` **will not start** after upgrading until migrated. ## What's Changed * Runtime env injection for frontend configuration by @SimmerV in https://github.com/MeshAddicts/meshinfo/pull/360 **Full Changelog**: https://github.com/MeshAddicts/meshinfo/compare/v2.3.0...v3.0.2

v0.0.336
? · 2024-09-12

## What's Changed * Dependabot for all package types by @vidplace7 in https://github.com/MeshAddicts/meshinfo/pull/88 * Bump @types/node from 22.5.1 to 22.5.4 by @dependabot in https://github.com/MeshAddicts/meshinfo/pull/93 * Bump actions/checkout from 2 to 4 by @dependabot in https://github.com/MeshAddicts/meshinfo/pull/91 * Bump actions/setup-node from 2 to 4 by @dependabot in https://github.com/MeshAddicts/meshinfo/pull/89 * Bump docker/metadata-action from 4 to 5 by @dependabot in https://github.com/MeshAddicts/meshinfo/pull/90 * Bump docker/build-push-action from 5 to 6 by @dependabot in https://github.com/MeshAddicts/meshinfo/pull/92 * Avatar loading & retrying by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/99 * fix node neighbors, update some styling on the main node page by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/105 * Fix via column by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/103 * Add mobile menu icon by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/104 * Remove device role if role not sent (existing nodes) by @afairclo in https://github.com/MeshAddicts/meshinfo/pull/101 * gary, you wanted dark mode? by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/106 * 2024-09-12 fixes by @daviesgeek in https://github.com/MeshAddicts/meshinfo/pull/107 ## New Contributors * @vidplace7 made their first contribution in https://github.com/MeshAddicts/meshinfo/pull/88 * @dependabot made their first contribution in https://github.com/MeshAddicts/meshinfo/pull/93 **Full Changelog**: https://github.com/MeshAddicts/meshinfo/compare/v0.0.329...v0.0.336