Skip to main content
alpha · API may change before 1.0

One command. Every device. Parallel.

maestro-parallel orchestrates Maestro flows across every connected iOS simulator, iOS device and Android phone — auto-detects your build pipeline, runs flows in parallel, merges the JUnit. No glue scripts.

$ deno install --global --reload --allow-all -n maestro-parallel \
  jsr:@kaln/maestro-parallel/cli
maestro-parallel
  maestro-parallel

  configuration ──────────────────────────────────────────╮
  cwd: /Users/tom/devenv/cms4/admin_mobile/Shoptet                                            
  build: expo run:* (Release / release) via pnpm                                          
  buildMode: release                                                                   
├────────────────────────────────────────────────────────────────────╯

  Build & install
   expo run:android done (63.9s)
   expo run:ios done (86.4s)

  Maestro tests
  [ios:iPhone 17 Pro] [Passed] login_flow (15s)
  [and:Pixel 6a] [Passed] login_flow (29s)

  4/4 devices passed

Why mp

Build once. Install many.

mp builds your release artifact on the first device of each platform group, then reuse-installs the same .apk / .app on every other device. One xcodebuild run for five sims.

Auto-detected build pipeline.

Rock → EAS local → expo run:* — mp picks whichever your project uses. Override declaratively with one line of config when projects ship multiple.

Real parallel execution.

Android Maestro processes run in parallel, iOS sequentially (safe default) or opt-in --shard-all. Staggered process starts dodge Maestro 2.5.x log-dir races.

Picker that remembers.

TTY checklist with last-selection memory. Skip with --all in CI. Broken adb devices and missing iOS sim runtimes are surfaced with actionable hints, not stack traces.

Merged JUnit, ready to ship.

Every device writes its own report.xml plus a merged file at the top level. CI parsers see one suite — pass/fail aggregates across platforms.

Hooks you can write.

Auto-detect not enough? Drop a buildAndInstallFirst into your config. The runner does the reuse-install fan-out, signal handling, log files and JUnit merge for you.

Ready to stop running Maestro five times?