One cable. Four hops. Real hands on a real phone.
Every other iPhone automation route assumes you own a Mac. SideTap does not. It drives the phone through WebDriverAgent, so the agent reads the actual UI element tree: exact buttons, exact labels, exact coordinates. Not OCR guesses.
iPhone
WebDriverAgent sideloaded once with a free Apple ID.
go-ios
Tunnel, app launch, port forward. The installer fetches it for you.
harness
tap, swipe, type, read the screen. One helper call per intent.
viewer & MCP
Live screen in your browser. Native tool calls for the agent.
Built for agents. Supervised by you.
Real UI tree, not screenshots
tap_text("General") finds the actual element and taps its center. Coordinates are points, exact.
Reads that fit a context window
An agent pays for every byte it reads. Screen reads drop wrappers, geometry, and labels that just repeat the button they sit inside. 64% fewer tokens, measured on real screens. ocr(full=True) when you want the raw tree.
Waits for the screen, not the clock
Checking whether the screen had settled used to cost a fixed half second even when it had already stopped moving. It now compares straight away: 877ms down to 318ms, measured on a real phone. A scroll that hunts through nine screens gets five seconds back. Connection reuse takes another 46% off every call to the phone.
The loops agents hand-roll
scroll_until_found("Notifications") keeps going until the row is genuinely tappable, instead of stopping on one hidden under the nav bar. find_on_home_screen sweeps pages for an icon.
Live viewer at ~34 fps
Click to tap, drag to swipe, type on your keyboard. One-click Unlock and Restart link. Open apps lists what is running, as the app switcher would: click to bring one up, ✕ to close it.
One-call flows
send_message("Mom", "on my way") opens Messages, finds the thread, types, sends. It empties the compose bar first, because iOS keeps an unsent draft per thread and typing lands after it. read_messages reads replies back. send_image sends a screenshot from your PC as an attachment, with a caption; Ctrl+V in the viewer plus a Send image button does the same by hand, and Copy phone image brings one back.
Camera roll to your PC
One button copies new photos and videos to a folder you pick, over the USB cable. No iCloud, no emailing yourself. Files already pulled are skipped, so re-runs only fetch what's new.
Native MCP tools
One command registers the whole helper API as typed tool calls in Claude Code or Claude Desktop. Or turn the same server into shell verbs with declick: reads come back trimmed to the fields you asked for, the tool list stops riding in every prompt, and a subagent with no MCP tools can still drive the phone.
A doctor that names the fix
phone-harness doctor walks the whole chain. Every FAIL tells you the exact command or click that repairs it. The viewer runs the same checks and re-runs them by itself until they pass, so a link that is still starting settles to green with nothing to click.
Kill switch + live activity feed
Every tap, swipe, and keystroke count shows up as it happens. One red button freezes every agent action while you keep watching. Typed text is never logged, only its length.
Prompt injection gate
Anyone who can text you can put words in your agent's input. Once the agent has read your screen or your messages, a send stops and waits for you to approve the exact text. Running out of time refuses it. One click switches it between always, flagged only, and off, and no tool call can reach that setting. The text you approve is also the text that sends: the compose bar is read back before the send, and anything that does not match what you approved is refused rather than delivered. It bounds what an injection can send, not what it can tap, and the README says so plainly instead of pretending a filter catches everything.
One line installs the PC side.
Paste this into PowerShell. It installs Python, go-ios, and SideTap, and puts a shortcut on your Desktop. The viewer then opens and walks you through the phone side: Developer Mode and WebDriverAgent. About 10 minutes of Apple steps, one time.
irm https://sidetap.io/install.ps1 | iex
Set up SideTap (github.com/ucsandman/SideTap) on this Windows machine so LLM agents can drive my iPhone over USB. Follow the README section "Set it up with an agent", run phone-harness doctor after every step, and loop until every check passes. Ask me before anything that touches my Apple ID, my phone's settings, or sends anything from my phone.
:: Windows 10/11 · Python 3.10+ · Node.js · iPhone on iOS 17+ git clone https://github.com/ucsandman/SideTap cd SideTap npm install -g go-ios pip install -r requirements.txt python launch.py :: live viewer opens at http://127.0.0.1:8770
First time? docs/setup-windows.md covers the one-time phone setup: USB driver, Developer Mode, sideloading WebDriverAgent.
SideTap Pro
The weekly re-sign, gone.
Free Apple IDs expire app signatures every 7 days. SideTap already softens this: a desktop toast before it lapses, a one-command local fix. Pro moves you to Apple's own 1-year signing and scales you past one phone.
Open source
$0 MIT, forever
- Everything on this page: viewer, helpers, MCP tools, doctor, kill switch
- Weekly re-sign with one command and one click
- Expiry countdown and desktop notifications
- Community support on GitHub
Pro IN DEVELOPMENT
$49/year · early-bird price for the waitlist
- Multi-device: drive two or more iPhones from one PC
- Guided 1-year signing with your own Apple developer account. Set it up once a year instead of every week
- Your Apple ID and passcode never leave your machine
- Priority support, direct line
The core stays MIT and free. Pro is optional convenience for people who drive their phone every day. Joining the waitlist locks the early-bird price and helps decide what ships first. No spam, one email when it is ready.