It goes inside — asks you for a test account the first time, remembers it — and keeps the journeys that matter working.
Or run the package directly: npx -y @aarwitz/tapp@latest init . --explore
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.



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.
iOS, Android, web, and Windows desktop — tapp drives the real thing, not a mock. Same commands, same evidence, same CI check on every platform.
Runs your app on the iOS Simulator using Apple's own UI-testing hooks. Nothing gets added to your app — no SDK, no Appium.
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.
Explores your web app in a real Chromium browser and catches broken links, failed requests, missing assets, and JavaScript errors.
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.
Every one runs on your machine, on the real app, and hands back evidence. No API key.
tapp_exploreExplore 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_lookOne screen: a summary and a screenshot, with the accessibility tree on request.
tapp_sessionDrive the app step by step — tap, type, swipe, go back, wait — and see each screen.
tapp_runReplay a committed Flow, Task, contract, or Scenario. Deterministic, keyless.
tapp_mapThe UI map a run built: which screens exist and how it got to each one.
tapp_ciThe merge gate. The only thing here that returns pass, fail, or inconclusive.
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.
The checks that matter ran and passed.
Something broke, or a journey that used to work no longer does.
tapp couldn't gather enough evidence to say — so it doesn't.
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?
tapp report --journeys