Skip to content

Settings Reference

Every leaf of the beebo settings tree with its help text, range or choices, generated from the settings tree itself. For how the tree works see Settings. On the node's CLI screen the role prefix (companion. or repeater.) is optional and the live role is implied. companion.* and repeater.* hold each role's own copy of the settings they share.

Companion settings

companion.routing

  • companion.routing.airtime: Transmit budget [#] [0 to 9]. Scales the enforced wait between this node's transmissions; 0 is unthrottled, higher values ease congestion.
  • companion.routing.rxdelay: Base delay before relaying [s] [0 to 20]. Staggers repeats so neighbors that all heard a packet don't collide.
  • companion.routing.dutycycle: Airtime budget expressed as a channel-occupancy percent [%] [1 to 100]. A friendlier view of airtime; writes airtime_factor = 100/percent - 1.
  • companion.routing.seen_window: How long [seconds, fractional] [0 to 60] a repeat of a packet still counts as the same packet: a duplicate, or the echo of our own send that arrived after its echo window (credited as heard, so the confirm ratio and the trial scores do not charge a late echo as a failure; beebo analyze dup-latency sizes it). It also decides whether a dedup-table eviction counts as a live risk (beebo monitor status's rx_dedup_table_full row). Companion value; see repeater.routing.seen_window for the independent repeater copy. Stored as milliseconds. 0 turns the late credit and the live-eviction counting off (a real, literal setting, not a 'reset to default' sentinel); firmware default is 30.

companion.fem

  • companion.fem.rxgain: Front-end module RX gain / LNA — {on|off}. Switches the FEM's low-noise amplifier into the receive path for better weak-signal sensitivity, at a little extra receive current. Distinct from the SX1262's own boosted gain (radio.rxgain); only present on boards whose FEM supports it. This role's own independent copy -- see companion.fem.rxgain/repeater.fem.rxgain.
  • companion.fem.txgain: Front-end module TX gain / PA — {on|off}. Software-selectable external FEM transmit gain; not a PA power switch. Only present on boards whose FEM supports it. This role's own independent copy -- see companion.fem.txgain/repeater.fem.txgain.

companion.radio

  • companion.radio.lora.freq: Carrier frequency [MHz] [137 to 1020]. Must sit in a band legal for your region and match the nodes you talk to directly.
  • companion.radio.lora.bw: Channel bandwidth [kHz] [7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500]. Wider is faster but less sensitive; must match the nodes you talk to directly.
  • companion.radio.lora.sf: Spreading factor [#] [5 to 12]. Higher reaches further but is slower; must match the nodes you talk to directly.
  • companion.radio.lora.cr: Coding rate denominator [#] [5 to 8] (4/N). More redundancy survives noise but costs throughput.
  • companion.radio.lora.preset: Named community-suggested freq/bw/sf/cr quadruplet for a region (from presets.json, mirroring meshcore.nz's own app config) — reading reports the matching preset title or '(custom)' if the live quadruplet doesn't match any of them; writing applies all four fields from the named preset at once, e.g. 'beebo settings companion.radio.lora.preset "USA/Canada"'.
  • companion.radio.txpower: Output power at the PA [dBm] [-9 to board max].
  • companion.radio.rxgain: SX1262 RX boosted-gain mode for weak-signal reception — {on|off}. Independent of the FEM/LNA (fem.rxgain). This role's own independent copy -- see companion.radio.rxgain/repeater.radio.rxgain.
  • companion.radio.cad: Hardware channel activity detection before each transmit — {on|off}. This role's own independent copy -- see companion.radio.cad/repeater.radio.cad.
  • companion.radio.allowed_repeat_freq: Frequency ranges [MHz] this node is allowed to repeat on (read-only). Companion-only: it doesn't apply under repeater role, which has its own (currently unexposed) frequency config.

companion.monitor

  • companion.monitor.enabled: Global capture switch — {on|off}. Pause/resume the ring by toggling this.
  • companion.monitor.rx: Capture RX records — {on|off}.
  • companion.monitor.tx: Capture TX records — {on|off}.
  • companion.monitor.radio: Capture RADIO reference records (config changes) — {on|off}.
  • companion.monitor.env: Capture ENV reference records (noise/battery/heap) — {on|off}.
  • companion.monitor.batt: Capture BATT records (every Vbat sample, idle/forced + trend state) — {on|off}.
  • companion.monitor.tuning: Capture tuning records — {on|off}: the adaptive tuner's proposals (tuner), the evaluation windows (eval) and the A/B trials (trial).
  • companion.monitor.path: RX path mode — {on|off}: an RX record's nbr holds the last three hops of its path, one byte each (the first byte of each hash), instead of the last hop's identity. Off by default. With 2- and 3-byte hashes two neighbors can share a byte.
  • companion.monitor.event: Capture EVENT records (fault transitions and other notable state changes, timestamped instead of a bare sticky flag) — {on|off}. On by default. Same bit as setting/command/route/debug below (see their own help) -- toggling any of the five toggles all five.
  • companion.monitor.setting: Capture SETTING records (admin-visible setting changes) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • companion.monitor.command: Capture COMMAND records (admin commands run) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • companion.monitor.route: Capture ROUTE records (periodic routing-latency snapshot) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • companion.monitor.debug: Capture DEBUG records (folded-in RLOG transport/boot/session trace) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).

companion.profile

  • companion.profile.enabled: Enable/disable ProfileLog (command/span latency profiling ring, see beebo profile) — {on|off}. Off by default; inactive until turned on explicitly. Distinct from monitor.* (MonRing's own capture config) -- ProfileLog measures span duration, a separate concern. This role's own independent copy -- see companion.profile.enabled/repeater.profile.enabled.

companion.node

  • companion.node.coords: Companion's own PREFS-mode advertised coordinates [deg] (used when adv_loc_policy=2/prefs), as 'LAT,LON' -- distinct from repeater.coords (repeater_settings.py, a separate /beebo_repeater field) and from the shared, role-agnostic live-GPS SHARE register (no CLI leaf -- no GPS hardware on beebo, so SHARE always advertises 0,0).
  • companion.node.multi_acks: Whether companion sends multiple ACKs for multi-path replies [#] -- distinct from repeater.multi_acks (repeater_settings.py, a separate /beebo_repeater field).
  • companion.node.path_hash_mode: Path hash length used for companion's new contacts [0=1 byte, 1=2 bytes, 2=3 bytes] -- distinct from repeater.path_hash_mode (repeater_settings.py, a separate /beebo_repeater field).
  • companion.node.name: This node's advertised name (companion persona).
  • companion.node.region.scope: Default flood-advert scope name (channel messages fall back to this scope when none is given); 'none' clears it. Companion's own field (NodePrefs.default_scope_key, stock companion_radio's only scoping mechanism -- it has no RegionMap at all) -- unrelated to repeater.node.region.default, which is repeater's own independent RegionMap default_id.
  • companion.node.adv_loc_policy: Location advertising policy [0=none, 1=share, 2=prefs].
  • companion.node.manual_add_contacts: Whether new contacts must be manually approved — {on|off}.
  • companion.node.autoadd_config: Bitmask of contact types auto-added when manual_add_contacts is off [hex] (1=overwrite, 2=chat/client, 4=repeater, 8=room, 16=sensor). Set with a raw bitmask (e.g. 0x07) or a comma-separated flag name list (e.g. "chat,repeater"); read with no value for a table of which flags are set.
  • companion.node.telemetry.base: Telemetry advertising mode for base [#] [0 to 3].
  • companion.node.telemetry.loc: Telemetry advertising mode for loc [#] [0 to 3].
  • companion.node.telemetry.env: Telemetry advertising mode for env [#] [0 to 3].
  • companion.node.repeat: Whether this node relays other nodes' flood traffic while in companion role — {on|off} (_prefs.client_repeat, CMD_SET_RADIO_PARAMS's trailing byte). Distinct from repeater.repeat, which maps to a different field entirely (the repeater role's own forwarding toggle, disable_fwd) -- this one only matters while board.node.role is companion. Read via CMD_DEVICE_QUERY (stock meshcore's repeat field, fw_ver >= 9); written by re-sending freq/bw/sf/cr from self_info alongside the new value, since CMD_SET_RADIO_PARAMS rewrites all five at once.
  • companion.node.public_key: Companion's own Ed25519 public key (read-only) -- distinct from repeater.node.public_key (repeater_settings.py).
  • companion.node.tz_offset: Hours from UTC [-12 to +14], stored for the app's CLI (get/set tz.offset); nothing on the node uses it. This role's own independent copy -- see companion.node.tz_offset/repeater.node.tz_offset.
  • companion.node.transmit: Whether the radio sends anything — {on|off}. Off is receive-only: no forwards, adverts, ACKs or replies, and beebo cw is refused; stricter than node.repeat, which only stops relaying. This role's own independent copy -- see companion.node.transmit/repeater.node.transmit.
  • companion.node.transport.ble: Whether this role brings up BLE at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • companion.node.transport.tcp: Whether this role brings up TCP at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • companion.node.transport.usb: Whether this role brings up USB at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • companion.node.wifi.ssid: WiFi network name (SSID) the node joins to offer the TCP companion transport. This role's own independent copy -- see companion.node.wifi.ssid/repeater.node.wifi.ssid.
  • companion.node.wifi.password: WiFi password, write-only (see node.wifi.password's help for why). This role's own independent copy. (write-only, prompts for the value)
  • companion.node.wifi.ip: Current WiFi station IP address, assigned at run time by DHCP once the node joins its configured network -- read-only. Not really a per-role value (there's one physical WiFi radio, whichever role is live) -- companion.node.wifi.ip/repeater.node.wifi.ip both read the same run-time cache regardless of role. Empty means WiFi is off or the node hasn't associated yet.
  • companion.node.wifi.rssi: Current WiFi STA RSSI in dBm -- read-only, same run-time/role-agnostic shape as node.wifi.ip. No BLE equivalent: BLE RSSI can't be read synchronously on this hardware without racing a live BLE teardown (see fw's SerialBLEInterface::requestHealthSample() comment), so it isn't exposed at all. WIFI_RSSI_UNAVAILABLE (127) means WiFi is off or the node hasn't associated yet.
  • companion.node.ble.pin: BLE pairing PIN, this role's own stored override -- see node.ble.pin's help for the general semantics. Reports the stored value, not the resolved active session pin (only meaningful for whichever role is actually live).
  • companion.node.ble.rssi: Current BLE RSSI in dBm -- read-only, same run-time/role-agnostic shape as node.ble.rssi -- companion.node.ble.rssi/repeater.node.ble.rssi both read the same run-time cache regardless of role.

Board settings

board.adc

  • board.adc.multiplier: Battery ADC scale multiplier. 0 resets to the board default. Works for both companion and repeater nodes.
  • board.adc.resolution: Battery ADC sample resolution, bits [10|12]. 12-bit is the default, giving ~4x finer quantization than 10-bit at the cost of exposing more raw analog noise. Works for both companion and repeater nodes.

board.fem

  • board.fem.rssi_offset.lna: dB added to RSSI and the noise floor while the FEM LNA is in the RX path (fem.rxgain on), referring them to the antenna connector. Nominal -17; 0 = no correction.
  • board.fem.rssi_offset.bypass: dB added to RSSI and the noise floor while the FEM LNA is bypassed (fem.rxgain off), referring them to the antenna connector. Nominal +2; 0 = no correction.

board.battery

  • board.battery.sample_period: Battery resample period [seconds] [1 to 65535], default 300s.
  • board.battery.sample_window: How long before sample_period elapses to start trying for an idle-gated sample [seconds] [1 to 60], default 30s.
  • board.battery.present: Does this node have a real battery installed? {yes|no}. Resolves the ambiguity between 'no battery' and 'battery already full at boot' that voltage alone can't tell apart -- no assumption is made from node type.

board.state

  • board.state.quiet: Bench IR-drop test {on|off}. 'on' sleeps the radio + FEM and suspends mesh/radio work, leaving only the VBAT ADC path live so a bench meter can read board current in isolation. 'off' wakes both live and resumes normal operation immediately -- no reboot needed. Works for both companion and repeater nodes.

board.node

  • board.node.role: Node role -- ['companion', 'repeater']. Persisted; an actual change always reboots the device. multi_role firmware only.
  • board.node.password: The node's one backup/recovery credential (see beebo config backup/recover) -- distinct from repeater.admin.password (mesh admin login), and present on every build, static companion/repeater included, unlike repeater.admin.password which only exists when the repeater role is compiled in. Unset by default (no compiled-in default, unlike repeater.admin.password's ADMIN_PASSWORD) -- config backup refuses to run until this is set. Write-only, never echoed back on read -- get reports (set)/(unset) only. (write-only, prompts for the value)
  • board.node.id: The ESP32's factory eFuse base MAC (read-only) -- a hardware-burned identifier, stable across reflashes, identity changes, and role switches, unlike companion.node.public_key/repeater.node.public_key (ed25519) or board.node.role (shared).
  • board.node.name: Human-editable alias for board.node.id (DEVICE_NAME plan) -- distinct from the per-role persona names (companion.name/repeater.node.name): this identifies the physical board, not a role. Empty until set; beebo config's default filenames fall back to board.node.id's hex string until then.

Console settings (local)

  • console.autosave: Whether pref changes are written to flash immediately — {on|off}. On (the default) writes every pref change to flash at once. Off holds changes in RAM only, so they survive until reboot but are not saved — pair it with beebo settings commit to write a batch, or beebo settings restore to roll back.
  • console.transport: Default transport used when no --ble/--tcp/--usb is given — {ble|tcp|usb}. (local to this machine)
  • console.log_level: Default logging verbosity, overridable per-run with --log-level. (local to this machine)
  • console.dbg_level: Default minimum debug-event severity monitor debug/monitor watch stream, when no H/M/L is given in their own KINDS arguments — H | M | L. (local to this machine)
  • console.device_id: Optional: a human-readable record of which board.node.id this alias is meant to point at. Not auto-verified against the live device on connect (see common/config.py's module docstring for why). (local to this machine)
  • console.device_name: Optional: this alias's device.name label, purely informational. (local to this machine)
  • console.node_name: Auto-learned on this alias's first successful connect: the live device's board.node.name. Every later connect verifies the live device still matches, refusing on a mismatch (see common/config.py's module docstring). Clear it (empty string) to re-learn after an intentional device swap under this alias. (local to this machine)
  • console.node_role: Auto-learned alongside node_name (see there) -- the live device's role (companion|repeater) at that connect. Same verify-on-connect/clear-to-re-learn behavior as node_name. (local to this machine)

console.ble

  • console.ble.address: Default BLE MAC/name; 'scan' discovers and picks a device. (local to this machine)

console.tcp

  • console.tcp.host: Default TCP host[:port]. (local to this machine)

console.usb

  • console.usb.port: Default USB serial port path. (local to this machine)

Repeater settings

repeater.routing

  • repeater.routing.rxdelay: Base delay before relaying [s] [0 to 20], independent of companion.routing.rxdelay. Staggers repeats so neighbors that all heard a packet don't collide.
  • repeater.routing.airtime: Transmit budget [#] [0 to 9], independent of companion.routing.airtime. Scales the enforced wait between this node's own transmissions; 0 is unthrottled, higher values ease congestion.
  • repeater.routing.seen_window: How long [seconds, fractional] [0 to 60] a repeat of a packet still counts as the same packet: a duplicate, or the echo of our own send that arrived after its echo window (credited as heard, so the confirm ratio and the trial scores do not charge a late echo as a failure; beebo analyze dup-latency sizes it). It also decides whether a dedup-table eviction counts as a live risk (beebo monitor status's rx_dedup_table_full row). Independent of companion.routing.seen_window. Stored as milliseconds. 0 turns the late credit and the live-eviction counting off (a real, literal setting, not a 'reset to default' sentinel); firmware default is 30.
  • repeater.routing.retry: Coding rates 4/x of the retries of a forwarded flood whose echo timed out, in order, up to three [5 to 8 each]: 5|6 retries first at 4/5 then at 4/6. 5 is the same rate as the first send, 8 the most robust (longest airtime). 0 disables retries.
  • repeater.routing.dutycycle: Repeater's own airtime budget as a channel-occupancy percent [%] [1 to 100], independent of companion.routing.dutycycle. A friendlier view of repeater.routing.airtime; writes airtime_factor = 100/percent - 1.
  • repeater.routing.txdelay: Base TX delay factor [0 to 2], scales the random wait before this node's own transmissions.
  • repeater.routing.direct.txdelay: TX delay factor for direct (non-flood) transmissions [0 to 2].
  • repeater.routing.agc.reset.interval: AGC reset interval [s], rounded to a multiple of 4.
  • repeater.routing.interference.threshold: Interference threshold [0 to 9]. Higher values require a noisier channel before the radio reports interference. (CommonCLI wire key stays "int.thresh" -- only this path's name changed, per SETTINGS_TREE_CLEANUP.md Decision D.)
  • repeater.routing.tuning.adaptive.enabled: Adaptive tuner on/off — {on|off}. Observe-only by default: logs MON_ADAPTIVE proposals to the monitor ring every 5 min. Whether a given param's proposals actually get written live is controlled separately by tuning.adaptive.applied. Independent of the trial (tuning.trial.enabled). RAM-only — always back to 'off' after a reboot.
  • repeater.routing.tuning.adaptive.applied: Per-param live-actuation bitmask [0 to 63], bit i = AdaptiveController::specFor(i)'s param (0=rx_delay_base, 1=tx_delay_factor, 2=direct_tx_delay_factor, 3=agc_reset_interval, 4=interference_threshold, 5=airtime_factor). A clear bit keeps that param observe-only; 0 (default) means every param stays observe-only. RAM-only — always back to 0 after a reboot.
  • repeater.routing.tuning.adaptive.window.min_s: Shortest evaluation window, seconds [1 to 65535, <= max_s]; default 300. RAM-only. Invalidates the window in progress.
  • repeater.routing.tuning.adaptive.window.max_s: Longest evaluation window, seconds [1 to 65535, >= min_s]; default 3600. A window with no RX activity at max_s is insufficient_data. RAM-only. Invalidates the window in progress.
  • repeater.routing.tuning.score.routed: Weight of packets routed per hour (confirmable attempts; a retry is not one) in the score both tuners judge windows with [-50 to 50], in tenths (10 = 1.0, 0 = ignored, negative = a cost). Defaults: routed 10, delivered 10, received 0, which is the confirmed deliveries per hour. RAM-only. Refused while a trial is running; between trials it restarts the trial sequence and the adaptive tuner's statistics.
  • repeater.routing.tuning.score.delivered: Weight of the share of the routed packets that were confirmed in the score both tuners judge windows with [-50 to 50], in tenths (10 = 1.0, 0 = ignored, negative = a cost). Defaults: routed 10, delivered 10, received 0, which is the confirmed deliveries per hour. RAM-only. Refused while a trial is running; between trials it restarts the trial sequence and the adaptive tuner's statistics.
  • repeater.routing.tuning.score.received: Weight of valid packets received per hour in the score both tuners judge windows with [-50 to 50], in tenths (10 = 1.0, 0 = ignored, negative = a cost). Defaults: routed 10, delivered 10, received 0, which is the confirmed deliveries per hour. RAM-only. Refused while a trial is running; between trials it restarts the trial sequence and the adaptive tuner's statistics.
  • repeater.routing.tuning.trial.enabled: On-device A/B trial master switch — {on|off}. A trial runs only when this and that switch's switches.<lna|rxboost|cr>.enable are on. Independent of the adaptive tuner (tuning.adaptive.enabled). RAM-only — always back to 'off' after a reboot. Turning it off aborts a running trial.
  • repeater.routing.tuning.trial.switches.rxboost.enable: Include the on-device A/B trial of RX boosted gain in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.rxboost.values: Values of RX boosted gain the trial explores [0 to 1]: A first, then 1 to 3 challengers, separated by commas (default 0,1). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.lna.enable: Include the on-device A/B trial of FEM LNA in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.lna.values: Values of FEM LNA the trial explores [0 to 1]: A first, then 1 to 3 challengers, separated by commas (default 0,1). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.agc.enable: Include the on-device A/B trial of AGC reset interval [s] in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.agc.values: Values of AGC reset interval [s] the trial explores [0 to 1020]: A first, then 1 to 3 challengers, separated by commas (default 0,8,16,32). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.interference.enable: Include the on-device A/B trial of interference threshold in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.interference.values: Values of interference threshold the trial explores [0 to 9]: A first, then 1 to 3 challengers, separated by commas (default 0,3,6,9). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.cad.enable: Include the on-device A/B trial of CAD in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.cad.values: Values of CAD the trial explores [0 to 1]: A first, then 1 to 3 challengers, separated by commas (default 0,1). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.cr.enable: Include the on-device A/B trial of coding rate in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.cr.values: Values of coding rate the trial explores [5 to 8]: A first, then 1 to 3 challengers, separated by commas (default 5,6,7,8). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.multiacks.enable: Include the on-device A/B trial of multi acks in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.multiacks.values: Values of multi acks the trial explores [0 to 1]: A first, then 1 to 3 challengers, separated by commas (default 0,1). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.retry.enable: Include the on-device A/B trial of retry policy in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.retry.values: Values of retry policy the trial explores (policies separated by commas, each 0 or 1 to 3 coding rates from 5 to 8 separated by '|'): A first, then 1 to 3 challengers, separated by commas (default 0,5,5|6,5|7). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.rxdelay.enable: Include the on-device A/B trial of RX delay base in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.rxdelay.values: Values of RX delay base the trial explores [0 to 20]: A first, then 1 to 3 challengers, separated by commas (default 0,7,13,20). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.txdelay.enable: Include the on-device A/B trial of TX delay factor in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.txdelay.values: Values of TX delay factor the trial explores [0 to 2]: A first, then 1 to 3 challengers, separated by commas (default 0,0.5,1,2). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.directtxdelay.enable: Include the on-device A/B trial of direct TX delay factor in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.directtxdelay.values: Values of direct TX delay factor the trial explores [0 to 2]: A first, then 1 to 3 challengers, separated by commas (default 0,0.5,1,2). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.airtime.enable: Include the on-device A/B trial of airtime factor in the sequence [0 to 1]; 1 = yes (default: all are on, so tuning.trial.enabled runs the whole sequence). One switch runs at a time when tuning.trial.enabled is on, in the order rxboost, lna, agc, interference, cad, cr, multiacks, retry, rxdelay, txdelay, directtxdelay, airtime; a switch turns itself off once decided. A trial changes it live only (a reboot reverts it) and persists the winner. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.switches.airtime.values: Values of airtime factor the trial explores [0 to 9]: A first, then 1 to 3 challengers, separated by commas (default 0.5,1,3,9). The sequence first stores A; the first trial compares A with the first challenger, each later one compares the winner, which is persisted, with the next challenger. A challenger equal to the winner is skipped. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.confidence_pct: Trial confidence level, percent [90, 95 or 99]; default 95. How sure the node must be before it adopts the alternative: 100 minus it is about the most often a trial of a setting with no real gain adopts it, counting every look (sequential t-test on the paired score difference); higher adopts less readily and needs more pairs. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.min_gain_pct: Smallest worthwhile score gain, percent [0 to 50]; default 5. When even the best case of the trial's confidence interval is below it, the trial stops early and keeps the original. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.min_pkt_rate: The score's own events per minute (confirmed deliveries for the default score; normalized so a uniform scale of the score weights does not change it) a FIXED schedule (block_size_s and block_count both set) needs before its next trial starts, and that every A B B A cycle of a running one must clearly average [0 to 255]; default 5, 0 = no minimum and no idle stop. A planned (auto) schedule adapts to any rate and ignores it. Below it before a start the sequence waits, checking once a minute; below it over a cycle the trial ends idle, keeps the original and runs again an hour later, and three in a row turn tuning.trial.enabled off. RAM-only. A running trial keeps the value it started with for its idle stop.
  • repeater.routing.tuning.trial.profile: Which switches a trial sequence runs and how many values each tries — {main|exhaustive}. main (default): the FEM LNA, CAD, TX delay factor and retry policy, one challenger each against the stored value. exhaustive: every switch with its full value list. Selecting a profile sets the switches' .enable and resets their .values. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.start: Where a trial sequence starts — {stored|list}. stored (default): each switch's A is its stored value, the last winner, and every list value is a challenger. list: the sequence first stores each switch's first list value as A. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.combined: Run one combined trial instead of one per switch — {on|off}. Side A has every participant at its stored value, side B at its current challenger (the first list value with start stored, the second with start list); a switch participates when selected and its B differs from its A, and at least two must. A win adopts every participant's B. Every selected switch is done after it. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.block_size_s: Trial block length, seconds [0 = auto, 1 to 3600]; default 0: set before every A/B/B/A cycle from the node's traffic so a block holds about 50 of the score's events. Blocks alternate A/B/B/A so each hour of day is compared like for like. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.block_count: Most blocks per trial [0 = auto, 2 to 1000], rounded down to whole A/B pairs; default 0: planned from the confidence, min gain and the noise the trial measures, or the trial is skipped as underpowered; it ends earlier when the decision bounds settle it. With block_size_s also set the schedule is fixed. RAM-only. Aborts a running trial.
  • repeater.routing.tuning.trial.block_spread_pct: Advanced: override of the block spread a trial's first plan starts from, percent [0 to 70]; default 0 = built-in (14: c = 0.02), the relative standard deviation of a block that a longer block does not average away. Higher starts with more pairs. A running trial moves it toward what its own pairs show, so it rarely needs setting. RAM-only. Aborts a running trial.
  • repeater.routing.loop.detect: Flood-loop suppression aggressiveness — {off|minimal|moderate|strict}.
  • repeater.routing.flood.max: Max hop count for flood-routed packets [0 to 64].
  • repeater.routing.flood.max_advert: Max hop count for flood-routed adverts [0 to 64].
  • repeater.routing.flood.max_unscoped: Max hop count for unscoped flood packets [0 to 64].

repeater.guest

  • repeater.guest.password: Guest/room-server login password (not the repeater's own admin password — see repeater.admin.password). Read back in cleartext over a legacy CommonLink text connection; write-only over a binary (multi_role) connection, same as repeater.admin.password — treat beebo settings repeater.guest.password as a secret-revealing command when it does read back. (write-only, prompts for the value)

repeater.fem

  • repeater.fem.rxgain: Front-end module RX gain / LNA — {on|off}. Switches the FEM's low-noise amplifier into the receive path for better weak-signal sensitivity, at a little extra receive current. Distinct from the SX1262's own boosted gain (radio.rxgain); only present on boards whose FEM supports it. This role's own independent copy -- see companion.fem.rxgain/repeater.fem.rxgain.
  • repeater.fem.txgain: Front-end module TX gain / PA — {on|off}. Software-selectable external FEM transmit gain; not a PA power switch. Only present on boards whose FEM supports it. This role's own independent copy -- see companion.fem.txgain/repeater.fem.txgain.

repeater.radio

  • repeater.radio.lora.freq: Carrier frequency [MHz] [137 to 1020]. Must sit in a band legal for your region and match the nodes you talk to directly.
  • repeater.radio.lora.bw: Channel bandwidth [kHz] [7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500]. Wider is faster but less sensitive; must match the nodes you talk to directly.
  • repeater.radio.lora.sf: Spreading factor [#] [5 to 12]. Higher reaches further but is slower; must match the nodes you talk to directly.
  • repeater.radio.lora.cr: Coding rate denominator [#] [5 to 8] (4/N). More redundancy survives noise but costs throughput.
  • repeater.radio.lora.preset: Named community-suggested freq/bw/sf/cr quadruplet for a region (from presets.json, mirroring meshcore.nz's own app config) — reading reports the matching preset title or '(custom)' if the live quadruplet doesn't match any of them; writing applies all four fields from the named preset at once, e.g. 'beebo settings companion.radio.lora.preset "USA/Canada"'.
  • repeater.radio.txpower: Output power at the PA [dBm] [-9 to board max].
  • repeater.radio.rxgain: SX1262 RX boosted-gain mode for weak-signal reception — {on|off}. Independent of the FEM/LNA (fem.rxgain). This role's own independent copy -- see companion.radio.rxgain/repeater.radio.rxgain.
  • repeater.radio.cad: Hardware channel activity detection before each transmit — {on|off}. This role's own independent copy -- see companion.radio.cad/repeater.radio.cad.

repeater.monitor

  • repeater.monitor.enabled: Global capture switch — {on|off}. Pause/resume the ring by toggling this.
  • repeater.monitor.rx: Capture RX records — {on|off}.
  • repeater.monitor.tx: Capture TX records — {on|off}.
  • repeater.monitor.radio: Capture RADIO reference records (config changes) — {on|off}.
  • repeater.monitor.env: Capture ENV reference records (noise/battery/heap) — {on|off}.
  • repeater.monitor.batt: Capture BATT records (every Vbat sample, idle/forced + trend state) — {on|off}.
  • repeater.monitor.tuning: Capture tuning records — {on|off}: the adaptive tuner's proposals (tuner), the evaluation windows (eval) and the A/B trials (trial).
  • repeater.monitor.path: RX path mode — {on|off}: an RX record's nbr holds the last three hops of its path, one byte each (the first byte of each hash), instead of the last hop's identity. Off by default. With 2- and 3-byte hashes two neighbors can share a byte.
  • repeater.monitor.event: Capture EVENT records (fault transitions and other notable state changes, timestamped instead of a bare sticky flag) — {on|off}. On by default. Same bit as setting/command/route/debug below (see their own help) -- toggling any of the five toggles all five.
  • repeater.monitor.setting: Capture SETTING records (admin-visible setting changes) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • repeater.monitor.command: Capture COMMAND records (admin commands run) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • repeater.monitor.route: Capture ROUTE records (periodic routing-latency snapshot) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).
  • repeater.monitor.debug: Capture DEBUG records (folded-in RLOG transport/boot/session trace) — {on|off}. Alias of event -- same bit, no independent toggle (see its help).

repeater.profile

  • repeater.profile.enabled: Enable/disable ProfileLog (command/span latency profiling ring, see beebo profile) — {on|off}. Off by default; inactive until turned on explicitly. Distinct from monitor.* (MonRing's own capture config) -- ProfileLog measures span duration, a separate concern. This role's own independent copy -- see companion.profile.enabled/repeater.profile.enabled.

repeater.admin

  • repeater.admin.password: Admin/owner login password used for mesh login/cmd auth (distinct from guest.password). Defaults to the firmware's own compiled-in ADMIN_PASSWORD until changed (varies by build env -- not always the literal "password"). The value itself is write-only, never echoed back on read (over a binary connection, get instead reports (default)/(set): a server-side comparison against ADMIN_PASSWORD via GET_PREFS_TLV(KEY_REPEATER_PASSWORD), mirroring node.wifi.password's (set)/(unset); unavailable at all over a CommonLink, no CommonCLI text-CLI equivalent exists). Run beebo settings repeater.admin.password with no value and you'll be prompted for it hidden, twice — a plaintext CLI argument is rejected outright since it'd already be in your shell history before any confirmation could help. Even a successful set only proves what's in RAM/ComPrefs, not that the mesh login check accepts it — verify with beebo admin <target> login <newpwd>. (write-only, prompts for the value)

repeater.node

  • repeater.node.name: The repeater persona's own advertised name (distinct from companion.name) -- stored at /com_prefs offset 4. Empty until customized, in which case the device falls back to the companion name.
  • repeater.node.repeat: Whether this node forwards other nodes' traffic — {on|off}. Off turns the repeater into a leaf node (advertises but doesn't relay).
  • repeater.node.multi_acks: Whether this node sends multiple ACKs for multi-path replies [#], independent of companion.multi_acks (companion's own copy, companion_settings.py).
  • repeater.node.path_hash_mode: Path hash length used for new contacts [0=1 byte, 1=2 bytes, 2=3 bytes], independent of companion.path_hash_mode (companion's own copy, companion_settings.py).
  • repeater.node.adv_loc_policy: The repeater persona's own advertised-location policy [0=none, 1=share, 2=prefs], independent of companion.adv_loc_policy (companion's own copy, companion_settings.py). 'share' reads the shared, role-agnostic live-GPS register, which stays 0,0 on beebo (no GPS hardware) -- deliberately not seeded from repeater.coords, so an accidental 'share' is obviously wrong rather than silently acting like 'prefs'. Use 'prefs' (backed by repeater.coords) for a fixed location.
  • repeater.node.coords: The repeater persona's own advertised coordinates [deg], as 'LAT,LON', independent of companion.coords (companion's own copy, companion_settings.py).
  • repeater.node.allow.read.only: Whether unauthenticated clients may read (but not change) prefs over the console — {on|off}.
  • repeater.node.advert.interval: Interval between local (zero-hop) adverts [minutes], 60 to 240, or 0 to disable.
  • repeater.node.advert.flood_interval: Interval between flood adverts [hours], 3 to 168, or 0 to disable.
  • repeater.node.owner.info: Free-text owner/contact info shown to guest logins.
  • repeater.node.region.home: This repeater's home region -- a bookmark only (RegionMap's own home_id). No forwarding or send code anywhere reads it; it exists purely for 'region tree'/'region home' to show which region you consider yours. See repeater.node.region.default for the region that actually tags this node's own outgoing traffic -- home_id and default_id are two genuinely independent RegionMap fields (same as stock simple_repeater keeps them), not synced with each other. 'none'/'0'/empty clears this bookmark (binary connection only -- no CommonLink equivalent for clearing, only reading/setting). Setting this to a region name that doesn't exist yet auto-defines it first (root-level, flood-allowed by default -- same as a bare beebo region put <name>), so this always applies directly.
  • repeater.node.region.default: The region this repeater's own outgoing traffic (self-adverts, flood replies) is actually tagged with -- RegionMap's own independent default_id/getDefaultRegion(), GET/SET_REGION_DEFAULT (distinct from repeater.node.region.home's home_id). Restores stock simple_repeater's own default-scope mechanism, which multi_role's repeater role didn't consult until this was wired up -- it used to fall back to companion.node.region.scope (companion's own field, companion_settings.py) as a stand-in, which this leaf is now unrelated to. Setting this to a region name that doesn't exist yet auto-defines it first (root-level, flood-allowed by default), matching CommonCLI's real 'region default <name>' behavior exactly.
  • repeater.node.region.list: Read-only inventory of this repeater's defined region names. Over a CommonLink this is only the flood-allowed subset (CommonCLI's text-CLI has no unconditional 'list everything' form); over a binary connection it's every defined region regardless of its flood-allow/deny flag.
  • repeater.node.public_key: Repeater's own Ed25519 public key (read-only) -- distinct from companion.node.public_key (companion_settings.py) and from node.public_key (whichever role is currently live).
  • repeater.node.tz_offset: Hours from UTC [-12 to +14], stored for the app's CLI (get/set tz.offset); nothing on the node uses it. This role's own independent copy -- see companion.node.tz_offset/repeater.node.tz_offset.
  • repeater.node.transmit: Whether the radio sends anything — {on|off}. Off is receive-only: no forwards, adverts, ACKs or replies, and beebo cw is refused; stricter than node.repeat, which only stops relaying. This role's own independent copy -- see companion.node.transmit/repeater.node.transmit.
  • repeater.node.transport.ble: Whether this role brings up BLE at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • repeater.node.transport.tcp: Whether this role brings up TCP at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • repeater.node.transport.usb: Whether this role brings up USB at boot — {on|off}. This role's own independent copy -- see node.transport.* for the general semantics (live-apply behavior, ble/tcp mutual exclusion, usb fallback).
  • repeater.node.wifi.ssid: WiFi network name (SSID) the node joins to offer the TCP companion transport. This role's own independent copy -- see companion.node.wifi.ssid/repeater.node.wifi.ssid.
  • repeater.node.wifi.password: WiFi password, write-only (see node.wifi.password's help for why). This role's own independent copy. (write-only, prompts for the value)
  • repeater.node.wifi.ip: Current WiFi station IP address, assigned at run time by DHCP once the node joins its configured network -- read-only. Not really a per-role value (there's one physical WiFi radio, whichever role is live) -- companion.node.wifi.ip/repeater.node.wifi.ip both read the same run-time cache regardless of role. Empty means WiFi is off or the node hasn't associated yet.
  • repeater.node.wifi.rssi: Current WiFi STA RSSI in dBm -- read-only, same run-time/role-agnostic shape as node.wifi.ip. No BLE equivalent: BLE RSSI can't be read synchronously on this hardware without racing a live BLE teardown (see fw's SerialBLEInterface::requestHealthSample() comment), so it isn't exposed at all. WIFI_RSSI_UNAVAILABLE (127) means WiFi is off or the node hasn't associated yet.
  • repeater.node.ble.pin: BLE pairing PIN, this role's own stored override -- see node.ble.pin's help for the general semantics. Reports the stored value, not the resolved active session pin (only meaningful for whichever role is actually live).
  • repeater.node.ble.rssi: Current BLE RSSI in dBm -- read-only, same run-time/role-agnostic shape as node.ble.rssi -- companion.node.ble.rssi/repeater.node.ble.rssi both read the same run-time cache regardless of role.