Documentation
Getting started
You need a Mac, one iPhone and a cable. Roughly ten minutes, most of it waiting on Xcode.
How the pieces fit together
Your phones never talk to us. A small agent runs on your own Mac, and it reaches out to the dashboard: it asks whether there is work, does it over USB, and reports back. Nothing dials into your network, and no inbound port is opened.
That means the Mac holding the phones has to be awake and online for a scheduled run to fire. It also means the phones stay yours, on your desk.
Before you start
- A Mac with Xcode installed from the App Store, not just the command line tools.
- Node 22 or newer. The installer checks this first and stops if the version is older.
- An Apple ID. A free one works, with the caveat below.
- An iPhone running iOS 16 or newer, and a cable that carries data.
Free Apple IDs expire every 7 days
A free account signs the automation harness for seven days, after which the phone stops responding until it is rebuilt. A paid Apple Developer account lasts a year. For one phone the free tier is fine; past two or three it becomes a weekly chore.
Set it up
Create your workspace
Sign in with Google. The first sign-in creates a workspace on the free plan, which covers one device.
Add a machine
Open Machines and add one. You get a one-line install command carrying a token that ties that Mac to your workspace:
curl -fsSL https://appfarmmagic.com/install.sh | sh -s -- afm_agent_...It installs into
~/.appfarmmagicand registers a launchd job, so the agent comes back on its own after a reboot.Plug in the iPhone
Connect it and tap Trust when the phone asks. Then turn on Developer Mode under Settings → Privacy & Security → Developer Mode, which restarts the phone.
Enrol it
The phone appears under Devices as discovered. Enrol it, and the agent builds the automation harness for that specific phone. First build takes a few minutes; later ones are cached.
Run a health check
Schedule Health check to run now. It unlocks the phone, takes a screenshot and confirms a swipe actually reaches the screen. If that passes, everything downstream works.