NewiPhone Duo, live in your browser. Try it →
Vibeview
Pricing
Testing · Maestro import

Bring your Maestro flows to VibeView

Rokas Kašinskas — Co-founder, VibeViewPublished 2026-10-11Updated 2026-10-13

Moving test tools usually means rewriting your tests, so most teams don’t. A Maestro import keeps the work you’ve already done: your flows become VibeView tests in one upload, and your YAML files stay exactly as they are.

What you get is a test you can read. tapOn: { id: login_button } becomes the step Tap the element with id “login_button”, so anyone on the team can see what a test does and change it without learning YAML.

Preview first

Nothing is saved until you’ve seen what the import will create.

  1. On the Tests page, click Create test, then Import Maestro flows at the bottom of the dialog.
  2. Choose the file, the app to import into and, optionally, a group.
  3. Click Preview. Each test is listed with its number of steps, its setups, how it starts and every command that was flagged. Show steps lets you read them.
  4. Untick any test you don’t want, then click Import.
The Import Maestro flows dialog after Preview: the file add-item.yaml, the app Kitlist (iOS), one test 'Add an item to the Lisbon trip' with 5 steps and the start state Clean app data, a Needs rewrite line for a runScript command, and an Import 1 test button.
The preview lists each test, how it starts and every flagged command before anything is saved.

If a test with the same name already exists, the new one is imported as “Name (imported)”, so nothing is overwritten.

Prefer the terminal? The CLI does the same, with --dry-run for the preview:

vibeview import-maestro .maestro --app <app-id> --dry-run
vibeview import-maestro .maestro --app <app-id> --group "Smoke"

How commands become steps

Each command becomes a step that reads the way you would explain it to a tester. Some of the most common:

MaestroIn VibeView
tapOn: "Sign in"Tap “Sign in”
tapOn: { id: login_button }Tap the element with id “login_button”
inputText: "Lisbon"Type “Lisbon”
assertVisible: "Welcome"Verify “Welcome” is visible
assertWithAI: { assertion: "The cart is empty" }Verify the cart is empty
scrollUntilVisible: { element: "Save" }Scroll down until “Save” is visible
extendedWaitUntil: { visible: "Synced", timeout: 15000 }Wait until “Synced” is visible (up to 15 s)
pressKey: EnterPress Enter

An element’s id stays in the step, so the step still points at exactly the same element. The full table covers taps by position, swipes, random input, links, orientation and more.

How a test starts

launchApp and clearState at the start of a flow don’t become steps. They set how the test starts:

At the start of the flowStart state
launchAppRestart the app
launchApp with clearState: true, or clearStateClean app data
launchApp with stopApp: falseWhere the last test stopped

Later in a flow, launchApp becomes the step “Restart the app”.

Setups and test data

Shared flows keep working the way you built them:

  • A runFlow at the start of a flow becomes a setup that runs Before this test, such as a sign-in. A setup used by several flows is imported once and shared.
  • A runFlow later in the flow has its steps copied into the test, as does one that passes env values.
  • ${NAME} becomes test data. The step refers to {{NAME}}, and values from env: or a default such as ${NAME || "value"} become its starting value.
  • Passwords become secrets. Names like PASSWORD, API_KEY or authToken are stored as secret test data, never shown again and never sent to the AI. Check anything with a less obvious name, such as SESSION_COOKIE, under App notes & data after the import and tick Secret.

What gets flagged

The preview lists every command that needs your attention, with where it sits in the flow:

  • Needs rewrite: VibeView can’t run this one, so no step was made. That covers scripts (runScript, evalScript, assertTrue; VibeView never runs JavaScript from an upload), conditional flows (when:), open-ended loops, clipboard commands and a runFlow file missing from the upload. A VibeView test runs the same steps every time, so write the condition into a step instead: If “Not now” is shown, tap it.
  • Check: a step was made, but read it first. Regular-expression selectors and taps or swipes at pixel coordinates land here, because they depend on the screen.
  • Not imported: nothing to do. takeScreenshot isn’t needed because every step of a run keeps a screenshot, and screen recording isn’t needed because every run has a video.

TV flows import too. On Apple TV, Android TV and Roku the remote moves the focus, so a tap at a screen position or a swipe is flagged with a suggestion such as “Select …” or “Press Left on the remote”, and pressKey: Enter becomes “Press Select on the remote”.

After the import

An imported test has no recorded taps yet, so on its first run the AI agent (beta) carries out each step, billed like any other AI run. Once a run passes, VibeView saves the route, and later runs replay it without the AI (Tests that stop paying for AI). If you’d rather skip the AI entirely, open the test and record it once.

Good to know

  • Up to 5 MB per upload, 256 KB per flow, and 200 flows in a .zip.
  • YAML anchors and aliases (& and *) are refused. Expand them and upload again.
  • A workspace config.yaml is skipped. Tags and execution order don’t apply in VibeView.

Frequently asked questions

Do I need Maestro installed?

No. The import reads the files, and runs happen on VibeView’s live devices.

Does it run my JavaScript?

No, never. Scripts are flagged Needs rewrite, and VibeView never runs scripts from an upload.

Can I keep running Maestro too?

Yes. The import copies what it reads; your files are unchanged.

Try it yourself

Open a live iOS simulator, Android emulator, Apple TV, Android TV or Roku in your browser.

Start free