Let your coding agent test the app it changed.

Tapp gives coding agents hands and eyes on iOS simulators, Android emulators and devices, and browser apps. Inspect screens, explore technical failures, save journeys as deterministic tests, and gate reviewed behavior in CI.

Install the agent skill → View on GitHub
npx -y skills add aarwitz/tapp --skill tapp

Or run the package directly: npx -y @aarwitz/tapp@latest init . --explore

you: "Add a logout button to the settings screen"
agent: *writes the Swift*
agent: *tapp: builds, opens the app, navigates to Settings, screenshots it*
agent: "Done — and here it is working on the simulator: [screenshot]"
Platforms

Three app surfaces. One testing workflow.

Tapp drives the real target through its native accessibility surface, captures inspectable evidence, and keeps the same Flow and gate contract across supported platforms.

🍎

iOS simulator

A generic XCUITest harness drives accessible simulator apps. No Tapp SDK, Appium, or WebDriverAgent is added to the app.

🤖

Android emulator or device

ADB and UIAutomator provide black-box driving on a connected emulator or device. Install an APK or let Tapp build a detected Gradle target.

🌐

Web (beta)

Playwright Chromium explores an owned browser app and checks technical behavior such as failed requests, broken assets and links, uncaught exceptions, and placeholder links.

📦

Agents, CLI, and CI

Use the Agent Skill first, call the npm CLI directly, add MCP for inline images and persistent sessions, or run the same deterministic gate in GitHub Actions.

Windows can host Android and web testing when their prerequisites are installed. Windows desktop UI apps such as WinForms, WPF, and WinUI are not currently supported targets.

Local and inspectable

Explore autonomously. Commit only what matters.

Tapp can discover broadly, then distill the highest-value behavior into reusable Tasks and reviewable business contracts. The deterministic suite runs in CI without a model or API key.

👁

tapp_open_app

Launch the app, get a screenshot + accessibility tree back in seconds.

🕹

tapp_session_*

Interactive driving — the Playwright loop. Tap, type, swipe, back, wait.

🔭

tapp_explore

Autonomous exploration on iOS, Android, or web returns an observation {findings[], coverage, inconclusive}. It is not a release verdict.

🔁

tapp_flow_*

Record a session as a replayable Flow, or generate one from a goal in plain English.

📱

tapp_boot_simulator

Simulator + app install management — list, boot, install.

🩺

tapp_health

Diagnostics, capture history, marker parsing.

Observe, then judge

Exploration observes. The gate judges.

Tapp explores like a user and surfaces crashes, failed sign-ins, dead buttons, stuck loading screens, navigation dead ends — and on web, uncaught exceptions, failed requests, and broken links. Exploration observes (findings + evidence, never a ship verdict). The gate judges: the same evidence + contracts + baseline always produce the same outcome. A shallow run is inconclusive, never a pass. Optional model-assisted authoring and advisory analysis never silently become deterministic gate authority.

🟢 pass

Required deterministic checks ran and passed.

🔴 fail

A deterministic violation or regression was observed.

🟡 inconclusive

Required evidence couldn't be obtained — fails closed.

The complete product loop

Turn important journeys into merge checks.

Explore broadly, preserve important journeys as reviewed Flows or contracts, and install the same engine as a portable GitHub Action. Every PR answers one question with evidence: did this break important behavior that worked in the reviewed baseline?

  • Builds or starts the selected iOS, Android, or web target
  • Composes reusable Tasks into business-level release contracts
  • Blocks on failed critical contracts, crashes, and new high/critical regressions
  • Shows exact coverage boundaries, screenshots, and deterministic replay evidence
🟢 PASS
Screens explored4
Findings0
Contracts3 / 3
GatePASS