Start
Features
| Item | What you get |
|---|---|
| 👀 | Read the screen as text. ls lists what's visible, one row per element: @ref type x,y w×h label = value. It reads native screens, React Native screens and web content (Safari, in-app browsers, web views) |
| 👆 | Tap by label. Exact match first, then a prefix or substring that names exactly one label. An ambiguous match is an error, never a guess. Also by @ref from the last ls, or by x y coordinates |
| ⌨️ | Type and fill. type into the focused field, fill to clear a field and type, key return|escape|delete|tab|selectall|paste|… (the same names on both platforms), and hidekb, which never reports success while the keyboard is still up |
| 🧭 | Navigate and gesture. swipe, scrollto <label>, back, home (the Home button, the app keeps running), open <deep link>, launch <app>, stop <app>, longpress, and two-finger zoom in|out |
| ⏱️ | Wait instead of sleep. wait "Welcome", wait "Loading" --gone. Actions already wait up to 3 s for their target |
| 🧪 | Tests in CI. expect "Welcome", expect "Email" = [email protected], expect "Error" --gone check the screen. test flows/ runs flow files as tests, one line per flow, and a failure leaves its screen, screenshot, error logs and crashes behind. --junit for CI reports. On Android, codegen records a flow while you use the phone |
| 📸 | Screenshots. shot saves a PNG and prints its path, with --scale 0.5 for fewer image tokens. On Android emulators it also captures FLAG_SECURE screens |
| 🎞️ | Burst capture and video. burst saves a frame each time the screen changes, to catch spinners, toasts and transitions. record start … record stop saves an MP4 of everything in between |
| 🪵 | Logs. logs shows the app's log since your last look. --errors and --grep narrow it, and on iOS Apple-framework chatter is filtered out |
| ⏱️ | Performance. perf reads the app's CPU, memory and threads, once or each second with --for 10s; perf --frames adds frames, jank and frame-time percentiles (on iOS, from the screen itself). launch --time times a cold start until the first screen settles |
| 💥 | Crashes. crashes reads iOS crash reports (exception, reason, top frames) and Android crashes, ANRs and low-memory kills, so "the app vanished" always comes with a reason |
| | Biometrics. bio match|nomatch simulates Face ID or a fingerprint |
| 🌍 | Simulated conditions. location <lat> <lon>, appearance dark, textsize xxl (Dynamic Type / font scale), statusbar clean (9:41 for screenshots), rotate landscape (ls, taps and screenshots follow the turned screen), Android network offline, and iOS push notifications |
| 🧹 | App state for repros. install a build, apps to see what is installed (and which version), reset an app to a fresh install, uninstall, and permission grant|revoke|reset camera|location|photos|…, with the same names on both platforms |
| 📱 | Devices on demand. boot "iPhone 16 Pro" or boot Pixel_9a starts a simulator or emulator by name and waits until it's ready, with a window or --headless; shutdown stops it. devices tells real phones from simulators and emulators (model, OS, USB or Wi-Fi), and says what to do for a phone that isn't ready yet |
| 🤖 | Built for agents. --ls on any action, run to batch steps, --json, capabilities to check what the device in use can and can't do, and a Claude Code skill you install with one command |
| 🧩 | Nothing to install on simulators, emulators or Android phones, no server to run, no npm dependencies. The helpers start on first use. A real iPhone gets a small test runner, built for you |
| ⚠️ | Honest failures. A tap that's covered by a toast prints a warning, a stale @ref is an error rather than a wrong tap, a system prompt over the app is reported as one, a locked device is reported as locked (never typed into), and an app that dies is named the moment looktap notices |
Generated from README.md. Edit it there.