phonedriver vs phone-harness

On nine real phone jobs phonedriver passed 27 of 27 runs and phone-harness 0.3.3 passed 14 of 18, using 1.7 times the tokens and 4.4 times the time. Per operation phonedriver was 2.4 to 186 times faster. Measured on one emulator, with how each tool drives a phone and what each sends home.

The short answer

phonedriver finished more jobs, with fewer tokens, in less time. On nine real phone jobs on one emulator on 10 November 2026, phonedriver passed 27 of 27 runs with 657,542 tokens in 306 s, and phone-harness passed 14 of 18 with 1,127,495 tokens in 1,360.5 s: 1.7 times the tokens and 4.4 times the time. On the same Android 17 emulator, interleaved, phonedriver was faster on every operation measured, by 2.4 times (a cold start) to 186 times (the 1,000-row list read).

phone-harness is a Python CLI: the agent pipes a Python script on stdin, and helpers drive an Android phone over adb or an iPhone through the Mac's iPhone Mirroring window. phonedriver is an MCP server and CLI with typed tools, a batch tool for several steps in one call, a diff after every action, an approval prompt before a tap that spends money, and no telemetry.

Measured

p50 of 50 runs after 20 warm-ups, Android 17 emulator, both tools on the emulator's own host, 11 November 2026. phonedriver 0.1.1 against phone-harness 0.3.3, helpers called in process, which spares it a Python start per call and favours it. Source: speed-2026-11-11.

Operationphonedriverphone-harnessphone-harness / phonedriver (95% CI)
UI tree, 1,000-row list12.7 ms2,362.5 ms186x (176.8 to 193.4)
UI tree, Settings51.0 ms2,393.8 ms47x (44.3 to 51.7)
Screenshot9.1 ms348.3 ms38x (36.9 to 39.8)
Type 100 characters158.3 ms3,928.7 ms25x (21.2 to 26.9)
Tap, 1.5 s apart28.7 ms220.4 ms7.7x (7.2 to 8.3)
Tap, back to back38.5 ms162.8 ms4.2x (3.0 to 5.1)
Tap, then what changed514.0 msnot supported

phone-harness cannot type Unicode, and has no equivalent of a settled diff. Fresh process to first screen read: phonedriver 1,176.0 ms, phone-harness 2,776.6 ms.

Tokens and passes

Claude Sonnet 5.5 through claude -p, each tool the only one available, nine jobs that only a phone can do, each result checked from device state (the benchmark post and the jobs table). Both tools ran on the same emulator on 10 November 2026. phonedriver ran each job three times and phone-harness twice. Tokens are medians per job:

Jobphonedriverphone-harness
qa-signup3/3, 121,8541/2, 305,766
qa-shop3/3, 92,5702/2, 136,428
relay-code3/3, 49,1260/2, 161,444
chrome-prefs3/3, 98,5762/2, 151,782
clock-settings3/3, 95,9622/2, 79,931
messages-pin-archive3/3, 45,2402/2, 42,452
photos-crop3/3, 61,4772/2, 65,703
wakelock-restrict3/3, 38,7751/2, 54,694
log-code3/3, 53,9622/2, 129,294
Sum27/27, 657,54214/18, 1,127,495

Tool calls summed to 99 for phonedriver and 104.5 for phone-harness. phone-harness failed four runs: relay-code twice (no contact was saved), wakelock-restrict once, and qa-signup once, which hit the 10-minute limit. The failed runs are part of its sum. These are small samples on a test set I wrote. I also ran a smaller, earlier test with three tasks, where phonedriver's medians were 218,357 tokens against phone-harness's 330,375 (34% fewer), phone-harness was ahead on the Wikipedia task, and all runs passed. phonedriver's fixed per-turn cost is higher: the first turn of a one-word claude -p is 5,606 tokens against 5,214 (benchmarks).

How they differ

phonedriverphone-harness
InterfaceMCP server and CLI, typed toolsCLI that runs a Python script the agent writes
AndroidResident agent, UiAutomation tree, H.264 stream, input injected through InputManagerOne adb call per operation; uiautomator dump and screencap
iPhoneOwn XCTest runner, needs Xcode and a signing teamiPhone Mirroring window and Apple Vision OCR (its README)
WaitingSettle detection, returns the diffFixed sleeps and a hash-compare stable check (source at commit 4bebff1)
TelemetryNoneThe 0.3.3 source ships the script, its output and helper calls to PostHog by default, opt out with DO_NOT_TRACK=1. Its README does not mention it

The telemetry row is from reading src/phone_harness/telemetry.py at commit 4bebff1 on 2026-11-05 (teardown). I ran phone-harness with telemetry off in every benchmark. The project may have changed since.

Where phone-harness is better

  • It drives an iPhone without a signing team or an Xcode runner, by mirroring. That setup has limits its README lists: unlocking the phone pauses mirroring, OCR sees text but not icons, and there is no multi-touch.

Use which

Use phonedriver when the agent calls tools, when you want it fast, when you want to know what changed after each action, and when you want an approval prompt before it spends money. Use phone-harness when you need to drive an iPhone through iPhone Mirroring with no Xcode runner and no signing team.

By Hridya Agrawal. Last updated . Other comparisons: phonedriver vs adb, phonedriver vs mobile-mcp. Something wrong or out of date? Open an issue.