Point tapp at anything.

npx -y skills add aarwitz/tapp --skill tapp

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

Real evidence

Watch it work on a real app.

Unedited footage of the tapp desktop app. Drop a repo in, and tapp builds it, boots a simulator, explores the app on its own, finds the bugs that were planted in it, and maps every screen it reached.

The desktop app on a real run. Prefer to read? Open a full sample evidence report →
Platforms

Works with the apps you actually ship.

iOS, Android, web, and Windows desktop — tapp drives the real thing, not a mock. Same commands, same evidence, same CI check on every platform.

🍎

iOS simulator

Runs your app on the iOS Simulator using Apple's own UI-testing hooks. Nothing gets added to your app — no SDK, no Appium.

🤖

Android emulator or device

Drives your app on an emulator or a plugged-in device through ADB. Point it at an APK, or let it build your Gradle project.

🌐

Web

Explores your web app in a real Chromium browser and catches broken links, failed requests, missing assets, and JavaScript errors.

🪟

Windows desktop

WPF, WinForms, and WinUI apps, driven through Windows UI Automation — the same commands, evidence, and CI check. Early Windows runs are set up through the pilot.

Give it to your agent as a skill, run it from the terminal, add it over MCP to get screenshots inside the chat, or run the same check in GitHub Actions — on macOS, Linux, or Windows.

The toolkit

What your agent can ask for.

Every one runs on your machine, on the real app, and hands back evidence. No API key.

🔭

tapp_explore

Explore the app on its own and report what it found, what it covered, and what it couldn't reach. An observation, not a verdict.

👁

tapp_look

One screen: a summary and a screenshot, with the accessibility tree on request.

🕹

tapp_session

Drive the app step by step — tap, type, swipe, go back, wait — and see each screen.

🔁

tapp_run

Replay a committed Flow, Task, contract, or Scenario. Deterministic, keyless.

🗺

tapp_map

The UI map a run built: which screens exist and how it got to each one.

⚖️

tapp_ci

The merge gate. The only thing here that returns pass, fail, or inconclusive.

Observe, then judge

Exploring finds problems. The gate decides.

Exploration behaves like a curious user: it taps everything and reports crashes, dead buttons, failed sign-ins, screens stuck loading, and dead ends — and on web, broken links, failed requests, and JavaScript errors. It reports; it doesn't decide. The gate decides, and it's deterministic: the same evidence and the same rules always give the same answer. If a run was too shallow to tell, the answer is inconclusive — never a pass.

🟢 pass

The checks that matter ran and passed.

🔴 fail

Something broke, or a journey that used to work no longer does.

🟡 inconclusive

tapp couldn't gather enough evidence to say — so it doesn't.

On every pull request

Turn the journeys you care about into merge checks.

Pick the journeys that must keep working — checkout, sign-in, onboarding — and tapp runs them on the real app for every PR. Each PR gets one answer, with evidence: did this change break something that used to work?

  • Builds and launches your iOS, Android, or web app
  • Replays the journeys you've marked as important
  • Blocks the merge on crashes, failed journeys, and new serious findings
  • Attaches screenshots and a replay so you can see exactly what happened
🟢 PASS
Screens explored4
Findings0
Contracts3 / 3
GatePASS
Founding tapp Teams

Try it on your real app, with help.

We're taking a small number of paid pilot teams. We set tapp up on your repo, pick the journeys that matter, and wire up the CI check — together. tapp itself is MIT licensed and runs on infrastructure you control.

Apply for the founding pilot →
The application opens a public GitHub issue. Do not include private code, credentials, or customer data.