Skip to main content
The noqa CLI brings the platform to your terminal: inspect devices, drive the screen, author and edit test cases, run them with the noqa agent, and read results — all scriptable, and easy to wire into CI or an AI coding agent. It ships with the macOS desktop app and talks to it locally, so there’s nothing separate to configure.
You need the noqa macOS app running and the CLI installed. To drive it with an AI agent, see CLI & MCP for setup and Device CLI for the screen-and-action loop. To have your agent write the test cases for you and run them, see Generate test cases with AI.

Setup

1

Install and open the app

Download noqa and install it. Keep the app running — the CLI talks to it locally, so it must be open for any command to work. Sign in for account features (test management, running the agent); base commands work without an account.
2

Install the CLI

In the app, open Settings → CLI & Agents and click Install on CLI Tool. This links the noqa command into ~/.local/bin and adds it to your PATH — no sudo required. Restart your terminal afterward.
3

Install the skill (for AI agents)

In the same Settings → CLI & Agents, click Install globally on Mobile Testing Skill to add the noqa-testing skill to your agent directories, so your agent knows the commands and workflows. Skip it if you only use the CLI by hand. See CLI & MCP.
4

Verify

Base commands

No account and no app prefix needed. Connect a device first with noqa devices connectscreen and action run against the connected device.

Devices

Inspect the screen

For how noqa screen, --full, and a screenshot compare by token cost, see Reading the screen.

Actions

Gestures (tap, swipe, drag, pinch, input) target an element two ways: by coordinates, or by description. By coordinates0–1000, relative to the screen; read them from the relative_bbox_2d of the target in noqa screen (element center = ((xmin+xmax)/2, (ymin+ymax)/2)):
By description (automatic grounding) — describe the element in plain language and noqa grounds it to the right spot on screen, working from what is rendered rather than from the element tree. Use it when noqa screen returns no usable target — a game, a canvas, a WebView, an ad overlay — or when the coordinates from the tree didn’t work. Requires being signed in, and each call draws on the grounding quota:
App & system controls take no target:

Test management

Author and maintain your test suite from the terminal — free, with an account. Every command here takes your app prefix as its first argument (shown as APP); find it with noqa apps list. See Test Cases for how cases and flows fit together.

Apps & context

app_context is a shared description injected into every run — credentials, screen names, and rules the agent should always follow. update overwrites, so read the current value first, then send the full replacement.

Test cases

A test case has a title, optional tags, and a list of flows (steps + expected results).
Each flow is either inline ({"instructions": "...", "result": "..."}) or a reference to a reusable flow ({"id": "..."}) — never both. Tags are created automatically when named.
For how to phrase instructions and expected results, see Writing Good Test Cases.

Reusable flows & tags

A reusable flow is a named step shared across cases (e.g. “Go through onboarding”). Update it once and every case that references it updates too.

Builds & test runs

Register builds and run test cases with the noqa agent on a connected device. Each run uses credits.

Builds

Build paths must be absolute (e.g. /Users/me/build/App.ipa, not build/App.ipa).

Run tests

Hand saved cases (by number) or ad-hoc cases (inline JSON) to the noqa agent, which runs them autonomously on the connected device.
Omitting both build flags reuses whatever is already installed on the device — quick, but the app keeps its existing state across cases. Pass a build so each run starts clean for a regression suite. --build-path and --build-id are mutually exclusive; connect a device first with noqa devices connect.
delete commands (cases, flows, runs, builds) are irreversible. Double-check the id before running.

Output & scripting

Most read commands accept --json for raw output you can pipe into jq or a script:
Errors go to stderr with a non-zero exit code, so the CLI composes cleanly in CI pipelines and agent tooling.

Test cases

How cases and flows work

CLI & MCP

Let an AI agent drive the CLI