Agent reference: Meshtastic channel URLs & Store & Forward
August 21, 2026 · View on GitHub
Deep subsystem reference for AI assistants. Open this when a task touches Meshtastic config apply, admin, channel URLs, Store & Forward, remote admin, last-heard, or static GPS. Hard rules live in AGENTS.md.
- Config apply (Radio / Modules / Security): Firmware
setConfig/setModuleConfigreplace full protobuf structs. UI must merge cached device slices with form edits viameshtasticConfigApply.ts(mergeMeshtasticConfigApplyValue,buildMeshtasticModuleApplyValue); slices live indeviceStore.meshtasticConfigSlicesandmoduleConfigs(PacketRouter + runtime lifecycle wire effects). Module-specific validation:meshtasticMqttModuleApply.ts,meshtasticSerialModuleApply.ts. Apply failures surfaceclientNotificationtext within 8s (meshtasticClientNotification.ts→formatMeshtasticModuleApplyError); inline status viaConfigApplyNotice.tsx. Forms re-sync after reboot viauseSyncFormFromConfig. - Administration tab:
AdminPanel.tsx— device commands and Danger Zone (reboot, shutdown, factory reset, NodeDB reset, OTA/DFU); sharedConfirmModal.tsxwith Radio/Modules destructive flows. Local-only OTA/DFU disabled when Configure node targets a remote node. - Remote admin module snapshot:
meshtasticRemoteAdminModuleFetches.ts— canonical list/count ofModuleConfigreads during remote snapshot (REMOTE_ADMIN_MODULE_CONFIG_FETCHES). - Channel URLs:
src/shared/meshtasticUrlEncoder.ts(parse/generate),src/shared/meshtasticChannelApply.ts(replace vs add-only apply); Radio panel UI; Meshtastic-only. - S&F chat history:
src/renderer/lib/meshtasticBacklogUtils.ts—CLIENT_HISTORYon primary router heartbeat after RF configure (auto: 50-msg cap, 120 min window cap, 15 min per-server cooldown, 5 min offline gate;storeForwardAutoFetchHistoryopt-out;storeForwardHistoryProfile: 'conservative' | 'aggressive'indefaultAppSettings.tstunes offline gate / cooldown / cap aggressiveness; manual catch-up in Chat). Protobuf decode for replayed text,via_store_forwardon messages; do not await SDK queue for history (async replay). - MQTT broker clientId:
src/main/mqtt-broker-client-id.ts— stable per-install IDs inapp_settings(meshtasticMqttClientId,meshcoreMqttClientId); MeshCore LetsMeshv1_username unchanged as clientId. - PKC remote admin (firmware 2.5+):
meshtasticRemoteAdmin.ts— PKI-wrappedAdminMessageviaMeshDevice.sendRaw()(pkiEncrypted: true, channel omitted on wire); session passkeys (~300s); tab-scoped snapshot routes inmeshtasticRemoteAdminSnapshot.ts(Channels-first LoRa load). Per-node keys:meshtasticRemoteAdminKeyStorage.ts(meshtasticRemoteAdminKey:<nodeNum>inapp_settings; base64 /base64:/ 64-char hex paste). Dest public key: NodeDB hex first, stored admin-key base64 fallback.useMeshtasticRuntime:configureTargetNodeNum,remoteConfigSnapshot,runRemoteAdminOp(errors → UI + toast); serialize admin reads with S&F (remoteAdminReadsActiveCountinmeshtasticBacklogUtils.ts). Requires connected local radio (MQTT-only cannot admin). UI:ConfigureNodeSelector.tsx; NodeDetailModal admin key + Configure node remotely; SecurityPanel Copy public key. Persist last target inmeshtasticConfigureTargetNodeNum. Gate withhasRemoteAdmin. Legacy admin channel (PSK +"admin") out of scope. - Meshtastic last heard:
meshtasticLastHeard.ts— bumplast_heardon live RF packets (not only text);computeNodeInfoLastHeardMsmerges radio NodeDB timestamps with client-side values (max wins). Configure replay guard must apply innodeStore(upsertNode,updatePosition,meshtasticLastHeardPatch) viameshtasticConfigurePhase.ts, not only inmeshtasticNodeSideEffects— PacketRouter updates the store before side effects run. Duringdevice.configure(), the Meshtastic SDK replays NodeDB asnode_infoframes and may emit syntheticonUserPacket/onPositionPacketwithrxTime = now; guards skip those bumps. UserPacket path usesmergeMeshtasticUserPacketLastHeard(ms); NodeDB path usescomputeNodeInfoLastHeardMs(sec). Protocol decode must usemeshtasticPacketRxTimeMs—@meshtastic/corePacketMetadata.rxTimeis already aDate(ms); neverrxTime * 1000(Date×1000 → ~1e15; regression lock inMeshtasticProtocol.test.tsDate-shaped rxTime + source-policymeshtastic-protocol-rxtime-via-helper). SQLite storeslast_heardas unix seconds;meshtasticDbCacheHydration.tsnormalizes to ms on hydrate (normalizeLastHeardMs); stale/online checks useeffectiveLastHeardMs. BLE configure uses a stall watchdog (MESHTASTIC_BLE_CONFIGURE_TIMEOUT_MS, reset on each replayednode_info/ position / telemetry viatouchMeshtasticConfigureProgress) so large NodeDBs are not cut off mid-stream. Node list JSON export emitslast_heardas unix seconds withlast_heard_unit: 'unix_sec'. - Static GPS:
src/renderer/lib/gpsSource.ts— App tab static coordinates sync to self-node, map, and radiosetPosition.