run-meshtastic-android

Launch, drive, and screenshot the Meshtastic Compose Desktop and Android emulator apps against a simulated radio.

1.8k|511|Updated Jan 20, 2020
One-click install
npx skills add https://github.com/meshtastic/Meshtastic-Android --skill run-meshtastic-android
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: run-meshtastic-android
Source: https://github.com/meshtastic/Meshtastic-Android/tree/main/.claude/skills/run-meshtastic-android
Command: npx skills add https://github.com/meshtastic/Meshtastic-Android --skill run-meshtastic-android

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve?

Verifying UI changes in the Meshtastic app normally requires manual app launches, physical radios, and hand-driven clicking through onboarding and connection flows. This Skill automates running the Compose Desktop app with hot reload and the Android app on an emulator, driving both programmatically against a simulated Meshtastic radio.

Core Features & Use Cases

  • Desktop hot-reload driving: Launch :desktopApp:hotRunAsync and drive the running app through an MCP JSON-RPC server — semantic tree inspection, clicks by node id, text input, hot-swap reload, and window screenshots.
  • Emulator automation: Scripted deeplink bring-up of the Android fdroid debug build with skip-onboarding, uiautomator-based taps, trust-dialog handling, and screencaps over adb.
  • Simulated radio testing: Connect either app to a replay-sim TCP radio (desktop at 127.0.0.1, emulator at 10.0.2.2) to exercise real mesh flows without hardware.
  • Use Case: After editing a Compose screen, ask the agent to reload the desktop app, click through the Connect flow to the simulated radio, and capture a screenshot proving the change renders correctly.

Quick Start

Run the Meshtastic desktop app with hot reload, connect it to a simulated radio on port 4403, and take a screenshot of the Nodes tab.

Frequently Asked Questions about run-meshtastic-android

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I run the Meshtastic desktop app with hot reload?

Launch it with the Gradle task :desktopApp:hotRunAsync through the gradle-queue wrapper, using the JetBrains 25 JDK and a sanitized environment. Once the pid file exists, driver.py connects to the hotMcpServer and supports reload to recompile and hot-swap edits into the running app.

How do I automate the Meshtastic Android app on an emulator?

Use driver_emulator.py with the connect command, which force-stops the app, relaunches MainActivity with the skip_onboarding extra and a /connections deeplink, accepts the trust dialog, and verifies the connected state. It also supports uiautomator dumps, text-based taps, swipes, and screencaps over adb.

Can I test the Meshtastic app without a physical radio?

Yes, a replay-sim simulated radio serves a Meshtastic TCP endpoint that the desktop app reaches at 127.0.0.1 and an emulator at 10.0.2.2. Each app needs its own sim port because only one client can hold a connection to a simulated node.

Why does my Meshtastic desktop screenshot show my terminal instead of the app?

The screenshot captures the window's on-screen region, so the app window must be frontmost before capturing. Run the driver's raise command, which uses System Events AXRaise on the window named Meshtastic Desktop, before taking the screenshot.

Why does the MCP server report connected:false right after launch?

The hotMcpServer attaches to the running app asynchronously, so an immediate status call can report connected:false while the app is fine. The driver auto-waits by polling status; persistent false usually means a stray app instance from another checkout holds the pid file.

What are the limitations of the deeplink launch for the desktop app?

Deeplink launch requires the plain :desktopApp:run task because hotRunAsync does not accept --args, so you lose hot reload. The blocking run task also holds a gradle-queue slot for the app's entire lifetime, and the deeplink can race last-device auto-reconnect.