Skip to content
NewiPhone Duo, live in your browser. Try it →

Testing Import Maestro flows

Import Maestro flows

Import Maestro flows from one YAML file or a zipped flows folder: each command becomes a plain-language step, and anything unsupported is flagged.

Bring the flows you wrote for Maestro into VibeView. Each Maestro command becomes a plain-language step you can read and edit, and anything VibeView can’t carry over is listed for you to rewrite. Importing uses no AI and costs nothing.

Flows for phone and tablet apps (iOS, Android) and for TV apps (Apple TV, Android TV, Roku) import the same way. Maestro’s remote d-pad keys become remote presses. TV devices have no touch, so some commands need a rewrite there (see TV apps).

What you can upload

  • One flow file (.yaml or .yml), or
  • a .zip of your flows folder (for example your .maestro folder), subfolders included.

An upload can be up to 5 MB, each flow file up to 256 KB, and a .zip can hold up to 200 flows. Flows that use YAML anchors or aliases (& and *) are refused: expand them and upload again.

Every flow that no other flow runs becomes a test. A flow that other flows run with runFlow becomes a setup (“Before this test”) or has its steps copied into the tests that run it (see Subflows). A workspace config.yaml is skipped: tags and execution order don’t apply in VibeView. If you upload a single flow that runs other flow files, upload the whole folder as a .zip instead, or the steps from those files are missing.

Import from the dashboard

  1. Open Tests, click Create test, then Import Maestro flows at the bottom of the dialog. (You need the developer role or above.)
  2. Choose the file, the app to import into and, optionally, a group. The list includes the groups of apps linked to it as the same product, of the same kind (phone and tablet, or TV).
  3. Click Preview. Nothing is saved yet. Each test is listed with its number of steps (open Show steps to read them), its setups, how it starts, and every command that was flagged.
  4. Untick any test you don’t want, then click Import.

After the import the dialog shows what was created, the flagged commands of each created test, and the status of each test data value: created, kept (you already had a value for that name), or still needing a value. Click Done to close it.

A test whose name is already used in the app is imported as “Name (imported)”.

Import from the CLI

# Preview a folder without saving anything
vibeview import-maestro .maestro --app <app-id> --dry-run

# Import into a group
vibeview import-maestro .maestro --app <app-id> --group "Smoke"

See import-maestro in the CLI reference.

How commands become steps

MaestroIn VibeView
tapOn: "Sign in"Tap “Sign in”
tapOn: { id: login_button }Tap the element with id “login_button”
tapOn: { text: "Buy", index: 2 }Tap “Buy” (the 3rd match)
tapOn: { below: "Email" } (also above, leftOf, rightOf, childOf, containsChild)Tap the element below “Email” (or above, left of, right of, inside, or one that contains …)
tapOn: { text: ".*Continue.*" }Tap the element containing “Continue”
tapOn with optional: trueTap ”…” if it is shown
tapOn: { point: "50%,90%" } (phones and tablets)Tap the screen at 50% across and 90% down
doubleTapOn, longPressOn (phones and tablets)Double-tap …, Long-press …
inputText: "Lisbon"Type “Lisbon”
inputRandomEmail, inputRandomNumber, inputRandomText, inputRandomPersonName, …Type a random email address, a random number, random letters, …
eraseTextClear the text in the focused field
hideKeyboard, back, scrollHide the keyboard, Go back, Scroll down
pressKey: Enter (also home, lock, backspace, tab, remote d-pad keys)Press Enter
scrollUntilVisible: { element: "Save" }Scroll down until “Save” is visible
swipe: { direction: LEFT } (phones and tablets)Swipe left
assertVisible: "Welcome"Verify “Welcome” is visible
assertNotVisible: "Error"Verify “Error” is not visible
assertWithAI: { assertion: "The cart is empty" }Verify the cart is empty
extendedWaitUntil: { visible: "Synced", timeout: 15000 }Wait until “Synced” is visible (up to 15 s)
waitForAnimationToEndWait until the screen stops changing
openLink: https://…Open the link https://…
setLocation, setOrientation (phones and tablets)Set the device location to …, Rotate the device to …

An element’s Maestro id is kept in the step, so the step says exactly which element to use.

TV apps

On Apple TV, Android TV and Roku the focus moves with the remote, so commands that need a finger are not turned into steps. They are flagged Needs rewrite, with a suggestion such as “Select …” or “Press Left on the remote”:

  • taps at a screen position (point), swipe, longPressOn and doubleTapOn;
  • pressKey: lock, setLocation and setOrientation;
  • pressKey: tab.

