Run a Mobster check from GitHub Actions
mobster ci init writes the workflow, a Mac of yours runs the checks on each pull request, and one comment shows the verdict, repro steps and video.
The command
mobster ci initA pull request changes a screen. Nobody opens the app to look. Mobster closes that gap in the pull request itself: a job on a Mac of yours tests the screens the change touched, and one comment shows the verdict, the frame of each failure and the steps to repeat it.
Set it up
Run the command above in your project’s folder. It reads the origin remote, writes .github/ and prints what is left:
Wrote .github/ workflows/ mobster.yml.Next: 1. On the Mac that runs the checks: mobster ci doctor 2. Register it as a self-hosted runner with the label mobster: https://docs.mobster.dev/ ci/ mac-runner 3. Add ANTHROPIC_API_KEY as a repository secret, for checks with steps. 4. Commit the file and open a pull request.On the runner, mobster ci doctor lists what the Mac still needs, one row each: Apple silicon, Xcode, an iOS Simulator runtime, Mobster for Mac in Applications, a plan, sleep settings, automatic login, the runner service and free disk. A row marked ✗ comes with the command that fixes it, such as sudo pmset -a sleep 0 disksleep 0, so the Mac never sleeps through a job.
What the job does
The workflow runs on a runner with the label mobster, so your other jobs stay on GitHub’s hosted runners. Three steps matter:
mobster ci runfetches the pull request’s base branch, then runsmobster test prwith video. It builds the app, runs the saved checks that cover the changed screens, and drafts a check for each changed screen that none covers. The step fails when a check fails or couldn’t run.- The upload step keeps
.mobster/as the job’s artifact:ci/ junit.xml,pr.json, the HTML report, frames, GIFs and videos. mobster ci commentcreates the comment, or updates the one from an earlier push. It never fails the job.
What you get on the pull request
One comment, updated on every push. Its first line is the count, such as Mobster checks: 11 passed, 1 failed, then the changed screens and a table with the check, the device, what it expected and what it found. A failure folds open into a repro: the device, the deep link it opened, the steps it took, the expected and found values, its media and the command that runs it again:
mobster test .mobster/ checks/ paywall.yaml --sim 'iPhone 17 Pro@iOS 26.4'Up to 5 failed checks get a repro. Typed text, email addresses and phone numbers in a step show as •••. GitHub doesn’t show images from a workflow’s artifacts inside a comment, so the frames, GIFs and videos are links to the uploaded report.
With Mobster Checks installed on the repository and GitHub connected in Mobster on the runner, the verdict also appears as a check named Mobster on the pull request.
Add an iPhone
A phone the runner’s owner lists is tested too. The list lives in the runner’s .env, which no pull request can change:
MOBSTER_RUNNER_DEVICES=Test iPhoneMOBSTER_RUNNER_TESTFLIGHT=com.example.yourappThen change the run step to "$MOBSTER" ci run --device "Test iPhone" --testflight com.example.yourapp. A --device the runner doesn’t list stops the job before a check runs. On a phone, a check drives only builds you installed, and its Smart steps never send, buy, post or delete.
What it costs and what it doesn’t do
There is no per-run or per-device price. You pay for Mobster for Mac and the hardware you already own. Mobster hosts no runners. A check with steps uses your Anthropic key until it passes once, then replays with no model.
The job runs on a self-hosted runner, a Mac of yours with Mobster for Mac in Applications. Mobster doesn’t provide the runner, and the workflow isn’t written for GitHub’s hosted ones.
Questions
Does Mobster host runners or phones?
No. Everything runs on a Mac you own. Mobster charges nothing per run or per device.
Do I need a model key?
Only for checks with steps, and only until they pass once. Add ANTHROPIC_API_KEY as a repository secret. After a check passes, it replays with no model. A check that only launches your app needs no key.
Can the job test on a real iPhone?
Yes. List the phone in MOBSTER_RUNNER_DEVICES in the runner's .env file, then pass --device to mobster ci run. A pull request can edit the workflow file, so a phone named only there never reaches the job.
Is it safe on a public repository?
Not with pull requests from forks. A self-hosted runner runs the code in each pull request, which GitHub's hardening guide explains. Use a private repository, or a runner that only takes your own branches, and a test phone signed in to a test account.
Does it work on GitLab?
Yes. mobster ci init reads your origin remote and writes the mobster job in .gitlab-ci.yml when the remote is GitLab.
Sources
Every fact about the other tool comes from its own site, docs or repository, read on 17 October 2026. Corrections are welcome at the GitHub repo.