Skip to content

config.yaml

config.yaml at the project root holds workspace defaults; CLI flags win. It travels with the project — in the desktop app, editing a Project setting edits this file, and it ships to the team via Publish.

flows: [flows/] # where tests live
includeTags: [smoke] # default tag filter
excludeTags: [wip]
env: # available as ${VAR} inside flows
STAGING_URL: https://staging.example.com
ai: # enables assertWithAI / --analyze
endpoint: https://ai.internal:8000/v1
model: qwen3-coder

Real values — credentials, anything that must not be committed — live in a .env file (plain KEY=VALUE lines, kept in .gitignore) next to the flow or project root. Flows and config.yaml are shared, so they carry placeholders; .env stays local. An environments: block names alternative value sets:

environments:
staging: { URL: https://staging.example.com }
prod: { URL: https://example.com }

Values resolve weakest to strongest: params: defaults < flow env: < config env: < .env < --env-set NAME < --env-file FILE < -e KEY=VAL. The nearest config.yaml and .env are found by walking up from the flow, and the same chain applies in test, run, and the MCP run_flow.

env.STAGING_URL is the address the desktop’s Record uses as the project’s Staging target: recorded flows start with openLink: ${STAGING_URL}, so repointing staging is a one-line change for every test at once.