Let your coding agent use a phone.

Ask your agent to search Google, read the newest Play Store reviews or find a video, and it taps through the real apps while you watch. PhoneDock is a free Mac app for Claude Code, Codex, Cursor and Pi. When the agent reaches a Face ID prompt or a login, it stops and asks you to do that part.

Open source (Apache-2.0) · Apple silicon, macOS 15+ · No telemetry

Claude Code at 0:06

Recording 1 of 3, Google. The prompt: Search Google for the best noise cancelling headphones under $200, open the top review and tell me its best overall pick. Claude Code’s answer: RTINGS.com picks the JBL Live 780NC as best overall under $200, but the article shows no exact price, only a “See Price” button linking to Amazon.in.

Screen recordings from a real Android phone, at real speed with the waits trimmed. Claude Code made every tap through PhoneDock. The calls and answers are its own.

Watch Claude Code use a real phone

47 seconds, with sound, all real recordings. It flicks through X, comments on Instagram, tests a game on an iPhone and stops to ask you for a password.

Real apps on a real phone

These are screen recordings, trimmed for length. In each one, Claude Code got the prompt and did the rest through PhoneDock, with nobody touching the phone. The first three ran on a real Android phone, the last on a real iPhone, recorded at 60 fps. Under each one is a line from its answer.

  • Google search

    “Search Google for the best noise cancelling headphones under $200, open the top review and tell me its best overall pick.”

    Claude Code 9 PhoneDock calls

    “RTINGS.com picks the JBL Live 780NC as best overall under $200, but the article shows no exact price, only a ‘See Price’ button linking to Amazon.in.”

  • Play Store reviews

    “Open Duolingo in the Play Store, check its rating and downloads, and read me the newest one-star reviews.”

    Claude Code 20 PhoneDock calls

    “Duolingo is rated 4.6 stars (about 48.8 million reviews) with 500 million+ downloads.”

  • YouTube

    “Find a cold brew coffee video on YouTube, play a few seconds and tell me the title, channel and views.”

    Claude Code 21 PhoneDock calls

    “The Easiest Cold Brew Ever: 2 Ways — Joshua Weissman — 4.7M views (paused at 0:51, back on the results).”

  • Testing your own app

    “Test my Snackdoku app on my iPhone … screen by screen, like a QA tester.”

    Claude Code 19 PhoneDock calls

    “Tab bar overlap: the floating tab bar covers content at the bottom of Daily Bake and Bakery.”

More prompts to try

  • Read your phone’s settings.

    “Open Settings and tell me my battery health, storage left and iOS version.”

    The agent opens Settings and reads the numbers back to you.

  • Testing your app.

    “Build the app, open the new settings screen in light and dark mode, and attach screenshots to the PR.”

    Reproduce a bug with the logs, the crash report and the UI tree, and leave the evidence on the PR.

  • Big text and dark mode.

    “Open checkout at the largest text size in dark mode and tell me what gets cut off.”

    The agent sets dark mode, text size and contrast in one step on simulators and Android, and you can change them in the app.

  • Tests for CI.

    “Save what you just did as a test.”

    It becomes a YAML file that runs on every pull request.

PhoneDock runs on your Mac. Your agent sends it taps, swipes and text, and you watch each phone in a window, where you can pause the agent or take over at any point.

Agent driving. It reads the screen, taps things by their label, types, and checks that what it expected actually showed up.

Waiting for you. It reached a Face ID prompt and asked you to approve it.

You’re driving. Agents can’t touch the phone until you give it back.

How it works

Your agent connects over MCP, the CLI or an SDK. PhoneDock runs the devices and shows them live in the app.

PhoneDock

MCP server, CLI and SDKs
Local service on 127.0.0.1
Mac app with live view and takeover

Claude Code, Codex, Cursor and Pi connect to PhoneDock, which runs Android emulators, iOS simulators, Android phones and iPhones.
  1. get_ui

    Reads the screen as text. Every element gets its own line, like e12 Button "Settings" @(540,1210), so the agent doesn’t have to guess from a screenshot.

  2. tap text="Settings"

    Taps things by name. The same command works on any screen size, and the result says exactly what got tapped.

  3. wait_for "Display"

    Checks its own work. It waits for the screen it expected. If something else shows up, the agent is told what’s actually there.

At Face ID or a password, it stops and asks you.

Your agent won’t type your password or solve a CAPTCHA. It calls request_human, says what it needs, and waits for you.

  1. The agent asks.

    You get a request like “Approve the Face ID prompt, then tap Done.” It shows up above the phone in the app, and as a notification if you’re in another app.

  2. You take over.

    Click Take Over and the phone is yours. Agents are locked out while you have it.

  3. You hand it back.

    Click Done, with a note if you want, and the agent carries on from where it stopped. If you can’t do it, click Can’t Do It and the agent is told why.

The request shows up right above the phone, with Take Over, Can’t Do It and Done.

Emulators, simulators and real phones

Emulators, simulators, Android phones and iPhones sit side by side in one window. PhoneDock makes emulators and simulators from the system images on your Mac, and connects the phones on your desk.

The PhoneDock window. The sidebar lists an iPhone simulator, an Android emulator, an Android phone and a real iPhone. The middle shows the iPhone in a game, under a bar that says Claude Code is in control, with Take Over, and the Activity list on the right shows what Claude Code did.
The PhoneDock window, recorded while Claude Code tested a game on a real iPhone: your devices on the left, the phone in the middle with Take Over above it, and everything the agent did on the right.
  • Android emulator

    With Google APIs or the Play Store. Save snapshots and make clones.

  • iOS simulator

    Any iOS version you’ve installed in Xcode.

  • Android phone

    Over USB, or over Wi-Fi with the pairing code from Wireless debugging.

  • iPhone

    iOS 27 or later, over Wi-Fi or USB, with live video at up to 60 fps. Nothing to install on the phone.

