CLI reference
@nomac/cli — ship iOS apps without a Mac, from any terminal or CI runner. Requires Node 20+. Also see the API reference and the agent install page.
npx @nomac/cli <command> # no install needed npm i -g @nomac/cli && nomac <command>
Commands
| Command | What it does |
|---|---|
nomac login | Device login: prints a URL + short code, waits for approval in the browser, stores the key in ~/.nomac/credentials.json. No secret ever touches the terminal. |
nomac login <api-key> | Store an nmk_ key directly (CI / power users). Create keys in the dashboard or via POST /api/v1/api-keys. |
nomac push | Pack the current directory (respecting .gitignore, secrets excluded) and upload a snapshot. Auto-creates the project on first push, auto-detects the Xcode project, scheme and bundle id, and runs source-level review lint. |
nomac build | Start a signed release build on a cloud Mac from the latest snapshot. Prints the build id and returns immediately. |
nomac build --smoke | Fast unsigned compile check — use this to verify the project builds before spending a release build. |
nomac build --testflight | Release build that waits (polling every 10s) until the build is live on TestFlight, printing each pipeline stage. --wait is the same flag; combine --smoke --wait for a blocking compile check. Exits non-zero on failure — CI-friendly. |
nomac status [build-id] | Show a build as JSON (defaults to the last build started from this directory). |
nomac logs [build-id] | Print per-step build logs, plus the failure excerpt if the build failed. |
nomac mcp | Run the stdio MCP server — this is what agents connect to. See /install. |
nomac whoami | Show your org, plan tier and usage as JSON. |
Configuration
| Where | Meaning |
|---|---|
NOMAC_API_KEY | API key (nmk_…) — overrides the stored credentials. The way to authenticate in CI. |
NOMAC_API_URL | API base URL. Defaults to https://nomac.app. |
~/.nomac/credentials.json | Key stored by nomac login (file mode 0600). |
.nomac.json | Per-project state (project id, last build) written next to your code. Commit it — CI and teammates then push to the same project instead of creating a new one. |
Manual usage (a dev, a terminal, no agent)
Everything an agent does over MCP, you can do by hand. One-time setup: sign up at nomac.app, connect your Apple Developer account with an App Store Connect API key (the dashboard wizard walks you through it), then:
cd YourApp/ # the folder with the .xcodeproj npx @nomac/cli login # approve in the browser, once per machine npx @nomac/cli push # upload a snapshot + run review lint npx @nomac/cli build --testflight
About 3 minutes later the build is on your phone in TestFlight. From there the loop is push → build → test on device → repeat. When a build fails, nomac logs shows the failing step and excerpt.
Metadata, screenshots, review checks and the App Store submission itself have no CLI subcommands yet — drive them with curl against the REST API (/review-lint, /metadata, /screenshots, /publish), or let an agent do it.
CI/CD usage (GitHub Actions & friends)
The CLI runs on plain Linux runners — no macOS runner, no certificates, no fastlane. Authenticate with NOMAC_API_KEY:
- Create a key: dashboard → API keys (or
nomac loginlocally and reuse it). - Store it as a repo secret named
NOMAC_API_KEY. - Commit
.nomac.json(created on your firstnomac push) so CI builds the same project.
Ship every push to main to TestFlight:
# .github/workflows/testflight.yml
name: TestFlight
on:
push:
branches: [main]
jobs:
testflight:
runs-on: ubuntu-latest
env:
NOMAC_API_KEY: ${{ secrets.NOMAC_API_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx @nomac/cli push
- run: npx @nomac/cli build --testflightCheap compile check on pull requests (smoke builds don't sign or upload):
# .github/workflows/smoke.yml
name: Smoke build
on: pull_request
jobs:
smoke:
runs-on: ubuntu-latest
env:
NOMAC_API_KEY: ${{ secrets.NOMAC_API_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx @nomac/cli push
- run: npx @nomac/cli build --smoke --waitWorth knowing before you wire this to every commit:
- Every build attempt counts toward your monthly cap (Starter 50, Pro 300) — including failed ones. Gate the TestFlight job on main, use smoke builds for PRs.
- Build numbers (
CFBundleVersion) increment automatically per project — no version bumping step needed. Bump the marketing version in your Xcode project when you cut a release. build --testflightexits non-zero on failure, so the job fails visibly; runnpx @nomac/cli logs(orGET /builds/:id/failure) to see why.- POSTs accept an
Idempotency-Keyheader — the CLI already sends one, so a retried CI step won't double-start a build.
Questions: support@nomac.app · Agents can file issues directly with the report_issue tool.