Package-level declarations
Types
Envelope of the bundled device_bootloader_ota_quirks.json asset.
Defines the capabilities and feature support based on the device firmware version.
Monotonic counters for connection lifecycle events that cannot be inferred reliably from transient ConnectionState values. A fast disconnect/reconnect may be observed only as the final state, while these counters retain both lifecycle boundaries.
One atomically published view of canonical connection state and its lifecycle evidence.
Type-safe wrapper for contact key strings (channel index + node address).
A data class version of the protobuf MeshPacket + Data subpacket.
A selected-radio address, parsed from its stored form: one InterfaceId character followed by the transport's own identity for the device.
A msh.to device link resolved by the Meshtastic API (/resource/deviceLinks) and cached locally. Every link routes through the msh.to redirect service.
The physical transports a radio can be reached over. Demo Mode reaches no radio and has no DeviceType.
Zero-overhead wrapper providing structured access to parse and compare device version strings.
The event's own firmware release, so a client can surface its version or offer the download (zipUrl).
Display metadata for one event-specific firmware edition (Hamvention, DEFCON, …).
Font-family names for event branding — Google Font family names (e.g. Lato / Atkinson Hyperlegible), not URLs. Captured so the data is available; actually rendering with these fonts is a separate, platform-specific concern (a downloadable-font provider is Google-flavor only), so consumers may ignore them and fall back to the app typeface.
A labeled link for an event (website, schedule, map, …).
Response envelope for event-firmware display metadata. Matches the bundled event_firmware.json and the live GET https://api.meshtastic.org/resource/eventFirmware API (the source of truth), sharing the {version, generatedAt, source, <payload>[]} shape used by NetworkDeviceLinksResponse.
Richer event branding beyond a single accent color. Not all editions carry a full theme.
Named brand colors (#RRGGBB) for an event theme; any may be absent.
Outcome of checking a device's firmware version against the app's minimum requirements.
Authoritative target catalogue referenced by a firmware release's zip_url.
One firmware target declared by a FirmwareReleaseManifest.
Where a firmware-update nudge takes the user.
Fully validated connected-device firmware update information for platform UI and notifications.
Determines whether a connected local device is behind the latest stable firmware and where it can be updated.
The only permitted visual treatment for a firmware update: an informational update nudge.
Connection transports that can determine the Android firmware-update destination.
The rung a board reads at wherever the app names its support status. Top to bottom: hardware the project actively supports, independent maker hardware, then community hardware (including anything not actively supported).
Address identifiers for all supported radio backend implementations.
Nested by architecture, then (for nRF52) by SoftDevice wire value — RP2040 has no SoftDevice concept at all, so it correctly has no sub-key, unlike the old flat {s140_6_1_1, s140_7_3_0, rp2040} shape that mixed a SoftDevice-variant axis with an architecture axis in one object.
Pinned nRF52/RP2040 maintenance UF2 manifest — factory-erase and OTAFIX bootloader self-update images, keyed by hardware. Envelope of resource/maintenanceUf2 and the bundled maintenance_uf2.json seed asset. Each image's own sha256 is checked against its downloaded bytes before any write — see MaintenanceUf2.kt — independently of how this manifest itself is fetched.
Represents activity on the mesh network.
A received Mesh Beacon invitation — an advisory, zero-hop advertisement from another mesh offering a channel to join. Beacons are unsigned and originate from nodes outside the local NodeDB, so this is deliberately not a message/contact; it lives in the Discovery surface instead.
App-level MQTT proxy connection state, decoupled from the MQTT library's internal type.
UI-friendly outcome of a one-shot MQTT broker reachability probe.
A single resolved device link from the Meshtastic API.
Response envelope of GET /resource/deviceLinks on the Meshtastic API. The server resolves meshtastic/msh.to's catalog into fully-classified links (type + targets + regions), so the client only stores and filters them — no client-side matching heuristic.
The API also returns a pullRequests array of open firmware PRs. It is deliberately not modelled: nothing in the app offers PR builds, and the list turns over several times a day, so carrying it only churned the bundled asset. The shared kotlinx.serialization.json.Json is configured with ignoreUnknownKeys, so responses still decode.
Domain model representing a node in the mesh network.
Type-safe representation of a mesh node address.
Controls the visual density of the node list.
Which security indicator a surface shows beside a node's name (design#149).
Exception thrown when an operation is attempted while not connected to a mesh radio.
Regulatory regions for radio usage
The modem presets the firmware advertised as legal for one LoRa region, decoded from a LoRaRegionPresetMap.
Durable per-node remote-administration session status, derived from the time of the last admin response that carried a session_passkey from the target node.
The Nordic SoftDevice an nRF52840 board's firmware is linked against. Static hardware fact, derived from the board's build.arduino.ldscript in meshtastic/firmware (nrf52840_s140_v6.ld / _v7.ld).
Properties
Type-safe interpretation of DataPacket.to.
Checks whether this packet is addressed to the broadcast channel.
The @mention wire token: @ followed by a node's hex user id (@!ffccee11). This is the single source of truth for the cross-platform wire format (see meshtastic/design#21) so the compose input, message rendering, and notification paths all detect it identically. The 8-hex run plus the negative lookahead reject a partial match against a longer id.
Last measured noise floor in dBm, or null when this reading has never been reported (LocalStats.noise_floor still holds firmware's 0 "no reading yet" sentinel). Every read of noise_floor should go through this so every consumer treats absence the same way, rather than each site repeating its own != 0 / ?: 0 guard.
The resource prefix every value of a labelled enum shares, one per enum. A consumer that has to tell an enum value's resource from a field's - settings search, which indexes fields and not the values they offer - reads this rather than keeping its own copy of the list.
The SNR (in dB) at or above which a packet sent with this modem preset can still be demodulated — i.e. the spreading-factor-determined demodulation floor. Signal quality should be judged relative to this limit, since the same SNR means very different things per preset: -15 dB is excellent on LongSlow (SF12) yet unusable on ShortFast (SF7).
Type-safe interpretation of DataPacket.from.
Resolves the rung in one place so every surface agrees. DeviceHardware.isMaker is a relationship and wins first, so a maker board never reads as plain supported once the registry promotes it; DeviceHardware.activelySupported is the project's lifecycle flag and decides the other two rungs. A legacy or untiered maker board falls through to that lifecycle check.
Functions
Normalizes the nightly pointer into the common release shape, or null when the pointer carries no usable version. Nightly artifacts are served per-file from the nightly host's root, so there is no release zip.
Resolves the RegionPresetConstraint the firmware advertised for region, or null when there is no constraint information and the client must therefore NOT restrict the preset list. A null result happens when:
The app's preferred default preset for region, or null when it has no region-specific default and the caller should fall back to ChannelOption.DEFAULT / the current preset.
The preset a first-ever setup in region should install, or null to leave the choice alone.
The ack proof rows the message detail sheet shows, or null when no proof was carried - the ordinary case, and every ack from firmware that predates MeshPacket.AckProofStatus.
True when an ack carried a proof and it did not verify, which is an attempted forgery rather than a quiet absence.
Checks whether this packet originated from the local device.
Matches node search text (long/short name, hex id, decimal id, status message) with Unicode-aware case folding.
Merges a user-editable power-channel label into existing at the 0-based channelIndex.
Derives a unique color pair from a node number. Returns (foreground, background) as @ColorInt.
With use_preset on, keeps coding_rate only while it raises the preset's own coding rate, and stores 0 ("use the preset's") otherwise, so a value firmware ignores never sits in the config looking like it applies. A manual config, or a preset with no ChannelOption, comes back unchanged.
Returns the modem preset the LoRa form should hold when the region changes from previousRegion to newRegion with current selected.
The schema's one-sentence explanation of this enum value, or null where it has none.
The schema's label for this enum value, or null where the schema does not name it. A picker shows this in place of the constant's Kotlin name, and falls back to that name when it is null, so a value the schema has not reached still renders.
Pure mapping to the cached domain model. Callers are expected to drop TYPE_INTERNAL links (GitHub, YouTube, …), which never belong to a device's purchase section.