Maestro

Gmail screen with every element outlined in dashes and Inbox selected, next to a list of tapOn commands

YAML flows driven through the accessibility tree

Maestro is an open-source framework for UI and end-to-end testing of Android, iOS and web apps. Each test, called a flow, is a YAML file listing commands such as launchApp, tapOn, inputText and assertVisible. The CLI reads that file as is, so you can edit a flow and run it again without compiling anything.

Maestro treats the app as a black box. It reads the accessibility tree that screen readers rely on and simulates touches and typing at the device level, with no access to the source code.

appId: com.android.contacts
---
- launchApp
- tapOn: "Create new contact"
- tapOn: "First Name"
- inputText: "John"
- tapOn: "Save"

Screen-aware waits and an MCP server in the CLI

  • Built-in waiting: the engine waits for the UI to settle or for content to load before it acts, so flows carry no hand-placed sleep() calls.
  • One syntax across frameworks: React Native, Flutter, native Android and iOS, Ionic and hybrid apps all take the same commands. The README says Meta uses Maestro to test React Native itself, and Expo backs it as its preferred E2E platform.
  • MCP server included: maestro mcp ships with the CLI. Through it, Claude Code, Cursor, Codex or another MCP client drives the app on an emulator, a simulator or an Android device, checks the change it just made, and can write a YAML flow it reruns until it passes, then leave it in the repo as a CI test.
  • Debuggable CI output: JUnit and HTML reports, a screenshot before every step, and the view hierarchy attached when a step fails.

Simulator-only on iOS, beta on the web

No physical iPhones. iOS runs only on simulators managed by Xcode, which means a Mac. Since 2.11.0 the CLI no longer lists plugged-in iPhones and stops early with "Physical iOS devices are not yet supported". Android works on emulators and physical devices alike.

Java 17 required, despite the "no dependencies" pitch. The README promises an install with no drivers, SDK or dependencies, yet the CLI needs Java 17 or later. The known-issues page warns that very old or very new Java versions can make it fail.

Web is in beta, on Chromium only. The documentation labels web support as beta. Chromium is the only supported browser, in a copy Maestro downloads on first run, with en-US as the default locale and preset screen dimensions.

Selectors depend on accessibility data. On Android, the known-issues page lists WebView content Maestro cannot always see. On iOS, the SwiftUI guide recommends .accessibilityIdentifier() for icons and custom controls.

Free but closed-source Studio, paid Cloud. The repository is Apache-2.0, but Maestro Studio Desktop, the visual IDE, is not in it: Studio is free without being open source. Maestro Cloud, paid after a 7-day trial, runs hundreds of tests in parallel on dedicated infrastructure.

Built on Appium and Espresso lessons, by its own account. The README names Appium, Espresso, UIAutomator, XCTest, Selenium and Playwright as predecessors, plus three early choices: drive the app through the accessibility layer, install as a single binary with no drivers or SDK, and keep every test a flat list of YAML commands.

Nine releases in six months, with breaking changes in minor versions. Version 2.5.0 came out on April 27, 2026, and nine releases have followed, up to 2.12.0 on October 26. The 2.12.0 changelog flags a breaking change: a scroll speed outside 0-100 now fails the flow instead of quietly falling back to the default.