config.toml, at the root of your store. It is plain TOML you can read and edit - but going through px0 config gets you validation, so a typo is caught when you set the key rather than during a run at 5pm on a Friday.
set checks the value against the key’s type and allowed values before saving:
px0 config unset <key> drops a stored override so it falls back to its default - not an error even if the key was never set, and the parent table is removed once it empties. px0 config get --help and px0 config set --help print the full key list.
Interactive helpers
Two settings have their own commands, because getting them wrong is expensive and worth verifying at the point of change.PATH status, takes a model name, and actually invokes the result before saving - so a typo’d model name or a missing API key surfaces here rather than mid-workflow. It never asks for or stores a model backend key; that stays with the harness CLI’s own login.
Model
A known harness name (
claude, gemini, pi, opencode) expands to its full command. Any other literal command works too - a wrapper script, a pinned path - and px0 appends the prompt as the final argument.
model.output_format. A harness is another program, and only some of them report what a call cost. auto asks for a structured envelope wherever px0 knows the flag for that backend, which is what turns a run’s token counts from px0’s own estimate into the numbers the backend was actually billed - px0 workflows health says which it is showing you. px0 adds no flags to a command it does not recognise, because the cost of guessing wrong is every run for that backend failing; and if a backend turns out to be older than the flag, the call is retried once without it rather than failing.
model.agent_loop. builtin is px0’s own tool-call loop, capped at runs.max_tool_turns. mcp hands the workflow’s tools to the harness over MCP and lets it run its own loop, which removes that cap and is what a workflow needing many steps wants. auto does that wherever px0 has verified flags for the configured harness and falls back otherwise. Everything px0 enforces still holds either way - the allowlist, dry-run stubbing, held-back writes, and the event stream - because in MCP mode that enforcement moves into the scoped server rather than disappearing.
px0 doctor reports when model.agent_loop is mcp but the configured harness has no verified way to be handed tools, since every run with tools would otherwise fail.Brain
Reindex after changing
brain.path, brain.private_folder, or brain.ignore. px0 init writes brain.path as an absolute path under the store it just created. See The brain.
Output
A workflow’s
output.path is always resolved inside this directory, and a path that tries to escape it is rejected. See Workflow files.
Connectors
ca_bundle applies to every outbound request px0 makes, not just Composio - a brain fetch behind a TLS-inspecting proxy uses it too. An explicit SSL_CERT_FILE always wins over it, and px0 never silently disables verification.
Tools
See Tools and Approvals.
Notify
What happens when a scheduled run fails. A workflow’s ownon_failure block overrides all three.
See Status.
Runs
How a run is retried, how far it may go, and what it may spend.
Each attempt writes its own run record, so
px0 runs list shows the failures that led to a success rather than hiding them. The per-workflow cap is 10.
The turn ceiling. In px0’s own loop every turn resends the whole conversation, so the cost of a high ceiling is paid only by the runs that use it - where the cost of a low one was paid by every run that needed one more step and silently stopped short. model.agent_loop = "mcp" removes the ceiling entirely.
The budget. Off by default: a tool that refuses to work because of a number you never set would be worse than one that spends. It stops unattended runs only - a command you just typed is never blocked, since you are sitting there and can see what it costs. daily_budget_usd is exact and needs the harness to be reporting its costs; daily_token_budget works against px0’s own estimate for a harness that reports nothing.
Capture. Off by default and deliberately so: a fixture is the content of your work. See Improving a workflow.
Approvals
Write calls held for a person. See Approvals.Inbox
Where scheduled output is delivered. See Inbox.Memory
What px0 knows about you. See Memory.Ask
Conversations. See Ask.Schedule
Empty follows the machine, which is right until the machine travels or the clocks change. See Scheduling.
Retrieval
See Retrieval backends.
Logs and retention
Failed logs are kept four times longer than successful ones, because those are the ones you come back to. Retention is applied by the daemon’s nightly pass, or on demand with
px0 runs prune.
Updates
See Updating px0.
Keys that are declared but not yet wired
Named here so the list is honest about what the current build actually does:connectors.provider- every toolkit routes through Composio regardless.update.channel- not functionally checked;px0 updatereports when no release manifest is configured.
Using config values in a workflow
Any key is readable from a workflow body or an input’sargs:
Editing the file directly
Editingconfig.toml by hand is fine, and px0 versions the file like any other, so your edit shows up in history. The trade-off is that a hand edit skips validation - if px0 behaves oddly after you change the file directly, px0 config list shows what it actually parsed, and px0 doctor catches the categories of mistake that matter. What you save is checked for parseability; if it no longer parses, px0 says so and names the line to fix, and the edit is still recorded so px0 changes revert is there if you would rather drop it wholesale.

