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.

sunny.brews
morning ritual ☕️ the pour never gets old #latteart #coffee
♫original sound - sunny.brews

biscuit.the.golden
he heard the word beach 🐶🌊 #goldenretriever
♫original sound - biscuit.the.golden
Auralis Q40 Wireless Noise Cancelling Headphones, 40H Playtime, Bluetooth 5.3, Deep Bass
#1 Best Seller
-20%$7999
List Price: $99.99
prime FREE delivery Tomorrow, Oct 15
In Stock
Favorites
Privacy Report

maya.k
the way he runs 😭😭
3hReply
jonas_berlin
golden hour + golden retriever = perfect
2hReply
lily.travels
where is this beach??
1hReply
sam.codes
need this energy on mondays
48mReply

biscuit.the.golden
he heard the word beach 🐶🌊 #goldenretriever
♫original sound - biscuit.the.golden

nightmarket.eats
₩5,000 wok noodles at 1am hit different 🔥 #streetfood
♫original sound - nightmarket.eats

TRAVEL · LAKES
By Lena Hofer · Oct 12 · 6 min read
From Lago di Braies to the Königssee, these alpine lakes look unreal in person. We hiked, paddled and waited for sunrise at each one, so you know exactly when to go.
1. Lago di Braies, Italy
Arrive before 7 a.m. to have the emerald water to yourself. Rowboats open at 9, and the loop trail around the lake takes about an hour at an easy pace.
2. Königssee, Germany
Take the electric boat to St. Bartholomä and listen for the famous echo off the cliffs.
Auralis Q40 Wireless Noise Cancelling Headphones, 40H Playtime, Bluetooth 5.3, Deep Bass
#1 Best Seller
-20%$7999
List Price: $99.99
prime FREE delivery Tomorrow, Oct 15
In Stock
Review your order
Delivering to Alex
Torstraße 1, 10115 Berlin
Paying with Visa •••• 4242
Auralis Q40 Wireless HeadphonesArriving tomorrowType 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
An extension is a TypeScript file you write yourself, for whatever you need: run a TikTok farm, watch prices, test your app, pull data out of any app. If you can do it with your thumbs, an extension can do it on a schedule.
Write it by hand, or ask your agent to write it for you. Save the file and PhonePilot loads it. An extension can show 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 and 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 no pixel leaves your Mac.
Capture, control and storage stay local. The server only listens on 127.0.0.1.
Every automation and every update, running on the Claude subscription you already have. The only ceiling is hardware: about 5–7 iPhones per Mac.
$50/ month
Control your iPhones for whatever you want, about 5–7 per Mac.
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 caps from us. Works with your Claude subscription.