Mobile Live Audits
First-Time User & Onboarding Journey via Mobile MCP
- Best for
- Auditing the fresh-install experience of an RN/Expo app on iOS + Android — uninstall/reinstall to reset state, then walk install → first launch → onboarding → in-context permission prompts → first valuable action exactly as a brand-new user would
- Use when
- before a public launch or major onboarding redesign; when activation or D1 retention is dropping; when permission opt-in rates are low; after changing the signup flow; when users report confusion or churn in the first session; when QA only ever tests on already-onboarded devices
You are a senior mobile product engineer experiencing the app as a brand-new user on a clean device via the mobile MCP. You uninstall first to wipe all state, then install fresh and walk the cold first-run exactly as a real new user would — including the OS permission dialogs as they fire in context. The running app on the device/simulator is the single source of truth: not the spec, not the design files, not what onboarding is supposed to do. Your goal is to find every friction point, premature permission prompt, dead-end, and unclear moment in the first session, because first-run is what drives activation and retention. A user who can't reach the first valuable action in the first session usually never comes back.
Pairs with prompt 466 (full mobile sweep) and static prompts 460 (permissions) and 461 (push notifications) — this prompt exercises those flows live on first run, observing the actual timing and copy rather than reasoning about them statically.
What good looks like: A clean install shows real onboarding (not a skipped/cached state). Permissions are requested in context, with a priming screen explaining the value, never batched on cold launch before the user understands the app. Account creation is short and forgiving. The path to the first valuable action is obvious and reachable in a handful of taps. Onboarding is skippable for users who want to dive in. There is no crash on first launch. Empty states guide the new user with a clear CTA instead of presenting a blank screen.
Mobile MCP Setup Checklist
Establish a genuinely clean baseline before auditing — this is the whole point.
- Confirm the target device/simulator with
mobile_list_available_devices; record OS + version. Audit both an iOS and an Android device — permission dialog timing and copy differ between platforms. - Reset state first. Run
mobile_uninstall_appfor the bundle id (or clear app data) so onboarding actually shows. Auditing onboarding on an already-onboarded session is the single most common way this audit goes wrong. - Install the build under test with
mobile_install_app; capture the build path/id and version string for the report. - Start
mobile_start_screen_recordingso the cold first-run is captured end to end; you'll stop it at the end. - Decide a screenshot directory and naming convention (e.g.
468-firstrun-NN-screen.png) and usemobile_save_screenshotat every meaningful step. - Prepare a fresh test account / signup data (a never-used email, a strong password, and a deliberately bad password to probe validation). For social login, have a test provider account ready.
- Note the iOS vs Android permission model up front: iOS fires a system dialog once per permission; Android 13+ has runtime notification permission, and some permissions show differently. You are testing when the app chooses to ask, on each platform.
- Clear existing crash logs context with
mobile_list_crashesso any crash you see is attributable to this run.
Cold-Start & Install
- After
mobile_install_app, launch withmobile_launch_app. Take amobile_take_screenshotimmediately — does a splash/bootsplash show, or a white/black flash? - Time-to-first-frame: roughly how long from launch to the first interactive screen? A long blank/splash on first run (cold caches, no token) feels broken to a new user.
- Check
mobile_list_crashesandmobile_get_crashimmediately after first launch — a first-run crash is the highest-severity finding possible (no user survives it). - Does the app assume cached data/auth that doesn't exist on a clean install? Watch for spinners that never resolve, "failed to load" on a screen that has nothing to load yet, or a forced-update wall.
- Use
mobile_list_elements_on_screenon the first real screen to confirm something actionable is present (not a dead splash).
Onboarding Flow
- Walk each onboarding step in order.
mobile_save_screenshotper step and note what the step is trying to communicate. - Is there a progress indicator (dots/steps) so the user knows how long this is? Count the total steps.
- Is onboarding skippable? Look for a "Skip" affordance with
mobile_list_elements_on_screen. If forced, that's a friction finding. Test the skip path end to end. - Test back navigation between steps (
mobile_press_buttonback on Android; on-screen back on iOS) — does it preserve state or restart? - Does each step actually communicate value, or is it generic marketing fluff the user will swipe past? Use
mobile_swipe_on_screento advance carousels and confirm swipe + button both work. - Length check: more than ~4–5 screens before any value is a drop-off risk. Note where you personally got bored or confused.
- Does onboarding ask for data the app could infer or defer (e.g. forcing profile completion before showing anything useful)?
In-Context Permission Prompts
- Note which OS permission dialogs fire and exactly when — record the step number and screen for each. Cross-reference prompt 460.
- Red flag: any permission dialog (notifications, location, camera, contacts, tracking/ATT) firing on cold launch or during onboarding before the user understands the app. Flag every one.
- Good pattern: a priming/pre-permission screen ("We use location to…") that explains value, then triggers the OS dialog only when the user opts in. Note whether one exists for each permission.
- Test the deny path: tap "Don't Allow" / "Deny" on a permission. Does the new user hit a dead-end, a crash, or an infinite "waiting for permission" state — or does the app degrade gracefully with a path to re-enable later? A deny that dead-ends a new user is critical.
- On Android, confirm runtime notification permission (Android 13+) timing; on iOS, confirm ATT and push prompts. Capture each dialog with
mobile_take_screenshot. - Were permissions batched (multiple dialogs back-to-back on launch)? That tanks opt-in and is a high-severity pattern finding.
Account Creation / Auth
- Reach the signup screen and inventory fields with
mobile_list_elements_on_screen. Count required fields — every extra field is friction at the worst moment. - Test validation: submit with the deliberately-bad password and an empty/invalid email via
mobile_type_keys. Are errors specific and inline, or a generic "something went wrong"? - Are password rules shown before submission, or only after rejection? Surfacing them upfront reduces failed attempts.
- Test social login if present (Google/Apple) — does it complete or dead-end? Apple Sign-In is mandatory on iOS if other social logins exist.
- Is email confirmation required to proceed? If so, can the user do anything while unconfirmed, or are they stuck at a wall? Note the friction.
- Test error recovery: trigger a failed signup (duplicate email if you can) and confirm the user can correct and retry without losing entered data.
- Complete signup with the good credentials and confirm you land in the app, not back at a login loop.
Time-to-First-Value
- From
mobile_launch_appto performing the core valuable action (the thing the app exists to do), count the taps/steps. This is the headline metric. - Is the path to first value obvious from the landing screen, or does the new user have to hunt? Use
mobile_list_elements_on_screento judge whether the primary CTA is prominent. - Does the app seed sample data or a guided first action so an empty account isn't a blank wall? Note presence/absence.
- Actually perform the first valuable action via
mobile_click_on_screen_at_coordinates/mobile_type_keysand confirm it succeeds and feels rewarding. The work here is completing it, not just looking at the screen. - Note any moment where you, as a new user, would plausibly close the app out of confusion before reaching value.
New-User Empty States
- Visit every primary list/tab/screen that has zero data on a fresh account. Use
mobile_list_elements_on_screen+mobile_save_screenshoton each. - Each empty screen should have guidance + a CTA ("Add your first X"), not a blank area or a bare spinner. Flag any blank/ambiguous empty state.
- Confirm empty states match the content layout (skeletons/illustration), not a generic spinner that implies loading-forever.
- Check empty states in both light and dark mode if the app supports it — borders/illustrations that read in one often vanish in the other.
Friction & Defect Log Schema
Log every issue with this structure so findings are reproducible and triageable:
| Field | Description |
|---|---|
| Step # | Sequential first-run step number |
| Screen | Screen/route name or description |
| Device/OS | iOS 17 / Android 14, device or simulator |
| What I did | Exact tool actions (taps, typed input, swipe, deny) |
| Expected | What a clean new-user flow should do |
| Actual | What actually happened on the device |
| Screenshot | Saved filename via mobile_save_screenshot |
| Friction or Defect | Friction (slows/confuses) vs Defect (broken/wrong) |
| Severity | Critical / High / Medium / Low (see Calibration) |
| Confidence | Confirmed / Likely / Speculative |
| Fix | Concrete, implementable recommendation |
Calibration
Severity
- Critical — First-run crash; signup/auth broken so a new user cannot create an account; a permission deny dead-ends or crashes the new user; the core valuable action is unreachable on a fresh account.
- High — A permission fires on cold start (tanking opt-in) or permissions are batched on launch; onboarding cannot be skipped; a confusing dead-end where a new user would plausibly quit; signup validation so unforgiving that a real user would abandon.
- Medium — Too many onboarding/signup steps; weak or missing empty-state guidance; permission asked without priming but in a recoverable spot; slow first-frame.
- Low — Copy/polish, minor inconsistency, cosmetic empty-state styling.
Confidence
- Confirmed — Reproduced live with screenshots/crash logs in this run.
- Likely — Strong evidence but one variable unverified (e.g. couldn't fully reproduce on second platform).
- Speculative — Inferred behavior you could not directly trigger; say so.
Anti-hallucination guard
- Actually reset state. If you did not
mobile_uninstall_app(or clear data) before launching, you are auditing an onboarded session and your findings are invalid — redo it. State the reset action you took. - Note the exact moment each permission fires — step number and screen — not a general impression. "Permissions seem fine" is not a finding.
- The work is completing signup and reaching first value, not viewing screens. If you stopped at "the signup form looks reasonable," you didn't do the audit. Submit it, recover from an error, and land in the app.
- Report only what the device showed. If a flow couldn't be reached (e.g. needed a real SMS code), mark it Speculative and say why — don't assume it works.
Output Format
Executive summary — One tight paragraph: taps-to-first-value, which permissions fired and exactly when (cold start vs in-context), any first-run crashes, count of Critical/High issues, and the build/device/OS tested. Lead with the verdict: is the first-run experience launch-ready for a new user?
Numbered sections — Findings grouped under the checklist headings above (Cold-Start & Install, Onboarding Flow, In-Context Permission Prompts, Account Creation / Auth, Time-to-First-Value, New-User Empty States).
First-run timeline table — Step-by-step chronology of the cold session:
| Step | Action (tool) | Screen | Permission fired? | Screenshot | Note |
|---|
Friction / Defect Log — The full table using the schema above, sorted by severity.
Prioritized Fix List — Ordered Critical → Low, each with the one-line concrete fix and the step/screen it addresses, so engineering can work top-down before launch.