Commit Graph
100 Commits
Author SHA1 Message Date
Afri 7b0176df93 web: dedup MeshCore channel copies whose sender resolved differently (#880) (#914) 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
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
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
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
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
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
l5y f43270d351 web: fix waypoints shipped-review audit findings (#878) 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
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
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
l5y 3878597c8d data,web: ingest every telemetry family from both protocols (#850)
* data,web: ingest every telemetry family from both protocols

* data: 24h per-node telemetry poll cooldown; RX_ONLY ingestor switch
2026-07-23 11:51:30 +02:00
l5y 22c470d9e6 data: meshcore rf metrics rssi/snr/hops/path (#849) 2026-07-22 21:41:57 +02:00
l5y 5b6d45e25e web: node table keeps latest telemetry of every type (per-field merge) (#847) 2026-07-22 16:14:17 +02:00
l5y 6fefce73e1 web: blend basemap providers to fix HOT/CARTO tile checkerboard (#846) 2026-07-22 13:02:39 +02:00
l5y 0cd2b2c4d4 Bump all packages to 0.7.3 (#845)
* Bump all packages to 0.7.3

* ci: disable Flutter mobile release workflow
2026-07-18 12:11:49 +02:00
l5y ebd500981d web: HOT primary basemap (dark-filtered) with per-tile CARTO fallback (#844) 2026-07-18 11:58:05 +02:00
l5y ea5560f9aa fix(docker): armv7 ingestor build toolchain; disable matrix fail-fast (#842) 2026-07-07 19:42:33 +02:00
l5y 211ae52d55 web: fix MeshCore ghost nodes (stale contact enrichment discarded) (#841)
* web: fix MeshCore ghost nodes (stale contact enrichment discarded)

* web: guard short_name gap-fill against empty strings; codify Known gaps
2026-07-06 09:27:36 +02:00
l5y 2479a6554f fix: UDP-transport hardening, bridge tracker coverage, CI repairs; release 0.7.2 (#840)
* fix: UDP-transport hardening, bridge tracker coverage, CI repairs; release 0.7.2

* fix: UDP-transport hardening, bridge tracker coverage, CI repairs; release 0.7.2
2026-07-06 00:30:52 +02:00
l5y 436bf34de6 web: chat-log retention and vertical scroll fix (#837)
* web: chat-log retention and vertical scroll fix

* web: suppress redundant advert when a node is heard via an encrypted message
2026-07-02 20:50:27 +02:00
l5y 6d9d524e09 improve log wiring and capture all meshcore adverts (#836)
* data: fix meshcore adverts gap and capture adv from other nodes

* web: improve log wiring
2026-06-30 12:57:04 +02:00
l5y e633ff9d5e web: progressively backfill all bulk collections (#835) 2026-06-30 09:35:22 +02:00
l5y bc6d0187cc web: fix MeshCore chat duplicates and warm-cache message gap (#834) 2026-06-29 20:59:30 +02:00
l5yandClaude Opus 4.8 8ed15f1142 web: initial-load module-graph waterfall (#832)
* web: initial-load module-graph waterfall

* web: prefetch initial API data on cold load (faster first paint)

Second phase of the initial-load fix (after the module-graph preload in
8915f8c). Even with the graph preloaded, the first /api/* fetch waited for the
~806KB bundle to download, parse, and boot. An early <script type="module"
async> boot module (main/boot-prefetch.js) now fires the first-load (since=0)
requests in parallel with the module graph (at priority:'high') and stashes the
in-flight Response promises on window.__PM_BOOT__; refresh() consumes them on its
first cold refresh via a new responsePromise option on the data-fetchers instead
of issuing its own requests.

Cold loads only: a synchronous localStorage marker (pm:cache-present, maintained
by the cache write-back / clear / disable paths) suppresses the prefetch on warm
revisits, leaving the FC2 seed-then-delta path untouched. Message endpoints are
skipped in private mode (data-pm-chat="false"), mirroring the /api/messages 404
(Invariant II / PS6). Pure pre-warm: an absent or rejected prefetch re-fetches,
so it is never load-bearing (FC7).

Read-side only; no API/DB/ingestor change, no new dependency. Adds ACCEPTANCE
EF-A1/EF-A2/EF-R1; 100% line/branch/func coverage on the new module (lcov);
rspec + npm test green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 14:50:33 +02:00
l5y 266f8ff8bd chore: bump version 0.7.1 (#833) 2026-06-29 14:45:37 +02:00
l5y b5d9249918 web: change tiles to carto (#831)
* web: change tiles to carto

* web: change tiles to carto
2026-06-28 20:59:52 +02:00
l5y c8d5a8a20f web: fix pubsub thread budget to not block entire app (#828)
* web: fix pubsub thread budget to not block entire app

* web: address review comments
2026-06-27 11:09:57 +02:00
l5y be5365105d web: fix api/events hang on shutdown (#827)
* web: fix api/events hang on shutdown

* web: address review comments
2026-06-26 15:26:13 +02:00
l5y afb15ff48d web: fix live-update DOM handling (#826)
* web: fix live-update DOM handling

* web: live-update feedback upgrades (v2)

* web: more live-update feedback

* web: address review comments
2026-06-26 09:59:41 +02:00
l5y 554fa38f50 web: fix meshcore message duplication regression (#825) 2026-06-24 22:22:35 +02:00
l5y 1804a8a75e web: add visual feedback to pubsub events (#824) 2026-06-24 20:34:35 +02:00
l5y 4831e37a52 web: mark message author nodes as seen (#822) 2026-06-24 17:53:10 +02:00
l5y 8083206210 web: implement pubsub (#821) 2026-06-24 17:35:33 +02:00
l5y f5f9298746 web: add pagination to all APIs (#820) 2026-06-24 13:02:50 +02:00
l5y 7eccbfb89a fix: unify Meshtastic custom LoRa label with MeshCore format (#818) 2026-06-23 21:58:18 +02:00
l5y 3790686ab2 web: version JS/CSS assets to bust stale browser caches (#815) 2026-06-23 21:23:35 +02:00
l5y 9039fb6f95 web: implement local storage caching (#814)
* web: implement local storage caching

* web: address review comments
2026-06-23 19:35:51 +02:00
l5y 4107527eca web: render chat incrementally to reduce page load time (#813) 2026-06-23 12:18:00 +02:00
l5y 843dc85776 web: fix federation cycle and http response error handler (#810) 2026-06-22 17:06:56 +02:00
l5y be9e7c006f web: fix federation dns status 500 (#809) 2026-06-22 16:35:56 +02:00
l5y d323cab32a web: fix meshcore node synthisation, merging, and deduplication (#808) 2026-06-22 15:54:12 +02:00
l5y 088907345d web: progressively load messages in batches (#807)
* web: progressively load messages in batches

* web address review comments
2026-06-22 13:21:50 +02:00
l5y 027b6160df web: federation signature v2 migration (#805)
* web: federation signature v2 migration

* web: address review comments
2026-06-22 10:01:45 +02:00
l5y af64b2c60f web: fix apis to use consistently use camel case (#802) 2026-06-21 20:17:40 +02:00
l5y 5e0363a0ec web: breaking change on stats api (#801)
* web: breaking change on stats api

* address review comments
2026-06-21 13:41:41 +02:00
l5y bb95b0792d web: fix chat (#800)
* chore: add guardrails

* docs: fix meshcore badge

* web: life chat message cap at 1000 in frontend

* web: honor protocol in chat

* web: deprioritize test channels

* fix ci
2026-06-19 16:37:41 +02:00
l5y 512b4f157b Fix regression where Meshcore chat senders show as Meshtastic (#794)
* Fix regression where Meshcore chat senders show as Meshtastic

* Address review feedback for protocol misclassification fix

- ingest.rb: exclude wrapper ``protocol`` key from /api/nodes batch-limit
  count so the documented 1000-node maximum still applies after the
  Python ingestor started stamping protocol at the wrapper level.
- Drop plan-file references from production and test comments per the
  repo guidelines; the why is already explained inline.

* Address protocol-fallback review feedback

- Neighbor placeholder now inherits the source node's protocol from the
  surrounding /api/neighbors entry, so the badge tracks the radio the
  peer lives on instead of collapsing to the neutral "Unknown" label
  (review item #1).
- resolve_record_protocol logs one warn_log line when an explicit
  protocol stamp is rejected as malformed, making misbehaving custom
  protocol adapters visible in the operator log instead of silently
  falling back (review item #3).

* Extract buildNodePlaceholder helper for testability

The neighbor placeholder logic in main.js lives inside an untested
closure, so codecov reported the protocol-propagation lines as
uncovered.  Extract the small placeholder builder into long-link-router
so it can be unit tested directly; the closure-internal call site stays
trivial (one factory call + one fallback call).
2026-05-24 09:49:45 +02:00
l5y d2fe4f8223 web: add node opt-out marker and data retention policies (#793)
* web: add node opt-out marker and data retention policies

* web: address review comments

* web: address review comments
2026-05-20 21:02:59 +02:00
l5y 8a89185fbe fix sentinel position data (#792)
* fix sentinel position data

* address review comments
2026-05-18 21:27:47 +02:00
l5y b187ba2066 data: move connected event to after ensure_contacts (#789)
* data: move connected event to after ensure_contacts

* data: address review comments
2026-05-18 08:57:08 +02:00
l5y c32da2c541 chore: bump to 0.6.4 (#785) 2026-05-03 17:01:28 +02:00
l5y 73e161f432 web: fix liveliness of api data hydration bug (#783)
* web: fix liveliness of api data hydration bug

* web: address review comments
2026-05-03 13:05:37 +02:00
l5y 7b38f92b2d web: refactor 6/7 node page (#777)
* web: refactor 6/7 node page

* web: address node-page refactor review and close coverage gaps

Fix the concurrency cap in fetchNodeDetailsIntoIndex so it actually
limits in-flight requests.  The previous implementation built each
fetch as an immediately-invoked async IIFE, so all N fetches started
the moment the loop ran; the slicing-then-Promise.all step only
changed when settlement was observed, not when work began.  Replace
the IIFE-then-batch pattern with a worker pool: a fixed-size set of
worker promises iterates a shared queue and only pulls the next
identifier once the previous fetch settles.

Reduce cross-module coupling around the role-aware short-name badge
by extracting renderRoleAwareBadge into a new badge.js module that
single-node-table, messages, detail-html, and traces import directly,
so the neighbour module is no longer pulled in by four non-neighbour
callers.  Tighten applyDetails in role-index.js by hoisting the
ternary into a single key binding and dropping the redundant
instanceof Map guard.

Close the patch-coverage gap reported by Codecov: add tests for
parameter-validation paths in bootstrap (parseReferencePayload,
normalizeNodeReference, fetchNodeDetailHtml, initializeNodeDetailPage),
the worker-pool branches in role-index (no-fetch, empty queue, 404,
non-success responses, and an explicit concurrency-cap assertion),
the badge fallback path, the nested-neighbor seedNeighborRoleIndex
branches, the renderNeighborBadge metadata-merge and short-name
fallback paths, the empty-trace and empty-chart short-circuits, and
single-node-table validation.  All ten node-page submodules now
report 100% line coverage.
2026-05-02 23:05:36 +02:00
l5y 1041e06644 data: refactor 4/7 interfaces (#775)
* data: refactor 4/7 interfaces

* data: address PR #775 review feedback

Fix the two CI test regressions caused by the package split:
- ``factory._load_ble_interface`` no longer keeps a stale module-level
  ``BLEInterface`` cache that survived ``monkeypatch`` teardown across
  tests. The package-level attribute is now the single cache; the
  ``factory.py`` global was removed.  This unblocks
  ``test_load_ble_interface_sets_global``.
- ``interfaces/__init__.py`` re-resolves ``SerialInterface`` and
  ``TCPInterface`` from ``meshtastic.*`` at package-load time so that a
  test that pops ``data.mesh_ingestor.interfaces`` from ``sys.modules``
  and re-imports picks up the freshly registered classes rather than
  whatever a cached ``factory.py`` first resolved.  This unblocks
  ``test_interfaces_patch_handles_preimported_serial``.

Restore 100% patch coverage on the interfaces subpackage by:
- Adding tests for previously uncovered, testable paths:
  ``_extract_host_node_id(None)``, ``_ensure_channel_metadata``,
  ``_normalise_nodeinfo_packet`` (None input + dict-conversion fallback),
  ``_resolve_lora_message`` (radio_section paths), ``_modem_preset``
  (preset attr fallback + unparseable value), ``_camelcase_enum_name``
  separator-only input, ``_region_frequency`` no-digit enum name,
  ``_ensure_radio_metadata`` unresolvable-message path, plus the
  unknown-section recursive branch of ``_candidate_node_id``.
- Marking genuinely unreachable defensive branches with
  ``pragma: no cover`` (BLE receive loop body, upstream API regression
  guards, patch re-entry guard, unreachable ``NoAvailableMeshInterface``
  fallback).
2026-05-02 22:59:52 +02:00
l5y e04fab5b19 web: refactor 7/7 main js (#778)
* web: refactor 7/7 main js

* web: refactor 7/7 main js

* web: address review feedback on 7/7 main.js refactor

* Consolidate the duplicate ./main/format-utils.js import block in
  main.js so all symbols come from a single, alphabetised import
  statement (review item: "Important — Duplicate format-utils.js
  import block").
* Replace the leftover stale JSDoc atop +createOfflineTileLayer+ with
  one clear "do not inline" DI block, and likewise expand the
  +fetchMessages+ wrapper docstring so future readers see the shim's
  purpose without hunting for the implementation (review nit:
  "thin wrappers ... worth a one-line JSDoc").
* Add per-module unit tests under
  public/assets/js/app/main/__tests__/ covering every previously-
  uncovered branch in the 9 modules codecov flagged: tile-coords,
  sort-comparators, fullscreen-helpers, format-utils, data-fetchers,
  data-merge, tooltip-html, long-link-router, and offline-tile-layer.
  This drives the codecov patch percentage on PR #778 from 78.99%
  to ~100% on the new modules and unblocks the codecov/patch gate.

JS suite: 1,114 tests, 0 failures.
2026-05-02 22:35:34 +02:00
l5y d1d0225197 web: refactor 5/7 node page charts (#776)
* web: refactor 5/7 node page charts

* web: address review feedback on node-page-charts split

* Drop the local stringOrNull/numberOrNull copies from node-page.js
  and import them from ./value-helpers.js so the shared module's
  stated dedup actually happens (review issue #1).  The two locals
  were byte-identical to the new shared module.
* Split the display-only formatters out of
  node-page-charts/format-utils.js into a sibling
  node-page-charts/display-formatters.js so format-utils.js carries
  only chart concerns (review issue #2).  The barrel
  node-page-charts.js re-exports both files so existing callers and
  tests keep working unchanged.
* Inline +fmtCurrent+ in node-page-charts/specs.js and drop the
  sideways import from short-info-telemetry.js so node-page-charts/
  no longer depends on an unrelated module (review issue #3).
* Add a dedicated value-helpers.test.js pinning the contract of
  +numberOrNull+ and +stringOrNull+ so they stop relying on
  transitive coverage from the chart suite (review issue #5).
2026-05-02 22:16:18 +02:00
l5y 0fbff32535 web: refactor 2/7 federation (#773)
* web: refactor 2/7 federation

* web: close federation coverage gaps and apply review nits

Address Codecov patch coverage feedback by adding rspec examples for
the 51 lines flagged across the new federation shards (announce,
crawl, validation, http_client, self_instance, instance_metrics,
announcer_threads, lifecycle, signature). Per-shard line coverage in
the federation directory is now 100%.

Apply two review-comment changes: rename the awkwardly-named
http_client_get.rb to instance_fetcher.rb (matching its semantic
role rather than the HTTP verb), and declare PotatoMesh::App::Federation
explicitly in the federation.rb manifest so the namespace is owned by
this file rather than implicitly created by whichever shard happens to
load first.
2026-05-02 22:12:20 +02:00
l5y 03caf391e7 web: refactor 1/7 data processing (#772)
* web: refactor 1/7 data processing

* web: close coverage gaps in data_processing submodules

Bring every file under lib/potato_mesh/application/data_processing/ to
100% line coverage so codecov/patch passes on the 1/7 refactor PR. The
gap was a relocation of pre-existing untested branches; closing them
here keeps the subsequent refactor PRs in the series unblocked.

* Add unit tests covering canonical sender/recipient overrides,
  reply_id/emoji updates on existing rows, and the rare INSERT
  ConstraintException recovery path inside +insert_message+.
* Cover the non-canonical reporter and per-neighbour resolution
  branches in +insert_neighbors+.
* Cover the SQLException rescue in +upsert_ingestor+, the
  fallback_num branch in +touch_node_last_seen+, the limit fallback
  in +read_json_body+, the unrecognised-type branch in
  +store_decrypted_payload+, the +power+ telemetry_type fallback,
  the default-coercion path in +resolve_numeric_metric+, and the
  numeric/bare-hex paths in +canonical_node_parts+ and
  +coerce_trace_node_id+.

Drop dead code surfaced while pinning behaviour:

* +clear_encrypted+ in +insert_message+ has been initialised to
  +false+ and never reassigned since #633 dropped the
  decrypted-text override; remove it and the four dependent
  branches.
* The +rescue ArgumentError; nil+ tails in
  +identity.resolve_node_num+ and +traces.coerce_trace_node_id+ are
  unreachable because every +Integer(...)+ call inside is guarded by
  a regex pre-check.

Add a comment to the +data_processing.rb+ shim explaining that the
+require_relative+ list is ordered by dependency rather than
alphabetically, addressing review nit #5.
2026-05-02 22:08:21 +02:00
l5y f6aff3bdb8 data: refactor 3/7 protocols (#774)
* data: refactor 3/7 protocols

* data: address PR #774 review feedback

- Rewrite the parents[4] path comment in protocols/meshcore/debug_log.py
  to clearly explain why the index changed from parents[3] (the original
  pre-split index) without contradicting the code.
- Add tests covering the six lines flagged uncovered by codecov:
  * _process_self_info host-position branch (handlers.py:78)
  * on_contact_msg early-return for missing text/sender_ts (handlers.py:278)
  * close() RuntimeError swallow when loop closes mid-call (interface.py:155-156)
  * _run_meshcore wrapper around _ensure_channel_names failure (runner.py:131-132)

Restores 100% patch coverage on the meshcore package.
2026-05-02 22:05:43 +02:00
l5y 09d9e7be13 chore: bump version to 0.6.3 (#779)
* chore: bump version to 0.6.3

* chore: bump version to 0.6.3
2026-04-29 22:06:29 +02:00
l5y 43a5724b7f web: add seo improvements (#771)
* web: add seo improvements

* web: address review comments

* web: address review comments
2026-04-29 10:33:33 +02:00
l5y c4dd825d72 matrix: fix matrix preset labels (#770)
* matrix: fix matrix preset labels

* matrix: address review comments

* matrix: address review comments
2026-04-29 07:49:31 +02:00
l5y ee98efc120 web: rework map spider-net feature (#769)
* web: rework map spider-net feature

* web: address review comments

* web: address review comments
2026-04-29 07:06:18 +02:00
l5yandClaude Opus 4.7 161f22bf12 chore: bump version to 0.6.2 (#763)
Backfill v0.6.1 CHANGELOG entry (previously undocumented),
add v0.6.2 entry covering 9 commits since v0.6.1, and bump
the version string across data, web, matrix, and app along
with the README docker-pull examples.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 19:02:26 +02:00
l5y e8f3f17b85 matrix: enable meshcore (#761)
* matrix: enable meshcore

* matrix: address review comments
2026-04-21 14:11:05 +02:00
l5y a4902548d3 web: fix emoji pattern render in short names (#760)
* web: fix emoji pattern render in short names

* web: address review comments
2026-04-21 13:02:36 +02:00
l5y 491678f75b data: catch packet handler errors (#759)
* data: catch packet handler errors

* data: address review comments

* data: address review comments
2026-04-21 11:41:44 +02:00
l5y db236d58e2 web: fix meshcore message duplication with 120s dupe protection (#758)
* web: fix meshcore message duplication with 120s dupe protection

* web: fix meshcore message duplication with 120s dupe protection

* web: address review comments

* web: address review comments
2026-04-21 10:13:39 +02:00
l5y a6cac6ced5 web: fix node duplication through message synthetization (#757)
* web: fix node duplication through message synthetization

* web: fix edge case

* web: address review comments
2026-04-21 08:53:09 +02:00
l5y f866cf8837 web: show colocated nodes (#753)
* web: show colocated nodes

* web: address review comments

* web: address review comments

* web: address review comments
2026-04-17 09:02:39 +02:00
l5y 7f5b52db67 ingestor: deduplicate meshcore messages (#752)
* ingestor: deduplicate meshcore messages

* ingestor: address review comments

* ingestor: address review comments
2026-04-16 22:16:22 +02:00
l5y 8ac12ee2c8 fix reaction handling and classification (#750)
* fix reaction handling and classification

* fix reaction handling and classification

* web: add tests

* web: address review comments

* web: address review comments

* web: address review comments

* web: address review comments
2026-04-16 20:07:41 +02:00