My PC just texted my mom. From my real iPhone.

SideTap lets an LLM agent see and control a real iPhone from a Windows desktop, over USB. No Mac. No jailbreak. No Appium server. A free Apple ID is enough. Open source, MIT.

irm sidetap.io/install.ps1 | iex
Set it up with an agent →

Works with Claude Code out of the box: claude mcp add sidetap turns the phone into native tool calls.

viewer · 11 checks ok · battery 82% · unlocked
Every agent action, live. The switch works here too.
MacXcodejailbreakAppium serverpaid developer accountfree Apple ID + a USB cable

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.

iOS 17+

iPhone

WebDriverAgent sideloaded once with a free Apple ID.

USB

go-ios

Tunnel, app launch, port forward. The installer fetches it for you.

Python

harness

tap, swipe, type, read the screen. One helper call per intent.

you + agent

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.

powershell · recommended
irm https://sidetap.io/install.ps1 | iex
or paste into your agent
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.
or by hand
:: 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
Clone it free →

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.