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 (
.yamlor.yml), or - a
.zipof your flows folder (for example your.maestrofolder), 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
- Open Tests, click Create test, then Import Maestro flows at the bottom of the dialog. (You need the developer role or above.)
- 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).
- 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.
- 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
| Maestro | In 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: true | Tap ”…” 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, … |
eraseText | Clear the text in the focused field |
hideKeyboard, back, scroll | Hide 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) |
waitForAnimationToEnd | Wait 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,longPressOnanddoubleTapOn; pressKey: lock,setLocationandsetOrientation;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 flow | Start state |
|---|---|
launchApp | Restart the app |
launchApp with clearState: true, or clearState | Clean app data |
launchApp with stopApp: false | Where 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
runFlowfile at the start of a flow, withoutenv, becomes a setup that runs before the test. Several setups keep their order, and a setup used by several flows is imported once. - A
runFlowlater in the flow, or one that passesenvvalues, has its steps copied into the test. runFlowwithcommands:has its commands copied in.runFlowwithwhen: 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.repeatwithtimes: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,credentialorcredentials(split at underscores and at camelCase capitals, any case, soLOGIN_PASSWORD,userPassword,SMS_OTP,API_KEYanduserTokencount, butKEYBOARD_LAYOUTdoesn’t) is stored as a secret value and is never shown again, in the preview or afterwards. Other credentials are not recognized by name: aSESSION_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,assertTrueand other JavaScript. VibeView never runs scripts from an upload.- Conditional flows:
runFlowwithwhen:visible,notVisibleortrue. 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. repeatwithwhile:, or more than 10times.copyTextFrom,pasteText,setClipboard,extractTextWithAI.travel,addMedia, airplane mode and dark mode changes, and aclearKeychaincommand on its own.clearStateorstopAppin the middle of a flow, and launching a different app.onFlowComplete: VibeView tests have no steps that run after the test.- A
runFlowfile 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.