
Maestro CLI 2.7.0 is out. Leading the release: your AI agent can now debug a failing Cloud run on its own. Ask it why a run failed, and it pulls that run’s recording, logs, and failure-point view hierarchy itself, explains the root cause, and proposes a fix, all in one conversation. Plus a redesigned per-flow debug bundle and a broad wave of iOS, Android, and Web reliability fixes.
Maestro MCP
Ask your agent to explain a failed Cloud run (new describe_cloud_run MCP tool). Give your AI agent (Claude, Cursor, etc.) a run_id and it fetches that run’s screen recording, maestro.log, and device logs (simulator, xctest, emulator) as short-lived signed URLs, plus, when your agent asks for it, a full artifacts archive that also holds a screenshot of every step and the failure-point view hierarchy. The agent reads them, explains the root cause, and proposes a fix. No dashboard trip. Requires Maestro CLI 2.7.0, works on finished runs, and returns files for runs recent enough to have Cloud-stored artifacts.
maestro chat is discontinued. Use Maestro MCP instead, which plugs into your AI agent and covers everything the old chat command did. maestro chat now prints a local sunset message; maestro chat --ask "…" exits 1 so scripted CI usage surfaces the change.
Per-flow debug artifacts
One folder per flow with everything you need to debug a failure. Each run produces a flat bundle with a typed, versioned manifest.json, commands.json, a screenshot of the failing step, the view hierarchy on failed and warned steps, device logs, and any crash or ANR report. Point one script or one agent at manifest.json and read a stable, documented structure.
View hierarchy is now a separate artifact rather than inlined into commands.json. One demo commands.json went from ~246 KB to ~4 KB, so the file stays readable.
Human-readable step filenames. Screenshots and hierarchy files are named like step-003-tapOnElement-submit.png, 1-based and slugged, so you can scan a folder and know which step is which.
Device logs and crash/ANR reports are captured out of the box, both locally and in Cloud. On iOS, Maestro now waits for the async .ips crash report to be written before collecting it, so crash-report.txt is actually there when the app crashed.
maestro.log is no longer written empty on some setups. On hosts with certain logging configurations the run log used to come out empty; it now captures as expected.
--test-output-dir now contains the full bundle, including manifest.json, not just screenshots.
Android
Type any Unicode text with inputText (Arabic, Chinese, Japanese, Korean, emoji, mixed scripts), with no external APK. Maestro’s own IME is bundled inside maestro-android.
A stalled WebView socket no longer hangs the flow. On Android, a view-hierarchy read over a stalled Chrome DevTools socket is now bounded by a 10s timeout and falls back to a native-only hierarchy, instead of blocking the flow for minutes.
Native (SIGSEGV) crashes are detected and reported. React Native / Hermes crashes are now parsed from tombstones and attributed to the right package, and land in the run’s crash report instead of surfacing as a generic element-not-found.
Cloud screen recordings on Android below API 34 run for the full flow duration. They used to stop at exactly 180s; Maestro now records through the extended screenrecord binary on Cloud devices that carry it.
A dropped connection is reported as a device error, not a test failure. If the ADB connection dies mid-flow, Maestro now surfaces it as a device-connection error across launchApp, clearState, and setPermissions, so a dropped connection isn’t blamed on your test.
iOS
Taps right after scrollUntilVisible land on the settled element. tapOnElement re-resolves the target until its position is stable when the driver can’t confirm scroll settling, so post-scroll taps don’t hit stale coordinates. The re-stabilisation only runs on taps that follow a scroll, so ordinary taps stay fast.
Failed iOS UI checks tell you what actually went wrong. When a query like swipeV2 times out, Maestro now surfaces the real underlying message instead of a generic “Unknown error”, so you can see the cause and fix it.
Long iOS flows stay reliable on busy screens. Hierarchy handling on large screens keeps long runs from stalling.
A transient iOS UI error mid-flow no longer aborts the run. When an element goes stale during a screen read, Maestro recovers and keeps going instead of failing the flow.
False crash detection on app launch is fixed. An app sitting on its splash screen with no foreground hierarchy yet is no longer declared crashed.
iPad and iOS 26 home screens are inspectable in Studio.
Region-specific locales load the right strings. Run with a locale like en_GB and your app now shows British English instead of falling back to US English, so an assertion on “favourite” passes instead of unexpectedly seeing “favorite”.
setOrientation no longer crashes on unsupported orientations. Requesting PORTRAIT_UPSIDE_DOWN on a device that doesn’t allow it now fails gracefully instead of crashing the flow.
launchApp honors its timeout when the app crashes on launch. A missing-framework crash used to hang indefinitely; it now fails within the timeout.
Simulator recording duration matches across players. The .mov metadata is corrected in-place (no re-encode), so Chrome, QuickTime, and other players agree on the duration.
Web / Flutter web
id: selectors work in Flutter web. tapOn: { id: "login_button" } now resolves against Flutter’s flt-semantics-identifier attribute set by Semantics(identifier: ...), so you get a stable, code-defined selector for canvas-rendered UI.
CSS selectors match elements with wrapper children. A button wrapping two <span>s now matches, and selectors containing quotes no longer break.
Remote browsers without screen recording no longer break the first command. On drivers like Browserbase, a session that can’t set up recording used to fail on its first real step. Maestro now fails fast and clearly at recording setup, and empty (0-byte) recording files are dropped from the manifest instead of showing up as broken artifacts.
More resilient web driving. Transient JavaScript errors now retry automatically, and unusual element-position data during page navigation no longer trips up a flow.
CLI & tooling
AI HTML reports handle / in flow names. A flow whose name contains a slash no longer crashes the run; the filename is sanitized.
--verbose works consistently across commands and no longer prints stray debug tokens.
Concurrent Maestro runs don’t clobber each other’s debug logs. Log archival at run start is race-safe, so one run’s cleanup can’t delete another run’s live working directory.
Console output on Windows, and strings containing special markup characters such as #, print correctly.
For contributors
Driver binaries are auto-updated on main instead of gated on PRs, so you no longer need to commit rebuilt drivers with your change. E2E on macOS runs in ~3m on warm caches.
Update to 2.7.0
Update the Maestro CLI to get everything above:
curl -fsSL "https://get.maestro.mobile.dev" | bash