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 minutesWarm 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.
Checking inbox
Watching For You
Posting draft
Watching For You
Checking inbox
Watching For You
Type a task, pick a phone. The built-in agent works the screen until it has your answer.
warm up tt-03 for 10 minutesClaude Code, Codex, Cursor — anything with MCP gets tools for every iPhone.
phonepilot · tap_text(“Post”)One TypeScript file becomes a button, a schedule, an agent tool and an endpoint.
schedule: "0 9,14,20 * * *"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 mcp add --transport http phonepilot http://127.0.0.1:7788/mcp09: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
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:
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.
1import { Duration, Effect, Schema } from "effect"2import { HttpRouter, HttpServerResponse } from "effect/http"3import { Extension, Phone } from "phonepilot"45// Scroll the For You feed like a person would.6const warmUp = Effect.gen(function* () {7const phone = yield* Phone.Service8yield* phone.openApp("TikTok")9yield* phone.tapText("For You")10for (let i = 0; i < 40; i++) {11yield* phone.scroll(800)12yield* Effect.sleep(Duration.seconds(4 + Math.random() * 8))13}14})1516// Every phone named tt-…, all at once: each has its own queue.17const warmUpFarm = Effect.gen(function* () {18const phones = yield* Phone.list19yield* Effect.forEach(20phones.filter((p) => p.name.startsWith("tt-")),21(p) => Phone.session("warm-up", warmUp, { phone: p.name }),22{ concurrency: "unbounded" }23)24})2526const done = () => HttpServerResponse.jsonUnsafe({ ok: true })2728export default Extension.make({29name: "TikTok farm",30tools: [Extension.tool({31name: "warm-up",32description: "Warm up every tt- account now.",33input: Schema.Struct({}),34run: () => warmUpFarm35})],36http: HttpRouter.add("POST", "/warm-up", warmUpFarm.pipe(Effect.map(done))),37actions: [Extension.action({38id: "warm-up",39title: "Warm up every account",40schedule: "0 9,14,20 * * *",41run: warmUpFarm42})]43})
Warm up accounts, post drafts, reply to comments — on every phone at once, each with its own account and schedule.
Give Claude Code, Codex or Cursor an iPhone. They see the screen, tap, type and report back.
Smoke-test every TestFlight build on real devices and keep screenshots of each step.
WHOOP, Health, banking, delivery apps — read them into typed JSON on a schedule.
Check a customer’s flow on a real iPhone, reproduce bugs, verify push notifications.
If you can do it with your thumbs, an extension can do it on a schedule.
Your Mac is a Bluetooth mouse. PhonePilot watches the screen to aim, and only taps once it’s on target.
Settings
Find text to tap and wait for it to appear — fast, free, and without sending a pixel anywhere.
Capture, control and storage stay local. The server only listens on 127.0.0.1.
Every iPhone, every automation, every update — and it runs on the Claude subscription you already have.
$50/ month
Control as many iPhones as you want, for whatever you want.
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.
claude mcp add --transport http phonepilot http://127.0.0.1:7788/mcpHow 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.
$50 a month. No limits. Works with your Claude subscription.