REMOTE DEBUG IOS APP ON DEVICE

Remote debug an iOS app on a real device — from any network

The app dials out to a hosted relay. No cable, no shared Wi-Fi, no Xcode on the machine you debug from — and your AI agent gets exactly the same access you do.

How far “remote” actually goes

The device is the one that connects. That single decision is what removes the cable, the shared network and the Mac.

Set it up: SDK → device online → agent running commands

Six steps, end to end. Steps 2 to 5 are the ones an AI agent can do for you — the console's guide hands it the whole task in one paste.

Connect your agent to the hosted MCP

Sign in, then point a remote-MCP client at the hosted endpoint. Authorization happens once in the browser: you confirm the account, the client and the workspace.

codex mcp add apptelepath --url https://apptelepath.com/mcp \
  --oauth-client-id https://apptelepath.com/oauth/clients/codex-cli.json
codex mcp login apptelepath

Any remote-MCP-capable client uses the same URL: https://apptelepath.com/mcp. There is no npm package and no local stdio server. No MCP client? Skip this step — the HTTP API in step 6 does everything the MCP tools do.

Add the SDK to the builds you debug

One pod, restricted to the configurations you actually debug. Name the non-App-Store configurations of your project here — they are not always called Debug.

# Podfile
pod 'AppTelepath', '~> 3.0', :configurations => ['Debug', 'Staging']
pod install

React Native Fabric hosts use pod 'AppTelepath/ReactNative', '~> 3.0' so Pressable can be activated. The legacy pod name Telepath installs the same binary; pick one. Either way the import stays import Telepath.

Turn on your own compile flag

Add the flag to every host target you listed above. Use it instead of DEBUG: TestFlight and Ad Hoc builds are Release-type configurations, and a #if DEBUG guard would silently keep the SDK out of exactly the builds you wanted to inspect.

// Build Settings · every host target you listed above
SWIFT_ACTIVE_COMPILATION_CONDITIONS = TELEPATH_ENABLED

Objective-C targets use GCC_PREPROCESSOR_DEFINITIONS = TELEPATH_ENABLED=1.

Start the SDK at launch

In application:didFinishLaunchingWithOptions:. No key in the source: the connection settings come from the build configuration.

// AppDelegate.swift
#if TELEPATH_ENABLED
import Telepath

Telepath.start() // configure once; works in normal runs and in authorized test builds
#endif

Point the build at the hosted relay

Only placeholders go into version control. The real values live in a gitignored local config or the secret store you already use — the agent writes them there for you after calling telepath_issue_device_token.

// Info.plist — committed placeholders only
TelepathAgentServerURL      $(TELEPATH_AGENT_URL)
TelepathAgentWorkspaceKey   $(TELEPATH_AGENT_KEY)
# CI or a temporary override
TELEPATH_AGENT_URL=wss://apptelepath.com/ws
TELEPATH_AGENT_KEY=<device-only credential>

For CI or a one-off run, inject them as environment variables instead. The credential is device-only: someone who extracts it from a build can impersonate a device, and cannot reach MCP, the HTTP API, the control plane or any other device. Never substitute an admin or ordinary workspace token, and never commit it. Working without an agent? Create a member workspace token in the console and use that as the key.

Run the app and verify

Launch the app on the device. It connects at launch and shows up in the workspace — in the console at apptelepath.com/app, and in your agent's device list.

# agent side
telepath_list_devices
telepath_screenshot
# any workspace member token
curl -s -H "Authorization: Bearer $TELEPATH_TOKEN" \
  https://apptelepath.com/api/devices
curl -s -H "Authorization: Bearer $TELEPATH_TOKEN" \
  https://apptelepath.com/api/screenshot -o shot.jpg

The HTTP calls take an ordinary member workspace token, not the device-only credential. Anything the MCP tools can do, POST /api/invoke can do too, so scripts and CI need no MCP client at all.

Prefer not to do this by hand? The console's integration guide copies the whole thing — pods, flag, launch entry, build settings, verification — as one task for your coding agent, which then reports back only once the device is actually online.

Watch one run before you install anything

The same commands, on sample data: screenshot, hierarchy, tap, network, diagnose.

See a session

What you get once the device is online

Every panel in the console and every agent tool is one command on the device. Same list for both.

screen.shot · ui.tree

Screen and UI tree

A screenshot of the live app, and a hierarchy that defaults to a summary — interactive elements and visible text, each with a stable ref — instead of ten thousand nodes.

ui.tap · ui.input · ui.swipe

Tap, type, swipe

Act by ref instead of guessing coordinates. Each action reports what changed on screen, plus the error logs and failed requests from that moment — usually no confirming screenshot needed.

net.list · net.detail · net.replay

Network

Captured requests with headers and bodies, paged for large payloads, exportable as HAR from the console. Replay a captured request through the app's own stack.

log.recent · log.subscribe

Logs

Recent lines with filters, or a live stream. The response says how many lines the on-device buffer dropped, so “no logs” and “logs lost” never look alike.

