phone
Skill5 starsChanged 2 months agoMITView on GitHub
Control the user's iPhone, including apps and messaging.
- Reads credentials
3 other projects use a version of this.
Adopted by
Most recently taken up by
- BlockRunAI/ClawRoutertheir own version, first seen Oct 27, 2026
- BlockRunAI/blockrun-mcptheir own version, first seen Oct 20, 2026
- zoom/skillstheir own version, first seen Mar 11, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- BlockRunAI/ClawRouter★ 6.7ksame name
- BlockRunAI/blockrun-mcp★ 389same name
- zoom/skills★ 82same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository57 other files it gives its agents.
- adversarial-reviewSkill
- aesthetic-animaxxingSkill
- ai-search-optimizationSkill
- announceSkill
- audio-trackSkill
- blindspotSkill
- brave-wesSkill
- chrome-wesSkill
- clihubSkill
- dashclaw-governanceSkill
- deskclawSkill
- de-vibeSkill
- dispatch-blocksSkill
- epic-infographicsSkill
- fable-gptSkill
- frontend-verifySkill
- gsap-astroSkill
- gsap-coreSkill
- gsap-frameworksSkill
- gsap-nextjsSkill
- gsap-nuxtSkill
- gsap-performanceSkill
- gsap-pluginsSkill
- gsap-react-routerSkill
- gsap-reactSkill
- gsap-scrolltriggerSkill
- gsap-sveltekitSkill
- gsap-tanstack-routerSkill
- gsap-timelineSkill
- gsap-utilsSkill
- gsap-vanillaSkill
- harness-healthSkill
- iphoneSkill
- landing-page-cro-expertSkill
- launchSkill
- launch-videoSkill
- logo-revealSkill
- marketingSkill
- marketing-studioSkill
- meditateSkill
- moleresearchSkill
- og-assetsSkill
- petstoreSkill
- phone-gotchasSkill
- preflightSkill
- product-demoSkill
- ship-itSkill
- shipSkill
- show-meSkill
- skillfindSkill
- social-clipSkill
- spec-probeSkill
- teamSkill
- tregSkill
- wes-voiceSkill
- wrapSkill
- xplainerSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 48
REQUIRED SUB-SKILL: read phone-gotchas before your first tap.
- Distinctive: line 93
Ask first only when the recipient or content is genuinely ambiguous.
- Very specific: line 105
Never guess at connection problems.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Drive the user's iPhone (SideTap)
The user's real iPhone is connected to this PC over USB and fully controllable.
Replace /path/to/sidetap below with the SideTap folder — a git clone, or
%LOCALAPPDATA%\SideTap\app when it was installed with the sidetap.io
one-liner. Driving the phone works from any project directory.
Run
Cheapest path, and the only one a subagent with no MCP tools has: the declick
adapter iphone. Build it once with
declick add "mcp:python /path/to/sidetap/scripts/phone_mcp.py" --name iphone,
then every helper is a shell verb:
declick daemon start # once per boot: keeps the server warm, ~0.6s a call instead of 2-4s
declick run iphone ocr --rows screen --fields text,x,y --limit 30
declick run iphone tap-text --text "General"
declick run iphone send-message --contact Mom --text "hi"
declick run iphone act --steps '[{"tool":"tap","args":{"x":100,"y":200}},{"tool":"type_text","args":{"text":"hi"}}]'
declick describe iphone --verb tap-text # one verb's flags, under 500 tokensVerbs are the helper names in kebab-case (tap_text is tap-text) and every
argument is a --flag; inside act --steps the tool names stay Python-style
(type_text). ocr and find-text answer {warning, source, flags, screen}:
--rows screen unwraps the rows and the warning stays in meta.extra. Set
DECLICK_TIMEOUT_MS=120000 for unlock, send-message, read-messages and
find-on-home-screen, which can outrun the 30s default. Every safety gate below
applies unchanged.
For a step that needs logic between gestures, run Python with the helpers in scope:
cd /path/to/sidetap && ./phone-harness.cmd <<'PY'
send_message("Mom", "hi")
PYBare phone-harness is NOT on the bash PATH — always use ./phone-harness.cmd
from the repo root. Helpers are pre-imported; print() output comes back to you.
REQUIRED SUB-SKILL: read phone-gotchas before your first tap. It holds the
coordinate traps, the batching tool, and what the harness genuinely cannot do —
none of which you can learn by looking at the screen.
Helpers
| Helper | Use |
send_message(contact, text) | full Messages send; contact = conversation name in the Messages list |
send_image(contact, image_path, text="") | send a PNG/JPEG file from this PC as a Messages attachment, optional caption (clipboard paste; same approval gate) |
save_clipboard_image(path) | save the image copied on the phone to a PNG on this PC |
read_messages(contact, limit=20) | read a thread back: [{text, from_me}, ...], oldest first |
ocr() | all visible text with center coords (real UI tree, exact). Elements are {"text","x","y","type","rect"} — the key is text, and full= is MCP-only |
find_text(t) / tap_text(t) | locate / tap by visible text |
wait_for_text(t, timeout=10) | poll until text appears; returns the element (with x/y) |
tap(x, y) / swipe(x1,y1,x2,y2,secs) / scroll("down") | raw gestures, units = points |
long_press(x, y, seconds=1.0) | context menus and other hidden affordances |
act([{"tool":n,"args":{...}}, ...]) | several tools in ONE round trip; screenshot excluded |
type_text(t) | type into the focused field (tap the field first) — it appends at the cursor |
set_field_text(field, text) | replace a field's contents: pass the ocr() row for the field (it taps it for you), reads the value back. The only correct way to fill a field that may already hold text or an iOS draft |
get_clipboard() / set_clipboard(t) | read or write the iPhone system clipboard |
open_app("messages", wait_seconds=0) | friendly name or bundle id; wait_seconds>0 confirms it reached the foreground and raises if it never did (the only foreground-confirmed launch that does not need the bundle id) |
current_app() / wait_for_app(bundle_id) | frontmost app / wait until one is |
open_apps() / close_app(name) | the app switcher's contents [{name, bundle_id, pid}], newest first, read over USB; force-quit one (same names as open_app). The switcher SCREEN cannot be opened: WDA touches never reach the home-indicator zone (measured) |
screenshot("out.png") / press_home() / wait_stable() / unlock() | utilities |
Not in the table, and you will want them:
- There is no
drag(). Moving Home Screen icons means jiggle mode plus a hand-builtclient()._pointer_actionsgesture, and it fails silently if you skip jiggle mode. Recipe and the page-hiding flow are inphone-gotchas. Same-page drags and folder-creation (drop icon A on icon B) are verified; cross-page drags are not and degrade into plain swipes that look like progress. - "Organise my Home Screen" is not a quick job. ~160 icons is hours of drags
and can strand half-sorted. Hiding pages via the
PageIndicatoreditor is ~10 taps, reversible, and does most of the work — read the costing section inphone-gotchasbefore you promise anything. - Full installed-app inventory:
ios apps --list(go-ios, on PATH asios.EXE). Instant, and far cheaper than sweeping Home Screen pages.
Rules
- Sending to real people: send exactly what the user asked. If you composed the content yourself (a summary, a draft), include the sent text verbatim in your reply. Ask first only when the recipient or content is genuinely ambiguous.
- Messages compose field is labeled "Message", NOT "iMessage" — old message bubbles carry "iMessage" in their labels; searching for it taps the wrong thing.
send_message/read_messageshandle Messages resuming mid-thread, find the thread via Messages SEARCH (type the name, tap the Conversations result), and verify the opened thread's header before acting — a wrong or unverifiable match raises instead of guessing.- MCP alternative: the
sidetapMCP server (see the SideTap README) exposes the same helpers as nativemcp__sidetap__*tools. The declick verbs are the same tools with no per-session catalog cost, and they work from every subagent, so prefer them; fall back to MCP only where declick is not installed. - Anything fails to connect →
./phone-harness.cmd doctorfrom the repo root. Never guess at connection problems. Common: free-Apple-ID signing expires every 7 days →phone-harness fix-input, then the USER clicks Start in Sideloadly. - Phone must be unlocked for bring-up;
unlock()enters PHONE_PASSCODE from .env if set (digit passcodes are typed in one fast request and verified by the pad leaving the screen; if a lock-screen notification holding keyboard focus eats the typed digits, they go in by tapping the pad's buttons instead). It raises if the screen stays dark after two wake attempts — that means the phone needs a hand wake (side button), not a retry loop. - Human-watchable live viewer: http://127.0.0.1:8770 (start with
python launch.py).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

