Point tapp at anything.

It goes inside — asks you for a test account the first time, remembers it — and keeps the journeys that matter working.

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

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

Behind the sign-in

A run becomes a journey you own.

Real applications live behind a login, so a crawl never meets them. tapp stops at the sign-in and asks you in the chat. What you type is kept encrypted, used only to sign in, and never shown again — the next run starts inside. When a run gets somewhere, tapp offers to keep it as a journey: it replays exactly that path every day, and shows you here the moment it stops working.

The tapp Studio stopped at a sign-in page, asking in the chat for an email and password, with a checkbox to remember them for this site
1 · It asks. A sign-in it has no account for pauses the run and asks — once.
The tapp Studio inside the application after signing in, offering to keep the run as a journey named after where it went
2 · It goes inside, then offers to keep the path. Sign in → Dashboard → Orders → Settings, 13 steps, one click.
The Journeys panel listing kept journeys with a passing status and the time of the last check, next to the test accounts tapp holds
3 · It keeps it checking. Every journey, with how its last daily check went. Forget a test account any time.
Real evidence

Watch it work on a real app.

Unedited: the Studio is pointed at an app with a sign-in. It stops at the login and asks; given a test account once, it goes inside, offers to keep the path as a journey, and replays it — passing — with a recording and a report for every run.

The Studio on a real run: ask, go inside, keep, replay. 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 with us — write to hello@runtapp.com.

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.

A journey you kept in the Studio is a file your coding agent can commit — .tapp/flows/ — and tapp runs every committed journey 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
  • Or let your coding agent ask, with a token you create: tapp report --journeys
🟢 PASS
Screens explored4
Findings0
Contracts3 / 3
GatePASS