Commit Graph
156 Commits
Author SHA1 Message Date
Afri e3333693fb data: MeshCore contacts post once per connect (#1024) 2026-10-10 11:00:43 +02:00
Afri d9a459b6d5 data: MeshCore scope table adds five German community regions (#1016) 2026-10-08 23:35:07 +02:00
Afri 949821d7f3 chore: remove the Flutter app and its CI (#1015) 2026-10-08 20:51:52 +02:00
Afri f4daac7b8d chore: bump version to 1.0.0 (#1011) 2026-10-08 17:15:16 +02:00
Afri ddae287ee6 data: keep snapshot node ages when the radio clock is off (#1007)
* data: keep snapshot node ages when the radio clock is off

* data: add the snapshot clock unit tests left out of the first commit
2026-10-08 15:55:12 +02:00
Afri 86c7f52a69 data: keep CodeQL off a blank UDP group and a test channel name (#1006) 2026-10-08 15:41:08 +02:00
Afri 6c9e0bad52 data,web: queue uploads per instance and retry each on its own (#1005) 2026-10-08 15:39:44 +02:00
Afri 0a9764e3f7 data: lock mesh.sh venv installs and skip pip when nothing changed (#1003) 2026-10-08 12:25:48 +02:00
Afri 7426276964 data: log why a Reticulum ingestor hears nothing; close failed connects (#1002) 2026-10-08 12:25:31 +02:00
Afri 438596c6d2 data: name MeshCore flood scopes from a built-in region table (#1001) 2026-10-08 10:14:15 +02:00
Afri 49323d3809 data: let operators limit which hosts may send UDP packets (#995) 2026-10-08 00:35:19 +02:00
Afri 95ff69f6cb web,data: cap ingested strings by column and check node ids (#997) 2026-10-08 00:34:08 +02:00
Afri 5e0deb8a46 data: check MeshCore RX-log adverts against their signatures (#996) 2026-10-08 00:33:48 +02:00
Afri 3a07231e6e data,web: bind node rows to their key and records to their sender (#998) 2026-10-08 00:33:21 +02:00
Afri 501662ab58 data,web: use the receive time when the radio clock is off; cap battery (#987) 2026-10-07 10:59:50 +02:00
Afri 586545fa4b data,web: put the Reticulum host on the map from its RNS config (#991) 2026-10-07 10:59:33 +02:00
Afri 9f988d2d90 data,web: capture MeshCore message path, RSSI and scope (#765) (#984) 2026-10-06 18:41:35 +02:00
Afri e2b33a1cf9 repo: move .claude to the spec tree (#976) 2026-10-06 15:28:17 +02:00
Afri ea8d618489 ci: upload test results with codecov-action v7 and move to checkout v7 (#975) 2026-10-06 15:27:55 +02:00
Afri 61072fde6f docs: describe the RA10/RE10 placeholder rules where they changed (#973) 2026-10-06 14:46:47 +02:00
Afri 27eac3d4e5 web,data: stop Reticulum destination placeholders from renaming (#968) 2026-10-06 13:06:43 +02:00
Afri 326a6ab608 web,matrix,app: name Reticulum as a known protocol in every consumer (#967) 2026-10-06 12:56:25 +02:00
Afri c681fb2cd7 docs: scope Reticulum as experimental and announce-only (#966) 2026-10-06 12:44:57 +02:00
Afri 1aa45073a2 tests: make the Reticulum host-id canonicalisation check able to fail (#965) 2026-10-06 12:44:10 +02:00
Afri 0831912dfa data: refresh the Reticulum host's own destinations every hour (#969) 2026-10-06 12:29:24 +02:00
Afri fe9e46ef67 data: ingest only RNode interfaces by default under PROTOCOL=reticulum (#964) 2026-10-06 08:57:10 +02:00
Afri 5f03f7d024 nix: add rns to the flake ingestor and update the nixpkgs pin (#963) 2026-10-06 08:56:09 +02:00
Afri c1a4cf9e9b data: retry the Reticulum host id through the provider every loop (#944) 2026-10-05 12:56:17 +02:00
Afri ce0fdd4391 data,ci: run the ingestor image on Python 3.13 and test 3.13 and 3.14 (#942) 2026-10-05 12:55:39 +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 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 44fab19bf3 data: listen on both Meshtastic UDP multicast groups by default (#903) (#909) 2026-10-04 15:51:58 +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 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
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 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 5d2790bb48 data: harden MeshCore subscribe against unknown EventType (#867) 2026-07-28 12:55:55 +02:00
l5y cd771c4eea data: count every MeshCore RX-log frame; stamp position radio metadata (#861) 2026-07-27 11:21:16 +02:00