Files
potato-mesh/CHANGELOG.md
T

72 KiB

CHANGELOG

Features

  • Web/Data: Reticulum gets its own visual identity - trifoil marker on violet #7b61ff, MeshCore's tile moves to #1f2937, a four-step role color ramp, hexagon shape, and a third legend column (SPEC RD1-RD8)
  • Data: Reticulum node roles are derived from the announce aspect, so a multi-aspect peer no longer flips roles (SPEC RD4/RE10)
  • Web: the federation table renders a Reticulum zero count as a dash instead of a tile (SPEC RD8)
  • Web: mesh.dmz.pt joins the default federation seed nodes and potatomesh.jmrp.io leaves them
  • Data/Web: MeshCore channel messages carry their path, RSSI and flood scope, and chat shows a route chip with hops and scope; path and RSSI were never captured before (#765, SPEC SC1-SC10)

Fixes

  • Web: MeshCore @[Name] mentions and replies no longer create, refresh, or revive nodes (#883)
  • Web: a live refresh no longer moves the chat: a scrolled-up reader keeps their place, the channel tab strip stops sliding back, and tab focus and text selection survive (#881, SPEC DR1/DR3)
  • Web: a MeshCore channel message stays on its sender's node and no longer moves to, or revives, a same-name node; a sender named by a stale roster is credited to the current key (#883)
  • Data: the MeshCore ingestor no longer posts placeholder nodes for chat senders or mentions, so hidden-channel names stay hidden; the web app ignores such posts from older ingestors (#883)
  • Data: a MeshCore sender name shared by several roster contacts resolves to the most recently advertised one (#883)
  • Web: live refreshes keep unchanged nodes-table rows, so an open + row, focus, a text selection, an overlay opened from a badge and the row under a scrolled page stay put; a moved overlay's close button now works (#881, SPEC DR1)
  • Matrix: the bridge crate declares its crates.io package metadata, and its README screenshot no longer links outside the crate (#879)
  • Data: TRANSPORT=udp listens on both Meshtastic multicast groups by default, 239.0.0.69 (firmware 2.8+) and 224.0.0.69; MESH_UDP_GROUP takes a comma-separated list. If you set MESH_UDP_GROUP=224.0.0.69 before, remove it to also hear firmware 2.8+ nodes (#903)
  • Data: MESHCORE_TELEMETRY_POLL_24H_EXEMPT reaches every packaged deployment - docker-compose.yml, both data/Dockerfile stages and the NixOS module (meshcoreTelemetryPoll24hExempt); setting it in .env had no effect under Compose or NixOS (SPEC PX5)
  • Web: live refreshes keep map overlays, line tooltips and waypoint cards open, and repaint only the table, map or chat whose data changed (#881, SPEC DR2/DR4)
  • Docs: the README documents MESHTASTIC_PSK_B64 (SPEC PX7)
  • CI: the env-surface check runs in pytest whenever a deployment surface changes, and also checks names with digits, names read through helpers, and retired names (SPEC PX6/PX8)
  • CI: test results reach Codecov also when tests fail; workflows use codecov-action v7 and checkout v7; Dependabot opens up to 20 GitHub Actions update PRs at a time (SPEC DW1/DW2/DW4)
  • Docker: the root Dockerfile builds the same image as web/Dockerfile, including Chromium for Open Graph previews (skip it with --build-arg WITH_OG_IMAGE=0), the custom pages directory, and the APP_VERSION build arg (SPEC DF1)
  • Docs: SECURITY.md says how to report a vulnerability privately (SPEC SEC1)
  • Web: /metrics no longer exports nodes that opted out or that private mode hides; series exported before an opt-out stop at once (SPEC PM1/PM2)
  • Data/Web: Reticulum reports a frequency and LoRa preset, read from the RNS config (SPEC RL1-RL3)
  • Web: federation node counts distinguish zero from not-reported uniformly across all three protocols (SPEC RL4)
  • Web: the Reticulum destination count matches the table, and /api/destinations serves only destinations of nodes inside the node window (SPEC RA3/RA8)
  • Web: a destination's identifier links to its identity page (SPEC RL5)
  • Web: Reticulum rows match every other row's height; one dash glyph throughout the nodes table (SPEC RA11)
  • Data/Web: Reticulum nodes are keyed on the announcing identity, not on each destination - one node, several destinations (SPEC RE7/RE10)
  • Data: the ingestor's own node id is its primary announced identity (SPEC RE8)
  • Web: the map legend lists only protocols in view: a protocol toggled off, or with no node matching the filter, leaves it; Clear filters also clears the filter text (SPEC LP1)
  • Data: the host's own transport aspect is ingested when the stack has transport enabled (SPEC RE9)
  • Data: the Reticulum ingestor re-posts its host's own destinations every hour, so rns.transport and the host aspects stay fresh on a connection that never reconnects (SPEC RE8)
  • Data: PROTOCOL=reticulum needs INGESTOR_NODE_ID in Docker, when nothing on the ingestor's RNS stack announces, or when two local identities tie; otherwise the node id is derived once a local app announces (SPEC RE5/RE8)
  • Data: a set CONNECTION is no longer silently ignored under PROTOCOL=reticulum - the ingestor now logs that it is dropping the value (SPEC RN10)
  • Data: RETICULUM_INTERFACES now resolves interface names through the shared RNS instance, fixing an allowlist that matched nothing on a shared stack (SPEC RE3)
  • Data: a Reticulum announce with no display name no longer overwrites a stored name
  • Docs: document the Reticulum config directory, its Docker volume, and how to add interfaces to it
  • Data: ALLOWED_CHANNELS, HIDDEN_CHANNELS, and MAP_ZOOM no longer break on the packaged Compose default's quoted-empty value (ACCEPTANCE CH-A1-CH-A3)
  • Data/Web: nodes.identity_hash keeps each Reticulum node's full identity hash, as do its destinations rows (SPEC RE2/RE7)
  • Data/Web: user.publicKey carries the identity's real public key; destinations get their own table, served by GET /api/destinations, which honors the node opt-out marker (SPEC RE2)
  • Data: new RETICULUM_INTERFACES allowlist scopes announce ingestion by interface, applied from one hop out; the operator's own nodes are always ingested (SPEC RN4/RE4)
  • Data: PROTOCOL=reticulum ingests only RNode interfaces by default; set RETICULUM_INTERFACES=* to ingest every interface as before (SPEC RN4)
  • Config: configure.sh asks for INGESTOR_NODE_ID under PROTOCOL=reticulum (SPEC RE8)
  • Web: the /charts mesh-activity figure draws the Reticulum series (SPEC RN2)
  • Web: instances.reticulum_nodes_count gets its own migration (SPEC RN7)
  • Docs: every environment variable the ingestor or web app reads is documented (SPEC DOC2)
  • Docs/Config: configure.sh and the NixOS module are no longer Meshtastic-only (SPEC DOC3)
  • Docs: the README documents every route (SPEC DOC4)
  • Docs: the dual basemap-CDN egress disclosure was restored (SPEC SB6)
  • Docs: CONTRACTS.md corrected to match the served /api/destinations shape (SPEC DOC5)
  • Docs: ACCEPTANCE.md amended for the shipped Reticulum stats scope; README gains a Reticulum section
  • Web: picking a channel from the chat dropdown on mobile no longer fails while live updates arrive (#882)
  • Data: ALLOWED_CHANNELS, HIDDEN_CHANNELS and PRIMARY_CHANNEL_ONLY drop every packet type and node-list entry from excluded channels, not only text messages (#784, SPEC CF1-CF3)
  • Data: node-list snapshots no longer carry the radio library's copy of each node's last packet (#784, SPEC CF3)
  • Data: under TRANSPORT=udp, ALLOWED_CHANNELS and HIDDEN_CHANNELS match channel 0 by PRIMARY_CHANNEL_NAME (#784, SPEC CF2)
  • Data: PRIMARY_CHANNEL_ONLY accepts true/yes/on like the TX_* flags; an unrecognized value enables it (#784, SPEC CF5)
  • Data: new DROP_VIA_MQTT=1 drops Meshtastic packets and nodes relayed via MQTT, on the API and UDP transports (#884, SPEC VM1-VM2)
  • Web: the web service no longer receives the unused ALLOWED_CHANNELS/HIDDEN_CHANNELS settings (#784, SPEC CF6)
  • Docs: CHANNEL_INDEX documented as the announcement channel, not an ingest filter (#884, SPEC CF7)
  • CI: Dependabot version updates run for every ecosystem; the Ruby and Python entries use the documented bundler and pip names (SPEC DP1)
  • Web: web/Gemfile.lock is committed, so CI and the web image install the locked gems (SPEC DP2)
  • Data: data/requirements.txt pins the runtime dependencies with == and no longer installs black and pytest into the ingestor image; the dev tools move to data/requirements-dev.txt (SPEC DP3)
  • Web: the web image and the Nix web app run Ruby 3.4, the version CI tests, instead of Ruby 3.3 (SPEC DP5)
  • Data: the ingestor image runs Python 3.13, the version CI tests, instead of Python 3.12 (SPEC DP5)
  • CI: the Python workflow tests Python 3.13 and 3.14; neither CI matrix fails fast (SPEC DP5)
  • Web: a MeshCore channel message heard by two ingestors that resolved its sender to different node ids is stored once (#880)
  • Web: the first boot after upgrading deletes duplicate MeshCore messages once; on instances with several MeshCore ingestors this can remove about a fifth of the stored MeshCore messages (#880)
  • Data/Web: a Reticulum destination's placeholder name never replaces its real name or names its node; a node with no announced name reads its own placeholder; a nameless destination is named from its own hash (SPEC RA10, RE10)
  • Web, bridge, app: Reticulum is named as its own protocol in the bridge tag ([RT]), the footer join strip (RETICULUM_PRESET and RETICULUM_FREQ), the /nodes page description and the client fallback label; the site description names no protocol; the app README states the app is Meshtastic only (SPEC RL8)
  • Docs: Reticulum is marked experimental and announce-only; the README says what the RNS stack transmits and that the channel filters ignore it (SPEC RD7/RN5)
  • Nix: the flake ingestor includes rns, so PROTOCOL=reticulum runs on NixOS; flake.lock moves nixpkgs to nixos-unstable of 2026-10-03, which brings Python 3.14 and Ruby 3.4.9 (SPEC DP8)
  • Docs: CONTRACTS.md states the Reticulum placeholder and headline name rules as amended (SPEC RA10, RE10)

Features

  • Data/Web: Reticulum protocol support - PROTOCOL=reticulum ingests announces as protocol="reticulum" nodes end-to-end (ingest, stats, federation wire, UI) (SPEC S6/FS2/MA5/MA-F2/F2-2 as amended)

v0.7.5

Features

Fixes

  • Ingestor: every mesh transmission is now off by default (TX_ENABLED, default 0), covering the activity announcement and the MeshCore on-air contact telemetry polls; announcements take a second opt-in (TX_ANNOUNCE=1) on top by @l5yth in https://github.com/l5yth/potato-mesh/pull/891
  • Ingestor: RX_ONLY no longer fails open - it was compared as an exact == "1", so RX_ONLY=true, TRUE, yes, on and " 1" all silently resolved to off and a receive-only listening post transmitted anyway; all TX flags now accept the common spellings, strip whitespace, and resolve an unrecognized value toward silence by @l5yth in https://github.com/l5yth/potato-mesh/pull/891
  • Ingestor: the TX_* flags reach every packaged deployment - docker-compose.yml, data/Dockerfile, the NixOS module (txEnabled/txAnnounce) and .env.example; the previous ANNOUNCE opt-in reached none of them, so setting it in .env had no effect at all by @l5yth in https://github.com/l5yth/potato-mesh/pull/891
  • Ingestor: the announcement's 24 h anti-spam delay is measured on a monotonic clock - it used wall clock, so on an RTC-less host a post-boot NTP step cleared it instantly by @l5yth in https://github.com/l5yth/potato-mesh/pull/891
  • Ingestor: transmit policy is stated in the log at startup without DEBUG=1, and each suppressed announcement names the gate that closed by @l5yth in https://github.com/l5yth/potato-mesh/pull/891
  • App: await the in-flight request before closing its HTTP client in loadMessages/loadNodes - the unawaited return let finally close the client mid-request by @l5yth
  • App: raise the iOS deployment target to 15.0 (from 14.0) in the Podfile, Xcode project and AppFrameworkInfo.plist - Flutter 3.47's Flutter pod requires it, and pod install could not resolve against the old target. Drops support for iOS 14 devices. by @l5yth
  • CI: the Mobile workflow matrix no longer fails fast, so an iOS failure stops hiding whether the Android build passed by @l5yth
  • Docs: README gains a Transmitting on the mesh section - what each flag turns on, the truth table, the literal announcement text, and what is never gated by @l5yth in https://github.com/l5yth/potato-mesh/pull/891

v0.7.4

Features

Fixes

Chores

v0.7.3

Features

Fixes

v0.7.2

Features

Fixes

v0.7.1

Features

Fixes

Chores

v0.7.0

Features

Fixes

Chores

v0.6.3

Features

Fixes

Chores

v0.6.2

Features

Fixes

v0.6.1

Features

Fixes

Chores

v0.6.0

Features

Fixes

Chores

v0.5.12

v0.5.11

v0.5.10

v0.5.9

v0.5.8

v0.5.7

v0.5.6

v0.5.5

v0.5.4

v0.5.3

v0.5.2

v0.5.1

v0.5.0

v0.4.0

v0.3.0

v0.2.0

v0.1.0