Skip to content

.lazyenv/config.json

.lazyenv/config.json connects your repo to a store, a project, environments, and (optionally) provisioners.

It contains no secret values.

Add this for editor autocomplete:

{
"$schema": "https://raw.githubusercontent.com/methodacting/lazyenv/main/schemas/lazyenv.schema.json"
}
{
"$schema": "https://raw.githubusercontent.com/methodacting/lazyenv/main/schemas/lazyenv.schema.json",
"schemaVersion": 1,
"store": "infisical",
"projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"environments": ["dev", "prod"],
"defaultEnvironment": "dev",
"workspaceFolders": [
{
"path": ".",
"secretPath": "/",
"envFile": ".env.example",
"keys": ["DATABASE_URL", "JWT_SECRET"]
}
]
}
FieldPurpose
schemaVersionConfig schema version.
storeStore backend: infisical, doppler, bitwarden, onepassword.
storesOptional named store entries for multi‑store configs.
defaultStoreOptional name from stores[] used as default.
projectIdStore project identifier (UUID/name depending on store).
projectNameOptional label for humans.
organizationIdStore org/workspace identifier (required by some stores).
storeEnvOptional mapping of store config env var names (for targets and CI).
workspaceFoldersMonorepo mapping (one entry per .env.example).
environmentsAllowed environment names (for --env).
defaultEnvironmentDefault env when --env is omitted.
provisionersNamed provisioners available to the wizard.
provisionerRulesKey matching rules that select a provisioner and behavior.
devDev-only settings for port allocation and emitting derived vars into .env.local.
targetsOptional fan-out targets (github and store).
importsOptional cross-project key imports (compose/read-through only).

lazyenv init writes .lazyenv/config.json by scanning for .env.example files.

lazyenv keeps project-local metadata in .lazyenv/:

  • .lazyenv/config.json: project configuration
  • .lazyenv/provisioners/*.jsonl: browser recordings used by browser provisioners

Browser provisioners now use a shared browser block and an engine-specific steps block:

{
"kind": "browser",
"name": "my-browser-provisioner",
"label": "My Browser Provisioner",
"engine": "stagehand",
"browser": {
"startUrl": "https://example.com",
"userDataDir": "$XDG_STATE_HOME/lazyenv/chrome-profile",
"headless": false
},
"steps": {
"type": "stagehand",
"items": []
}
}

Playwright replay uses:

{
"engine": "playwright",
"steps": {
"type": "playwright-jsonl",
"file": ".lazyenv/provisioners/recording.jsonl"
}
}

Program provisioners may define an input object. Each key is an input field consumed by the provisioner command.

Supported field shape:

{
"prompt": "Field label",
"type": "string | select | multiselect",
"secret": false,
"env": "ENV_VAR_NAME",
"default": "optional-default",
"options": ["a", "b"],
"optionsFrom": {
"command": "node",
"args": ["scripts/list-options.mjs", "--for", "{{accountId}}"],
"cwd": "."
}
}

Notes:

  • optionsFrom is for select and multiselect fields.
  • optionsFrom command must print a JSON array (strings or { value, label, description?, disabled? }).
  • args can reference previously resolved inputs using {{inputName}}.

See: Program Provisioners.