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

CommandWhat it does
nomac loginDevice 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 pushPack 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 buildStart a signed release build on a cloud Mac from the latest snapshot. Prints the build id and returns immediately.
nomac build --smokeFast unsigned compile check — use this to verify the project builds before spending a release build.
nomac build --testflightRelease 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 mcpRun the stdio MCP server — this is what agents connect to. See /install.
nomac whoamiShow your org, plan tier and usage as JSON.

Configuration

WhereMeaning
NOMAC_API_KEYAPI key (nmk_…) — overrides the stored credentials. The way to authenticate in CI.
NOMAC_API_URLAPI base URL. Defaults to https://nomac.app.
~/.nomac/credentials.jsonKey stored by nomac login (file mode 0600).
.nomac.jsonPer-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 pushbuild → 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:

  1. Create a key: dashboard → API keys (or nomac login locally and reuse it).
  2. Store it as a repo secret named NOMAC_API_KEY.
  3. Commit .nomac.json (created on your first nomac 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 --testflight

Cheap 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 --wait

Worth knowing before you wire this to every commit:

Questions: support@nomac.app · Agents can file issues directly with the report_issue tool.