Every config key
The 25 settings AutoDev reads from config.json, on the project and on the machine, with each default, its environment variable where it has one, and what it does.
How a value is chosen #
Settings persist to a config.json, which autodev config set <key> <value> writes and autodev config unset <key> edits. Which of the two files a key lives in is below. The project's file is in your repository, so a setting travels with the project and is reviewed in a pull request.
An environment variable wins over the file when it is set. A value that does not fit its key, such as a negative number or a provider that does not exist, is ignored in the environment, and the file's value stands. A config.json that does not parse, or that fails validation, is read as an empty config. Only the flat keys have an environment variable: the nested keys, notify and capability, are read from the file alone.
Numbers must be positive. Booleans take true, false, 1, 0, on or off in autodev config set, and the environment also takes yes and no. A key with no default has nothing set until you set it.
autodev config set maxSpendUsd 25 autodev config set notify.url https://ntfy.sh/<topic> autodev config unset maxSpendUsd
The project and the machine #
Two files hold settings.
| File | Holds |
|---|---|
.autodev/config.json, in the repository | Every key on this page except the ones in the next row. It travels with a clone. |
~/.autodev/config.json, on the machine | suspendOnCompletion and the whole notify block. |
autodev config set writes each key to its own file, and autodev config shows the value in force and where it came from.
suspendOnCompletion is the machine's because suspending stops every run on the box. With two projects working at once, a setting per project would let them disagree about whether the machine may sleep, and the first to finish would put the other to sleep in the middle of its work.
notify is the machine's for two reasons. The phone it reaches is yours and not the project's, so a fresh clone or worktree would otherwise notify nobody. And the topic in notify.url works like a password, which must not sit in a file that travels with a repository.
A value an older AutoDev wrote for one of these keys into a project's config.json is still read when the machine has none of its own, and autodev config unset clears both, so it cannot come back.
Run #
| Key | Default | Env var | What it does |
|---|---|---|---|
provider | claude | AUTODEV_PROVIDER | The agent CLI a participant runs on when its file names none, or names one this machine lacks: claude, codex or antigravity. The binary of the third is agy. |
model | unset | AUTODEV_MODEL | Kept for compatibility. No participant's turn reads it: a participant's model comes from its own file. |
effort | unset | AUTODEV_EFFORT | Kept for compatibility, like model: a participant's effort comes from its own file. |
claudeArgs | unset | AUTODEV_CLAUDE_ARGS | Extra arguments passed to the claude CLI, separated by spaces. |
codexArgs | unset | AUTODEV_CODEX_ARGS | Overrides the default arguments of the codex CLI, and replaces its sandbox default. Separated by spaces. |
antigravityArgs | unset | AUTODEV_ANTIGRAVITY_ARGS | Overrides the default arguments of the agy CLI. Separated by spaces. |
autocompact | 300000 | AUTODEV_AUTOCOMPACT | The size at which claude compacts a session's context: auto, or a token count from 100000 to 1000000. auto leaves the choice to claude and to whatever you configured there. Only claude takes it, and AutoDev passes the value as written, without checking it. The default is smaller than the window claude uses on its own, so a long run compacts sooner. |
Each participant answers for its own provider, model and effort, in its file: autodev team pin sets the model and the effort, and the provider is the one the participant was added with. The three run-level keys above are what is left of a time when a project had one agent. The panel's Config screen leaves them out, and autodev config still lists them.
model and effort are free-form strings. There is deliberately no fixed list: model aliases drift, and a list AutoDev kept would be wrong the morning a new model ships. In a participant's file, the suggested values for effort are low, medium, high, xhigh and max.
autocompact is a free-form string, like model and effort: AutoDev does not check it, and claude rejects a value it does not accept.
The three Args keys are split on whitespace, so an argument that contains a space cannot be written in them.
Guardrails #
These settings pause the loop cleanly when they are reached.
| Key | Default | Env var | What it does |
|---|---|---|---|
maxIterations | 1000 | AUTODEV_MAX_ITERATIONS | The safety cap on loop iterations. A positive integer. A wait for a usage limit does not count. |
maxSpendUsd | unset | AUTODEV_MAX_USD | The global estimated-spend cap, in USD. It pauses the loop. |
maxRuntimeMin | unset | AUTODEV_MAX_RUNTIME_MIN | The wall-clock run budget, in minutes. It is re-anchored on each daemon run, and time spent waiting is not charged to it. |
perCallBudgetUsd | unset | AUTODEV_PER_CALL_USD | A per-call <cli> --max-budget-usd passthrough, in USD: a hard cap for API users. Only claude takes it. |
maxWaitMin | 240 | AUTODEV_MAX_WAIT_MIN | The cap on one wait a participant asked for, in minutes. A longer wait pauses the run instead of going on. |
waitRecheckMaxMin | 30 | AUTODEV_WAIT_RECHECK_MAX_MIN | The ceiling of the interval at which a wait is checked again, in minutes. The intervals run 2, 4, 8 and 16, then this ceiling. |
maxAcceptChecks | 3 | AUTODEV_MAX_ACCEPT_CHECKS | How many times the completion audit may reopen the run before it pauses. |
maxTalkTurns | 4 | AUTODEV_MAX_TALK_TURNS | How many posts in a row may be something other than verified work. After them the thread restricts the next turn to work, and a restricted turn that still produces none pauses the run. |
suspendOnCompletion | false | AUTODEV_SUSPEND_ON_COMPLETION | Suspends the machine when a run is over and the machine is idle. A machine key. Suspending the machine has the conditions. |
The spend cap is soft. AutoDev checks it between tasks, so a run can overshoot by roughly one task's cost before it pauses.
maxAcceptChecks counts the audit. When a participant says the objective is met, an independent audit reads the claim against the objective, and a gap it finds goes back to the team as a post. The run pauses once the audit has found gaps more times than this key allows, and a message from you resumes it.
When a run waits or gives up #
A run can wait for three reasons, and they are bounded in three ways.
- A usage limit. A participant's engine, which is a provider with its model and effort, reports a limit. The turn moves to the next engine in the participant's
failoverchain. When every engine is limited, the run waits for whichever comes back first. No key bounds this wait, since it ends by itself, and it does not count as an iteration or as run time. - A wait a participant asked for. A participant that has to hold, for example while another session finishes, posts a
wait. The run checks again at growing intervals, andmaxWaitMinandwaitRecheckMaxMinbound it. WhenmaxWaitMinis spent the run pauses, and a message from you orautodev startcontinues it. - An infrastructure failure. The CLI crashed or timed out, or it reported a limit before AutoDev could read its reset. The first retry is at once. The next ones wait 1, 2, 4, 8, 15 and 30 minutes, and then an hour each. After the twelfth failure in a row the run gives up, having waited about five hours, and pauses. It never waits past the moment a limited engine comes back, because the next attempt then goes to it.
autodev starttries again. No key changes this schedule.
Two fixed limits stop a run that is going nowhere, and they have no key either: 5 steps in a row that fail on AutoDev's own side pause the run as an error, and 10 iterations in a row with no verified work pause it as stuck.
Gates #
| Key | Default | Env var | What it does |
|---|---|---|---|
gateMode | auto | AUTODEV_GATE_MODE | The posture toward irreversible actions: auto auto-approves the declared gates, and gated pauses for a human. |
gateAutoApprove | unset | AUTODEV_GATE_AUTO_APPROVE | Substring patterns approved without pausing, separated by commas. It applies in both modes. |
gateAutoDeny | unset | AUTODEV_GATE_AUTO_DENY | Substring patterns denied without pausing, separated by commas. It applies in both modes. |
A pending gate waits for autodev approve or autodev deny.
Checkpoints #
| Key | Default | Env var | What it does |
|---|---|---|---|
checkpoints | true | AUTODEV_CHECKPOINTS | Git checkpoint and rollback in the target repository. |
Computer use #
The keys of the capability.computerUse block let participants see and operate web pages, in a browser AutoDev keeps for the run. They live in the project's file and have no environment variable.
| Key | Default | What it does |
|---|---|---|
capability.computerUse.enabled | false | Turns the browser tools on. It is off until you turn it on: a capability that operates interfaces is not a default. The participant sees screenshots of what it operates, sent to its own model like the code it reads. |
capability.computerUse.headless | true | false shows the browser window while it works. One browser lasts the whole run and closes when the run ends. Changing this mid-run swaps the browser at the next call, and the window is best left alone while a call is running. |
capability.computerUse.browserProfile | unset | A folder to use as the browser profile. It can only be written in the file, and autodev config set refuses it. Unset means a profile of AutoDev's own, kept on the machine. A path here is your own browser profile, and it carries every cookie you have into an automated session. |
With the default profile, you log in to a site once and every later run has that login: autodev browser login <url> opens the page, and the panel has the same action. autodev browser login has the details.
autodev config set capability.computerUse.enabled true autodev config set capability.computerUse.headless false
Notifications #
The keys of the notify block send a message to your phone when a run finishes, stops on its own or needs you. They live in the machine's file, and they have no environment variable.
| Key | Default | What it does |
|---|---|---|
notify.url | unset | Where to POST. Unset is off. An ntfy topic URL, or a webhook of your own. It must start with http:// or https://. The topic in the URL works like a password: anyone who knows it learns when your runs stop. The panel shows only whether it is set, and autodev config set prints (hidden) in place of it. |
notify.format | ntfy | The body of the POST. ntfy is plain text, with the title in a Title header. json is { "title", "body", "project", "kind", "at" }, for a webhook of your own. Discord and Slack each expect a shape of their own and refuse this one. |
The message is sent once for each thing that needs you, in any project on the machine, and it is one of three:
| Kind | Body | When |
|---|---|---|
decision | AutoDev is waiting on a decision only you can make. | A gate awaits your approval, a participant's notice holds a capability until you answer it, or the thread asked you something. |
stopped | AutoDev stopped and will not resume on its own. | The run paused or hit an error, and you did not ask for the pause. |
finished | AutoDev finished. | The run completed. |
The title is AutoDev · <project>. A run you stop or pause yourself sends nothing. The POST has a 5-second timeout and is tried once more if it fails, and the log records notify.sent, notify.failed or notify.off, never the address. The editor applies the same rule to its own notification, so an event that one of them announced is not announced again by the other.
autodev config set notify.url https://ntfy.sh/<topic> autodev config set notify.format json
Suspending the machine #
With suspendOnCompletion on, AutoDev puts the machine to sleep when a run no longer needs it, so a night's run does not leave the machine awake until morning. It is off by default, it only acts on Windows, and it sleeps rather than hibernates.
It suspends only when all of these hold:
- The run ended because it completed, with no gate or proposal pending, or because it stopped and waits for you: paused by the system, halted on a gate or a proposal, asking you something, or in error.
- You did not stop or pause the run yourself.
- No other project on the machine has a run alive, since suspending stops all of them.
- No phone can answer through the server. A running server with a phone paired or pairing prevents it, and so does a server that cannot say. A server with no phone does not.
- The machine has been idle for 20 minutes, meaning no keyboard or mouse.
When they hold, AutoDev shows a message on screen that says the machine will suspend, waits 60 seconds, and checks every condition again. Touching the mouse or the keyboard in that minute cancels it. The log records the reason for each refusal.
An example #
{
"suspendOnCompletion": true,
"notify": { "url": "https://ntfy.sh/<topic>", "format": "ntfy" }
}{
"maxIterations": 500,
"maxSpendUsd": 25,
"gateMode": "gated",
"checkpoints": true,
"capability": { "computerUse": { "enabled": true, "headless": false } }
}