Skip to content

Commit 35fd767

Browse files
Yerazeclaude
andauthored
release: v4.13.1 (version bump + docs/blog for Link Quality & 2.8 preview) (#4231)
* chore: 4.13.1 release — version bump + release blog Bump 4.13.1-rc4 → 4.13.1 across package.json, package-lock.json, desktop/package.json, desktop/src-tauri/tauri.conf.json, and helm/meshmonitor/Chart.yaml. Add the v4.13.1 release blog post (Link Quality tools + Meshtastic 2.8 early preview); news.json regenerates from it during the docs build. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018e4dtLyWeYJYJ7SbgFvGG1 * docs: bring user docs current for 4.13.1 (map analysis, link quality, 2.8 preview) Documents everything shipped since v4.13.0 that user-facing docs hadn't caught up with yet: the icon-based Map Analysis toolbar and its new Show RF/UDP/MQTT transport filter, the obscured-position marker offset and Discard Invalid Positions setting, per-theme (light/dark) tileset preferences, the Link Profile chart's map-cursor mirroring, the derived Signal Trend/Noise Floor node stats, position accuracy + location source in node popups, plain-text lat/lon/elevation in Node Details, the new Privacy (noindex/robots.txt) setting, MQTT geo-ignore observability, and a curated firmware-2.8-early-preview section (XEdDSA shield, MeshBeacon, MEDIUM_TURBO) extending the FAQ's existing 2.8 content rather than duplicating it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018e4dtLyWeYJYJ7SbgFvGG1 --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 9e4cbb2 commit 35fd767

15 files changed

Lines changed: 164 additions & 10 deletions

desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "meshmonitor-desktop",
33
"private": true,
4-
"version": "4.13.1-rc4",
4+
"version": "4.13.1",
55
"type": "module",
66
"scripts": {
77
"tauri": "tauri",

desktop/src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "MeshMonitor",
4-
"version": "4.13.1-rc4",
4+
"version": "4.13.1",
55
"identifier": "org.meshmonitor.desktop",
66
"build": {
77
"beforeBuildCommand": "",
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
id: news-2026-07-20-v4-13-1-release
3+
title: MeshMonitor v4.13.1 - Link Quality Tools & a Meshtastic 2.8 Early Preview
4+
date: '2026-07-20T16:00:00Z'
5+
category: release
6+
priority: important
7+
minVersion: 4.13.1
8+
tags: [release, link-quality, map, meshtastic-2.8, preview]
9+
---
10+
11+
MeshMonitor **v4.13.1** builds on the "one map core" foundation from 4.13 with a set of **link-quality tools** for the RF-minded, and an **early preview** of several Meshtastic 2.8 features so you can start seeing them the moment you flash a 2.8 build. There's also a firmware-quirk fix worth calling out for anyone requesting telemetry from neighbour-info nodes.
12+
13+
## Link Quality: see how your links are really doing
14+
15+
If you care about *why* a node is hard to reach — not just that it is — this release is for you.
16+
17+
- **Terrain Link Profile.** On Map Analysis, pick two nodes and get a full terrain cross-section between them: the ground profile from real elevation data, the **Fresnel zone**, and a **link budget** verdict (clear / marginal / obstructed) colored right on the graph. It auto-picks the frequency for your region, handles elevation-data voids gracefully, and the graph cursor mirrors onto the map so you can see exactly where along the path that ridge is. This is the tool for answering "would a repeater on that hill actually help?"
18+
- **Signal-trend / link-attenuation badge.** Each node now carries a derived badge summarizing whether its link is holding steady, improving, or degrading over time — an at-a-glance read on link health without digging into graphs.
19+
- **Noise Floor** is now on the Node Detail quick-stats card, alongside SNR and RSSI, so you can tell a weak-signal problem from a noisy-environment problem.
20+
- **Position accuracy & source in popups.** Node popups (map and chat) now show how precise a position is and where it came from — GPS, a fixed position, or an estimate — so you know how much to trust that dot.
21+
22+
## Map Analysis: the toolbar grew up
23+
24+
- The Map Analysis toolbar is now **icon-based**, with labels moved to tooltips — more map, less chrome.
25+
- New **Show RF / UDP / MQTT** transport toggles let you filter the map by how packets actually arrived.
26+
- **Obscured-node handling** got smarter: overlapping markers are offset only when they genuinely share a map cell, scaled by how crowded that cell is, so lone nodes stay put and dense clusters fan out cleanly.
27+
- A **"Discard invalid positions"** map setting (honored on both ingest and render), plus a pile of fixes: spiderfy no longer opens the wrong node's popup, SNR overlay dots pin to the merged marker for multi-source nodes, and route/heatmap density no longer renders for marker-less or deleted nodes.
28+
29+
## Meshtastic 2.8 — Early Preview
30+
31+
> ⚠️ **This is an early preview.** Meshtastic 2.8 has **not been officially released** — there's no 2.8 tag yet, so MeshMonitor builds this support against the firmware's development branch. Expect these features to **change as 2.8 evolves**, and treat anything here as subject to revision until the firmware ships stable.
32+
33+
With that caveat firmly in place, 4.13.1 gets a head start on 2.8 so the data shows up automatically when you run a preview build:
34+
35+
- **XEdDSA signature shield.** 2.8 can cryptographically sign packets. The Packet Monitor now decodes `MeshPacket.xeddsa_signed` and shows a 🛡️ shield next to signed packets, with the signing status persisted per packet (tri-state: unknown / unsigned / device-verified). The first signed packet from a 2.8 node will light it up.
36+
- **MeshBeacon decoding.** The new `MESH_BEACON_APP` beacons are decoded and surfaced in the Packet Monitor — beacon text plus the channel/preset it's advertising.
37+
- **MEDIUM_TURBO preset.** The new modem preset is in the preset tables, with firmware-verified channel-name derivation (which also fixed a long-standing naming bug in the older presets along the way).
38+
39+
**A firmware heads-up while you're here:** 2.8 makes **position and telemetry broadcast opt-in**, and a freshly flashed node defaults **position precision to off**. If a node goes quiet on the map or stops reporting telemetry after upgrading, that's expected 2.8 behavior — not a MeshMonitor bug. The [FAQ](/faq) has the details.
40+
41+
## Also in this release
42+
43+
- **Telemetry that survives a firmware quirk.** Some 2.x nodes with neighbour-info enabled hijack the reply to a telemetry request and send NeighborInfo instead (an upstream firmware behavior — [firmware#11071](https://github.com/meshtastic/firmware/issues/11071)). MeshMonitor now detects this and automatically retries the telemetry request, so you get the metrics you asked for instead of silence.
44+
- **Privacy toggle:** a new setting serves `X-Robots-Tag: noindex` headers and a disallow-all `robots.txt`, so a publicly-exposed dashboard can ask search engines and crawlers to stay out.
45+
- **`TRUST_PROXY` and boolean env vars** are now parsed case-insensitively — `True`, `TRUE`, and `true` all work.
46+
- **Chat timestamps** from unsynced-clock nodes no longer render back in 1970.
47+
- Plus MQTT, message, and MeshCore fixes, dependency updates, and the usual round of polish. The [full changelog](https://github.com/Yeraze/meshmonitor/blob/main/CHANGELOG.md) has every entry.
48+
49+
As always, a lot of the best fixes here started as detailed bug reports — thank you. Flash a 2.8 preview build and let us know what the shield and beacons look like in the wild.

docs/faq.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,22 @@ MeshMonitor **keeps all previously collected history** — nothing you already g
281281

282282
---
283283

284+
### What is MeshMonitor's "firmware 2.8 early preview" decode support? {#firmware-2-8-early-preview}
285+
286+
::: info Not released yet
287+
As above, firmware 2.8 is **not officially released** (latest stable is v2.7.26). MeshMonitor has started decoding a few 2.8-only wire formats ahead of release so nothing breaks the day it ships, but these are necessarily built against pre-release protobuf definitions and may still change.
288+
:::
289+
290+
A few things you may notice if you're running a 2.8 development build:
291+
292+
- **Signed-packet shield in the Packet Monitor.** Firmware 2.8 introduces an **XEdDSA** packet-signing scheme. When the connected node reports a packet as signature-verified, MeshMonitor shows a small shield icon next to it in the [Packet Monitor](/features/packet-monitor). MeshMonitor doesn't verify the signature itself — it only surfaces what the node already checked.
293+
- **MeshBeacon decoding.** 2.8 adds a periodic `MESH_BEACON_APP` broadcast that a node can use to advertise a joinable channel (name and modem preset). The Packet Monitor decodes and previews these as `[MeshBeacon: "..."]`.
294+
- **MEDIUM_TURBO modem preset.** A new 500 kHz "medium range, turbo" preset appears alongside the existing presets in configuration screens that list modem presets. See [Modem Preset](/features/device#modem-preset).
295+
296+
None of this requires any action on your part — it's read-only decode support so MeshMonitor stays useful against nodes running early 2.8 builds. Expect this section to be replaced with normal release documentation once 2.8 ships.
297+
298+
---
299+
284300
## 🔐 User Management
285301

286302
### How do I reset a user's password as an admin?

docs/features/device.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,19 @@ Predefined radio settings that balance range, speed, and reliability. All nodes
447447
- **Coding Rate**: 4/7
448448
- **Best For**: Urban deployments with moderate coverage needs
449449

450+
#### MEDIUM_TURBO
451+
452+
::: tip Firmware 2.8 early preview
453+
See [What is MeshMonitor's "firmware 2.8 early preview" decode support?](/faq#firmware-2-8-early-preview) — 2.8 is not yet officially released.
454+
:::
455+
456+
- **Range**: Medium
457+
- **Speed**: Faster than MEDIUM_FAST
458+
- **Bandwidth**: 500kHz (widest)
459+
- **Spreading Factor**: 9
460+
- **Coding Rate**: 4/5
461+
- **Best For**: Medium-range deployments that want more throughput than the 250kHz medium presets
462+
450463
#### SHORT_SLOW
451464

452465
- **Range**: Short

docs/features/global-settings.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ Individual Apprise URLs (per user, per source) are not here — users configure
4040
- MFA enforcement defaults
4141
- Rate-limiter thresholds
4242

43+
### Privacy
44+
45+
::: tip New in 4.13
46+
:::
47+
48+
- **Discourage search engine & LLM indexing** — opt-in, off by default. When enabled, MeshMonitor adds an `X-Robots-Tag: noindex, nofollow` header to every response and serves a disallow-all `/robots.txt`, asking crawlers not to index the dashboard. Both are advisory (a crawler must choose to honor them); the `/robots.txt` body is offered alongside the header because some reverse proxies (e.g. Cloudflare tunnels) strip custom response headers at the edge.
49+
4350
### System Backup / Restore
4451

4552
- Create / download / restore system backups (includes the new `sources` table)

docs/features/link-quality.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,10 @@ Smart Hops always uses actual message hop counts regardless of this setting. The
112112
Both features use the `messageHops` telemetry type, which is calculated from each incoming mesh message as `hopStart - hopLimit`. This represents the actual number of relay hops the message traversed to reach your node.
113113

114114
Link Quality additionally factors in traceroute results and encryption error events to provide a more complete reliability picture.
115+
116+
## Signal Trend badge
117+
118+
::: tip New in 4.13
119+
:::
120+
121+
Don't confuse the Link Quality score above with the **Signal Trend** badge (▲ Improving / → Stable / ▼ Degrading) shown in the [Node Details block](/features/settings#node-details-block) on the Messages page. Signal Trend answers a narrower, RF-focused question: *is this specific node's received signal getting weaker or stronger, day-over-week?* It compares the last 24 hours of RSSI (falling back to SNR when RSSI history is sparse) against the preceding 7-day baseline, and calls out separately when a drop is attributable to a rising local noise floor rather than the link itself. Link Quality, by contrast, is a broader 0-10 reliability score driven by routing (hop-count changes, traceroute failures, encryption errors) rather than raw signal strength. Use Link Quality to judge overall reliability; use Signal Trend to judge whether the RF path itself is changing.

docs/features/map-analysis.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,25 @@ Configuration is per-browser (stored in `localStorage`) and survives reloads.
2626

2727
The page is publicly accessible — but data is silently filtered by your existing per-source permissions. Sources you can't read contribute zero points; nothing renders for them and no error is shown.
2828

29+
::: tip Icon toolbar (New in 4.13)
30+
The toolbar is now icon-based rather than text-labeled — every button carries a hover tooltip (and `aria-label`) instead of a visible caption, so the same set of controls fits in a much narrower space. Behavior is unchanged; if you're looking for a control by its old label, hover the icons to find it.
31+
:::
32+
2933
## Toolbar
3034

3135
The toolbar runs across the top of the canvas. From left to right:
3236

3337
| Control | Purpose |
3438
| --- | --- |
3539
| **Source multi-select** | Pick which sources contribute to every layer. "All sources" is the default. |
40+
| **Node type filter** | Show/hide markers by role category (client, router, sensor, etc. — adapts to whichever source types are connected). |
41+
| **Transport filter (Show RF / UDP / MQTT)** | Show/hide markers by how the node's most recent packet reached MeshMonitor — over the air (**RF**), the Meshtastic multicast-UDP local transport (**UDP**), or an **MQTT** broker/bridge. Mirrors the same toggle on the Dashboard/Nodes map. A node heard through more than one transport (across sources) stays visible as long as any of its transports is enabled. |
3642
| **Search box** | Filter visible markers (and traceroute link endpoints) by name or node number. See [Node search](#node-search). |
3743
| **Node multi-select** | Pick specific nodes to emphasize. Selected nodes render at full opacity; everything else dims. "All nodes" (empty selection) is the default. See [Node selection & emphasis](#node-selection-emphasis). |
3844
| **Follow / Auto-zoom** | Keep the selected nodes framed as they move — recenter (Follow) and/or fit-to-bounds (Auto-zoom) on each update. See [Follow & Auto-zoom](#follow-auto-zoom). |
3945
| **Time slider toggle** | Show/hide the floating time-window slider. |
46+
| **Measure** | Straight-line distance between two positioned nodes. Disabled until at least two positioned nodes exist; mutually exclusive with Link Profile. |
47+
| **Link Profile** | Terrain, Fresnel clearance, and link-budget verdict between two points. See [Terrain Link Profile](#terrain-link-profile). Only shown when the server has elevation enabled. |
4048
| **Layer buttons (×8)** | Toggle each visualization layer on/off. The right-edge chevron opens a popover for layer-specific options (lookback window, sub-options). |
4149
| **Progress bar** | Shows aggregate loading state while any layer is fetching. |
4250
| **Inspector toggle** | Show/hide the right-side detail panel. |
@@ -114,10 +122,18 @@ Renders every known node from the selected sources using the same icon set as th
114122
For a node reported by more than one source, the popup includes a **"Seen by N sources"** list with a row per source that links to that source's view — matching the Unified/Dashboard map. The page is also fully multi-source-aware: a node stays visible when **any** of its reporting sources is enabled in the source filter, not only its primary source.
115123
:::
116124

125+
::: tip Discard invalid positions
126+
Whether a "Null Island" (0,0) GPS fix renders here follows the global **Discard invalid positions** setting (**Settings → Map**) — the same setting that controls whether it's stored on ingest in the first place. Out-of-range/garbage coordinates are always dropped regardless of this setting. See [Settings → Map Settings](/features/settings#map-settings).
127+
:::
128+
117129
::: tip Overlapping markers fan out (New in 4.10)
118130
When several nodes report the **same coordinates** — a shared site with multiple radios, or a cluster of nodes that inherited one position — they no longer stack into a single un-clickable marker. They **spiderfy** (fan out around the shared point) so each node is individually selectable.
119131
:::
120132

133+
::: tip Obscured-position offset (New in 4.13)
134+
A node broadcasting a reduced-precision GPS fix (Meshtastic's `precision_bits`) reports a position snapped to the center of a grid cell that can be well over 100 m across — the true position could be anywhere inside it. When **two or more** such nodes snap to the *same* cell, their markers no longer stack exactly on that center point: each is nudged to a deterministic, stable spot inside its own cell so they're individually clickable without implying a precision the node never reported. A node alone in its cell is left at the true center — nothing to declutter. The nudge distance scales with how many nodes share the cell (more crowding, more spread) and is capped so a very coarse (low-precision) fix never scatters its marker kilometers away. This is separate from the exact-coordinate spiderfy above, and from the dashed **accuracy-region** rectangle (`Show Accuracy`), which always still shows the node's true full cell.
135+
:::
136+
121137
### Traceroute paths
122138

123139
Polylines for each traceroute hop, colored by SNR. Reuses the per-segment math from the existing Traceroute Routes view. Click a segment to view the last 10 traceroutes for that path in the inspector, or open the full route history modal.
@@ -192,6 +208,8 @@ The **verdict** is computed from Fresnel-zone clearance along the path:
192208

193209
Once a verdict is available, the connecting line on the map itself recolors to match (green/amber/red) — so you can see the result without having the drawer's chart in view. It reverts to a neutral amber while no verdict is available yet (still loading, or the pair was just cleared).
194210

211+
Hovering over the chart drops a matching marker on the map at the terrain point under your cursor, so you can correlate a dip or spike in the profile with the actual location along the path. Move off the chart (or clear the pick) to remove it.
212+
195213
### Link budget inputs
196214

197215
Nine inputs drive the analysis; editing any of them recomputes instantly with no refetch (only the terrain samples require a network round-trip — everything else is client-side math):

docs/features/maps.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ Click any node marker to view detailed information:
5151
- Device role
5252
- Firmware version
5353
- Network position (hops away)
54+
- **Position accuracy** (🎯) — a human-readable estimate derived from the node's reported GPS precision (e.g. "~91 m"), shown whenever the node broadcasts a non-full precision fix
55+
- **Location source** (🛰️) — how the position was obtained: Manual, Internal GPS, or External GPS. Hidden when the node hasn't reported a source.
5456

5557
### Map Controls
5658

@@ -66,6 +68,10 @@ Click any node marker to view detailed information:
6668
- **Default Tilesets**: OpenStreetMap, Satellite, Topographic, Dark/Light modes
6769
- **Custom Tilesets**: Any configured custom tile servers appear in the selector
6870

71+
::: tip Per-theme tileset preferences (New in 4.13)
72+
MeshMonitor remembers a **separate tileset preference for light and dark appearance**, so switching your color theme (e.g. Catppuccin Latte → Mocha) can also switch your map style automatically — a light OSM style while your UI is light, a dark CartoDB style once you flip to a dark theme, without picking the tileset again each time. Configure both in **Settings → Map Settings** (see below); the visual picker on the map always changes the tileset for whichever appearance is currently active.
73+
:::
74+
6975
#### Map Navigation
7076

7177
- **Pan**: Click and drag to move the map
@@ -251,7 +257,7 @@ See the [Custom Tile Servers](/configuration/custom-tile-servers) guide for comp
251257
**Method 1: Settings Tab**
252258

253259
1. Navigate to **Settings****Map Settings**
254-
2. In the **Map Tileset Selection** dropdown, choose your desired tileset
260+
2. Choose your desired tileset from the **Light Mode Tileset** and/or **Dark Mode Tileset** dropdowns — each applies only while the matching UI appearance is active
255261
3. Click **Save Settings**
256262
4. The map will reload with the new tileset
257263

0 commit comments

Comments
 (0)