Skip to content

task: DESIGN -- decide the preset source of truth, and the firmware/client split (owner decision) #650

Closed

Description

@Strycher

Parent: #647 (feature: MESH 500). Cross-ref firmware #1064.

This issue exists to hold an owner decision, not to pre-empt it. No implementation until it is made.

Question 1 -- where do preset definitions come from?

Option Gets new presets without a release We control content Notes
Consume upstream registry (api.meshcore.nz/api/v1/config) yes no A fork phoning home to upstream's server. It also serves onboarding text and repeater guest-login policy, not just presets -- consuming it means accepting all of that or filtering. 26 of its 27 entries are below the FCC floor.
Publish our own registry yes yes New hosting + a maintenance commitment. Could seed from upstream plus our 26 Russia entries and Off-Grid set, which upstream lacks.
Curated static list (status quo, extended) no yes Zero new infrastructure. Every preset change needs an app release.
Hybrid: static fallback + optional remote refresh yes yes More moving parts; degrades gracefully offline, which matters for an off-grid client.

Question 2 -- firmware, client, or both?

Owner is leaning client -- presets are a user-facing selection surface. But firmware has to be aware and coordinate: it holds the compile-time defaults, it validates and clamps what it is handed, and it drives the radio. A client-only answer firmware does not cooperate with produces a node whose displayed configuration and on-air behavior disagree.

Sub-questions the decision needs to settle:

  • Does firmware keep its own notion of a named preset, or only ever receive raw parameter values?
  • Who owns validation -- does the client refuse an out-of-range combination, or does firmware clamp it, or both?
  • What happens on mismatch between what the client believes is set and what the radio reports?
  • Does a preset apply atomically? Frequency, bandwidth, SF, CR and path hash currently go through separate paths; a partial apply is a node that talks to nobody.

Constraint that binds every option

A US-compliant entry is added; nothing else is removed or changed. The 500 kHz value derives from 47 CFR, which is US law only. Europe, EU 433, Australia, New Zealand, Vietnam and the rest keep their current values. See the scope clarification on #647.

Acceptance

The owner has recorded a decision on both questions, with enough rationale that implementation issues can be filed against it. Nothing is built under this issue.


Agent: WhiteFalcon (session cb12cdd2) -- cross-filed from firmware, not claiming.

Activity

  1. diffwireauto commented on Sep 23, 2026

    @diffwireauto
    Member

    Owner direction, 2026-09-23 (in chat to MagentaHawk), recorded verbatim in substance so it survives context resets.

    What the owner wants:

    1. A radio-preset config file, modeled on what was done for Observer config, holding values for the different meshes. It covers the historical regional defaults (Europe, USA, Australia, ...) and regional variances (Arizona, California, OKI-Mesh, Philly Mesh, MESH 500 variants, etc.).
    2. Inherit from Liam's work. Liam has built, or is building, this same functionality. The aim is to let him do the heavy lifting and inherit from him.
    3. Our own local config layered on top, to add or override entries whenever Liam lags, when we find something sooner, or at the owner's discretion.
    4. User story: from the preset list, apply a preset to Companion, Observer, Repeater, Room Server and Sensor.
    5. Hard constraint: keep backwards compatibility with stock and older firmware. No dependency on Offband-specific control codes. Apply only through stock paths.

    This answers Q1 (source: inherited upstream plus a local overlay, i.e. the hybrid option) and bounds Q2 (the client owns presets; the apply path uses stock commands only). Still open for design: the exact upstream source ("Liam's" registry, to be confirmed), the file format and where it ships, and the per-node-type stock apply paths.

    The #661 static entry is held uncommitted pending the owner's call on whether it ships as a stopgap for the OKI test.

    Agent: MagentaHawk (session 5a8922d6)

  2. diffwireauto commented on Sep 23, 2026

    @diffwireauto
    Member

    Owner decisions, 2026-09-23 (in chat to MagentaHawk):

    1. Hosting: a config JSON in our config repo, not an API on offband-prod.
    2. Liam's registry (api.meshcore.nz/api/v1/config, suggested_radio_settings) is mirrored into the config repo by a scheduled job that commits directly (no PR review of each upstream change). The app never calls Liam's API itself.
    3. Precedence: our config overrides Liam's. The client merges: Offband overlay > Liam mirror > bundled snapshot.
    4. Credit Liam / upstream for the data we use from them.

    Still open: overall plan approval; whether the #661 hardcoded OKI entry ships as a stopgap for the OKI test (starts 2026-09-23); the exact file location in the config repo.

    Agent: MagentaHawk (session 5a8922d6)

  3. diffwireauto commented on Sep 29, 2026

    @diffwireauto
    Member

    Owner decision, 2026-09-29 (in chat to MagentaHawk):

    • No permission request to Liam is needed. The owner's position: Liam offers api.meshcore.nz/api/v1/config as a public resource for MeshCore apps. Supporting facts [verified 2026-09-23..29]: CORS Access-Control-Allow-Origin: *; the official meshcore-dev map and config tools consume it; the MeshCore FAQ routes preset updates to Liam; many third-party apps consume it, and several bundle copies (openhop, MCLite, kNoAPP/MeshCore-Desktop). Mirroring and bundling a snapshot with credit proceeds on that basis.
    • Model confirmed: Liam's list is the base. A small Offband overlay adds what his list lacks (OKI 500 kHz test, Philly, the Russia city presets, Arizona, Off-Grid). The app bundles a snapshot of both for offline use; the network only refreshes. The CI mirror commits directly (decided 2026-09-23). Offering overlay entries upstream to Liam is optional courtesy, not a gate.

    Still open: overall plan approval (Epic + Tasks), the #661 stopgap, and the overlay file location (assumed OffbandMesh/config-profiles).

    Agent: MagentaHawk (session 5a8922d6)

  4. diffwireauto commented on Oct 1, 2026

    @diffwireauto
    Member

    Closing: the owner has decided both questions (decisions recorded in the comments above, 2026-09-23 to 2026-09-29).

    • Q1, source: Liam's public list is the base, mirrored into config-profiles by CI (direct commit). An Offband overlay adds and wins on conflict. The app bundles both for offline use; the network only refreshes. Upstream is credited.
    • Q2, firmware/client split: the client owns presets. It applies them through stock firmware commands only; no Offband-specific codes.

    Implementation is filed under Feature #647 as Epics #721 (A, sources), #726 (B, app catalog + Companion/Observer), #733 (C, remote nodes) and #737 (D, integration testing).

    Agent: MagentaHawk (session 5a8922d6)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions