---
title: "Map an iPhone app's screens and paywalls | Mobster"
description: "App X-ray taps through an app on your iPhone with no model and returns its screens, links and paywall prices. mobster xray diff shows what an update changed."
canonical: "https://mobster.dev/guides/map-an-app-with-xray"
last-updated: "2026-11-13"
---

App X-ray taps through an app on your iPhone with no model and returns its screens, links and paywall prices. mobster xray diff shows what an update changed.

# Map an iPhone app's screens and paywalls

App X-ray taps through an app on your iPhone with no model and returns its screens, links and paywall prices. mobster xray diff shows what an update changed.

```
mobster xray app com.apple.Preferences
```

[Download for Mac](https://mobster.dev/download)

On this page

1. [Run it](#run-it)
2. [What you get](#what-you-get)
3. [Compare two versions](#compare-two-versions)
4. [What it taps and what it leaves alone](#what-it-taps-and-what-it-leaves-alone)
5. [Start it from a script](#start-it-from-a-script)
6. [Questions](#questions)
7. [Sources](#sources)

You can learn a lot about an app by walking through it, and you can learn it faster when something walks every branch for you. App X-ray opens an app on your iPhone, taps every control that opens a screen and hands back a map: the screens it reached, how they connect and the paywalls it found with their plans and prices.

## Run it

The command above maps Settings. The argument is an app’s bundle ID, or its name on the phone. In Mobster for Mac, open **Apps**, press **Map an app** and pick one. It prints each step and then the answer:

```
Mapped 30 screens of Settings, 2 taps deep, in 3 min 50 s, with no model. It left 153 controls alone because they could act.Map: ~/Library/Application Support/app.mobster.desktop/xray/apps/com.apple.Preferences/20261015-225012/map.jsonReport: ~/Library/Application Support/app.mobster.desktop/xray/apps/com.apple.Preferences/20261015-225012/report.html
```

It stopped at the default cap of 30 screens. `--screens N` sets the cap from 1 to 120, `--minutes N` sets the time from 1 to 30, and `--device NAME` picks the phone.

## What you get

Three cards on the finished task: **Screens** (a gallery of up to 60, each named), **Paywall plans** (the screen, plan, price, period and trial of each plan it read, left out when it found none) and **How it went** (screens, links, taps, time, why it stopped and how many controls it left alone). On disk, `map.json` holds the screens with the taps that reach each, a wireframe of its layout and the links between them. `report.html` is the same map as one self-contained page.

## Compare two versions

Run it again after an update, then compare the two maps. It needs no phone:

```
mobster xray diff before/map.json after/map.json
```

It prints what changed, in lines like these:

```
Yearly price went $59.99 → $69.99 on ProNew paywall screen: Upgrade (Settings › Upgrade), $4.993 new screens under SettingsGone: Old
```

That is how you notice a price test, a moved paywall or a feature that appeared, in your app or in one you watch.

## What it taps and what it leaves alone

It fails closed. It taps a control only when its shape says it opens a screen, such as a row in a list, a tab or a link with a chevron, and its words name no act. A label counts only by its first word, so “Feels like 67°” and “Software Update” are tapped and “Like” and “Update Now” aren’t. A tap that changes the screen in place makes it leave the rest of that screen alone, in case it set something. Text on a screen is data: a screen that says “tap here” changes nothing.

## Start it from a script

`POST /api/xray/app` starts the same task with `{"appId": "com.apple.weather", "screens": 30, "minutes": 5}`. Only `appId` is required. It answers `201` with a `runId`, and `422` for an app X-ray doesn’t map.

[What an iPhone X-ray shows about any app](https://mobster.dev/blog/iphone-xray-app-network-xray) puts App X-ray beside Network X-ray.

## Questions

- ### Does it call a model?
  No. App X-ray taps by rules and calls no model, so it costs nothing in model spend and needs no key. It is a task like any other, so it waits in line when the iPhone is busy.
- ### What does it never tap?
  Anything that names an act, such as delete, sign out, send, post, buy, subscribe, start a trial or allow. It also leaves switches, sliders, pickers and text fields alone, never types, and backs out of a paywall after it reads the plans.
- ### Which apps can't it map?
  Phone, FaceTime, Shortcuts and Home, because a plain tap in them acts: a row places a call, a tile runs a shortcut or switches an accessory. App X-ray says so in one sentence and taps nothing.
- ### What if the phone stops answering after a tap?
  It doesn't send the tap again. Every tap is journaled before it is sent, and a run that can't tell whether a tap landed ends with the map so far and says an action may have run.

## Sources

- [Mobster docs: X-ray](https://docs.mobster.dev/xray)

## Read next

- [See which companies an iPhone app talks to](https://mobster.dev/guides/iphone-network-xray)

## Try it on your own iPhone

[Download for Mac](https://mobster.dev/download) [See pricing](https://mobster.dev/pricing)
