779 Commits
Author SHA1 Message Date
dependabot[bot] 235df026d6 build(deps): bump tokio from 1.49.0 to 1.50.0 in /matrix (#928)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.49.0 to 1.50.0.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.49.0...tokio-1.50.0)

---
updated-dependencies:
- dependency-name: tokio
  dependency-version: 1.50.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-05 08:59:28 +02:00
dependabot[bot] d8bac902c2 build(deps): bump docker/setup-qemu-action from 3 to 4 (#931)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-05 08:59:09 +02:00
dependabot[bot] 4038c245a5 build(deps): bump flutter_svg from 2.2.3 to 2.3.0 in /app (#936)
Bumps [flutter_svg](https://github.com/flutter/packages/tree/main/third_party/packages) from 2.2.3 to 2.3.0.
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/flutter_svg-v2.3.0/third_party/packages)

---
updated-dependencies:
- dependency-name: flutter_svg
  dependency-version: 2.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-05 08:58:57 +02:00
dependabot[bot] f89dfc62e2 build(deps): bump websocket-driver from 0.8.0 to 0.8.2 in /web (#940)
Bumps [websocket-driver](https://github.com/faye/websocket-driver-ruby) from 0.8.0 to 0.8.2.
- [Changelog](https://github.com/faye/websocket-driver-ruby/blob/main/CHANGELOG.md)
- [Commits](https://github.com/faye/websocket-driver-ruby/compare/0.8.0...0.8.2)

---
updated-dependencies:
- dependency-name: websocket-driver
  dependency-version: 0.8.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-05 08:58:37 +02:00
Afri 186b2ad0bd ci,deps: run Dependabot for every ecosystem and lock production builds (#915)
* ci,deps: run Dependabot for every ecosystem and lock production builds

* web,ci: run the web image on Ruby 3.4 and drop the Ruby 3.3 CI leg
2026-10-05 00:27:11 +02:00
Afri 7b0176df93 web: dedup MeshCore channel copies whose sender resolved differently (#880) (#914) v0.7.6-rc0 2026-10-04 21:25:57 +02:00
Afri b144b44e82 web,data: stop MeshCore chat text from minting or reviving nodes (#883) (#912) 2026-10-04 16:41:58 +02:00
Afri a59bd33e02 data,web: honor channel filters on every packet and the node list; add DROP_VIA_MQTT (#784, #884) (#913) 2026-10-04 16:39:17 +02:00
Afri 816ae1c1d1 matrix: add crates.io package metadata (#879) (#911) 2026-10-04 16:34:23 +02:00
Afri 44fab19bf3 data: listen on both Meshtastic UDP multicast groups by default (#903) (#909) 2026-10-04 15:51:58 +02:00
Afri 58ca8350c5 web: keep the mobile channel select alive across live refreshes (#882) (#910) 2026-10-04 15:39:59 +02:00
Afri c83ca0c301 data,docs: pipe MESHCORE_TELEMETRY_POLL_24H_EXEMPT through every deployment (#908) 2026-10-04 15:38:58 +02:00
Afri c831e86bfe docker,docs: resync the root Dockerfile and add a security policy (#907) 2026-10-04 15:18:55 +02:00
Nic Jansma 0c81dbe073 Add MESHCORE_TELEMETRY_POLL_24H_EXEMPT cooldown exemption for contact telemetry (#905) 2026-09-07 08:18:52 +02:00
l5y 3d89366e89 docs: trim operator docs to instructions, close doc/behavior drift (#904)
* docs: trim operator docs to instructions, close doc/behavior drift

* docs: strip em-dashes and bold from operator docs; trim changelog
2026-09-06 13:04:20 +02:00
l5y deaf89b1bd web: fix SSRF guard bypass via IPv6 transition addresses (#902) 2026-09-01 10:26:28 +02:00
l5y 39e5d01d26 data,web: Reticulum finalization — radio metadata, chat tags, federation zeros (#900)
* data,web: Reticulum finalization — radio metadata, chat tags, federation zeros

* web: purge destinations with their nodes
2026-08-31 12:01:36 +02:00
l5y d61cca93c0 web: reticulum aspects, identity groups, identity page, honest detail views (#899)
* web: reticulum aspects, identity groups, identity page, honest detail views

* web,data: fix staging findings, naming, row controls, transport gate

* web,data: fix Reticulum naming, row controls, and the transport gate

* web,data: fix Reticulum naming, row controls, and the transport gate

* web: cover the identity-group wiring and destination fetchers
2026-08-29 17:13:35 +02:00
Edwin Knuth 7fdbd94502 docs: correct .env.example's reticulum node id derivation (RE8) (#898)
.env.example still described the #896 model: the ingestor owning an RNS
identity and deriving its !xxxxxxxx from "the transport identity already
in RETICULUM_CONFIG_DIR". #897 shipped the opposite. RE8 excludes the
transport identity from the pick, because RNS generates it as an
independent keypair that matches none of the operator's announced
destinations; the id is the discovered primary identity, the one
announcing the most destinations on the machine. README says this
correctly and .env.example contradicted it, pointing operators at the
hash rnstatus prints as "Transport Instance".

The strands-the-old-row caveat #897 added to README and CHANGELOG is
carried over too, since .env.example is where an operator is standing
when they set the variable that moves the id.

Two guards in the deployment-surface class, both negative-tested against
main, where they correctly fail.

pytest 1443 passed; black clean.
2026-08-28 22:23:27 +02:00
l5y 96e0dbfd05 data,web: key Reticulum nodes on identity; discover host aspects (#897)
* data,web: key Reticulum nodes on destinations; fix e2e field findings (#888)

* data,web: key Reticulum nodes on identity; discover host aspects

* data,web: restore announced names and interfaces on host destinations

* data,web,docs: fix review findings on identity-keyed Reticulum nodes
2026-08-28 21:11:31 +02:00
Edwin Knuth dc0679234f data: derive the Reticulum ingestor's own node id; scope CONNECTION out (#888) (#896)
Answers the two questions left open on #888 after #893.

INGESTOR_NODE_ID was required for PROTOCOL=reticulum because a passive
announce listener has no handshake revealing "our" node id. The premise
holds; the conclusion did not follow. The ingestor now owns an RNS
identity, generated on first run and stored 0600 as potato_mesh_identity
inside the app-owned RETICULUM_CONFIG_DIR, and derives its !xxxxxxxx
through the same identity-hash mapping applied to every peer, so its own
row is shaped like any other Reticulum row. A plain PROTOCOL=reticulum
deployment brings up the heartbeat, and so the reticulum packets/hour
scope, unaided; the variable still overrides, which also means no key is
generated for a deployment that does not need one. The identity is local
and never announced, so nothing new transmits. Persist-or-nothing is
deliberate: an unstorable identity would be regenerated per start and
each generation is a different node id, filing one orphan ingestor row
per restart, so the provider reports no id and warns instead. An existing
but unreadable key file is never overwritten. The startup warning #890
emitted for an unset INGESTOR_NODE_ID is removed.

CONNECTION and RETICULUM_CONFIG_DIR/RETICULUM_INTERFACES are disjoint
rather than in conflict: CONNECTION names one serial, TCP, or BLE
endpoint and an RNS stack has no such thing, which is why connect() has
always ignored it. What was wrong was the silence, since the image sets a
serial default for every protocol. connect() now says once at info that
the value is dropped and names the two variables that do apply. The image
default stays: removing it would change how meshtastic and meshcore
containers resolve their port, and a Reticulum follow-up is the wrong
change to carry that.

SPEC RN9/RN10, ACCEPTANCE RN-A9/RN-A10; CONTRACTS, README and
.env.example reconciled. 100% line and branch coverage on the provider;
pytest 1442 passed, rspec 1717 examples 0 failures.
2026-08-28 10:16:56 +02:00
l5y 5294261892 web: add reticulum frontend support (#894)
* web: add reticulum frontend support

* docs: update readme

* web: address ui review comments
2026-08-27 12:15:05 +02:00
l5y 4b586316ae fix reticulum protocol loose ends from #888 review (#893)
* fix reticulum protocol loose ends from #888 review

* data: fix quoted Compose defaults blacking out every channel

* data,web: fix four defects found reviewing this PR
2026-08-27 08:04:08 +02:00
Edwin Knuthandoregonknuths a25140ee57 Add Reticulum announce ingestor provider (#888) (#890)
Co-authored-by: oregonknuths <159513803+oregonknuths@users.noreply.github.com>
2026-08-24 21:41:16 +02:00
Edwin Knuthandoregonknuths ace03b6807 Add Reticulum protocol support to the web tier (#888) (#889)
Co-authored-by: oregonknuths <159513803+oregonknuths@users.noreply.github.com>
2026-08-24 21:34:39 +02:00
l5y 40dfa14dfa chore: release 0.7.5 (#892)
* chore: release 0.7.5

* app: raise iOS deployment target to 15.0; stop mobile CI failing fast
v0.7.5
2026-08-24 19:48:29 +02:00
l5y 24a9226df4 data: gate every ingestor transmission behind TX_ENABLED/TX_ANNOUNCE (#891) 2026-08-24 17:18:19 +02:00
seybsen 376320b2e2 Make the activity announcement opt-in via ANNOUNCE (default off) (#886)
The periodic activity announcement was gated only by RX_ONLY, which
defaults to off, so a stock ingestor deployed to feed a map starts
broadcasting on its community's default channel without the operator
having chosen to. The only opt-out, RX_ONLY=1, also silences the
MeshCore telemetry polls, so "ingest but stay quiet" was not expressible.

Add an ANNOUNCE boolean (default 0) as an opt-in gate on top of RX_ONLY,
which keeps its meaning as the global TX kill switch and overrides
ANNOUNCE=1. Amend SPEC MA7 (which had explicitly ruled out a separate
enable env) and MA-A7 with the reasoning, document both flags in the
README env table — the RX_ONLY row did not mention the announcement at
all — and add gate unit tests for all four combinations plus the
missing-attribute fail-closed path.
2026-08-24 12:29:04 +02:00
l5y f43270d351 web: fix waypoints shipped-review audit findings (#878) v0.7.4 2026-07-30 21:58:43 +02:00
l5y 179cc5c198 web: LCP critical-path refinements (icon caching, preconnect, chat-tabs reflow) (#877) 2026-07-30 19:48:50 +02:00
l5y 882bbc4d97 web: bump sqlite3 to 2.9.5 for use-after-free advisory (#876) 2026-07-30 09:50:48 +02:00
l5y 0b93eb8169 web,docker: bake git APP_VERSION into image for immutable asset caching (#875)
* web,docker: bake git APP_VERSION into image for immutable asset caching

* web,docker: bake git version + uniform v-prefixed APP_VERSION
2026-07-29 18:59:26 +02:00
l5y a676a2997e data,web: Meshtastic waypoints as a first-class POI layer (#874)
* data,web: Meshtastic waypoints as a first-class POI layer

* web: re-roll waypoint UI to signed-off variants + node-page section

* web: reconcile stats-pushdown plan spec with the five-table W9 umbrella

* web: legend waypoint sample follows the 1c-B teardrop marker
2026-07-29 18:22:08 +02:00
l5y ad1dd5843b perf(web): index-seek /api/stats telemetry umbrella to end GVL stall (#873) 2026-07-29 13:20:16 +02:00
l5y f6945e5a08 web: immutable cache-control for versioned assets + configurable stats TTL (#868)
* web: immutable cache-control for versioned assets + configurable stats TTL

* web: address #868 review — git-gate immutable, scope to JS/CSS

* fix(spec): make the asset Cache-Control test mode-aware
2026-07-29 00:20:25 +02:00
l5y 4fb11d237c web: cap the node table render to the top N with a show all control (#869)
* web: cap the node table render to the top N with a show all control

* web: address #869 review — style the show-all control, fix hover, re-arm cap
2026-07-28 22:36:57 +02:00
l5y c5bde6280b docs: document reverse-proxy deployment, asset caching, and scaling (#872) 2026-07-28 21:57:00 +02:00
l5y 5d2790bb48 data: harden MeshCore subscribe against unknown EventType (#867) 2026-07-28 12:55:55 +02:00
l5y d501aeb4eb web: frontent performance fixes (#864)
* web: de-jank cold-load backfill + scope module preload to the view

* web: defer Leaflet, lazy-load node overlay, skip data pipeline off-dashboard

* web: address review of frontend-perf fix
2026-07-28 09:15:14 +02:00
dependabot[bot] 63aa227784 build(deps): bump quinn-proto from 0.11.14 to 0.11.16 in /matrix (#865)
Bumps [quinn-proto](https://github.com/quinn-rs/quinn) from 0.11.14 to 0.11.16.
- [Release notes](https://github.com/quinn-rs/quinn/releases)
- [Commits](https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.14...quinn-proto-0.11.16)

---
updated-dependencies:
- dependency-name: quinn-proto
  dependency-version: 0.11.16
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-27 22:03:20 +02:00
l5y e0b9c22fab chore: bump version to 0.7.4 (#863) 2026-07-27 17:06:12 +02:00
l5y f0045c984f matrix: tolerate compacted /api/messages rows (#862) 2026-07-27 15:55:30 +02:00
l5y cd771c4eea data: count every MeshCore RX-log frame; stamp position radio metadata (#861) 2026-07-27 11:21:16 +02:00
l5y 207150f235 web: mesh activity map card (#860)
* data,web: /api/stats packets rate as <scope>.packets.hour

* data,web: /api/stats packets as <scope>.packets.hour; total sums protocols

* web: mesh activity map card - packets/h total + per-protocol split

* web: /api/stats/activity bucketed packets/hour time-series

* web: mesh activity card draws the real 24h sparkline

* web: /charts mesh-activity figure, mobile card strip, legend-toggle fix

* web: mesh-activity design-review remediation

* web: /api/stats total sums rounded per-protocol rates + doc fixes
2026-07-26 20:59:26 +02:00
l5y b52f3949e4 data,web: mesh activity reporting & announcements (#859) 2026-07-26 09:09:28 +02:00
l5y 86f49506ff web: remediate frontend design & UX audit (#855)
* web: remediate frontend design & UX audit

* web: remediate design UX review follow-up

* web: remediate post-deploy design review (detail view, footer, marker recency)

* web: drop single-pass tag-strip in isReportedField

* web: legend shape key + pressed state + chat overflow
2026-07-25 22:06:59 +02:00
l5y 8d25dd42cd fix(docker): bump ingestor base to python 3.12.10 for cryptography's Rust MSRV (#858) 2026-07-25 19:34:22 +02:00
l5y b013faf13d web,data: reconcile MeshCore stale same-name node duplicates (#857)
* web,data: reconcile MeshCore stale same-name node duplicates

* data: MeshCore roster sync must not warm last_heard
v0.7.3
2026-07-24 23:25:48 +02:00
l5y 8b095669cf web: stack HOT over CARTO basemap layers, drop per-tile timeout (#856) 2026-07-24 22:06:37 +02:00
l5y 3d43061fff web: live relative-time tick - last-seen/updated ages count up in place (#851) 2026-07-23 12:03:13 +02:00