Automated Mode
Automated mode reads a conalyz.yaml file that describes how to reach each screen, then drives the app and analyses every screen without any human input.
Running
conalyz auto
How it works
For each screen defined in conalyz.yaml, Conalyz executes the steps: list in order. Steps are run exactly as written — analyse captures the screen, navigation actions (tap, type, back, swipe, scroll_to, wait_for, delay) drive the app.
── Login ───────────────────────────────────
Touch targets ✅ no violations
Contrast ❌ 3 violation(s)
→ Violation at [4]: contrast 4.27:1 < 4.5:1 ...
Focus ❌ 1 violation(s)
→ "Password" — not reachable by keyboard or switch access
Labels ✅ no violations
Vague labels ✅ no violations
Disabled ✅ no violations
Sliders ✅ no violations
Saved — 4 violations found on "Login"
→ type "user@example.com" into "Email"
→ type "••••••••" into "Password"
→ tap "Sign in"
── Home ────────────────────────────────────
→ delay 2.0s
Touch targets ✅ no violations
Contrast ✅ no violations
Focus ✅ no violations
Labels ❌ 2 violation(s)
Vague labels ✅ no violations
Disabled ✅ no violations
Sliders ✅ no violations
Saved — 2 violations found on "Home"
→ tap "Settings"
── Home (back) ─────────────────────────────
→ back
── Settings ────────────────────────────────
Touch targets ✅ no violations
Contrast ✅ no violations
Focus ✅ no violations
Labels ✅ no violations
Vague labels ✅ no violations
Disabled ✅ no violations
Sliders ✅ no violations
Saved — 0 violations found on "Settings"
─────────────────────────────────────────
Reports saved → conalyz_report.html | conalyz_report.json
3 screens · 6 total violations
─────────────────────────────────────────
Screens without an analyse step (like Home (back) above) are navigated through silently — no report entry is created.
Using a custom config file
By default, Conalyz looks for conalyz.yaml in the current directory. Use --config to point to any file:
conalyz auto --config flows/staging.yaml
conalyz auto --config ci_config.yaml
Platform support
Automated mode works on both Android (via ADB) and iOS (via idb and xcrun simctl). The same conalyz.yaml file works on both platforms without modification.
See the conalyz.yaml reference for platform-specific behaviour of individual actions.
Scrollable screens
When Conalyz detects scrollable content on a screen, it automatically performs multiple analysis passes — no changes to conalyz.yaml are required.
After the first pass, Conalyz checks whether scrolling reveals new content. If it does, it continues scrolling and analysing pass by pass until the end of the list is reached, then scrolls back to the top and combines all results.
── Scroll Test — ListView ──────────────────────────
Scrollable content detected — multi-pass analysis...
Saved — 5 violations found on "Scroll Test — ListView"
On iOS, the bottom detection message reads Bottom reached (stable) — this is normal behaviour. iOS scroll physics make it harder to detect the exact bottom, so Conalyz uses a conservative approach that may require one additional confirmation pass before stopping.
In manual mode, multi-pass scroll does not run automatically. Scroll through the screen yourself before typing the screen name at the prompt — items that are off-screen are not captured.
Working with tabs (TabBar)
Tab labels include position and total count when announced by TalkBack or VoiceOver. Conalyz uses this same format in steps::
| Tab title | Step to use in conalyz.yaml |
|---|---|
SingleChild (1st of 3) | tap "SingleChild Tab 1 of 3" |
ListView (2nd of 3) | tap "ListView Tab 2 of 3" |
Builder (3rd of 3) | tap "Builder Tab 3 of 3" |
- screen: Scroll Test — ListView
steps:
- analyse
- tap "ListView Tab 2 of 3"
If you are unsure of the exact label for a tab, run your app with flutter run and enable TalkBack (Android) or VoiceOver (iOS) — the screen reader will announce the exact label when you navigate to the tab. Alternatively, if a tap step fails, Conalyz prints all visible element labels so you can identify the correct one.
When to use automated mode
Automated mode is well suited for:
- CI pipelines — run on every pull request to catch regressions before they ship
- Full regression suites — cover every screen in the app without manual effort
- Repeatable audits — run the same flow on Android and iOS and compare results