All example apps use AppReveal for E2E testing. AppReveal is a debug-only in-app MCP server that exposes 43 native-control tools (tap, type, scroll, screenshot, state, network) over the local network — Playwright for native apps.
iOS — Swift Package Manager:
.package(url: "https://github.com/UnlikeOtherAI/AppReveal.git", from: "0.2.0")#if DEBUG
AppReveal.start()
#endifAndroid — Gradle:
debugImplementation("com.appreveal:appreveal")
releaseImplementation("com.appreveal:appreveal-noop")if (BuildConfig.DEBUG) {
AppReveal.start(this)
}- Time displayed — recognition timestamp is visible on screen and updates.
- Identification result shown — matched user name (or "unknown") appears within the latency window after a face is detected.
- Guided registration flow — fixed 6-photo guided capture completes in order → embedding saved → user appears in list.
- Recognition flow — registered user triggers login event, UI reflects match.
- Debug metrics — similarity score, FPS, and latency are all visible in the debug example app.
- Screen keys:
section.screen— e.g.registration.capture,recognition.live,debug.metrics - Element IDs:
screen.element— e.g.recognition.timestamp,recognition.matched_user,debug.similarity_score,debug.fps,debug.latency_ms
All interactive and display elements must have accessibility identifiers (iOS) or resource ID/view tag (Android) set to these names.
Tests are MCP-driven — run by Claude Code with AppReveal connected against a live simulator/emulator or real device. No separate test framework is needed; the MCP tools are the harness.
Full click-through tests must pass on both platforms before any PR merge on the example apps.
For guided registration, coverage must include:
- pose order:
left_top->top->top_right->bottom_right->bottom_left->straight - active progress segment pulses before capture
- completed segments fill after capture
- low light blocks capture with the required copy