Skip to main content
Fabro loads machine defaults from ~/.fabro/settings.toml. The file is optional. If it does not exist, Fabro falls back to built-in defaults. The CLI and server each read the sections relevant to their own process. On a remote deployment, the CLI machine and the server machine each have their own settings.toml.
Fabro only reads settings.toml. Older cli.toml, user.toml, and server.toml filenames are no longer part of the supported config surface.

File location

The default path is ~/.fabro/settings.toml. Use fabro server start --config /path/to/settings.toml if the server should read a different file.

Schema version

Every Fabro config file must declare its schema version with a top-level _version key:
settings.toml
Files that omit _version are treated as version 1. The legacy top-level version key is no longer accepted and raises a targeted rename hint.

Who reads what

settings.toml uses the same schema as .fabro/project.toml and workflow.toml, but each process only reads the fields it understands. The top-level schema is strictly namespaced — the only allowed domains are [project], [workflow], [run], [llm], [cli], and [server]. [cli.*] and [server.*] stanzas are owner-specific: they are only consumed from ~/.fabro/settings.toml (plus process-local flags and env overrides). The same stanzas in .fabro/project.toml or workflow.toml remain schema-valid but runtime-inert. fabro run and fabro create do not copy the CLI machine’s [run] or [environments] tables into an intent request. They warn with only the file path and affected key names when those tables are present. Put workflow-owned behavior in workflow.toml and configure placement in environments managed by the target server. The server may still use its own active settings.toml independently. See Server Configuration for the server-owned sections.

Precedence

For CLI-created workflow runs, sparse CLI flags override immutable workflow.toml behavior. The CLI does not layer local project or machine run defaults into the request. A target server resolves its own server-side policy and environment catalog during admission. Owner-specific domains ([cli.*], [server.*]) use a narrower trust boundary — only CLI flags, env overrides, ~/.fabro/settings.toml, and built-in defaults apply.

Full example

settings.toml
All fields are optional. Include only the sections and keys you want to override. A single file can still include both CLI and server sections when you run both processes on one machine, but explicit remote targets do not read remote server state from the local machine.
The [run] schemas below remain valid for a server’s own active configuration, but they are not CLI-side defaults for fabro run or fabro create. Put automatic pull-request settings and other workflow-owned behavior in workflow.toml; there is no compatibility request field or CLI global default.

[cli.target]

Connection info for commands that target a remote Fabro server.
settings.toml

[llm]

The [llm] table is a lithos-llm catalog overlay. Fabro builds its model catalog from two layers: the lithos built-in providers and models, and this table. Later layers win; tables merge key by key and every other value replaces. Fabro does not interpret the table itself. lithos validates it when the catalog is built, and rejects unknown provider or model fields. Several built-in providers ship with enabled = false. Turn one on by setting enabled = true on its provider table.
settings.toml
A provider’s API key is the secret lithos names for it: OPENAI_API_KEY for openai, MODAL_TOKEN_ID and MODAL_TOKEN_SECRET for modal, and <PROVIDER>_API_KEY (upper case, - and . as _) for a provider you define, so the gateway above reads PROXY_API_KEY. Store it in the server vault with fabro secret set, or export it for fabro exec and SDK use.

[llm.providers.<id>]

Define or override an LLM provider. The keys are the lithos provider record.

[llm.providers.<id>.metadata.agent]

Which coding harness the provider’s models expect. Pebble reads the same namespace. Every key is optional; a model row overrides the provider.

[llm.providers.<provider>.models.<model-id>]

Define or override one provider’s offering of a model. The table key is the model id Fabro users reference. An offering’s identity is the pair (provider, model id), so different providers may use the same id and aliases. api_model is the string sent to the provider and defaults to the id.

[llm.providers.<provider>.models.<model-id>.metadata.agent]

The same keys as the provider-level metadata.agent table, applied to one model. profile here is how a Kimi or GPT-5.6 model keeps its own harness on a gateway whose other models use the provider default.

[cli.updates]

[cli.updates] — upgrade check toggle
settings.toml

[cli.output]

[cli.output] — generic CLI output defaults
settings.toml

[cli.exec]

[cli.exec] — fabro exec defaults
settings.toml

[cli.exec.model]

settings.toml

[cli.exec.agent]

settings.toml

[run.model]

[run.model] — provider-neutral default model selection
settings.toml

[cli.logging]

[cli.logging] — process-owned logging configuration for the CLI
settings.toml

[run.git.author]

settings.toml

[run.pull_request]

[run.pull_request] — provider-neutral PR behavior
settings.toml

[run.agent]

[run.agent] — agent knobs only (Fabro tools and MCPs)
settings.toml

[run.agent.mcps.<name>]

Configure MCP servers for workflow agents. For fabro exec-only MCPs, use [cli.exec.agent.mcps.<name>] with the same shape.
settings.toml
See MCP for transport-specific examples.