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.
Interact with iOS simulator or Android emulator/device using snapshot-based coordinates.
$ npx skills add Shopify/flash-list --skill agent-device -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Shopify/flash-list agent-device --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/Shopify/flash-list.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/agent-device .claude/skills/agent-device && 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 "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .claude/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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/Shopify/flash-list/tree/main/.claude/skills/agent-deviceType 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 Shopify/flash-list --skill agent-device -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Shopify/flash-list agent-device --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/agent-device .agents/skills/agent-device && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .agents/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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 Shopify/flash-list --skill agent-device -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Shopify/flash-list agent-device --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/agent-device .cursor/skills/agent-device && 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 "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .cursor/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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/Shopify/flash-list.git --path .claude/skills/agent-device--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 Shopify/flash-list --skill agent-device -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Shopify/flash-list agent-device --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/agent-device .gemini/skills/agent-device && 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 "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .gemini/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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 Shopify/flash-list agent-deviceInstalls 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 Shopify/flash-list --skill agent-device -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/agent-device .github/skills/agent-device && 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 "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .github/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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 Shopify/flash-list --skill agent-device -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Shopify/flash-list agent-device --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/agent-device .opencode/skills/agent-device && 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 "agent-device" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/agent-device into .opencode/skills/agent-device/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-device", 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.
agent-deviceInteract with iOS simulator or Android emulator/device using snapshot-based coordinates.
Agent Device is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Interact with iOS simulator or Android emulator/device using snapshot-based coordinates. Uses accessibility tree snapshots for precise element targeting, with screenshot verification as fallback. Use when navigating the app on a simulator/emulator.
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile, covering Mobile testing and debugging and Accessibility. It works with Android and iOS. The repository describes itself as: A better list for React Native. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 527d767. 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:
adbffmpegxcrunbashFrom 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.
Agent Device loads about 5k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 1,610 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 Shopify/flash-list at commit 527d767, republished under its MIT licence (© Shopify). 1,610 words, ~5,027 tokens.
.claude/skills/agent-device/SKILL.md (or your agent's skills folder).ALL simulator/emulator interaction MUST go through agent-device commands. No exceptions, no fallbacks.
Banned tools/commands (never use these for device interaction, even if they seem easier):
adb for UI interaction — no input tap, input swipe, input text, screencap, etc. Allowed exceptions: adb devices, adb wait-for-device, adb install, adb reverse, adb shell getprop, adb shell am, adb shell pm, adb shell screenrecord + adb pull (see "Android Recording Workaround"), adb shell kill/adb shell pidof (for stopping screenrecord)mobile_click_on_screen_at_coordinates, mobile_take_screenshot, mobile_list_elements_on_screen, mobile_swipe_on_screen, mobile_type_keys, mobile_press_button, mobile_long_press_on_screen_at_coordinates, or any other mobile_* toolxcrun simctl — no simctl io screenshot, simctl openurl, etc. Allowed exceptions: simctl list devices, simctl get_app_container, simctl install, simctl launchosascript / AppleScript for simulator controlWhy: agent-device manages sessions, coordinate translation, and daemon state. Mixing in other tools causes session conflicts, stale state, and unreliable behavior.
wait, sleep, and any other waiting mechanism. The app is fast — transitions and network responses complete quickly. The only exception is app launch (open), which may take a few seconds to fully load.Control the iOS simulator or Android emulator using agent-device. The primary interaction method is snapshot-based: take an accessibility tree snapshot, find the target element's rect, compute its center, and press.
Do NOT use these as standalone subcommands:
click, find, fill, focus, get text, get attrs, scrollintoview, is, wait text, wait @ref, diff snapshotAllowed agent-device subcommands: snapshot, screenshot, press, type, scroll, swipe, longpress, back, home, app-switcher, wait <ms>, open, close, keyboard dismiss, appstate, clipboard, alert, settings, record, devices, apps, batch, push, logs, network.
Always target a specific device by name using --device "<name>" to avoid launching the wrong simulator/emulator. At the start of each session:
agent-device devices to list available devicesopen (see below)--device "<name>" on open — subsequent commands in the same session inherit itA previous conversation may have left an active session bound to the device. Calling open with a new session or the default session will fail with a conflict error. Always probe first using appstate (lightweight, no file output):
# Probe: check if a session already owns this device
agent-device appstate --device "iPhone 16"| Outcome | What it means | What to do |
|---|---|---|
| Succeeds | Default session already owns this device | Use it — no open needed |
Device is already in use by session "X" | Session X owns this device | Use --session X for all commands (no open needed) |
Session "default" is bound to device "Y" | Default session owns a different device | Use a new --session <name> and proceed with open |
No active session / device not found | No session exists yet | Proceed with open --device "<name>" normally |
iOS:
# First: discover available devices
agent-device devices
# Probe for existing session
agent-device appstate --device "iPhone 16"
# If error says "in use by session ios16" → use --session ios16
# If succeeds → default session works, skip open
# Only if no session exists: open with explicit device targeting
agent-device open FlatListPro --device "iPhone 16"
# Subsequent commands — no --device needed (session remembers)
agent-device snapshot -i -c --json # primary: get elements with rects
agent-device press <x> <y>
agent-device screenshot /tmp/verify.png && sips --resampleHeight 852 /tmp/verify.png >/dev/null # verificationAndroid (also requires --session and --platform):
Use agent-device apps --platform android --user-installed to discover the installed package name.
# Probe for existing session
agent-device appstate --device "Android35" --session droid --platform android
# If succeeds → session already exists, skip open
# Only if no session exists: bind session to Android (replace <package> with actual package name)
agent-device open <package> --session droid --platform android \
--device "Android35" \
--activity <package>/.MainActivity
# All subsequent commands: just --session droid
agent-device snapshot -i -c --json --session droid # primary
agent-device press <x> <y> --session droid
agent-device screenshot /tmp/verify.png --session droid && sips --resampleHeight 852 /tmp/verify.png >/dev/null # verificationThe primary method uses the accessibility tree snapshot for exact element coordinates. Screenshots are the fallback for visual verification.
agent-device snapshot -i -c --jsonThis returns interactive (-i) elements with their rect coordinates (-c) in JSON format. Each element looks like:
{
"@ref": "@e25",
"role": "button",
"label": "Settings",
"rect": {"x": 141, "y": 2032, "width": 154, "height": 154}
}Search the snapshot output for your target by matching label, identifier, or value. Example: looking for "Settings" → find the element with "label": "Settings".
Calculate the center of the element's rect:
x = rect.x + rect.width / 2y = rect.y + rect.height / 2Then press at those coordinates.
After pressing, take a screenshot to confirm the action worked:
agent-device screenshot /tmp/verify.png && sips --resampleHeight 852 /tmp/verify.png >/dev/nullThen Read /tmp/verify.png to view it.
When an element is not in the accessibility tree (e.g., canvas-rendered content, custom drawn views), fall back to screenshots with percentage-based coordinate estimation.
iOS and Android use different coordinate systems for press. The exact dimensions vary by device. You MUST discover them dynamically at the start of each session.
press takes raw pixel coordinates (same as screenshot dimensions)press takes logical point coordinates (screenshot pixels / scale factor)Snapshot rect values are already in the correct press coordinate space — skip this if you're only using snapshots. This is only needed when estimating coordinates from screenshots. Run once per platform:
agent-device screenshot /tmp/screen.png # (add --session droid for Android)
sips -g pixelWidth -g pixelHeight /tmp/screen.pngThen compute the press dimensions:
# Android: press coords = screenshot pixels
PRESS_W = RAW_W
PRESS_H = RAW_H
# iOS: press coords = screenshot pixels / scale
PRESS_W = RAW_W / 3 # (use /2 for iPhone SE or iPad)
PRESS_H = RAW_H / 3Remember these values for the rest of the session. All coordinate calculations use them.
x = PRESS_W * (x_percent / 100)
y = PRESS_H * (y_percent / 100)open FlatListPro --device "iPhone 16" # Launch app (iOS — always specify --device on first open)
open <package> \ # Launch app (Android — discover package name with `apps --platform android --user-installed`)
--device "Android35" --session droid --platform android \
--activity <package>/.MainActivity
close FlatListPro # Kill app
back # Navigate back (Android: in-app; iOS: may go to previous app)
home # Device home screen
app-switcher # Open app switchersnapshot -i -c --json # Interactive elements with rects (primary method)press <x> <y> # Tap (iOS=logical points, Android=pixels)
press <x> <y> --double-tap # Double-tap
longpress <x> <y> [durationMs] # Long press (default 500ms)
type "text" # Type into focused field (tap input first)
scroll <up|down|left|right> [0-1] # Scroll in direction with amount
swipe <x1> <y1> <x2> <y2> [durationMs] # Precise swipe between coordinates
wait <ms> # Wait milliseconds (max 500ms — the app is fast)screenshot /tmp/screen.png # Save screenshot
record start ./recording.mov # Start video recording (iOS only — see below for Android)
record stop # Stop recording (iOS only)To view a screenshot, downsample and read:
agent-device screenshot /tmp/screen.png && sips --resampleHeight 852 /tmp/screen.png >/dev/nullThen Read /tmp/screen.png.
agent-device record is broken on Android emulators (API 35+) — it sends SIGINT to the local adb process instead of the on-device screenrecord, producing a corrupt MP4. Use adb directly for Android recording.
First, resolve the serial once per session (store in $SERIAL):
SERIAL=$(adb devices | grep -w device | head -1 | cut -f1)Then use it for recording:
# Start (run in background)
adb -s $SERIAL shell screenrecord /sdcard/agent-rec.mp4 &
# Stop (SIGINT the on-device process, then pull)
adb -s $SERIAL shell kill -INT $(adb -s $SERIAL shell pidof screenrecord)
sleep 2
adb -s $SERIAL pull /sdcard/agent-rec.mp4 /tmp/recording.mp4
adb -s $SERIAL shell rm -f /sdcard/agent-rec.mp4Note: screenrecord only encodes frames when the display changes — interact with the UI during recording or you'll get a single-frame file.
devices # List available devices
apps --platform ios --user-installed # List installed apps
appstate # Show foreground app/activity (useful on Android)
keyboard dismiss # Dismiss on-screen keyboard (Android)
clipboard read # Read clipboard (iOS only)
clipboard write "text" # Write to clipboardsettings appearance dark # Switch to dark mode
settings appearance light # Switch to light mode
settings wifi off # Toggle wifi
settings permission grant camera # Grant camera permissionagent-device open can hang indefinitely on CI. Set reasonable timeouts and be prepared to fall back to code-only verification with unit tests.org.reactjs.native.example.FlatListPro) instead of FlatListPro.back on iOS navigates to the previous app (not always within the current app) — use press on the back arrow insteadpress before using typeswipe down near the top of the screen can trigger the notification shade — start swipes well within the content areasnapshot over screenshots for finding elements — it gives exact coordinatesNot every press needs a screenshot afterward. Take one when:
Skip it when tapping obvious, large targets (tab bar items, prominent buttons) where the next snapshot or action will confirm success anyway.
A snapshot gives you rects for every interactive element on screen. If you need to tap multiple elements on the same screen (e.g., fill a form), compute all the centers from one snapshot and press them in sequence — don't re-snapshot between each tap unless the screen layout changes (navigation, modal dismiss, keyboard appearing).
Screenshots are too slow (~300ms per capture) to catch brief loading spinners or animations. Use video recording + frame extraction instead. agent-device sometimes doesn't record properly unless one press has been performed with it. It can lead to a small file.
ffmpeg at high FPSrecord start needs ~3 seconds of lead time before performing the action. The recording daemon takes time to initialize — without this delay, the recording captures a static image and the action is missed entirely.
Similarly, wait at least 4-5 seconds after the action before calling record stop to capture the full animation and settle.
IMPORTANT: Do NOT put recording commands inside a bash script. When record start, sleep, action commands, and record stop are all in one script, the recording often captures only a fraction of a second. Instead, run each step as a separate Bash tool call:
iOS:
# Step 1: Start recording (separate Bash call)
agent-device record start /tmp/evidence.mov --session ios
# Step 2: Wait + perform action + wait (separate Bash call)
sleep 3 && agent-device swipe 197 340 197 680 800 --session ios && sleep 5
# Step 3: Stop recording (separate Bash call)
agent-device record stop --session iosAndroid (uses adb workaround — see "Android Recording Workaround" above):
# Step 1: Start recording (separate Bash call)
adb -s $SERIAL shell screenrecord /sdcard/agent-rec.mp4 &
# Step 2: Wait + perform action + wait (separate Bash call)
sleep 3 && agent-device swipe 540 700 540 1400 800 --session droid && sleep 5
# Step 3: Stop + pull recording (separate Bash call)
adb -s $SERIAL shell kill -INT $(adb -s $SERIAL shell pidof screenrecord) && sleep 2 && adb -s $SERIAL pull /sdcard/agent-rec.mp4 /tmp/evidence.mp4 && adb -s $SERIAL shell rm -f /sdcard/agent-rec.mp4Do NOT guess which frames show the action. Use MD5 hashes to find frames that actually differ:
# Find which frames are unique (not identical to previous)
prev_hash=""
for f in /tmp/frames/frame-*.png; do
hash=$(md5 -q "$f")
if [[ "$hash" != "$prev_hash" ]]; then
echo "$(basename $f): CHANGED"
prev_hash="$hash"
fi
doneIf ALL frames have the same hash, the recording did not capture the action — re-record with more lead time.
iOS:
# Step 1 (separate Bash call): Start recording
agent-device record start /tmp/loading-evidence.mov
# Step 2 (separate Bash call): Wait for recording to initialize, perform action, wait for completion
sleep 3 && agent-device swipe $X_MID $Y_35PCT $X_MID $Y_75PCT 500 && sleep 5
# Step 3 (separate Bash call): Stop recording
agent-device record stopAndroid:
# Step 1 (separate Bash call): Start recording
adb -s $SERIAL shell screenrecord /sdcard/agent-rec.mp4 &
# Step 2 (separate Bash call): Wait, perform action, wait
sleep 3 && agent-device swipe $X_MID $Y_35PCT $X_MID $Y_75PCT 500 --session droid && sleep 5
# Step 3 (separate Bash call): Stop + pull
adb -s $SERIAL shell kill -INT $(adb -s $SERIAL shell pidof screenrecord) && sleep 2 && adb -s $SERIAL pull /sdcard/agent-rec.mp4 /tmp/loading-evidence.mp4 && adb -s $SERIAL shell rm -f /sdcard/agent-rec.mp4# Step 4 (same or separate call): Extract frames + find changes
rm -rf /tmp/loading-frames && mkdir -p /tmp/loading-frames
ffmpeg -y -i /tmp/loading-evidence.mov -vf "fps=30" /tmp/loading-frames/frame-%04d.png 2>/dev/null
# Find changed frames via MD5
prev_hash=""
for f in /tmp/loading-frames/frame-*.png; do
hash=$(md5 -q "$f")
if [[ "$hash" != "$prev_hash" ]]; then
echo "$(basename $f): CHANGED"
prev_hash="$hash"
fi
doneThen downsample and read the changed frames:
# Downsample specific changed frames for LLM viewing
sips --resampleHeight 852 /tmp/loading-frames/frame-0090.png --out /tmp/loading-frames/view-0090.png >/dev/nullRead /tmp/loading-frames/view-0090.png| Scenario | Approach |
|---|---|
| Navigating / tapping UI elements | snapshot -i -c --json + compute center + press |
| Verifying a loading spinner exists | Video + frame extraction |
| Visual verification after an action | screenshot + downsample + Read |
| Element not in accessibility tree | screenshot + percentage estimation |
| Evidence for PR / bug report | Video recording (share .mov file) |
swipe from ~35% down to ~77% down (within the content area)scroll down when at top of list — swipe down can trigger the notification shadeFor quickly performing a sequence of interactions (press, swipe, type), use a bash script. Manual step-by-step execution is too slow to catch fleeting UI states. Note: this is for interaction commands only — record start/record stop must still be separate Bash calls (see "Capturing Transient States" above).
bash /tmp/test-script.sh© Shopify, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/agent-device of Shopify/flash-list.
Open the folder on GitHubat commit 527d767
Agent Device 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 |
|---|---|---|---|---|---|---|
| Agent Device this skillShopify/flash-list | 7.2k | — | ~5k | Automated safety check: Pass | MIT | |
| Mobilerun Docs Referencedroidrun/mobilerun | 9.6k | — | ~943 | Automated safety check: Pass | MIT | |
| Appiumblokadaorg/blokada | 3.3k | — | ~3.5k | Automated safety check: Pass | MPL-2.0 | |
| 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 |
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.
blokadaorg/blokada
A skill your agent uses for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session.
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.
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.
Shopify/flash-list
Analyze agent feedback artifacts from GitHub Actions workflow runs, extract actionable learnings, and incorporate them into skill files and CLAUDE.md.
Shopify/flash-list
Full workflow for fixing a GitHub issue - understand the problem, reproduce, diagnose root cause, fix, test on iOS/Android simulators, review, and raise a PR
Shopify/flash-list
Create a GitHub PR for FlashList. An agent skill from Shopify/flash-list.
Shopify/flash-list
Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.
Shopify/flash-list
Triage a GitHub issue — classify priority (P0/P1/P2), search for duplicates, and apply labels.
Shopify/flash-list
Upgrade the React Native fixture app to a new version. An agent skill from Shopify/flash-list.
Categories
Interact with iOS simulator or Android emulator/device using snapshot-based coordinates. Agent Device is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Interact with iOS simulator or Android emulator/device using snapshot-based coordinates.
Agent Device fits situations like: navigating the app on a simulator/emulator; tasks that involve Mobile testing and debugging; tasks that involve Accessibility.
Run `npx skills add Shopify/flash-list --skill agent-device -a claude-code`. Or copy the skill folder (.claude/skills/agent-device in Shopify/flash-list) into .claude/skills/agent-device in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Shopify/flash-list --skill agent-device -a codex`. Or copy the skill folder (.claude/skills/agent-device in Shopify/flash-list) into .agents/skills/agent-device 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 Shopify/flash-list --skill agent-device -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agent-device, .gemini/skills/agent-device, .github/skills/agent-device and .opencode/skills/agent-device in your project.
Going by SKILL.md and its folder, Agent Device needs the command-line tools its instructions call (adb, ffmpeg, xcrun and bash).
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.
Agent Device is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k 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 Agent Device: Mobilerun Docs Reference (droidrun/mobilerun, 9.6k stars), Appium (blokadaorg/blokada, 3.3k stars), Phoneagent (rounak/PhoneAgent, 798 stars) and Simvyn (pranshuchittora/simvyn, 437 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Shopify (a GitHub organization, an official publisher) maintains it in Shopify/flash-list, which has 7,245 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 1, 2026.
Source: Shopify/flash-list on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.