mobster itself runs, so it lists exactly what this version accepts. mobster <command> --help prints the same text in the terminal. The Errors and exit codes lists the exit codes.
Options must be spelled in full: --exec is not --execute. A command’s options can go before or after its name.
mobster
mobster with no command opens the terminal UI. These options belong to it (and to mobster tui).
Options
URL
default:"http://127.0.0.1:8100"
the phone’s address, for a phone you set up by hand (default: http://127.0.0.1:8100) [env: MOBSTER_WDA_URL]
NAME
default:"your iPhone"
the iPhone or simulator to use: an id, UDID or name from
mobster devices (default: your iPhone)PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win [env: MOBSTER_ENV_FILE]
flag
default:"off"
use a scripted phone and policy: no iPhone, no keys, no model calls
ID, optional
open a past task and put it back in the prompt (the latest without an ID)
flag
default:"off"
continue your last conversation
NAME
start with this app chosen (a name or bundle ID)
flag
default:"off"
don’t ring the terminal bell when Mobster needs you
flag
print the version and exit
mobster doctor
Check everything a task needs and print how to fix what is missing. Without --fix it changes nothing. Keys are shown masked: their first characters and last four.
--fix runs the guided steps for what is missing: mobster login for a model key and mobster setup for an iPhone that isn’t ready, then checks again.
Options
URL
default:"http://127.0.0.1:8100"
the phone’s address, for a phone you set up by hand (default: http://127.0.0.1:8100) [env: MOBSTER_WDA_URL]
NAME
default:"your iPhone"
the iPhone or simulator to use: an id, UDID or name from
mobster devices (default: your iPhone)PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win [env: MOBSTER_ENV_FILE]
flag
default:"off"
run the guided key and iPhone setup for what is missing, then check again
flag
default:"off"
print the checks as JSON
flag
default:"off"
skip the USB iPhone and Xcode checks (a simulator’s phone)
mobster devices
List every device Mobster can drive: USB iPhones (set up or newly plugged in), Mobster’s simulators, and phone addresses from MOBSTER_WDA_DEVICES. Each shows its state: Ready, In use, Connected, Needs setup or Unplugged. Name one with --device on run, screen, doctor, serve, mcp and the terminal UI. It changes nothing.
mobster devices lock-probe reads whether an iPhone is locked or showing a system sheet (Face ID, a locked app, the App Store’s side-button confirmation) the way a task’s check does, and lists what the lock screen shows. It taps and types nothing.
mobster devices status reads a device’s battery and thermal state, and whether this Mac is on battery. A value the device doesn’t report is left out. Without --device it reads the only device, else the first iPhone set up.
Arguments
lock-probe | status, optional
lock-probe: the lock state and system sheets; status: battery and heat. Neither taps anything
flag
default:"off"
print the devices (or the probe, or the status) as JSON
URL
default:"$MOBSTER_WDA_URL, else http://127.0.0.1:8100"
lock-probe, status: the phone’s address (default:
$MOBSTER_WDA_URL, else http://127.0.0.1:8100)NAME
lock-probe, status: the device to read, by id, UDID or name
mobster test
Run every check in .mobster/checks (or the paths given) on one or more devices, in parallel, with retries, flake detection, and JUnit and HTML reports with the frames. A check is a saved YAML file; mobster verify runs one without saving it.
Arguments
PATH, zero or more
check files or folders of them (default: .mobster/checks);
record makes a check from a task instead, and import maestro from Maestro flowsTYPE[@RUNTIME]
default:"each check's own, or .mobster/matrix.yaml"
repeatable
a simulator device type, with an optional runtime, such as “iPhone 17 Pro@iOS 26.4”; repeatable (default: each check’s own, or .mobster/matrix.yaml)
NAME
repeatable
a device from
mobster devices, or all: every iPhone ready on this Mac, side by side in one report; repeatable. On a real iPhone, checks drive only builds you installed, never App Store appsBUNDLE
repeatable
with
--device: your app’s bundle ID, installed from TestFlight, which checks may drive as your own build; repeatableFILE
a YAML file of simulators to run every check on (simulators only)
LANG[,LANG]
repeatable
run every check once in each language, such as de,ja,ar: the app launches in that language and region, and the screens are read for truncated text, untranslated strings and, in a right-to-left language, a layout that didn’t mirror
flag
default:"off"
with two or more devices: run each check once, on whichever device is free, instead of on every one (the report groups checks by device)
N
default:"1"
simulators running checks at once (default: 1); each iPhone runs one check at a time
N
default:"1, or 0 with --repeat"
attempts after a failure, from a fresh app (default: 1, or 0 with
--repeat)K
default:"1"
run each check K times and report its pass rate (flake hunting)
flag
default:"off"
a flaky check fails the run
FILE
default:".mobster/quarantine.yaml"
checks that run and are reported but never fail the run (default: .mobster/quarantine.yaml)
flag
default:"off"
quarantine for this run the checks whose last 20 results say flaky; without it Mobster only suggests them
TAG
repeatable
only checks with this tag; repeatable
a11y
repeatable
also audit what each check reads: a11y finds controls with no label, tap targets under 44 pt, images with no label and text clipped at a large text size; no model is called
warn | strict, optional
audit the screens each check reads for accessibility: warn (the default) reports findings and passes, strict fails on a new one; findings in .mobster/a11y-baseline.json never fail
flag
default:"off"
write this run’s accessibility findings to .mobster/a11y-baseline.json, so later runs fail only on new ones
I/N
run the I-th of N even shards, such as 2/4
flag
default:"off"
never call a model: checks with steps couldn’t run
flag
default:"off"
replay each check’s recorded path with no model, and heal a step that changed (the default)
flag
default:"off"
run every step with Smart and record the path again
flag
default:"off"
replay, and fail a check whose screen changed instead of healing it (strict CI)
FILE
also write the JUnit XML here
DIR
also write the HTML report (with each run’s report) here
flag
default:"off"
record each run’s screen, on a simulator or an iPhone, into the report
flag
default:"off"
print each check’s last 20 results (pass rate, duration trend, flake score) and run nothing
flag
default:"off"
print results.json on stdout instead of the summary
also upload the report, sealed, to your team’s hosted reports and print its link (Team plan: one of the team’s Macs, or MOBSTER_TEAM_KEY in CI)
how long a shared report is kept: 7, 30 or 90 (default: 30)
S
default:"5"
how long expectations may wait for the screen to settle (default: 5)
RUN_ID
the finished task to make a check from
TEXT
default:"the task"
the check’s name (default: the task)
PATH
default:"print it"
write the check here (default: print it); with import, the folder to write the checks to (default: .mobster/checks)
ID
the app’s bundle ID for flows with no appId, and over the appId of the others
PATH
write this .app (built for the iOS Simulator) into each check
flag
default:"off"
drop commands Mobster can’t run instead of turning each into a step marked TODO, and list each one; an assertion is never dropped
flag
default:"off"
say what would be written, and write nothing
flag
default:"off"
replace checks that already exist
flag
default:"off"
list the recipes, one line each
KEY=VALUE
repeatable
a recipe param; repeatable (
mobster test add --list shows each recipe’s)REF
default:"$GITHUB_BASE_REF, else origin/main"
the branch the PR merges into (default:
$GITHUB_BASE_REF, else origin/main)flag
default:"off"
don’t build the app: test the builds the checks name
NAME
default:"the only one"
the Xcode scheme to build (default: the only one)
PATH
default:"the one in the project"
the .xcodeproj or .xcworkspace to build (default: the one in the project)
run | write | off
default:"run"
checks for changed screens no check covers: write and run them (default), only write them, or neither. Drafts never fail the PR
flag
default:"off"
don’t make a GIF of each failed check
flag
default:"off"
leave the “Made with Mobster” line out of the PR comment
FILE
also write the PR comment’s Markdown here
check | comment | off
default:"check"
put the verdict on the pull request with Mobster Checks, the GitHub App: a check run (check, the default), the check run and one comment kept up to date (comment), or nothing (off)
HH:MM
with nightly on: the time to run every night, on a 24-hour clock, such as 02:00
flag
default:"all"
keep the healed steps of these checks (default: all)
flag
default:"off"
keep failing: put the recorded steps back and fail when they change again
PATH
default:"$MOBSTER_ENV_FILE"
load KEY=VALUE lines, such as OPENAI_API_KEY or ANTHROPIC_API_KEY for Smart steps; variables already set win; default:
$MOBSTER_ENV_FILEmobster mcp
Serve Mobster as an MCP server on stdio, so your coding agent can launch and check an iOS app on a simulator: it starts a check with verify_start, drives the app with screen, tap, type_text and swipe, and gets the verdict from verify_finish.
Options
PATH
default:"$MOBSTER_ENV_FILE"
load KEY=VALUE lines; OPENAI_API_KEY or ANTHROPIC_API_KEY turns on smart in verify_start; variables already set win; default:
$MOBSTER_ENV_FILEflag
default:"off"
never offer smart in verify_start, even with an OpenAI or Anthropic key: the coding agent drives
NAME
default:"iPhone 17 Pro"
the device for runs and phone tools that don’t name one: an id, UDID or name from
mobster devices, or a simulator device type (default: iPhone 17 Pro)NAME
repeatable
drive only this real iPhone (id, UDID or name), never another; repeatable. Without it every set-up device is allowed; simulators always are
BUNDLE
repeatable
let run_tests with pr drive this app’s TestFlight build on an
--allow-device iPhone as your own app; repeatableflag
default:"off"
offer the file tools (put_file, get_file, list_files, and send_media, which adds to Photos) when this build has them; off by default
flag
default:"off"
offer pull_media, which copies the newest photos and recordings from an iPhone’s camera roll to this Mac; off by default
NAME
default:"the newest installed"
the iOS runtime for runs that don’t name one, such as “iOS 26.4” (default: the newest installed)
DIR
default:"$MOBSTER_RUNS_DIR, else ./.mobster/runs"
where runs go (default:
$MOBSTER_RUNS_DIR, else ./.mobster/runs)FILE
also append the server’s log to FILE (it never holds keys or long typed text)
mobster mcp install
Add Mobster’s MCP server to your agents’ configs: Claude Code, Codex, Cursor, VS Code, Claude Desktop, opencode, Gemini CLI, Windsurf, Zed, Goose, Amp, Cline, oh-my-pi (omp) and the agents inside Xcode. It writes the absolute path of this mobster, because apps opened from the Dock don’t see your shell’s PATH. Claude Code and Codex are set up with their own mcp add commands; the rest by editing the file, keeping its comments and formatting, with a copy of the old file beside it (.mobster-backup). Running it again changes nothing. It never writes a key: Smart’s key stays in --env-file.
Arguments
CLIENT, zero or more
the clients to set up, by name (see
mobster mcp clients)flag
default:"off"
every client found on this Mac
DIR
write the project’s config in DIR (such as .cursor/mcp.json) instead of yours
NAME
repeatable
the server drives only this real iPhone; repeatable
BUNDLE
repeatable
run_tests with pr may drive this app’s TestFlight build on an allowed iPhone; repeatable
PATH
the server loads this file (OPENAI_API_KEY or ANTHROPIC_API_KEY for Smart); it must be readable by you only (chmod 600)
flag
default:"off"
also copy the mobster skill into each client’s skills folder
flag
default:"off"
also add Xcode’s own tools (xcrun mcpbridge, Xcode 26.3 or later) to Claude Code and Codex
flag
default:"off"
show what would change and write nothing
flag
default:"off"
take Mobster out of the clients’ configs instead
flag
default:"off"
print the result as JSON
mobster mcp clients
List the agent clients Mobster can set up, whether each is installed on this Mac, and whether its config runs Mobster’s server.
Options
DIR
look at the project’s configs in DIR
flag
default:"off"
print the list as JSON
mobster mcp doctor
Start Mobster’s MCP server the way an app opened from the Dock would (its absolute path, launchd’s PATH, the home folder), send initialize, list the tools and call status, with the time each step took. Then check that every client’s entry runs a mobster that exists.
Options
PATH
start the server with this env file, as install would
flag
default:"off"
print the report as JSON
mobster login
Save your Claude or OpenAI key for Mobster’s agent, on this Mac. Mobster tests the key with one tiny request first, then saves it in Mobster’s settings file, which only you can read. Mobster for Mac and every mobster command use it. The key is never shown: only its first characters and last four.
mobster login <plan or provider> saves a plan’s key or sign-in (Kimi Code, Grok …) or another provider’s key. A ChatGPT, Claude or Google plan runs through your own Codex, Claude Code or Gemini CLI, which signs in itself: mobster login codex says how.
mobster login status shows which keys, plans and providers are saved.
Arguments
status|PLAN|PROVIDER, optional
status: show what is saved, masked; a plan or provider: kimi, zai, grok, openrouter, xai, custom …; codex, claude or gemini: how that CLI signs in
anthropic | openai
anthropic (Claude, the default) or openai
flag
default:"off"
read the key from standard input (a pipe or a file, never a terminal)
flag
default:"off"
save it without testing it (no network)
flag
default:"off"
print the result as JSON
ID
a plan or provider: the model Mobster’s agent uses there
URL
custom, ollama or lmstudio: the endpoint’s base URL, such as http://127.0.0.1:11434/v1
mobster setup
Get your iPhone ready for Mobster: plug it in, trust this Mac, turn on Developer Mode and put Mobster’s helper on it. Each step ticks itself off as it happens. The same guided setup as Mobster for Mac’s.
Options
NAME
the iPhone to set up, when several are plugged in
ID
a paid Apple developer team ID to sign Mobster’s helper with
flag
default:"off"
print each change as a JSON line
mobster chat
Start or continue a conversation with Mobster’s agent on your iPhone. Follow-ups use what earlier tasks found; type while it works to steer it. Uses Mobster for Mac or mobster serve when one is open, so approvals show there too. With neither open, a message runs here in the terminal, and mobster chat alone opens the terminal UI.
Arguments
MESSAGE, zero or more
what to ask Mobster’s agent; leave it out for a conversation in this terminal
ID
default:"the one this terminal used last"
continue this conversation (default: the one this terminal used last)
flag
default:"off"
start a new conversation
NAME
default:"the conversation's"
the iPhone or simulator: an id, UDID or name (default: the conversation’s)
flag
default:"off"
print one JSON object when the task finishes or needs you; never answers an approval
flag
default:"off"
with
--json and the app or mobster serve running: wait while the task waits for you, until it ends or --wait runs outSECONDS
default:"300"
with the app or mobster serve running: how long to follow a task (default 300); it goes on after
URL
Mobster’s address (default:
$MOBSTER_URL, else the running Mac app’s, else http://127.0.0.1:8765)NAME
run a saved workflow (its name or id) instead of a message: in a new conversation, its own one, or
--thread IDBLANK=VALUE
repeatable
with
--workflow: a value for one of its blanks; repeat it for each--thread and --new can’t be used together.
mobster workflow
Print a saved workflow’s steps from Mobster for Mac or mobster serve, in the order they run: each one’s type, title and the steps it waits for. mobster chat --workflow runs one.
mobster workflow show
Print a saved workflow’s steps in the order they run: each one’s id, type, title and the steps it waits for, with a loop’s steps under it. It shows the published version unless you add --draft, and changes nothing.
Arguments
NAME
required
the workflow’s name or id
flag
default:"off"
the draft you’re editing, not the published version
flag
default:"off"
print the steps as JSON
URL
Mobster’s address (default:
$MOBSTER_URL, else the running Mac app’s, else http://127.0.0.1:8765)mobster run
Run one task on your iPhone and print each step. On a terminal each step prints as a line; piped, or with --json, every event prints as one JSON object per line, and the last is the result.
Mobster’s agent runs it on your Claude or OpenAI key. It asks before it sends, buys, posts or deletes: on a terminal you answer y or n; with --json or a pipe the answer is no, and the run ends as declined.
Long tasks (“scroll basketball Reels for 10 minutes and tell me what you learned”, “go through my unread emails”): Mobster prints a plan with its estimate and asks Start? [Y/n] on a terminal (--yes starts at once). It covers the budget in as little phone time as it can, hands the phone back, then prints the report as Markdown.
ctrl+c stops at the next safe point (twice to force).
Arguments
TASK
required
what to do, in plain words
URL
default:"http://127.0.0.1:8100"
the phone’s address, for a phone you set up by hand (default: http://127.0.0.1:8100) [env: MOBSTER_WDA_URL]
NAME
default:"your iPhone"
the iPhone or simulator to use: an id, UDID or name from
mobster devices (default: your iPhone)PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win [env: MOBSTER_ENV_FILE]
flag
default:"off"
act on the phone (a task needs it)
flag
default:"off"
a scripted phone and policy: no iPhone, no keys, no model calls
flag
default:"off"
print raw JSON events, even on a terminal
USD
stop before further model calls once this task has cost USD
flag
default:"off"
run it as a long task, with a plan first and a report at the end (most long tasks are found on their own)
VALUE
a long task’s budget: a time (10m, 90s, 1h), a number of items (30) or all
flag
default:"off"
start a long task without asking (its plan still prints)
--wda-url and --device can’t be used together.
mobster memory
List, add and delete the things Mobster remembers, in your words. Mobster’s agent reads the ones that fit each task. Everything stays on this Mac.
mobster memory list
List what Mobster remembers: pinned things first, then the newest.
Options
BUNDLE
only what Mobster remembers for this app (its bundle ID)
flag
default:"off"
print JSON
mobster memory add
Tell Mobster something to remember, in your words (up to 300 characters). Pinned things go with every task; the rest go with tasks that mention them. Mobster never remembers passwords, codes or card numbers.
Arguments
TEXT
required
what to remember
BUNDLE
only for tasks in this app (its bundle ID)
flag
default:"off"
send it with every task (up to 10 pinned)
flag
default:"off"
print JSON
mobster memory rm
Forget one thing, by the ID list shows.
Arguments
ID
required
the 12-character ID from
mobster memory listmobster memory pin
Pin one thing, so it goes with every task (up to 10 pinned).
Arguments
ID
required
the 12-character ID from
mobster memory listmobster memory unpin
Unpin one thing: it goes only with tasks that mention it.
Arguments
ID
required
the 12-character ID from
mobster memory listmobster memory clear
Delete everything Mobster remembers, and its suggestions. Asks you to type “delete everything” first, unless you add --yes.
Options
flag
default:"off"
don’t ask
mobster memory export
Print everything Mobster remembers as Markdown, or save it with --output.
Options
FILE
save it to this file instead
mobster history
List the tasks you ran in this terminal, newest first. Open one with mobster --resume ID, or save one as a GIF with mobster export ID --gif. The history holds task text and screen text: keep it private.
Options
flag
default:"off"
print one JSON object per task
N
default:"20"
show N tasks (default: 20)
mobster export
Save a finished task as a captioned GIF, one screen per step with what Mobster did, ready to post: under X’s 15 MB limit, on the Paper or Night ground. --mp4 saves an MP4 too (it needs ffmpeg). The file goes to ~/Downloads and never replaces one there. It shows every screen of the task, so check it before you post it: --redact blurs text fields and messages and leaves the answer out. Nothing is uploaded.
Arguments
ID
required
a task’s ID from
mobster history (its first characters do), or latestflag
default:"off"
save a GIF
flag
default:"off"
save an MP4 (needs ffmpeg)
flag
default:"off"
blur text fields and messages, and leave out the answer
paper | night
default:"paper"
the ground: paper (light, the default) or night (dark)
PATH
default:"~/Downloads"
a file or folder to save to (default: ~/Downloads)
flag
default:"off"
print where it saved as JSON
mobster screen
Print your iPhone’s current screen. kitty, Ghostty, iTerm2 and WezTerm show the real image; other terminals get a half-block drawing. Nothing is tapped.
Options
URL
default:"http://127.0.0.1:8100"
the phone’s address, for a phone you set up by hand (default: http://127.0.0.1:8100) [env: MOBSTER_WDA_URL]
NAME
default:"your iPhone"
the iPhone or simulator to use: an id, UDID or name from
mobster devices (default: your iPhone)FILE
save the PNG to FILE instead of printing it
COLUMNS
draw it this many columns wide
mobster xray
X-ray an app on your iPhone. app maps an app with App X-ray: Mobster taps through every control that opens a screen and writes a map of the screens, how they connect and the paywalls it found, with no model and no tap on anything that could act. network records the phone’s traffic with Network X-ray and says which domains and companies each app talked to, reading hostnames, sizes and times only. diff compares two maps to see what an update changed. Everything stays on this Mac.
mobster xray app
Map an app on your iPhone: Mobster taps through every control that opens a screen, within the limits you set, and writes the map (map.json), a report (report.html) and a thumbnail of each screen to a folder on this Mac. It reads paywalls and taps nothing on them. It never taps a control that could act (delete, send, buy, a switch, a field), never types, and calls no model, so it needs no key. It runs like any task: your plan, the phone’s queue and Stop apply.
Arguments
APP
required
the app’s bundle ID, or its name on the phone
NAME
the iPhone to use (an id, UDID or name from
mobster devices)N
default:"30"
stop after this many screens, 1 to 120 (default 30)
N
default:"5"
stop after this many minutes, 1 to 30 (default 5)
flag
default:"off"
print each event as one JSON line; the last is the result
mobster xray network
Record an iPhone’s network traffic for a while and say who each app talked to: the domains, the companies behind them, and which do ads, analytics or attribution. Mobster reads hostnames, sizes and times. It decrypts nothing and keeps no page, no URL path and no address. The capture file is deleted after the analysis unless you pass --keep-capture.
Options
NAME
default:"the one connected"
the iPhone: an id, UDID or name from
mobster devices (default: the one connected)N
default:"60"
how long to record, 5 to 3600 (default 60)
flag
default:"off"
record over Wi-Fi even with the cable in (refused unless the link is encrypted)
NAME
report only this app, by its name on the iPhone
flag
default:"off"
keep the .pcapng beside the report (readable only by you)
flag
default:"off"
print one JSON object
FILE.pcapng
read a capture you already have, with no iPhone
mobster xray diff
Compare two maps mobster xray app wrote: the screens added, removed and changed, and the paywall prices that moved. Each argument is a map.json file or the folder that holds it. It reads two files on this Mac and needs no phone and no plan.
Arguments
BEFORE
required
the older map: a map.json file or its folder
AFTER
required
the newer map: a map.json file or its folder
flag
default:"off"
print the comparison as JSON
mobster verify
Check an iOS app on a headless simulator that Mobster manages. Mobster installs and launches the app, runs the steps (Smart, on your OpenAI or Anthropic key) or none (a launch-only check), and decides the verdict from your expectations on the accessibility tree, never from a model. Each run writes a report with the frames that prove it.
A check is a saved YAML file. verify is the one-off form of mobster test: it runs one check, from flags or --check FILE, and --save NAME keeps it for mobster test.
Arguments
STEP, zero or more
one step of the flow in plain English; none means a launch-only check
FILE
run a saved check (.yaml or .json); not combined with steps or expectations
PATH
the .app built for the iOS Simulator; it is installed before the run
ID
default:"read from --app"
the app’s bundle ID (default: read from
--app)NAME
default:"iPhone 17 Pro, else the newest iPhone"
a device from
mobster devices (its id, UDID or name), or the simulator device type (default: iPhone 17 Pro, else the newest iPhone)NAME
default:"the newest installed"
the iOS runtime, such as “iOS 26.4” (default: the newest installed)
none | data | reinstall
none, data or reinstall (default: reinstall with
--app, else data; com.apple.* apps are never reset)ARG
repeatable
a launch argument; repeatable (write
--launch-arg=-Flag for one that starts with -)KEY=VALUE
repeatable
a launch environment variable; repeatable
URL
a deep link opened after launch
TEXT
repeatable
expect TEXT on screen; repeatable
TEXT
repeatable
expect TEXT not on screen; repeatable
SEL
repeatable
expect an element on screen: key=value[,key=value] with keys id, label, value, role, enabled and selected; repeatable
SEL
repeatable
expect no element to match SEL; repeatable
JSON
repeatable
any expectation as JSON, such as ’{“count”: {“id”: ”/^plan_/”}, “equals”: 3}’; repeatable
TEXT
default:"the first step, or \"Launch check\""
the check’s name in reports (default: the first step, or “Launch check”)
flag
default:"off"
never call a model; a check with steps then can’t run
USD
default:"0.25, at most 1.00"
Smart’s spend cap for the run (default: 0.25, at most 1.00)
S
default:"180, at most 600"
Smart’s time limit for the flow (default: 180, at most 600)
S
default:"5"
how long expectations may wait for the screen to settle (default: 5)
DIR
default:"./.mobster/runs"
where runs go (default: ./.mobster/runs)
NAME
also save the check as .mobster/checks/NAME.yaml (a-z, 0-9 and -)
flag
default:"off"
print the result as JSON (the default when stdout isn’t a terminal)
PATH
default:"$MOBSTER_ENV_FILE"
load KEY=VALUE lines, such as OPENAI_API_KEY or ANTHROPIC_API_KEY for Smart; variables already set win; default:
$MOBSTER_ENV_FILEmobster sim
Manage the headless simulators that mobster verify and mobster mcp run on: list them, prepare one (create, boot, build and start WebDriverAgent), shut them down, erase or delete them. It deletes only simulators Mobster created.
mobster sim list
List the simulators Mobster created, with their state and WebDriverAgent address.
Options
flag
default:"off"
print JSON instead of a table
mobster sim prepare
Create the simulator if needed, boot it headless, build WebDriverAgent the first time, start it on 127.0.0.1, and print how long each phase took. It stays up afterwards.
Options
NAME
the simulator device type (default: iPhone 17 Pro, else the newest iPhone the runtime supports)
NAME
default:"the newest installed"
the iOS runtime, such as “iOS 26.4” (default: the newest installed)
flag
default:"off"
print the simulator and the phase times as JSON
mobster sim biometric
Read or change biometric enrollment, or send a Face ID or Touch ID test event to an idle, booted Mobster simulator. Real devices are never supported. A sent event does not confirm that the app authenticated.
Arguments
UDID
required
the booted Mobster simulator
status | enroll | unenroll | match | nonmatch
required
read enrollment, enable or disable it, or send a match or nonmatch event
face-id | touch-id
default:"face-id"
the biometric event type (default: face-id; enrollment is shared)
flag
default:"off"
print enrollment and event delivery as JSON
mobster sim shutdown
Stop WebDriverAgent and shut down every Mobster simulator that isn’t running a check, or the one named.
Arguments
UDID, optional
only this simulator
mobster sim erase
Shut down and erase one Mobster simulator: its apps and data go, and the next run boots it fresh.
Arguments
UDID
required
the simulator to erase
mobster sim delete
Shut down and delete Mobster’s simulators. Only UDIDs in Mobster’s registry whose names start with “Mobster · ” are deleted; any other UDID is refused.
Arguments
UDID, optional
the simulator to delete
flag
default:"off"
delete every Mobster simulator
UDID and --all can’t be used together; one is required.
mobster sim prune
Delete Mobster simulators unused for 14 days, WebDriverAgent builds for Xcode versions no longer installed, and registry entries for simulators that are gone.
Options
flag
default:"off"
print what was removed as JSON
mobster sim doctor
Check Xcode, the iOS runtime, the device type, git, disk space, WebDriverAgent, Mobster’s simulators, ports, and your OpenAI or Anthropic key for Smart, and print the fix for each problem. It never runs sudo and never downloads a runtime.
Options
flag
default:"off"
prepare the simulator: create, boot and build WebDriverAgent once
flag
default:"off"
print {“ok”, “checks”: [{“key”, “label”, “state”, “detail”, “fix”}]}
mobster ci
Run your app’s checks on every pull request or merge request, with a Mac of yours as the GitHub Actions or GitLab CI runner: its simulators, and the iPhones plugged into it. One comment on the PR keeps the verdict, the repro steps, frames, GIFs and videos.
mobster ci init
Write the workflow that runs mobster ci run on every pull request or merge request, on a Mac of yours as a self-hosted runner.
Options
github | gitlab
default:"from the origin remote"
where the repository lives (default: from the origin remote)
NAME
also test on this iPhone, plugged into the runner (the runner must list it in MOBSTER_RUNNER_DEVICES)
BUNDLE
repeatable
with
--device: your app’s TestFlight build on the phone; repeatableflag
default:"off"
replace the workflow file if it exists
flag
default:"off"
print the workflow instead of writing it
mobster ci doctor
Check this Mac as a CI runner: Xcode, a simulator runtime, Mobster for Mac and its plan, system sleep, automatic login, the runner service, free disk and the phones the runner allows. Reads only.
Options
flag
default:"off"
print the rows as JSON
mobster ci run
Run mobster test pr for the pull request or merge request this CI job builds, with a screen recording of each simulator run. The suite’s report, JUnit file, frames, GIFs and videos go to .mobster/ci for the job’s artifacts. Works the same in a terminal.
Arguments
TEST_FLAG, zero or more
more
mobster test pr flags, after a —: mobster ci run — --retries 2REF
default:"the job's target branch, else origin/main"
the branch the PR merges into (default: the job’s target branch, else origin/main)
TYPE[@RUNTIME]
default:"each check's own"
repeatable
a simulator device type to run on; repeatable (default: each check’s own)
NAME
an iPhone plugged into this Mac; in a CI job the runner must list it in MOBSTER_RUNNER_DEVICES
BUNDLE
repeatable
with
--device: your app’s TestFlight build on the phone; repeatableflag
default:"off"
don’t record the simulator’s screen
mobster ci comment
Post the verdict in .mobster/ci as one comment on the pull request (GITHUB_TOKEN) or merge request (MOBSTER_GITLAB_TOKEN), updated in place on every push: each failure’s repro steps, frame, GIF, video and the command that runs it again. Never fails the job.
Options
URL
default:"$MOBSTER_ARTIFACT_URL, else the job's page"
the uploaded report’s link (default:
$MOBSTER_ARTIFACT_URL, else the job’s page)flag
default:"off"
print the comment and post nothing
mobster expo
Open your Expo app on a simulator or your iPhone from the JavaScript Metro serves, in your dev client or Expo Go, and check a screen. Build it for checks and CI: Release for the simulator, with the JavaScript inside, or your dev client on your iPhone.
mobster expo doctor
Read package.json and the Expo config, and say what Mobster found: the app’s name, bundle ID and schemes, whether it opens in your dev client or Expo Go, whether the ios folder exists, and whether Metro is running. Reads only.
Options
N
default:"8081"
Metro’s port (default: 8081)
flag
default:"off"
print it as JSON
mobster expo preview
Open your app on a simulator or your iPhone from the JavaScript Metro serves from your working tree: in your dev client when the app has expo-dev-client, else in Expo Go. Starts Metro in the background when nothing answers on the port. With --expect, waits for the text and says whether it’s on screen, with a screenshot.
Options
NAME
default:"your iPhone, else the only device"
a device from
mobster devices (default: your iPhone, else the only device)N
default:"8081"
Metro’s port (default: 8081)
PATH
then open this screen by the app’s own deep link, such as settings/profile
TEXT
repeatable
text that must be on screen once the app loads; repeatable
S
default:"45"
how long
--expect waits for the bundle to load (default: 45)flag
default:"off"
don’t start Metro; fail when it isn’t running
FILE
default:"with --expect: .mobster/expo/preview.png"
save the screen here (default with
--expect: .mobster/expo/preview.png)flag
default:"off"
print the result as JSON
mobster expo dev
Start this project’s Metro (or reuse it), install your dev client on the device when it isn’t there, open the app, and reload it each time you save a source file. When Metro can’t bundle the app, it says so with Metro’s error and keeps watching: the next save tries again. ctrl+c stops the Metro this command started. --check runs saved checks on the device once the app is up.
Options
NAME
default:"your iPhone, else the only device"
a device from
mobster devices (default: your iPhone, else the only device)N
default:"8081, else the next free one"
Metro’s port (default: 8081, else the next free one)
PATH
repeatable
a check file or folder to run on the device once the app is up; repeatable
flag
default:"off"
don’t build and install the dev client when it is missing
flag
default:"off"
open the app, run the checks, and stop; no watching
flag
default:"off"
print one JSON line per event
mobster expo reload
Send Metro’s reload to every app connected to it, as pressing r in npx expo start does.
Options
N
default:"8081"
Metro’s port (default: 8081)
mobster expo build
Build the app. For a simulator: a Release build into .mobster/build with the JavaScript inside, so it runs with no Metro (what checks and CI use), after npx expo prebuild when there’s no ios folder. For an iPhone: your dev client, signed with your team and installed by npx expo run:ios --device. --eas builds an EAS profile on this Mac with eas build --local.
Options
NAME
build for this device: an iPhone (installs your dev client) or a Mobster simulator
flag
default:"off"
install the build on
--deviceflag
default:"off"
a Debug build that loads its JavaScript from Metro (the dev client), not Release
PROFILE
build this EAS profile on this Mac (eas build
--local)flag
default:"off"
print the build as JSON
mobster expo stop
Stop the Metro server mobster expo preview started in the background for this project.
mobster asc
Use your own App Store Connect API key, kept in your Keychain, to list builds and read your testers’ TestFlight feedback and crashes, and make App Store screenshots from your checks in every size and language. Read-only: Mobster submits nothing to Apple.
mobster asc key
Keep your App Store Connect API key in your login Keychain, readable only by Mobster’s own programs. Make one in App Store Connect › Users and Access › Integrations. A CI job can pass MOBSTER_ASC_KEY_ID, MOBSTER_ASC_ISSUER_ID and MOBSTER_ASC_KEY_PATH instead.
Arguments
add | show | remove
required
add, show or remove
ID
with add: the key’s Key ID
UUID
with add: the Issuer ID (a team key; none for an individual key)
FILE
with add: the AuthKey_<Key ID>.p8 file Apple gave you
mobster asc apps
List the apps your key can see.
Options
flag
default:"off"
print JSON
mobster asc builds
List an app’s builds and their TestFlight state, newest first.
Options
BUNDLE
required
the app’s bundle ID
N
default:"10"
how many (default: 10)
flag
default:"off"
print JSON
mobster asc feedback
List the screenshot feedback and crash reports your testers sent from TestFlight, newest first. --save downloads each crash log and screenshot.
Options
BUNDLE
required
the app’s bundle ID
flag
default:"off"
only crashes
flag
default:"off"
only screenshot feedback
N
default:"20"
how many (default: 20)
DIR
download the crash logs and screenshots here
flag
default:"off"
print JSON
mobster asc screenshots
Run each check on a simulator of each App Store display size, in each language, with the status bar at 9:41, and save its last screen as a full-resolution PNG in the folders fastlane deliver reads. Uploads nothing.
Arguments
PATH, zero or more
check files or folders (default: the checks tagged screenshot, else every check)
6.9 | 6.5 | 6.3 | 13
default:"6.9, and 13 for an iPad app"
repeatable
a display size; repeatable (default: 6.9, and 13 for an iPad app)
CODE
default:"every language the app has"
repeatable
an App Store locale such as de-DE; repeatable (default: every language the app has)
DIR
default:"fastlane/screenshots"
where the PNGs go (default: fastlane/screenshots)
flag
default:"off"
print screenshots.json
PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win [env: MOBSTER_ENV_FILE]
mobster testflight
List your app’s TestFlight builds, pick one and install it on your iPhone through the TestFlight app, with an App Store Connect API key kept per project in your Keychain. The build and version go on the next mobster test report. Read-only: Mobster submits nothing to Apple.
mobster testflight key
Keep an App Store Connect API key for this project in your login Keychain, readable only by Mobster’s own programs, and never printed. Make one in App Store Connect › Users and Access › Integrations. The key is this project’s: a folder with .mobster/ above the current one, or the current folder. --shared keeps it for every project instead.
Arguments
add | show | remove
required
add, show or remove
ID
with add: the key’s Key ID
UUID
with add: the Issuer ID (a team key; none for an individual key)
FILE
with add: the AuthKey_<Key ID>.p8 file Apple gave you
the key every project uses, not this project’s
mobster testflight list
List the app’s builds and whether TestFlight can install each, newest first.
Options
BUNDLE
required
the app’s bundle ID
N
default:"10"
how many (default: 10)
flag
default:"off"
print JSON
mobster testflight install
Install the newest installable build, or the one --build names, on your iPhone: Mobster opens the app’s page in TestFlight and taps Install or Update, then waits for Open. You must be a tester of the app. Mobster never accepts TestFlight’s terms for you, never picks from Previous Builds (it prints the taps instead), and after a tap it can’t confirm it never taps again.
Options
BUNDLE
required
the app’s bundle ID
N
default:"the newest installable"
the build number (default: the newest installable)
V
the version the build belongs to, such as 1.4.2
NAME
default:"your iPhone"
the iPhone (default: your iPhone)
SECONDS
default:"600"
how long to wait for TestFlight (default: 600)
flag
default:"off"
print JSON
mobster xcode
Add a post-action to your Xcode scheme: after each simulator build, Mobster runs the checks of the app you built, on that build, in the background, and the verdict comes as a notification.
mobster xcode hook
Add Mobster’s post-action to a shared scheme’s build: after each simulator build, the checks of the app Xcode built run in the background on that build, and the verdict comes as a notification.
Options
NAME
default:"the only one, or the one named like the project"
the shared scheme (default: the only one, or the one named like the project)
PATH
default:"the one here"
the .xcodeproj or .xcworkspace (default: the one here)
TYPE[@RUNTIME]
default:"each check's own"
repeatable
run the checks on this simulator; repeatable (default: each check’s own)
TAG
repeatable
only the checks with this tag, such as smoke; repeatable
mobster xcode unhook
Take Mobster’s post-action out of the scheme. Nothing else in it changes.
Options
NAME
default:"the only one, or the one named like the project"
the shared scheme (default: the only one, or the one named like the project)
PATH
default:"the one here"
the .xcodeproj or .xcworkspace (default: the one here)
mobster xcode after-build
Run the checks whose app is the one Xcode just built, on that build. It reads BUILT_PRODUCTS_DIR, FULL_PRODUCT_NAME, PLATFORM_NAME and SRCROOT from Xcode. A build for a device is left alone.
Options
flag
default:"off"
return at once and run in the background, stopping an older build’s run
TYPE[@RUNTIME]
repeatable
a simulator to run on; repeatable
TAG
repeatable
only the checks with this tag; repeatable
mobster fixtures
List the app states your checks start from (.mobster/fixtures/: a reset, launch args, seed files, the keychain, the pasteboard, sign-in steps) and put a simulator’s app in one now.
mobster fixtures list
List the fixtures in .mobster/fixtures/, flattened with what they extend: the reset, the launch args and env, the seed files, the keychain, the pasteboard and the steps. Reads files only.
Options
flag
default:"off"
print them as JSON
DIR
default:"the one you are in"
the project folder (default: the one you are in)
mobster fixtures apply
Reset the app on a simulator and seed it as the fixtures say: the keychain, the files in its data container and the pasteboard. Several names compose in order. The app is not launched.
Arguments
NAME, one or more
required
fixtures to apply, in order
ID
required
the app’s bundle ID
PATH
a built .app to install first (needed for a reinstall)
TYPE
default:"Mobster's own"
a simulator, such as “iPhone 17 Pro” (default: Mobster’s own)
NAME
an iPhone: refused when the fixtures change its state
DIR
default:"the one you are in"
the project folder (default: the one you are in)
mobster links
List the deep links your project has, from .mobster/links.yaml, the Expo config, the Xcode project and links a check opened, and open each on a simulator to see which screen it lands on. A step can then say “open cart” instead of the address.
mobster links list
List the project’s deep links: the ones in .mobster/links.yaml, the Expo config’s scheme and associated domains, the Xcode project’s URL types and associated domains, and links a check opened successfully. Dynamic Expo config runs npx expo config.
Options
flag
default:"off"
print them as JSON
DIR
default:"the one you are in"
the project folder (default: the one you are in)
mobster links check
Open each link on a simulator, in the app, and say what screen it landed on: passed when the screen shows the link’s title, failed with a screenshot when it doesn’t. Name links to check some; with none, every link is checked.
Arguments
NAME, zero or more
links to check, by name or address (default: all)
TYPE
repeatable
a simulator, such as “iPhone 17 Pro”; repeatable
NAME
repeatable
an iPhone from
mobster devices; repeatableID
default:"read from the project"
the app’s bundle ID (default: read from the project)
PATH
default:"the app already on the simulator"
a built .app to install (default: the app already on the simulator)
flag
default:"off"
print results.json’s document
DIR
default:"the one you are in"
the project folder (default: the one you are in)
mobster serve
Start the loopback HTTP API (127.0.0.1 only) that Mobster for Mac launches as its sidecar. Every request needs the launch’s API token. Scripting with it: https://docs.mobster.dev/scripting
Options
PORT
default:"8765"
port on 127.0.0.1 (default: 8765; 0 picks a free one)
URL
the WebDriverAgent to drive (default: none, or http://127.0.0.1:8100 with
--manage-device); a simulator’s runner listens on its own portNAME
default:"the only device, else the one last used"
the device a task that names none runs on: an id, UDID or name from
mobster devices (default: the only device, else the one last used)flag
default:"off"
own the USB iPhone setup: build, run and supervise Mobster’s helper (the Mac app does this)
PATH
where the managed device keeps its files
flag
default:"off"
shut down when the launching process exits (the Mac app’s safety net)
flag
default:"off"
leave the iPhone runner running on exit, for development reloads; the next server adopts it
PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win
ID
preferred WDA session; the one WDA is serving always wins
flag
default:"off"
allow tasks to act on the phone
USD
stop a run before further model calls once its observed inference spend reaches USD
PATH
the private task journal (never automatically replays interrupted tasks); default: .state/ beside the source in a checkout, else <data dir>/state/
mobster api
Serve every app Mobster has an app pack for as an API on this Mac: GET /v1/<app>/<thing> reads that app on your iPhone into rows (JSON or CSV), and GET /v1/openapi.json describes every endpoint. Each one is also an MCP tool in mobster mcp. Every endpoint only reads, and each client calls it with its own token.
mobster api serve
Serve every app Mobster has an app pack for as GET /v1/<app>/<thing> on 127.0.0.1. Each request needs a token from mobster api tokens create. Every endpoint only reads.
Options
PORT
default:"8780"
port on 127.0.0.1 (default: 8780; 0 picks a free one)
NAME
the iPhone a read uses when it names none: an id, UDID or name from
mobster devicesNAME
repeatable
read only this real iPhone, never another; repeatable
mobster api tokens
Make one token for each client you let call the App API, list them, and revoke one. Mobster keeps each token’s hash, never the token.
mobster api tokens create
Make a token for one client, such as a script or n8n, and print it once. Mobster can’t show it again.
Arguments
NAME
required
the client’s name, 1 to 40 characters
mobster api tokens list
List the tokens, never the tokens themselves.
Options
flag
default:"off"
print JSON
mobster api tokens revoke
Revoke a token: the next request with it is refused.
Arguments
ID|NAME
required
the token’s id or name from
mobster api tokens listmobster phone
Phone utilities that aren’t tasks: put text on the phone’s clipboard (or print what it holds), and install a signed .app or .ipa on a USB iPhone or a Mobster simulator.
mobster phone clipboard
Set the phone’s clipboard from the Mac, or print what it holds.
mobster phone clipboard set
Put text on the phone’s clipboard: TEXT, a file’s text with --file, or standard input with -. At most 64 KB.
Arguments
TEXT, optional
the text, or - for standard input
FILE
put this UTF-8 file’s text on the clipboard
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone clipboard get
Print the phone’s clipboard. WebDriverAgent’s runner comes to the front for a moment to read it (iOS lets only the front app read the clipboard). Only the CLI reads it: no MCP tool does, because it may hold a password.
Options
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone file
Copy files between this Mac and the Documents folder of an iPhone app that shares files (the folder Files shows under On My iPhone). Over the cable only. Nothing else on the phone is reachable, the camera roll included.
mobster phone file put
Copy a file (up to 100 MB) into an app’s folder on the iPhone. A file with the same name is kept: the copy gets a new name (menu 2.pdf) unless you pass --replace.
Arguments
PATH
required
the file on this Mac
BUNDLE
required
the app’s bundle ID, such as com.apple.Pages (
mobster phone file ls lists them)NAME
default:"its own"
the name it gets on the iPhone (default: its own)
flag
default:"off"
overwrite a file with the same name
flag
default:"off"
the app’s own Documents folder, for a development build of yours that doesn’t share files
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone file get
Copy a file from an app’s folder on the iPhone to this Mac.
Arguments
NAME
required
the file’s name in the app’s folder
BUNDLE
required
the app’s bundle ID
PATH
default:"the current folder"
where to save it: a folder, or a file name (default: the current folder)
flag
default:"off"
the app’s own Documents folder, for a development build of yours
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone file ls
Without --app, list the iPhone’s apps whose folders show in Files. With --app, list the files in that app’s folder.
Options
BUNDLE
the app’s bundle ID
flag
default:"off"
the app’s own Documents folder, for a development build of yours
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone photos
Add a photo or video from this Mac to the iPhone’s Photos library (Mobster’s runner saves it; the first time, iOS asks on the iPhone), or copy the newest photos, screenshots and screen recordings from its camera roll to this Mac (over the cable).
mobster phone photos add
Add JPEGs, HEICs, PNGs, GIFs, WebPs, MOVs or MP4s (up to 4 GB each, 50 at a time) to the iPhone’s Photos library, into the album Mobster unless you name another. Each one is checked by SHA-256 on the iPhone, and the library’s count is read before and after.
Arguments
PATH, one or more
required
the photos or videos on this Mac
NAME
default:"Mobster"
the album they go into, made if it isn’t there (default Mobster);
--album ” for noneauto | cable | wifi | airdrop | mirroring | icloud
default:"auto"
auto (default), cable, wifi, airdrop, mirroring or icloud
PROFILE
send to this profile’s iPhone (Settings › Profiles)
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone photos pull
Copy the newest photos, screenshots and screen recordings from the iPhone, newest first, each checked by SHA-256 or size. Over the cable by default; --via wifi reads them through Mobster’s runner, --via tunnel through Apple’s own tunnel (needs pymobiledevice3), --via icloud from this Mac’s Photos library.
Options
N
default:"1"
how many, 1 to 20 (default 1)
WHEN
only newer ones: 10m, 2h, 1d or an ISO time
flag
default:"off"
convert HEIC photos to JPEG (over the cable)
DIR
default:"the current folder"
the folder to save into (default: the current folder)
auto | cable | wifi | tunnel | icloud
default:"auto"
auto (default), cable, wifi, tunnel or icloud
PROFILE
copy from this profile’s iPhone (Settings › Profiles)
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone open
Open a URL or deep link on the phone, such as maps://?q=coffee or App-prefs:WIFI. Links that act as they open (tel:, facetime:, running a shortcut) ask for --yes.
Arguments
URL
required
the link
flag
default:"off"
open a link that asks first: a call, a message, a shortcut run, or a new app’s link
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone button
Press Home, Volume Up or Volume Down, or lock the screen. Mobster can’t unlock an iPhone: after lock, unlock it yourself.
Arguments
home | volume_up | volume_down | lock
required
home, volume_up, volume_down or lock
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone install
Install a build on a USB iPhone (xcrun devicectl) or a Mobster simulator (xcrun simctl). The build must be signed for that iPhone, and the iPhone needs Developer Mode on.
Arguments
PATH
required
the .app folder or .ipa file
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone record
Record a paired iPhone’s screen, and the audio it offers, over USB into a new .mov file, without a WebDriverAgent session. It uses the capture device QuickTime Player records from, so macOS asks once whether Mobster may use the camera and microphone. iOS shows its demonstration status bar while it records, and protected content may not be recorded. It never overwrites a file.
Options
FILE
required
write a new .mov file
N
default:"10"
how long to record, 1 to 300 (default 10)
NAME
default:"your iPhone"
the device: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster phone network
Create removable iPhone network profiles, inspect this Mac’s connectivity, or capture a USB iPhone’s packets. Profiles need installation in Settings.
mobster phone network proxy-profile
Write a Wi-Fi profile for one SSID. Apps may ignore HTTP proxies; this does not route cellular traffic or decrypt TLS.
Options
SSID
required
the Wi-Fi network name
SERVER
the HTTP proxy hostname or IP address
URL
the HTTP or HTTPS proxy auto-configuration URL
PORT
default:"8080"
the HTTP proxy port (default: 8080)
USERNAME
the HTTP proxy username
FILE
read the proxy password from this UTF-8 file
FILE
read the Wi-Fi password from this UTF-8 file
Any | WPA2 | WPA3 | None
default:"Any"
the Wi-Fi encryption type (default: Any)
FILE
required
write a new private .mobileconfig file; existing files are kept
NAME
default:"Mobster proxy"
the profile’s display name (default: Mobster proxy)
IDENTIFIER
default:"app.mobster.network.proxy"
the stable profile identifier (default: app.mobster.network.proxy)
flag
default:"off"
print one JSON object
--server and --pac can’t be used together; one is required.
mobster phone network vpn-profile
Write an IKEv2 EAP VPN profile for your provider. This does not create a VPN server. Install the profile and connect in Settings.
Options
SERVER
required
the VPN server hostname or IP address
REMOTE_ID
required
the server identifier from your VPN provider
LOCAL_ID
required
the client identifier from your VPN provider
USERNAME
required
the VPN account username
FILE
read the VPN password from this UTF-8 file
FILE
required
write a new private .mobileconfig file; existing files are kept
NAME
default:"Mobster VPN"
the profile’s display name (default: Mobster VPN)
IDENTIFIER
default:"app.mobster.network.vpn"
the stable profile identifier (default: app.mobster.network.vpn)
flag
default:"off"
print one JSON object
mobster phone network relay-profile
Write an Apple network relay profile for an existing compatible HTTP/2 relay service. This is not an ordinary HTTP proxy or a new relay server.
Options
URL
required
the HTTPS relay endpoint
FILE
read the bearer token from this UTF-8 file
FILE
required
write a new private .mobileconfig file; existing files are kept
NAME
default:"Mobster relay"
the profile’s display name (default: Mobster relay)
IDENTIFIER
default:"app.mobster.network.relay"
the stable profile identifier (default: app.mobster.network.relay)
flag
default:"off"
print one JSON object
mobster phone network diagnose
Check this Mac’s default route and optional TCP endpoint. With --device, also report USB attachment. This does not test the iPhone’s internet egress, proxy authentication, or installed profiles.
Options
NAME
also inspect USB attachment for this device
HOST
the hostname or IP address to test from this Mac
PORT
default:"8080"
the TCP endpoint port (default: 8080)
flag
default:"off"
print one JSON object
mobster phone network capture
Capture packets through Apple’s Remote Virtual Interface. Requires a paired USB iPhone, Xcode tools and BPF permissions on this Mac. TLS remains encrypted; packet data may contain private information.
Options
NAME
required
the paired USB iPhone’s id, UDID or name
FILE
required
write a new private pcap file
SECONDS
default:"30"
stop after 1 to 300 seconds (default: 30)
PACKETS
default:"10000"
stop after 1 to 100000 packets (default: 10000)
SNAPLEN
default:"128"
capture 64 to 65535 bytes per packet (default: 128)
flag
default:"off"
print one JSON object
mobster phone password
Enter one password from a hidden prompt or a private UTF-8 file. Requires a rebuilt Mobster runner and an empty, focused secure field. Does not submit, retry, or enter a phone passcode.
Options
BUNDLE
required
the foreground app’s bundle ID
NAME
required
the secure field’s accessibility identifier or label
FILE
read the password from a private UTF-8 file
NAME
the device’s id, UDID or name
flag
default:"off"
print one JSON object without the password
mobster alerts
Mobster posts to MOBSTER_ALERT_WEBHOOK_URL (https: Slack, Discord, ntfy or any JSON webhook) when a scheduled task fails, stops or waits a minute for your approval. The post never holds the task’s answer or anything it typed.
mobster alerts test
Send a test alert to MOBSTER_ALERT_WEBHOOK_URL (or --url) and say whether the service took it.
Options
URL
send to this https address instead of the saved one
flag
default:"off"
print one JSON object
mobster audit
Check a Team plan audit export offline: the hash chain, the signed head of the API’s export, and with --keys every Mac’s signature. Nothing leaves this Mac.
mobster audit verify
Check an audit export, offline. It follows the hash chain entry by entry and says which entry first fails: a gap, an entry out of order, or one that was changed. For the JSON Lines export from the API it also checks the signed head against Mobster’s license key, which pins where the export starts, where it ends and how many entries it holds, so a cut-off start or end is caught too. With --keys it checks each Mac entry’s signature against that Mac’s key. The relay’s own entries are unsigned.
Get the Macs’ keys from the Macs themselves, not from the export, so the relay can’t vouch for itself. Nothing leaves this Mac.
Arguments
FILE
required
the audit export: JSON Lines from the API, or JSON from the console
FILE
default:"the key built into Mobster"
the license public key, as a PEM, for a JSON Lines export’s signed head (default: the key built into Mobster)
FILE
a JSON file of {“<mac id>”: “<base64url Ed25519 public key>”}; checks every Mac entry’s signature
flag
default:"off"
print the result as one JSON object
mobster env
Keep a project’s test credentials and other secrets in your Keychain, named in .mobster/env.example (names only, committed). A check writes ${NAME} in its launch settings and steps; the run fills it in and masks it everywhere. A name with no value stops the run before it starts. Values are never printed or written to the project.
mobster env set
Save a value for a name, in your Keychain.
Arguments
NAME
required
the variable’s name, such as TEST_PASSWORD
DIR
default:"the folder with .mobster/ above this one"
the project folder (default: the folder with .mobster/ above this one)
flag
default:"off"
print the result as JSON
flag
default:"off"
read the value from standard input instead of asking for it
mobster env list
Show the names and which have a value.
Options
DIR
default:"the folder with .mobster/ above this one"
the project folder (default: the folder with .mobster/ above this one)
flag
default:"off"
print the result as JSON
mobster env unset
Remove a name’s saved value.
Arguments
NAME
required
the variable’s name, such as TEST_PASSWORD
DIR
default:"the folder with .mobster/ above this one"
the project folder (default: the folder with .mobster/ above this one)
flag
default:"off"
print the result as JSON
mobster demo
Run one task offline, “Search for coffee”, on a scripted phone and model: the real runtime and agent loop, no iPhone, no keys and no model calls. The same as mobster run "Search for coffee" --demo. For the terminal UI on it, run mobster --demo.
Options
flag
default:"off"
print raw JSON events, even on a terminal
mobster completion
Print a completion script for your shell, so tab completes commands, options, your devices and past task IDs. Homebrew installs the zsh and fish ones for you.
Arguments
zsh | bash | fish, optional
zsh, bash or fish
mobster update
Say whether a newer Mobster is out. New versions come in Mobster for Mac, which updates itself: https://mobster.dev/download. It installs nothing, and the mobster you have keeps working. Mobster checks once a day and says so after a command; MOBSTER_NO_UPDATE_CHECK=1 turns that off.
Options
flag
default:"off"
only say whether a new release is out
mobster version
Print the version of Mobster.
Options
flag
default:"off"
print the version, Python and platform as JSON
mobster logout
Remove a saved key from this Mac: from Mobster’s settings file, which Mobster for Mac uses too. A key set in your shell or an --env-file stays where it is.
mobster logout <plan or provider> forgets that plan’s or provider’s key or sign-in.
Arguments
PLAN|PROVIDER, optional
forget a plan’s or provider’s key or sign-in, instead of removing a key
anthropic | openai
default:"the one Mobster's agent uses"
which key to remove (default: the one Mobster’s agent uses)
mobster wifi
Turn on Wi-Fi use for an iPhone you set up with a cable once, see how each phone is connected, and check the encrypted link between this Mac and the phone.
mobster wifi status
Show each iPhone set up here: on the cable, on Wi-Fi, or not reachable, and whether Wi-Fi is on for it. Reads only; changes nothing.
Options
flag
default:"off"
print one JSON object
mobster wifi on
Let Mobster reach an iPhone over Wi-Fi when it’s unplugged, through the encrypted link between this Mac and the phone. The iPhone must be plugged in and trust this Mac; this is the same switch as Connect via network in Xcode.
Options
NAME
default:"your iPhone"
the iPhone: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster wifi off
Stop using an iPhone over Wi-Fi. When Mobster turned it on, and the iPhone is plugged in, its Wi-Fi switch is turned off too.
Options
NAME
default:"your iPhone"
the iPhone: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
print one JSON object
mobster wifi probe
Check an unplugged iPhone over Wi-Fi: what Xcode’s device service reports, the encrypted tunnel, WebDriverAgent on the tunnel through this Mac’s relay, and that the phone’s Wi-Fi address does not answer on 8100 or 9100. It binds only 127.0.0.1 and changes nothing on the phone (with --start, it launches Mobster’s helper on it for the probe, then stops it).
Options
NAME
default:"your iPhone"
the iPhone: an id, UDID or name from
mobster devices (default: your iPhone)flag
default:"off"
launch Mobster’s helper over Wi-Fi for the probe when it isn’t running (quit the Mac app first)
flag
default:"off"
print one JSON object
mobster tui
Open the terminal UI. The same as running mobster with no command.
Options
URL
default:"http://127.0.0.1:8100"
the phone’s address, for a phone you set up by hand (default: http://127.0.0.1:8100) [env: MOBSTER_WDA_URL]
NAME
default:"your iPhone"
the iPhone or simulator to use: an id, UDID or name from
mobster devices (default: your iPhone)PATH
load KEY=VALUE lines (ANTHROPIC_API_KEY, OPENAI_API_KEY, …); variables already set win [env: MOBSTER_ENV_FILE]
flag
default:"off"
use a scripted phone and policy: no iPhone, no keys, no model calls
ID, optional
open a past task and put it back in the prompt (the latest without an ID)
flag
default:"off"
continue your last conversation
NAME
start with this app chosen (a name or bundle ID)
flag
default:"off"
don’t ring the terminal bell when Mobster needs you
mobster help
Show the help for a command, or a topic: environment, exit-codes, tui. mobster help --all lists every command.
Arguments
COMMAND, zero or more
a command (and a subcommand), or a topic
flag
default:"off"
list every command, the hidden ones too