perf.snapshot · perf.subscribe

Performance

CPU, memory, FPS and thread count as a snapshot or a subscription — the same series the console charts.

sandbox.* · defaults.* · db.query

Files, UserDefaults, SQLite

Browse the sandbox, read files in chunks, read and edit defaults, run SQL against the app's databases. Write commands are gated by allowWrite.

crash.list · stuck.list · leak.list

Crashes, hangs, leaks

Crash reports with stacks, main-thread hangs, thread bursts, off-main UI calls, and leaks only when a retain cycle is proven. Detectors report whether they were armed, so an empty list is never read as “no problem”.

telepath_diagnose

Diagnose

One call answers “what just went wrong”: clustered error logs, failed requests, crashes and hangs from the last minute, ranked by severity, with a one-line headline.

recording.start · get

Record and replay

Record logs, network, performance and crashes — plus periodic screenshots — into a timeline you can filter, replay and export. Reproduce once, hand it to anyone.

simu.location · push · weaknet

Simulate conditions

Location, routes and location failures; push payloads including silent and tapped ones; network degradation with latency, bandwidth, failure rate, hangs and URL targeting.

registerCommand("myapp.foo")

Your own commands

Register an app-specific command once and it joins the capability list every agent sees. There is also a raw invoke escape hatch for anything in the protocol.

device.images

Stripped builds still readable

When a stack can't be symbolicated on device, the response says so and returns the image UUIDs and load addresses needed to resolve it — rather than a nearby symbol that looks like an answer.

Compared with the other ways to debug a device you aren't holding

Each of these is good at something. The differences that matter are how far the connection reaches, and how deep it sees.

Xcode wireless Safari Web Inspector Charles / Proxyman Appium / WebDriverAgent AppTelepath
Across the internet No — device and Mac on the same network No — device paired to a nearby Mac Only if you expose a proxy host the device can route to No — the driver host sits on the same network Yes — the app dials out to a hosted relay
USB cable Needed to pair the device the first time Needed for the initial trust and pairing No — but the device must trust a proxy certificate Needed to install and sign the driver app Never
Xcode or a Mac to look Required, on the same network Required — macOS Safari Not required; a proxy host is A macOS host is required to run the driver Only to build and install the app once. Debugging is a browser tab or an agent call
What it can see Everything a debugger sees — breakpoints, memory, Instruments Web view internals only: DOM, JS console, storage HTTP(S) traffic only The UI from the outside, plus device logs The app's runtime: screen, UI tree, logs, network, sandbox, UserDefaults, SQLite, performance, crashes and hangs
Driving the app No — you pause it, you don't tap it JavaScript inside the web view No — traffic can be rewritten, the UI can't be touched Yes — this is what it exists for Yes — tap, type and swipe by stable element reference
Callable by an AI agent No No No Through an Appium or mobile-mcp server you host Yes — hosted MCP, plus HTTP and SSE for everything else
What it asks of you Nothing added to the app Nothing added to the app A trusted proxy certificate on the device A signed driver app running alongside yours An SDK in non-App-Store builds — and iOS only for now

Questions people ask before setting this up

Do the device and my computer have to be on the same network?

No. The app opens an outbound WebSocket to wss://apptelepath.com/ws, and both the web console and the MCP endpoint reach it through that relay. A phone on cellular in another country behaves exactly like one on the desk beside you.

Do I need a Mac or Xcode to debug remotely?

You need Xcode once, to build and install a version of the app that contains the SDK. Debugging after that happens in a browser or through your agent, so the machine you debug from needs neither Xcode nor macOS.

Can I put this in an App Store build?

No. The SDK checks the distribution channel at runtime and refuses to start in an App Store build. TestFlight also refuses unless you opt in explicitly and accept that an embedded credential can be extracted from a build. Keep it in Debug, Staging, Ad Hoc and CI configurations.

Does it work on the simulator?

Yes. A simulator connects the same way a real device does and reports itself as a simulator, so an agent can tell the two apart. Everything on this page other than real-hardware conditions behaves identically.

What does it cost right now?

The hosted service and the iOS SDK are in free beta with no expiry date for now, running on Trial quotas: 2 devices online, 1 GB of traffic per month, 1 seat, 14 days of retention. Billing isn't switched on yet, so paid pricing isn't published.

What about Android, or React Native?

iOS is the only platform delivered today. There is an iOS host adapter for React Native Fabric so taps reach Pressable, but not a full React Native JS probe. Android is planned, not shipped.

Related

AppTelepath

What the platform is, and a live session you can page through.

iOS MCP server

The hosted MCP endpoint, its tools and how clients authorize.

Debug an iOS app with AI

What changes when the agent can see the running app itself.

Pricing

Free beta quotas today, and the plans that follow.

Put a device in front of your agent

Free beta, no credit card. Connect the MCP endpoint, let the agent do the integration, and watch the device come online.

Start free