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 msh.to device link resolved by the Meshtastic API (/resource/deviceLinks) and cached locally. Every link routes through the msh.to redirect service.
Represent the different ways a device can connect to the client.
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.
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.
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.
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.
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 fixed firmware-nightly/ folder, 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.
Checks whether this packet originated from the local device.
Matches node search text (long/short name, hex id, decimal id) 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.
Returns the modem preset the LoRa form should hold when the region changes from previousRegion to newRegion with current selected.
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.