Phone Harness
ShawnPana/phone-harness
Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.
Connect to an Android phone over ADB wireless (Galaxy S25 at meain's setup), install/launch APKs, take screenshots, and drive the UI via uiautomator.
$ npx skills add meain/dotfiles --skill android-adb-connect -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install meain/dotfiles android-adb-connect --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/meain/dotfiles.git skills-src && mkdir -p .claude/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .claude/skills/android-adb-connect && 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 "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .claude/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connectType 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 meain/dotfiles --skill android-adb-connect -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install meain/dotfiles android-adb-connect --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meain/dotfiles.git skills-src && mkdir -p .agents/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .agents/skills/android-adb-connect && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .agents/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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 meain/dotfiles --skill android-adb-connect -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install meain/dotfiles android-adb-connect --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meain/dotfiles.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .cursor/skills/android-adb-connect && 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 "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .cursor/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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/meain/dotfiles.git --path agents/.agents/skills/android-adb-connect--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 meain/dotfiles --skill android-adb-connect -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install meain/dotfiles android-adb-connect --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meain/dotfiles.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .gemini/skills/android-adb-connect && 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 "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .gemini/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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 meain/dotfiles android-adb-connectInstalls 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 meain/dotfiles --skill android-adb-connect -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/meain/dotfiles.git skills-src && mkdir -p .github/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .github/skills/android-adb-connect && 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 "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .github/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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 meain/dotfiles --skill android-adb-connect -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install meain/dotfiles android-adb-connect --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meain/dotfiles.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/agents/.agents/skills/android-adb-connect .opencode/skills/android-adb-connect && 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 "android-adb-connect" agent skill from https://github.com/meain/dotfiles/tree/master/agents/.agents/skills/android-adb-connect into .opencode/skills/android-adb-connect/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "android-adb-connect", 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.
android-adb-connectConnect to an Android phone over ADB wireless (Galaxy S25 at meain's setup), install/launch APKs, take screenshots, and drive the UI via uiautomator.
Android Adb Connect is an agent skill from meain/dotfiles. Connect to an Android phone over ADB wireless (Galaxy S25 at meain's setup), install/launch APKs, take screenshots, and drive the UI via uiautomator. Triggers: "connect to phone", "adb connect", "test on phone", "screenshot the phone", "install on phone", "phone is at 192.168.1.3", any task that needs to drive an Android device from the host.
Its SKILL.md is about 1.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. It works with Android. The repository describes itself as: If there is a shell, there is a way! The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3e336e2. 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:
adbsqlite3From 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.
Android Adb Connect loads about 1.5k tokens when it runs. Until then it costs about 91 tokens; SKILL.md has 490 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 meain/dotfiles at commit 3e336e2, republished under its MIT licence (© meain). 490 words, ~1,465 tokens.
.claude/skills/android-adb-connect/SKILL.md (or your agent's skills folder).This skill captures the actual quirks of meain's setup. The phone is a Samsung Galaxy S25 on the same WiFi as the host. The ADB SDK lives at ~/Android/sdk-edo (not the system path) — always export ANDROID_HOME=$HOME/Android/sdk-edo before running adb.
host:port and optionally a 6-digit pairing codeexport ANDROID_HOME=$HOME/Android/sdk-edo
# Java is only needed for builds, not for adb itself
export PATH=$ANDROID_HOME/platform-tools:$PATH
adb devices # check what's already attachedIf adb isn't found, the SDK is at ~/Android/sdk-edo/platform-tools/adb.
If any entry shows status device, check if it's the Galaxy S25 before proceeding to connect:
adb -s <device-id> shell getprop ro.product.model
# SM-S938B → it's the Galaxy S25, use this device ID and skip Step 2 entirelyUse that ID with -s for all subsequent commands.
The phone remembers the pairing across reboots, but the wireless port changes every time Wireless Debugging is toggled. The user will typically paste a new host:port — use it directly:
adb connect 192.168.1.3:38181If that fails with failed to authenticate or hangs, the pairing has expired — go to Step 2b.
The user needs to open Settings → Developer options → Wireless debugging → Pair device with pairing code on the phone. That screen shows a host:pairing_port and a 6-digit code. They are separate from the regular host:port shown on the main Wireless debugging screen.
adb pair 192.168.1.3:40319 # pairing port from the phone (different from connect port)
# adb prompts for the code; or pass it inline:
adb pair 192.168.1.3:40319 657538Then connect using the regular (non-pairing) port shown on the main Wireless debugging screen:
adb connect 192.168.1.3:38181If the user can't read the port off the phone, try mDNS:
adb mdns servicesIt lists adb-tls-pairing and adb-tls-connect entries with their ports. The pairing entry rotates each time the pairing code screen is opened.
SSLV3_ALERT_CERTIFICATE_UNKNOWN or "TLS handshake failed" means the host and phone disagree on the pairing — re-pair from scratch via Step 2b. Don't retry the same adb connect in a loop.
adb devices
# Should show e.g. 192.168.1.3:38181 deviceAlways pass -s <host:port> to subsequent commands when more than one device is listed (the adb-RZGY... mDNS entry can show up alongside the IP one).
adb -s 192.168.1.3:38181 install -r app/build/outputs/apk/debug/app-debug.apk
adb -s 192.168.1.3:38181 shell am force-stop com.example.app
adb -s 192.168.1.3:38181 shell am start -n com.example.app/.MainActivityadb -s 192.168.1.3:38181 exec-out screencap -p > /tmp/phone.png
# Read it with the Read tool. If the API rejects large images, resize:
# sips -z 1200 555 /tmp/phone.png --out /tmp/phone_small.pngCoordinates are in the device's native resolution (1080×2340 on the S25). Don't scale to display size. Get exact bounds via:
adb -s 192.168.1.3:38181 shell uiautomator dump /sdcard/window.xml >/dev/null
adb -s 192.168.1.3:38181 shell cat /sdcard/window.xml \
| tr '>' '\n' \
| grep -oE '(text|content-desc|bounds)="[^"]+'Then tap the center of bounds="[x1,y1][x2,y2]":
adb -s 192.168.1.3:38181 shell input tap 540 1200
adb -s 192.168.1.3:38181 shell input text "hello%sworld" # %s for spaces
adb -s 192.168.1.3:38181 shell input keyevent KEYCODE_BACK
adb -s 192.168.1.3:38181 shell input keyevent KEYCODE_WAKEUPQuirks of input text:
%s, not literal spaces.! — zsh history expansion can trigger before the command reaches the device.KEYCODE_ENTER separately.adb -s 192.168.1.3:38181 shell svc power stayon true # USB or AC
# Always turn it back off when done:
adb -s 192.168.1.3:38181 shell svc power stayon falseadb -s 192.168.1.3:38181 logcat -d -t 300 | grep com.example.appadb pull of just the .db file is incomplete because Room uses WAL mode. Force-stop the app first to flush, then pull all three files:
adb -s 192.168.1.3:38181 shell am force-stop com.example.app
for f in app.db app.db-wal app.db-shm; do
adb -s 192.168.1.3:38181 shell "run-as com.example.app cat databases/$f 2>/dev/null" > /tmp/$f
done
sqlite3 /tmp/app.db "SELECT ..."The device's sqlite3 binary is missing on stock Samsung — always pull and query locally.
For the Edo project at /Users/meain/dev/src/edo, see its CLAUDE.md for the install/launch/screenshot pattern with the actual package name (com.edo.app).
© meain, 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 agents/.agents/skills/android-adb-connect of meain/dotfiles.
Open the folder on GitHubat commit 3e336e2
Android Adb Connect 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 |
|---|---|---|---|---|---|---|
| Android Adb Connect this skillmeain/dotfiles | 285 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Phone HarnessShawnPana/phone-harness | 3.2k | — | ~4.3k | Automated safety check: Pass | MIT | |
| Mobile QAtloncorp/tlon-apps | 107 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Androidyang1ming/android-harness | 176 | — | ~259 | Automated safety check: Pass | MIT | |
| Debug Receiverstimusus/Shuttle2 | 229 | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Debug Bridgegetknit/knit | 133 | — | ~2.3k | Automated safety check: Pass | GPL-3.0 |
ShawnPana/phone-harness
Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.
tloncorp/tlon-apps
Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.
yang1ming/android-harness
Direct Android device control through ADB. An agent skill from yang1ming/android-harness.
timusus/Shuttle2
Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport…
getknit/knit
Drive and verify Knit on a device or emulator through the headless debug bridge (am broadcast to app.getknit.knit.debug.<ACTION, replies as JSON) — send a message on one phone and confirm it landed…
skydoves/android-testing-skills
A skill your agent uses to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos.
meain/dotfiles
Search past Claude Code and Codex sessions. An agent skill from meain/dotfiles.
meain/dotfiles
Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise.
meain/dotfiles
Daily backlog management — full planning review OR add a single entry from a URL.
meain/dotfiles
Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a…
meain/dotfiles
Generate a concise weekly status update in team format. An agent skill from meain/dotfiles.
meain/dotfiles
Search the web using lynx and DuckDuckGo. An agent skill from meain/dotfiles.
Works with
Categories
Connect to an Android phone over ADB wireless (Galaxy S25 at meain's setup), install/launch APKs, take screenshots, and drive the UI via uiautomator. Android Adb Connect is an agent skill from meain/dotfiles. Connect to an Android phone over ADB wireless (Galaxy S25 at meain's setup), install/launch APKs, take screenshots, and drive the UI via uiautomator.
Android Adb Connect fits situations like: tasks that involve Mobile testing and debugging.
Run `npx skills add meain/dotfiles --skill android-adb-connect -a claude-code`. Or copy the skill folder (agents/.agents/skills/android-adb-connect in meain/dotfiles) into .claude/skills/android-adb-connect in your project. Claude Code loads it when a task matches its description.
Run `npx skills add meain/dotfiles --skill android-adb-connect -a codex`. Or copy the skill folder (agents/.agents/skills/android-adb-connect in meain/dotfiles) into .agents/skills/android-adb-connect 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 meain/dotfiles --skill android-adb-connect -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/android-adb-connect, .gemini/skills/android-adb-connect, .github/skills/android-adb-connect and .opencode/skills/android-adb-connect in your project.
Going by SKILL.md and its folder, Android Adb Connect needs the command-line tools its instructions call (adb and sqlite3).
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.
Android Adb Connect is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.5k tokens (SKILL.md is roughly 5.9k 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 Android Adb Connect: Phone Harness (ShawnPana/phone-harness, 3.2k stars), Mobile QA (tloncorp/tlon-apps, 107 stars), Android (yang1ming/android-harness, 176 stars) and Debug Receivers (timusus/Shuttle2, 229 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
meain (a GitHub user) maintains it in meain/dotfiles, which has 285 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 8, 2026.
Source: meain/dotfiles on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.