Phone Harness 📱
phone-harness · let your agent control your phone.
Connect Claude Code, Codex, or any agent to your real phone. iPhone through the Mac's iPhone Mirroring window, Android over adb from macOS, Linux or Windows. No jailbreak, no Xcode, nothing installed on the phone. The agent sees the screen, taps, types, and reads the result.
● agent: wants to open Weather
│
● find_text("Weather") → (400, 468)
│
● tap(400, 468) → reads the screen → forecast is up
✓ done
Try Phone Harness Cloud → Hosted iPhones and Androids with stealth, real numbers, 2FA, and unlimited devices
Get started by sending the setup prompt to your coding agent.
Demo
Task: "Buy me a Waymo to Delah Coffee from my current location."
https://github.com/user-attachments/assets/80b6d38e-0222-481c-93db-9de60d79247a
Setup
Paste into Claude Code or Codex:
Set up phone-harness for me. Clone https://github.com/ShawnPana/phone-harness into ~/.phone-harness, read `install.md` first, install it so `phone-harness` is a command on my PATH, and register it as an agent skill named phone-harness using `phone-harness skill` as the body. Then read `onboarding.md` and walk me through it.
The agent asks which phone is your default and walks you through the parts
that need your hands: pairing iPhone Mirroring and granting Accessibility and
Screen Recording, or turning on Android developer options and approving adb.
phone-harness --doctor checks the chain. Details in install.md.
Usage
phone-harness <<'PY'
open_app("Notes")
tap_text("New Note")
type_text("hello from the harness")
print([o["text"] for o in ocr()][:10])
PY
Helpers are pre-imported. SKILL.md is the agent's day-to-day guide; helpers.py is the full list.
How it works
iPhone. iPhone Mirroring renders the phone as a Mac window and forwards mouse and keyboard as touches. The harness captures that window, OCRs it with Apple's Vision framework for text with tap-ready coordinates, and posts HID-level events for taps, swipes, and typing.
Android. adb is the transport. screencap is the capture, the phone's
accessibility tree is the text source, input is the hands. Works over USB or
Wi‑Fi, no window needed.
Same helpers on both. phone-harness config set platform ios|android picks
the default.
Limits
- Unlocking the iPhone pauses mirroring; a PIN-locked Android needs the user.
- OCR sees text, not icons. Unlabeled controls need a screenshot and a vision-capable model.
- No multi-touch, no camera or Face ID flows. DRM video renders black.
- Connecting the phone is always the user's job.
Sponsor
phone-harness is free and maintained in my own time. Sponsoring keeps it that way.
Metadata
Release files for phone-harness 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| phone_harness-0.2.1.tar.gz | 58.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| phone_harness-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 122.2 kB
Release files / phone_harness-0.2.1.tar.gz
| Download URL | phone_harness-0.2.1.tar.gz |
|---|---|
| Size | 58.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6c19d7746392ab196b83d6c3d37a198ba97146c5a63b130efc20b1ca56442519
|
|
BLAKE2b-256 checksum How to use checksums |
4078f9f213ff049a7f49955e38962f18da59d927ce1c9c7f42effdd06a09aaa1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / phone_harness-0.2.1-py3-none-any.whl
| Download URL | phone_harness-0.2.1-py3-none-any.whl |
|---|---|
| Size | 63.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fbf9952a6a3e1197d4624502b9eaad525a970ac1d429e1e0f8cfbaa4890379bb
|
|
BLAKE2b-256 checksum How to use checksums |
8fed8cb6f2e53aa042ce218e7f4e6e006e69649262501605328ea9201f321ab0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log