Mobilerun Docs Reference
droidrun/mobilerun
Answers questions about Mobilerun, the LLM-agent framework for automating Android and iOS devices, by pointing the agent to the right page of its v5 documentation.
A skill your agent uses for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session.
$ npx skills add blokadaorg/blokada --skill appium -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install blokadaorg/blokada appium --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/appium .claude/skills/appium && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .claude/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appiumType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add blokadaorg/blokada --skill appium -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install blokadaorg/blokada appium --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/appium .agents/skills/appium && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .agents/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add blokadaorg/blokada --skill appium -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install blokadaorg/blokada appium --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/appium .cursor/skills/appium && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .cursor/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/blokadaorg/blokada.git --path .agents/skills/appium--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add blokadaorg/blokada --skill appium -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install blokadaorg/blokada appium --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/appium .gemini/skills/appium && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .gemini/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install blokadaorg/blokada appiumInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add blokadaorg/blokada --skill appium -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/appium .github/skills/appium && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .github/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add blokadaorg/blokada --skill appium -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install blokadaorg/blokada appium --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blokadaorg/blokada.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/appium .opencode/skills/appium && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "appium" agent skill from https://github.com/blokadaorg/blokada/tree/main/.agents/skills/appium into .opencode/skills/appium/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "appium", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
appiumA skill your agent uses for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session.
Appium is an agent skill from blokadaorg/blokada. Use for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session. Trigger when Codex needs to explore the live native UI on a real device, inspect labels or structure, tap through screens, capture screenshots or XML on demand, or verify interactive behavior without writing a static WDIO spec. The current workflow is implemented for iOS, but the skill name stays generic so it can later cover other Appium-backed platforms too.
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Mobile, covering Mobile testing and debugging. It works with iOS and Android. The repository describes itself as: The official repo for Blokada apps. The licence is MPL-2.0.
12 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 5279136. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Appium loads about 3.5k tokens when it runs. Until then it costs about 119 tokens; SKILL.md has 1,593 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from blokadaorg/blokada at commit 5279136, republished under its MPL-2.0 licence (© blokadaorg). 1,593 words, ~3,459 tokens.
.claude/skills/appium/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Use the repo-local machine session only. Do not create temporary WDIO debug specs for ad hoc inspection.
Prefer the root make target:
make appium-explore-session IOS_DEVICE_NAME="<device-name>"Important:
xcrun device services, WebDriverAgent/Appium startup, and real-device interaction that the sandbox cannot reliably access.make <target> ... and put any make variable overrides after the target, for example make appium-explore-session APP_INSTALL=0 SHOW_XCODE_LOG=0. Avoid shell-style env prefixes like APP_INSTALL=0 make ..., because they create unnecessary sandbox permission prompt variants.Notes:
APP_FLAVOR=family when the primary app under test should be Blokada Family. The default primary flavor is Blokada 6.app.targets may still list family if Family is already on the device, but that is a reused install unless you also ran a fresh APP_FLAVOR=family session in the same turn.APP_INSTALL=0 only when you already installed the current workspace build in the same turn, or when you have high confidence the installed app still matches the code you want to inspect.APP_BUNDLE_ID may override the primary bundle id, but if it does not match the intended flavor, set APP_FLAVOR explicitly so the install target stays correct.IOS_DEVICE_NAME is the normal device selector for the current iOS flow.IOS_UDID is a low-level fallback only.APPIUM_WDA_HARD_RESET=1.Automation Running banner visible.Never or the longest available value and keep the device unlocked before starting.The same explorer drives an iOS Simulator running a Mocked / FamilyMocked
build, not just a physical device. Use this when verifying mocked-scheme work
(make run-{six,family}-mocked) where there is no real tunnel and no connected
phone. Opt in with IOS_USE_SIM=1; the harness then resolves the per-worktree
sim from make -C ios sim-status, uses simulator capabilities (Appium-managed
WDA, no signing identity), and skips the devicectl device-discovery the
physical path needs. None of the "request elevated access" / connected-iPhone
notes above apply in sim mode.
# interactive JSONL session against the per-worktree mocked sim
IOS_USE_SIM=1 make appium-explore-session
# family flavor
IOS_USE_SIM=1 APP_FLAVOR=family make appium-explore-session
# reuse an already-installed/running mocked build, skip rebuild+reinstall
IOS_USE_SIM=1 APP_INSTALL=0 make appium-explore-sessionPrerequisites and gotchas:
make run-{six,family}-mocked must have created the sim first;
appium-explore-session does not provision it.sim-status derives the sim name from SIM_BASE (default iPhone 17). If
you created the sim with a non-default base, pass the same SIM_BASE
here or the UDID will not resolve, e.g.
IOS_USE_SIM=1 SIM_BASE="iPhone 15" make appium-explore-session.cds into automation/appium/wdio
itself); do not run it from inside wdio/.ios/SIMULATOR.md ("Appium targeting") for the full sim flow and a raw
appium --udid ... fallback.Send one JSON object per line to stdin. Wait for the terminal done or error event before sending the next command.
Request shape:
{"id":"1","command":"ui.summary","args":{}}Response lifecycle:
ackresultdone or errorUse these commands:
session.statussession.shutdownapp.targetsapp.launchapp.activateapp.terminateapp.stateui.summaryui.inspectui.treeui.labelsui.readui.tapui.typeui.focusSearchui.searchui.backui.swipeui.scrollui.waitui.existsui.attrui.sourceui.screenshotUse this sequence unless the task requires something else:
session.status to confirm the session and app state.six session and then switch to family, treat that Family app as untrusted unless you separately ran make appium-explore-session APP_FLAVOR=family.app.targets when you need to switch between six, family, and iOS Settings without restarting the session.app.activate with args.target, for example six, family, or settings.ui.summary as the fast default inspection command while navigating the current foreground app. It now reports the verified foreground target and active app metadata instead of trusting app state alone.ui.inspect when you need bounded structure details. By default it includes labels, a tree summary, and a structured visible-element list.ui.read to normalize common element attributes such as value, enabled, visible, and switch-like boolean state.ui.focusSearch, ui.search, ui.back, ui.swipe, and ui.scroll for dynamic system-app exploration without creating a temporary static spec.ui.screenshot or ui.source only when you need artifacts.session.shutdown. This should end the active session without forcing a full WDA reset.Automation Running.If the session drops unexpectedly, first suspect device auto-lock or lost foreground automation:
If Appium never reaches JSONL command handling after install and the server log shows repeated /status socket hangups, iProxy ... Unexpected data, or WebDriverAgent xcodebuild code 65, treat that as a harness/WDA problem first:
automation/appium/output/appium-explore-server.logWhen reporting findings from an interactive session, state whether the session used a freshly installed workspace build or a trusted reused install.
Prefer ui.summary first:
{"id":"1","command":"ui.summary","args":{}}Use ui.inspect for bounded structure:
{"id":"2","command":"ui.inspect","args":{"labels":true,"tree":true,"limit":40}}Use generic navigation and reads for dynamic exploration:
{"id":"3","command":"ui.search","args":{"text":"keyboard"}}
{"id":"4","command":"ui.tap","args":{"selector":"~Keyboard"}}
{"id":"5","command":"ui.read","args":{"selector":"~Auto-Correction"}}
{"id":"6","command":"ui.back","args":{}}
{"id":"7","command":"ui.scroll","args":{"direction":"down"}}Use raw WDIO/Appium selectors directly:
{"id":"8","command":"ui.tap","args":{"selector":"~Privacy Pulse"}}
{"id":"9","command":"ui.wait","args":{"selector":"~Avancerat","timeoutMs":10000}}
{"id":"10","command":"ui.attr","args":{"selector":"~automation.power_toggle","name":"value"}}Switch between the built-in app targets without restarting Appium:
{"id":"11","command":"app.targets","args":{}}
{"id":"12","command":"app.activate","args":{"target":"family"}}
{"id":"13","command":"ui.summary","args":{}}
{"id":"14","command":"app.activate","args":{"target":"settings"}}
{"id":"15","command":"app.activate","args":{"target":"six"}}For dynamic Settings work, prefer discovery over a maintained path catalog:
settingsui.summary and ui.inspect to see the visible hierarchyui.search if the screen exposes a search fieldui.tap and ui.readLightweight hint only: DNS is usually under General, then VPN & Device Management, then DNS, but use the live hierarchy instead of assuming labels or locale.
Practical DNS notes:
Settings -> General -> the VPN/DNS management area. The exact row labels depend on locale, but it is not an app-specific setting under the Blokada app entry.DNS is not enough to conclude the path is unavailable; prefer live hierarchy discovery.Automatic is already selected, leave it unchanged instead of toggling away and back.Capture artifacts only when needed:
{"id":"16","command":"ui.screenshot","args":{"name":"settings-screen"}}
{"id":"17","command":"ui.source","args":{"name":"settings-screen"}}iOS system permission alerts live in SpringBoard, not the foreground app. ui.tap (selector or coordinate) cannot reach them — the alert is outside WDA's app-scoped accessibility tree, and a coordinate tap lands "underneath" the alert in the app's coordinate space.
Use ui.alert instead, which wraps WDA's mobile: alert extension and operates on the system alert layer:
{"id":"1","command":"ui.alert","args":{"action":"getButtons"}}
{"id":"2","command":"ui.alert","args":{"action":"accept","buttonLabel":"Tillåt"}}
{"id":"3","command":"ui.alert","args":{"action":"dismiss"}}action: accept (positive button) | dismiss (negative button) | getButtons (return the button labels for diagnostics)buttonLabel (optional): pick a specific button by visible label. Useful for localized alerts where "Allow" vs "Tillåt" vs "Erlauben" differs by sim locale.If ui.alert returns "An attempt was made to operate on a modal dialog when one was not open", the alert hasn't materialized yet. Sleep briefly and retry, or send the user-action that triggers it first.
Flutter often exposes interactive widgets as XCUIElementTypeStaticText (no Semantics(button: true)). ui.tap with a selector calls element.click(), which targets the accessibility element but doesn't dispatch the underlying GestureDetector callback. The tap reports success but nothing happens in the app.
Use ui.tapCenter for these — it resolves the element's on-screen rect and dispatches a real touch via mobile: tap:
{"id":"1","command":"ui.tapCenter","args":{"selector":"~Aktivera"}}Quick diagnosis: if ui.tap ~Foo reports tapped but the app's log shows no trace of the expected callback, switch to ui.tapCenter with the same selector.
By default the harness reads the per-worktree sim from make -C ios sim-status. To drive a sim that was provisioned by a sibling worktree (without reprovisioning a new sim in this worktree), set IOS_UDID (and optionally IOS_DEVICE_NAME):
IOS_USE_SIM=1 \
IOS_UDID=83114086-0934-4944-A01C-7955DB91B0A8 \
IOS_DEVICE_NAME="iPhone 16 - other-worktree" \
APP_FLAVOR=family APP_INSTALL=0 \
make appium-explore-sessionThis is the path for: edit harness scripts in worktree A, drive the existing app/sim from worktree B without rebuilding.
Always send:
{"id":"999","command":"session.shutdown","args":{}}The intended behavior is that shutdown removes active automation from the phone without discarding reusable WDA state. If the iPhone still shows Automation Running, treat it as a harness cleanup bug and use an explicit hard reset rather than normalizing full WDA teardown after every run.
© blokadaorg, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/appium of blokadaorg/blokada.
Open the folder on GitHubat commit 5279136
Appium next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Appium this skillblokadaorg/blokada | 3.3k | — | ~3.5k | Automated safety check: Pass | MPL-2.0 | |
| Mobilerun Docs Referencedroidrun/mobilerun | 9.6k | — | ~943 | Automated safety check: Pass | MIT | |
| Phoneagentrounak/PhoneAgent | 798 | — | ~2.2k | Automated safety check: Pass | MIT | |
| Simvynpranshuchittora/simvyn | 437 | — | ~938 | Automated safety check: Pass | MIT | |
| Mobile Automation with agent-devicenuclearpasta/react-native-drax | 714 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Screenmapaleqsio/screenmap | 239 | — | ~7.2k | Automated safety check: Pass | MIT |
droidrun/mobilerun
Answers questions about Mobilerun, the LLM-agent framework for automating Android and iOS devices, by pointing the agent to the right page of its v5 documentation.
rounak/PhoneAgent
Control a connected iPhone, iOS simulator, Android emulator, or Android device from macOS through PhoneAgent's JSON-RPC bridge.
pranshuchittora/simvyn
Operate iOS Simulators, Android Emulators, and connected mobile devices with Simvyn.
nuclearpasta/react-native-drax
Drives iOS and Android devices and simulators from the command line: open apps, snapshot the UI tree, tap, type, scroll, take screenshots and read UI info.
aleqsio/screenmap
Generate a visual navigation map of an Expo / React Native or NativeScript app.
hyochan/react-native-nitro-sound
Build and run repeatable react-native-nitro-sound recorder/player regression tests on an iOS Simulator or Android emulator, with explicit virtual-device selection, microphone permission, Maestro…
blokadaorg/blokada
A skill your agent uses for pulling recent Blokada app logs from a connected device, using the same share-log file exposed in Settings.
blokadaorg/blokada
A skill your agent uses to validate risky dependency bumps end to end as a local or cloud-launched agent.
Categories
A skill your agent uses for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session. Appium is an agent skill from blokadaorg/blokada. Use for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session.
Appium fits situations like: dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session; Codex needs to explore the live native UI on a real device; tap through screens; capture screenshots.
Run `npx skills add blokadaorg/blokada --skill appium -a claude-code`. Or copy the skill folder (.agents/skills/appium in blokadaorg/blokada) into .claude/skills/appium in your project. Claude Code loads it when a task matches its description.
Run `npx skills add blokadaorg/blokada --skill appium -a codex`. Or copy the skill folder (.agents/skills/appium in blokadaorg/blokada) into .agents/skills/appium in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add blokadaorg/blokada --skill appium -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/appium, .gemini/skills/appium, .github/skills/appium and .opencode/skills/appium in your project.
Going by SKILL.md and its folder, Appium needs the command-line tools its instructions call (make).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Appium is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Appium: Mobilerun Docs Reference (droidrun/mobilerun, 9.6k stars), Phoneagent (rounak/PhoneAgent, 798 stars), Simvyn (pranshuchittora/simvyn, 437 stars) and Mobile Automation with agent-device (nuclearpasta/react-native-drax, 714 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
blokadaorg (a GitHub organization) maintains it in blokadaorg/blokada, which has 3,265 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: blokadaorg/blokada on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.