Mesh+: a small Android app for Meshtastic radios https://meshplus.app
  • Kotlin 59.8%
  • Swift 35.6%
  • Python 3.9%
  • Shell 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Claude 72d4ded50b
Some checks failed
iOS / ios (push) Failing after 3m49s
CI: run on git.borodutch.com (Forgejo Actions)
Non-Pages workflows move to .forgejo/workflows; GitHub (a push mirror) keeps only Pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:43:54 -07:00
.forgejo/workflows CI: run on git.borodutch.com (Forgejo Actions) 2026-10-22 15:43:54 -07:00
.github CI: run on git.borodutch.com (Forgejo Actions) 2026-10-22 15:43:54 -07:00
app Android 0.4.4: block nodes, report messages, terms of use (#2) 2026-10-16 11:15:35 -07:00
docs Site: Block and Report are in both apps now (Android 0.4.4) 2026-10-16 12:41:25 -07:00
fastlane/metadata/android/en-US Android 0.4.4: block nodes, report messages, terms of use (#2) 2026-10-16 11:15:35 -07:00
gradle/wrapper Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00
ios One release ships everything: Play, App Store, meshplus.apk and the F-Droid merge request (#3) 2026-10-16 12:28:51 -07:00
store Play build without the SMS relay (Play rejected the SMS/Call Log permissions); v0.4.2 2026-10-10 09:45:17 -07:00
.gitignore iPhone app: native SwiftUI Mesh+ without the SMS relay (#1) 2026-10-16 11:45:16 -07:00
AGENTS.md One release ships everything: Play, App Store, meshplus.apk and the F-Droid merge request (#3) 2026-10-16 12:28:51 -07:00
build.gradle.kts Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00
CLAUDE.md Release instructions for agents: bump versionCode/versionName and add the fastlane changelog before publishing a release 2026-10-10 14:47:55 -07:00
gradle.properties Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00
gradlew Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00
gradlew.bat Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00
LICENSE F-Droid: MIT license, play/fdroid flavors (ZXing scanner instead of Google's in fdroid), fastlane metadata, v0.4.1 2026-10-09 12:55:21 -07:00
README.md iPhone app: native SwiftUI Mesh+ without the SMS relay (#1) 2026-10-16 11:45:16 -07:00
settings.gradle.kts Meshtastic+: minimal Android chat client over BLE and USB 2026-10-06 12:12:34 -07:00

Mesh+

A tiny Android app for Meshtastic radios: connect to your node, send and receive messages, keep it set up and updated. Download it at meshplus.app.

  1. Connect: plug the node into your phone with a USB-C cable (the app opens by itself and the phone powers the node), or tap Connect with Bluetooth, pick your node and type the PIN from its screen.
  2. Region: a brand-new node stays silent until it knows its radio band, so the app asks once (pre-selected from your phone's country).
  3. Name: pick how you show up on the mesh; initials become your short name. Change it later with the pencil.
  4. Chats: rooms and direct messages in one list with unread badges. Public is the open channel everyone nearby shares. Tap + Room to create a private, encrypted room and invite people with a QR code or link, or to join one by scanning or pasting an invite (links from the official Meshtastic apps work too). DMs are end-to-end encrypted by the firmware. A check under your message means another node relayed it (rooms) or the recipient got it (DMs).
  5. Nodes: everyone your radio has heard, favorites first, with online/offline badges (online = heard in the last 2 hours). Tap one for their profile (last heard, hops, signal, battery) to message or favorite them; favorites are stored on your node.
  6. Settings (gear): name, region, disconnect / switch node. Nodes you've used over Bluetooth are listed on the connect screen for one-tap reconnecting.
  7. Node settings: which board the node is (e.g. Heltec Mesh Node T114, nRF52840) and its firmware, plus role, relaying, radio preset, hops, transmit power, location sharing, power saving, screen and Bluetooth pairing. Every setting has an ⓘ that explains it. Changes are saved together and the node restarts once. At the bottom: clear the node list, reset settings (keeps identity and pairing) or a full factory reset (re-pair with the new PIN afterwards).
  8. Firmware updates (nRF52 boards over USB): when a newer stable release exists, Node settings shows Update to x.y.z (otherwise Up to date). Firmware options lists every version Meshtastic publishes for the board (pre-releases optional), so you can also pick a specific one or go back. It downloads the latest stable release for that exact board, reboots the node into its bootloader and installs it over the cable (~1.5 min). Settings, rooms and messages stay. If an update is interrupted, Node stuck in update mode? on the connect screen finishes it. ESP32 boards: use flasher.meshtastic.org.
  9. Background & notifications: while connected, Mesh+ keeps running in the background (a "Connected to …" notification shows it) and notifies you of new messages.
  10. SMS relay (Settings → SMS relay): one phone with a SIM relays the texts and calls it receives into a private room, and people in that room can send SMS through it (/sms +15551234567 message, or the SMS button Mesh+ shows in relay rooms). Anyone with the room's invite can read those texts and send SMS from the relay's number, so invite carefully.

The node restarts when its region or name changes; the app reconnects by itself. History is saved on the phone.

Speaks the Meshtastic BLE and serial APIs from firmware 2.x (tested on a Heltec Mesh Node T114 over USB; ESP32 boards with CP210x/CH340 USB chips like the Heltec V3 use the same path but are untested). Requires Android 12+.

Demo mode: No radio yet? Try the demo on the connect screen runs the app against a simulated node (rooms, DMs with replies, nodes, settings), for trying it without hardware and for app store review.

iPhone: ios/ is a native SwiftUI version with the same features over Bluetooth, minus the SMS relay, USB and firmware updates. It adds Block and Report on messages and nodes, as App Review requires for chat apps. ios/release.sh <version> <build> builds it and uploads it to App Store Connect, ios/screenshots.sh retakes the App Store screenshots from the demo node, and the iOS workflow runs its unit and demo UI tests.

Build

./gradlew assemblePlayRelease   # app/build/outputs/apk/play/release/app-play-release.apk (fdroid flavor: no Google code)
adb install app/build/outputs/apk/play/release/app-play-release.apk

The protocol code is a hand-rolled minimal protobuf codec (Proto.kt), so there's no protobuf toolchain. ./gradlew test checks it.

The landing page lives in docs/ and is served by GitHub Pages at meshplus.app.

Mesh+ is an independent project, not affiliated with Meshtastic LLC. Meshtastic® is a registered trademark of Meshtastic LLC.

Releasing: see AGENTS.md.

MIT licensed, see LICENSE.