One Mac · every iPhone · any app

Your iPhone farm,
on autopilot.

Warm up accounts, post, reply and test — on every iPhone at once. Drive them from your favorite agent or write an extension and put it on a schedule. Real taps, no jailbreak, no app on the phone.

TikTok farm6 iPhones running3,482 actions today
tt-01

Checking inbox

tt-02

Watching For You

tt-03

Posting draft

tt-04

Watching For You

tt-05

Checking inbox

tt-06

Watching For You

1 Mac
drives them all
No limit
on iPhones or runs
0
jailbreaks or phone apps
$50
a month, flat

Three ways to drive.
Mix them however you like.

Ask

Say it in plain language

Type a task, pick a phone. The built-in agent works the screen until it has your answer.

warm up tt-03 for 10 minutes
Agents

Let your agent drive

Claude Code, Codex, Cursor — anything with MCP gets tools for every iPhone.

phonepilot · tap_text(“Post”)
Extensions

Automate it for good

One TypeScript file becomes a button, a schedule, an agent tool and an endpoint.

schedule: "0 9,14,20 * * *"
Agents

Your agent.
Your phones.

Connect once over MCP and your agent can list phones, see their screens, tap, type and open apps — or hand a whole task to a phone with ask_phone. Scripts get the same tools over REST.

  • Claude Code
  • Codex
  • Cursor
  • Claude Desktop
  • Any MCP client
  • Your scripts
$claude mcp add --transport http phonepilot http://127.0.0.1:7788/mcp
tt-01
tt-02
tt-03
tt-04
tt-05
tt-06

A whole day of work,
scheduled once.

09:00 · all tt- phones

Warm up

Scroll For You 15 min, like a few

14:00 · all tt- phones

Post

Today’s draft on every account

20:00 · all tt- phones

Engage

Reply to new comments

Extensions

Write it once.
It runs forever.

This file warms up every account three times a day, on every phone at once. Save it and PhonePilot reloads it — it shows up in four places:

Button
Run it from the app on any phone
Schedule
Cron, in your Mac’s time zone
Agent tool
tiktok-farm_warm-up over MCP
Endpoint
POST …/x/tiktok-farm/warm-up

Extensions can also have Claude read the screen into typed data, keep their own storage and call the internet. Each runs in its own process, so one crashing never takes down the rest.

extensions/tiktok-farm/extension.ts
1import { Duration, Effect, Schema } from "effect"
2import { HttpRouter, HttpServerResponse } from "effect/http"
3import { Extension, Phone } from "phonepilot"
4
5// Scroll the For You feed like a person would.
6const warmUp = Effect.gen(function* () {
7 const phone = yield* Phone.Service
8 yield* phone.openApp("TikTok")
9 yield* phone.tapText("For You")
10 for (let i = 0; i < 40; i++) {
11 yield* phone.scroll(800)
12 yield* Effect.sleep(Duration.seconds(4 + Math.random() * 8))
13 }
14})
15
16// Every phone named tt-…, all at once: each has its own queue.
17const warmUpFarm = Effect.gen(function* () {
18 const phones = yield* Phone.list
19 yield* Effect.forEach(
20 phones.filter((p) => p.name.startsWith("tt-")),
21 (p) => Phone.session("warm-up", warmUp, { phone: p.name }),
22 { concurrency: "unbounded" }
23 )
24})
25
26const done = () => HttpServerResponse.jsonUnsafe({ ok: true })
27
28export default Extension.make({
29 name: "TikTok farm",
30 tools: [Extension.tool({
31 name: "warm-up",
32 description: "Warm up every tt- account now.",
33 input: Schema.Struct({}),
34 run: () => warmUpFarm
35 })],
36 http: HttpRouter.add("POST", "/warm-up", warmUpFarm.pipe(Effect.map(done))),
37 actions: [Extension.action({
38 id: "warm-up",
39 title: "Warm up every account",
40 schedule: "0 9,14,20 * * *",
41 run: warmUpFarm
42 })]
43})

Not just TikTok.
Any app, any iPhone.

01

Social & TikTok farms

Warm up accounts, post drafts, reply to comments — on every phone at once, each with its own account and schedule.

02

Agents with real phones

Give Claude Code, Codex or Cursor an iPhone. They see the screen, tap, type and report back.

03

App testing & QA

Smoke-test every TestFlight build on real devices and keep screenshots of each step.

04

Data from apps without APIs

WHOOP, Health, banking, delivery apps — read them into typed JSON on a schedule.

05

Ops & support

Check a customer’s flow on a real iPhone, reproduce bugs, verify push notifications.

06

Your own idea

If you can do it with your thumbs, an extension can do it on a schedule.

Under the hood.
Real taps, really seen.

tap “WHOOP” ✓

Real taps

Your Mac is a Bluetooth mouse. PhonePilot watches the screen to aim, and only taps once it’s on target.

Settings

  • Airplane Mode
  • Wi‑Fi
  • Bluetooth
  • Cellular
  • Personal Hotspot
  • Battery

On-device OCR

Find text to tap and wait for it to appear — fast, free, and without sending a pixel anywhere.

Runs on your Mac

Capture, control and storage stay local. The server only listens on 127.0.0.1.

Pricing

One plan.
No limits.

Every iPhone, every automation, every update — and it runs on the Claude subscription you already have.

PhonePilot Pro

No limits

$50/ month

Control as many iPhones as you want, for whatever you want.

  • ✓Unlimited iPhones — USB, AirPlay and Bluetooth
  • ✓Unlimited runs, agents and schedules
  • ✓Unlimited extensions, tools and endpoints
  • ✓MCP for Claude Code, Codex, Cursor and more
  • ✓Run history with steps, logs and screenshots
  • ✓Every update
Get PhonePilot

Uses your Claude

The built-in agent and extensions run Claude through Claude Code on your Mac, signed in with your own plan. No API key to manage, and no token bill from us.

  • ✓Works with the Claude plan you already pay for
  • ✓Bring Codex, Cursor or any MCP client too
  • ✓Phone control itself needs no AI at all
$claude mcp add --transport http phonepilot http://127.0.0.1:7788/mcp
FAQ

Frequently asked
questions.

How PhonePilot connects, what it can run, and where your data goes.

No. PhonePilot sees the screen over USB or AirPlay, and your Mac acts as a Bluetooth keyboard and mouse. iOS shows the mouse as an AssistiveTouch pointer, and PhonePilot aims it by watching the screen. Nothing is installed on the phone.

Put your iPhone farm on autopilot.

$50 a month. No limits. Works with your Claude subscription.