CLI · Open source · MIT

v0.13.1

Conductor

Give Claude hands. Let it drive your app.

A token-efficient CLI for mobile and web UI testing, built for AI agents. A TypeScript reimplementation and partial fork of Maestro that bundles its own native drivers — no external CLI, no setup friction, no nonsense.

Install

npm install -g @houwert/conductor

That's it. Conductor is a pure CLI — no Claude Code plugin or skill is registered. Wire it into your agent through a custom CLAUDE.md, a project skill, or a slash command.

Highlights
🎯

Built for agents

Output is short and human-readable by default; opt into --json when you need machine-parseable results. Designed to be cheap on tokens.

📱

iOS, Android, and web

Drive iOS simulators, Android emulators, and Playwright-controlled browsers through one CLI. Same commands, three platforms.

👀

Inspect and assert

Read the live view hierarchy with accessibility metadata, take screenshots, and assert visibility — all without writing flow YAML.

🧵

Multi-device parallel testing

Run flows on every booted device at once with run-parallel, or hand each agent its own device through a shared pool with file-based locking.

📦

Drivers bundled

No Maestro CLI, no extra setup. Native iOS, Android, and web drivers are downloaded on first use into ~/.conductor/drivers — and Argus ships its own copy out of the box.

🪵

Logs out of the box

Stream React Native Metro logs, native simctl/logcat output, or browser console events with a single conductor logs command.

  1. v0.13.1

    Fixes

    • Fix conductor memory using stale session appId
  2. v0.13.0

    Highlights

    • Drop the bundled Claude Code plugin and skill. Conductor is now a pure CLI — no postinstall plugin registration, no `SKILL.md`, and no `install-plugin` / `install-skills` / `cheat-sheet` commands. Wire Conductor into your agent however you like (a custom `CLAUDE.md`, a project skill, a slash command); use `conductor --help` for the full command reference.
    • Improve Metro log discovery and simplify the `logs` command. Metro targets are now resolved deterministically per device — no more `--metro`, `--metro-port`, or `--target` flags. The `--source` flag is now a filter (`metro` | `device`); when omitted, both sources stream together. `--list` prints only the Metro targets bound to the current device.
  3. v0.12.3

    Fixes

    • Fix element frames returned from `inspect` / `capture-ui` being in window-local coordinates when the iOS app runs windowed (iPadOS Stage Manager, Slide Over). The 0.12.2 fix assumed XCUIElement snapshot frames were already in screen space and removed all offset math, but snapshots are window-local in windowed mode — both `snapshot().frame` and `XCUIApplication.frame` report `(0, 0)` as the window origin. Resolving via `attributesForElement:` also fails because the AX daemon's per-PID attribute map isn't populated on-demand. The working source is SpringBoard's own snapshot (SpringBoard is always fullscreen, so every descendant's frame is screen-space): we snapshot it once per inspect, find the descendant whose dimensions match the foreground app's window, and translate every frame by that origin. Translated frames are also clipped to the window bounds, so views the window compositor hides — scrolled-off cells, sibling containers the app keeps measured but not visible — no longer leak into `tap-on` hit-testing or out-of-window outline overlays. Outlines and tap coordinates now line up with the underlying controls regardless of window position.