Build and test an iOS app
From your repository to a passing test run on a cloud Mac, with the build, the results and screenshots back on your side. The next build is incremental.
Put the project on the Mac
Clone it onto the drive, so the next session starts from it:
git clone https://github.com/acme/app ~/drive/src/appOr send the folder on your machine: nomac sync . puts it in ~/drive/src/<folder> and sends only what changed, and --watch keeps sending as you edit. A private repository's token can come from your secrets.
Build
cd ~/drive/src/app
xcodebuild -scheme App \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=27.0' \
build | xcbeautifyGive builds time: over MCP, wait_seconds: 40 and a timeout_seconds of up to 3600; with the CLI, nomac exec --wait 600. Each iOS runtime has devices with the same names, so name the OS version too.
Expo and Capacitor apps make their ios folder first: npx expo prebuild -p ios or npx cap sync ios.
Test
xcodebuild test -scheme App \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=27.0' | xcbeautify~/Library/Logs/DiagnosticReports.Look at the app
simulator-use is on every Mac. simulator-use run builds, installs and launches the project in the current folder, simulator-use look reads the screen as text, and simulator-use act 'tap "Sign In"' taps by label.
screenshot_macwith targetsimulatorreturns the Simulator's screen as an image, andxcrun simctl io booted screenshot shot.pngsaves one.- Launch arguments open a screen without tapping:
xcrun simctl launch booted com.acme.App -ShowPaywall YES.
Get the results back
nomac pull ./out --from build/export copies a folder to your machine. Over MCP, create_mac_link with direction download makes a link to a file or folder of up to 2 GiB that keeps working after the Mac stops, and read_mac_file reads a file of up to 3 MiB.
Your backend
Run it on the Mac with nomac-service start api -- npm run dev. The Simulator reaches it at http://localhost:PORT, and nomac ssh --forward 8787:8787 reaches it from your machine.