pressKey: Enter becomes “Press Select on the remote”. On Roku, openLink, pressKey: home and eraseText with no count are also flagged Needs rewrite: a Roku test stays inside your channel, and a field can’t be cleared in one step. eraseText with a count becomes “Delete the last N characters in the focused field”.

How a test starts

launchApp and clearState at the start of a flow set how the test starts instead of becoming steps:

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

If a flow asks for several, the strongest one wins. Later in a flow, launchApp becomes the step “Restart the app”.

Subflows

  • A runFlow file at the start of a flow, without env, becomes a setup that runs before the test. Several setups keep their order, and a setup used by several flows is imported once.
  • A runFlow later in the flow, or one that passes env values, has its steps copied into the test.
  • runFlow with commands: has its commands copied in.
  • runFlow with when: platform: is kept when the platform matches the app (Apple TV counts as iOS and Android TV as Android), and left out otherwise. On a Roku app it is flagged Needs rewrite, because Maestro has no Roku platform to compare with.
  • repeat with times: up to 10 has its steps repeated that many times.

A setup can’t have setups of its own, so a subflow that runs other subflows becomes one setup with all of their steps. See Setup steps.

Variables and test data

A value written as ${NAME} becomes {{NAME}} in the step, and NAME is added as test data. Values from a flow’s env: section, and defaults written as ${NAME || "value"}, are used as the starting value of that test data. A value a runFlow passes in env: also becomes a {{NAME}} reference rather than being written into the step, so a password never appears in step text.

  • A name that is, or has a part that is, password, pass, passwd, pwd, pin, secret, token, otp, key, apikey, credential or credentials (split at underscores and at camelCase capitals, any case, so LOGIN_PASSWORD, userPassword, SMS_OTP, API_KEY and userToken count, but KEYBOARD_LAYOUT doesn’t) is stored as a secret value and is never shown again, in the preview or afterwards. Other credentials are not recognized by name: a SESSION_COOKIE, for example, is stored as an ordinary value and shown in the preview. After importing, open App notes & data, edit that value and tick Secret.
  • A name your app already has keeps its current value.
  • If different flows give the same name different values, the first is used and the preview flags the name so you can check it.
  • Anything that needs a value you must add yourself (${output.x} and other values VibeView can’t work out) is flagged. Add missing values under App notes & data after importing.

What gets flagged

Each flagged command is listed in the preview with where it is in the flow.

Needs rewrite. No step was created; write the step yourself if the test needs it:

  • runScript, evalScript, assertTrue and other JavaScript. VibeView never runs scripts from an upload.
  • Conditional flows: runFlow with when: visible, notVisible or true. A VibeView test runs the same steps every time; write the condition into a step instead, for example: If “Not now” is shown, tap it.
  • repeat with while:, or more than 10 times.
  • copyTextFrom, pasteText, setClipboard, extractTextWithAI.
  • travel, addMedia, airplane mode and dark mode changes, and a clearKeychain command on its own.
  • clearState or stopApp in the middle of a flow, and launching a different app.
  • onFlowComplete: VibeView tests have no steps that run after the test.
  • A runFlow file that isn’t in the upload.
  • Commands VibeView doesn’t know.
  • The TV commands listed under TV apps.

Check. A step was created, but read it before you rely on it: selectors that are regular expressions, taps and swipes at pixel coordinates (they depend on the screen size), selector fields such as width or traits, values VibeView can’t work out (${output.x}, Maestro’s built-in variables), remote media keys, permission settings, launch arguments and clearKeychain: true on launchApp (the launch is imported, the keychain is not cleared), test data names given different values, and flows written for a different app id.

Not imported. Nothing to do: takeScreenshot (every step of a run keeps a screenshot), screen recording commands, stopApp right before launchApp, and retry (its commands are imported once, without the retry).

After importing

Imported tests have no recorded actions, so the AI (beta) carries out each step when the test runs, billed like any other AI run. A No AI run has nothing to replay until a Smart run has saved a learned path, so it is refused for a test with neither; after that, No AI replays the learned path and marks any step without recorded actions as not checked. Open a test to edit its steps, attach or reorder its setups, or record it.

Last updated 16 Oct 2026 Something wrong on this page? Tell us

Search the docs