phonedock setup connects Claude Code, Codex, Cursor and Pi for you. Anything else that speaks MCP, like Claude Desktop, Windsurf or VS Code, needs three lines of JSON. There’s also a CLI, plus TypeScript and Python SDKs.

Turn a finished task into a test for every PR

When the agent finishes a task, it can call save_flow. PhoneDock writes the steps into a short YAML file, and phonedock test replays it.

flows/greet.yaml

name: Greet Ada and turn on notifications
appId: dev.phonedock.sample
platform: android
steps:
  - launch: dev.phonedock.sample
  - assert_visible: PhoneDock Sample
  - fill: { field: Your name, value: Ada }
  - tap: Greet
  - wait_for: { visible: "Hello, Ada!" }
  - tap: { text: Notifications, type: Switch }
  - assert_visible: Notifications on
  • Taps are saved by their text, so they still work when the layout changes.
  • Typing into a field is one step.
  • Retries and dead ends are dropped.
  • It adds a check on the first and last screens.

Terminal

$ phonedock test flows/ --device Pixel --junit junit.xml
Greet Ada and turn on notifications
  PASS  launch dev.phonedock.sample        1.9s
  PASS  assert_visible PhoneDock Sample    0.4s
  PASS  fill Your name = Ada               5.8s
  PASS  tap Greet                          0.7s
  PASS  wait_for "Hello, Ada!"             0.3s
  PASS  tap Notifications                  0.8s
  PASS  assert_visible Notifications on    0.4s
1 passed · junit.xml written

Example output. Your timings will differ.

  • A failed step fails the build. It returns a non-zero exit code, so the check goes red.
  • Every failure comes with a screenshot. It also says what it expected and what was on screen, and saves the UI tree and recent logs.
  • JUnit and Maestro export. JUnit XML goes to your test report, and --maestro exports the flow if your team uses Maestro.

Install it, then connect your agents

Install the app and run phonedock setup. It finds the agents you have, connects PhoneDock to each one, installs the PhoneDock skill and puts phonedock on your PATH.

  1. Install.

    Download the latest release and drag PhoneDock into Applications. It’s signed and notarized.

  2. Connect your agents.

    /Applications/PhoneDock.app/Contents/Resources/bin/phonedock setup

    You can also use Connect an Agent… in the app. Add --dry-run to see what it would change, or --uninstall to undo it. It backs up any file before changing it, and leaves settings it didn’t write alone.

  3. Ask your agent.

    Use PhoneDock to create an iPhone simulator, open Settings and turn on Dark Mode.

    Start a fresh agent session so it picks up PhoneDock.

iPhone simulators need Xcode and Android emulators need the Android SDK. If something is missing, the app tells you and gives you the command that fixes it.

Privacy and limits

It runs on your Mac.

The service only listens on 127.0.0.1 and needs a token for every request. PhoneDock only goes online when you ask it to, for example to download a system image.

Your agent’s model still sees the screen.

Whatever the agent reads, screenshots and on-screen text included, goes to its model provider. Keep that in mind before you open anything private on the phone.

What it can’t do yet

  • Mac only: Apple silicon, macOS 15 or later.
  • iPhones on iOS 27 or later connect directly. Older iPhones (iOS 26 and earlier) work in beta, through WebDriverAgent on the phone.
  • Only one app can show an iPhone’s screen at a time, so close Xcode’s device window or iPhone Mirroring first. iOS doesn’t let PhoneDock switch dark mode, rotate the phone or read app logs.
  • Simulators need Xcode, and emulators need the Android SDK.
  • App Store apps don’t run in the iOS simulator. Use a real iPhone for those.

Questions

Is it free?

Yes. It’s open source under Apache-2.0. The download is signed and notarized, or you can build it yourself from the repo.

Which agents work with it?

phonedock setup handles Claude Code, Codex, Cursor and Pi. Any other MCP client can connect over stdio (phonedock mcp) or Streamable HTTP. If your agent doesn’t do MCP, it can use the CLI, and scripts can use the TypeScript or Python SDK.

Do I need a real phone?

No. PhoneDock can make Android emulators and iOS simulators for you. Connect a real phone when you need one.

What does a real iPhone need?

iOS 27 or later, paired with your Mac, with Developer Mode and UI Automation turned on. Nothing gets installed on the phone, and USB or Wi-Fi both work. iPhones on iOS 26 and older work in beta, through WebDriverAgent. The iPhone guide has the steps.

Can several agents share the devices?

Yes. Whoever is using a device holds a lease on it, and input from anyone else is refused until it’s released. A lease ends when the agent’s session ends, or after 10 idle minutes.

Does my screen leave my Mac?

PhoneDock doesn’t send anything anywhere. Your agent does send screenshots and screen text to its model provider, the same as with anything else it reads.

How is it different from other phone tools for agents?

Other tools can drive phones, and Maestro runs flows. PhoneDock also shows every device live in a Mac window, where you can take over at any time or answer the agent when it asks for help. Flows export to Maestro if you already use it.

Does it run on Linux, Windows or in the cloud?

Not right now. It’s a Mac app. In CI, use a macOS runner.

Give your agent a phone.

Free and open source, for Mac.