core:datastore wraps androidx.datastore.core.DataStore<T> for five payload types (four proto messages plus a Preferences-backed store). androidx.datastore:datastore -- the core artifact providing DataStore/OkioSerializer/CorruptionException, not just the -preferences extension core:prefs already hit -- publishes no wasmJs variant at any version, confirmed against its Gradle Module Metadata. Introduces Store<T> (core/datastore/store/Store.kt), a direct analog to core:prefs's PrefsStore but simpler: each store here already holds one whole serializable value, so no key/snapshot abstraction is needed, just data/updateData mirroring DataStore<T>'s own two members. nonWebMain's DataStoreAdapter wraps a real DataStore<T> unchanged; wasmJsMain's LocalStorageStore is backed by localStorage, running each payload's Wire ADAPTER.decode/.encode against an in-memory okio.Buffer and base64-encoding the resulting bytes (localStorage is string-only). Corruption policy mirrors the existing Android/JVM ReplaceFileCorruptionHandler: no value yet or a value that fails to decode both fall back to the default, with a decode failure also logged and the recovered default written back so it isn't re-hit on every access. The four proto-payload DataSources (ChannelSetDataSource and friends) needed zero logic changes -- they already depended only on data/updateData, not on any other DataStore<T> member. CorePreferencesDataStore (DataStore<Preferences>) has no wasmJs counterpart: androidx.datastore.preferences's Preferences type itself has no wasmJs variant, so there's no way to construct a Store<Preferences> there at all -- this is the payload type being unavailable, not a missing adapter. It and its three consumers (RecentAddressesDataSource/BootloaderWarningDataSource/ FirmwareRecoveryDataSource) move to nonWebMain unchanged, deferred rather than dropped -- a future pass could rewrite them against core:prefs's own PrefsStore instead. Caught before shipping: hoisting androidx.datastore/ androidx.datastore.preferences to nonWebMain-only initially demoted them from api to implementation, mirroring core:prefs's precedent -- but androidApp's google flavor (GoogleMapsDataStore.kt/ GoogleMapsPrefs.kt) imports those packages directly with no dependency of its own, relying entirely on this module's transitive api exposure. Kept as api at the nonWebMain/commonMain level instead; verified via a real compileGoogleDebugKotlin + testGoogleDebugUnitTest run, not just the fdroid flavor the first pass checked. CoreDatastoreWasmJsModule is not registered anywhere yet -- no webApp module exists in this repo pass, same state as core:database's SingleDatabaseProvider and core:prefs's CorePrefsWasmJsModule. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Meshtastic-Android
The Meshtastic client for Android and Compose Desktop — an app for communicating over open-source mesh radios. For more information see our webpage: meshtastic.org. The device-side code lives in the firmware repository.
If you have questions or feedback please Join our discussion forum or the Discord Group. We would love to hear from you!
Features
Highlights of the 2.8 line:
- Mesh network discovery to surface nodes and channels around you, with Mesh Beacon invitations for joining nearby meshes.
- Waypoint geofences — draw zones on the map and get alerts when nodes cross them.
- Secure key backup — encrypted backup, restore, and delete for your device security keys.
- NFC sharing — write shared contacts and channels to NFC tags.
- XEdDSA packet signing indicators in the node and messaging UI.
- Air-quality telemetry — PM1.0, PM2.5, PM10, and CO₂ readings from supported sensors.
- App Functions / system-AI integration so on-device assistants can trigger common workflows.
Get Meshtastic
The fastest way to get releases is GitHub releases; pair them with Obtainium for automatic updates.
With Obtainium installed, tap a link below on your phone to set it up with everything pre-configured. The google flavor adds Google Crashlytics and Google Maps; fdroid has no Google dependencies.
| Channel | google flavor |
fdroid flavor |
|---|---|---|
| Latest release | Add | Add |
| Open beta | Add | Add |
What those two channels point at right now:
| Channel | Currently | Released |
|---|---|---|
| Latest release | v2.8.1 |
2026-08-20 |
| Open beta | none published right now | — |
Closed-beta and per-commit snapshot channels, importable config files, and the setup details are in Test Builds & Obtainium. These links, files and the table above are generated — see obtainium/.
These providers are also available but may update more slowly.
The play store is the last to update of these options. To join the Play Store testing program, opt in to become a tester. If you encounter any problems or have questions, ask us on the discord, create an issue, or post in the forum and we'll help as we can.
Desktop
Meshtastic Desktop installers (macOS DMG, Windows MSI/EXE, Linux DEB/RPM/AppImage) are available from GitHub Releases. A Flatpak is available on Flathub (packaging repo: flathub/org.meshtastic.MeshtasticDesktop).
Documentation
The two documentation sites below are deployed to GitHub Pages automatically on every push to main.
| Site | URL | Contents |
|---|---|---|
| User & Developer Docs | meshtastic.github.io/Meshtastic-Android | Jekyll site — user guide, developer guide, in-app doc content |
| API Reference | meshtastic.github.io/Meshtastic-Android/api | Dokka-generated KDoc for all public APIs |
Generating Locally
User & Developer Docs (Jekyll):
./gradlew generateDocsBundle publishDocsSite
BUNDLE_GEMFILE=docs/Gemfile bundle exec jekyll serve \
--source build/_site --baseurl ""
API Reference (Dokka):
./gradlew dokkaGeneratePublicationHtml
# Output: build/dokka/html/index.html
Architecture
Modern Android Development (MAD)
The app follows modern Android development practices, built on top of a shared Kotlin Multiplatform (KMP) Core:
- KMP Modules: Business logic (
core:domain), data sources (core:data,core:database,core:datastore), and communications (core:network,core:ble) are entirely platform-agnostic, targeting Android and Compose Desktop. - UI: JetBrains Compose Multiplatform (Material 3) using Compose Multiplatform resources.
- State Management: Unidirectional Data Flow (UDF) with ViewModels, Coroutines, and Flow.
- Dependency Injection: Koin with Koin Annotations (K2 Compiler Plugin).
- Navigation: JetBrains Navigation 3 (Multiplatform routing with RESTful deep linking).
- Data Layer: Repository pattern with Room KMP (local DB), DataStore (prefs), and Protobuf (device comms). Protobuf models are consumed from the upstream
org.meshtastic:protobufsMaven artifact, pinned ingradle/libs.versions.toml.
Bluetooth Low Energy (BLE)
The BLE stack uses a multiplatform interface-driven architecture. Platform-agnostic interfaces live in commonMain, utilizing the Kable multiplatform BLE library to handle device communication across all supported targets (Android, Desktop). This provides a robust, Coroutine-based architecture for reliable device communication while remaining fully KMP compatible. See core/ble/README.md for details.
Module Documentation
Each module has its own README with details on its responsibilities, API surface, and internal design.
| Module | Description |
|---|---|
| androidApp | Android application host — activity, manifest, flavors, root Koin graph |
| desktopApp | Compose Desktop host — window, transports, packaging |
| core/domain | Business-logic use cases (radio config, sessions, exports) |
| core/repository | Data & infrastructure contracts (RadioTransport, NodeRepository, ServiceRepository) |
| core/takserver | Meshtastic ↔ TAK (ATAK/iTAK) bridge — CoT server & conversion |
| core/ble | Multiplatform BLE transport (Kable) |
| core/network | Internet comms: firmware metadata, map tiles, radio transports |
| core/data | Repository layer — orchestrates DB, network, and service data |
| core/database | Room KMP local persistence |
| core/datastore | DataStore preferences |
| core/service | Meshtastic Android service abstractions |
| core/navigation | Type-safe Navigation 3 route model |
| core/resources | Centralised CMP string & drawable resources |
| core/model | Shared domain models |
| core/ui | Shared UI components |
| core/common | Common utilities |
| core/di | Koin DI modules |
| core/testing | Shared test fakes & utilities |
| core/konsist | Konsist architecture-rule tests (KMP boundary guards) |
| core/nfc | NFC support |
| core/prefs | Type-safe preferences over multiplatform DataStore |
| core/barcode | Barcode / QR scanning |
| feature/messaging | Messaging UI feature |
| feature/map | Map UI feature — shared state, policy, tile sources and the waypoint editor |
| feature/map-maplibre | MapLibre map surfaces shared by the fdroid flavor and Desktop |
| feature/node | Node detail UI feature |
| feature/settings | Settings UI feature |
| feature/firmware | Firmware update UI feature |
| feature/intro | Onboarding / intro UI feature |
| feature/wifi-provision | Wi-Fi provisioning UI feature |
| feature/connections | Device discovery & connection management (BLE / USB / TCP) |
| feature/discovery | Mesh network discovery (scanner, AI summaries, Mesh Beacon) |
| feature/docs | In-app documentation browser with Chirpy AI assistant |
| feature/widget | Android home-screen Glance widget (live mesh stats) |
| baselineprofile | Macrobenchmark Baseline Profile generation for :androidApp |
Translations
You can help translate the app into your native language using Crowdin.
Integration
The app includes a built-in Local TAK Server feature that can be enabled in settings. This runs a loopback-only TLS (mTLS) server on port 8089 so ATAK on the same device can connect directly and route its traffic over the mesh.
Building the Android App
Warning
Debug and release builds install side by side to ease development, but don't run both at once — force-quit the one you are not using.
Follow the Android development guide to set up your environment.
Note: when building the google flavor locally you will need a Google Maps Android SDK api key to use Google Maps. Create secrets.properties at the repo root and set MAPS_API_KEY=…. Without it the build still succeeds with a placeholder key, but map tiles will not load.
e.g.
# secrets.properties
MAPS_API_KEY=your_google_maps_api_key_here
Contributing guidelines
For detailed instructions on how to contribute, please see our CONTRIBUTING.md file. For details on our release process, see the RELEASE_PROCESS.md file.
Repository Statistics
Copyright 2025-2026, Meshtastic LLC. GPL-3.0 license




