Reference

Configuration

Every Duscode configuration key, covering checks, budgets, models, providers, memory, workers and more, plus where the user and project config files live and how they combine.

Duscode works with no configuration at all. Most settings people change are in the Settings dialog, which writes your user config for you. You can also edit the JSON files:

File Applies to Notes
~/.duscode/config.json All your projects Your user config. It moves with DUSCODE_HOME.
<project>/.duscode/config.json One project Travels with the project if you commit it

The user config loads first, then the project config on top:

  • Most keys: the project's value replaces yours, including whole objects such as budget and workers.
  • providers: merged per provider.
  • models: combined. An entry with the same id replaces the earlier one.
  • tiers: merged per tier.

Duscode reads the config when it first opens a project. After you change it, restart Duscode (Ctrl+C, then duscode again) to pick up the change. The terminal app reads it each time it starts.

Warning

For your safety, a project config can't set a provider's baseURL, apiKey, apiKeyEnv, protocol or keyless. Those decide where your keys are sent, so they belong in your user config only.

Example

json
{
  "checks": ["pnpm typecheck", "pnpm test -- --run"],
  "budget": { "perTaskUsd": 3, "perDayUsd": 30 },
  "tiers": { "standard": ["claude-sonnet"], "frontier": ["claude-opus"] },
  "browserCheck": true
}

All keys

Key Type Default What it does
checks string[] detected Commands for the verification gate. [] turns the gate off.
browserCheck boolean false Adds a browser smoke check of the preview to the gate
budget.perTaskUsd number 2 Spending limit per task, in US dollars. See Budgets.
budget.perDayUsd number 20 Spending limit per UTC day, across sessions
workers.maxConcurrent number 3 Worker agents running at once
workers.perTaskUsd number budget.perTaskUsd Budget for each worker's task
tiers object — Preferred models per tier, in order: { "fast": [...], "standard": [...], "frontier": [...] }
models object[] — Add models, or override built-in ones by id. See Providers and models.
providers object — Turn providers on or off, or add your own. See Providers and models.
baselineModel string best frontier model The model that savings are measured against
defaultModel string standard tier The one model used on the Free plan
useClassifier boolean true Not used by Auto's routing, which starts every task on the fast tier (see Routing and costs)
memory boolean true Memory across sessions
turns.perTask number 60 Working turns per task before Dus saves its work and carries on once (merge work and long plans get more; waiting turns don't count). Also in Settings → Budgets for the open project.
queue.parallel boolean true Run independent queued requests at the same time as helpers, merged one at a time
feedback boolean true Record problems in Duscode itself in Settings → About & updates → Feedback for Duscode
lessons boolean true Read the project's lessons at the start of every task
lead boolean or object true Lead plans for big, separable requests; { "budgetUsd": 5 } caps a whole run
judgement boolean or object true Dus's working habits; switch one off with, for example, { "flaky": false } (baseline, environment, diagnose, orient, turns, history, flaky, remember)
lsp boolean true Language servers: exact definitions, references, types and renames, and type errors checked after every edit
journal boolean true Write the project journal
blueprint string — The project's architecture, such as nextjs-app. Usually set from the workspace.
setupDone boolean — Set when you finish or skip the first-run architecture question
sandbox string "auto" "auto", "required" or "off": whether commands run in the OS sandbox. A project can only set "required".
network.allow string[] — Extra hosts every sandboxed command may reach. User config only. See Network.
permissionMode ask, auto, plan Auto in a worktree, Ask in the project folder The mode new sessions start in. User config only.
routing.mode economy, balanced, maximum balanced How routing trades cost for strength. A project config can't choose maximum.
routing.learned false or { minSamples, successBar, halfLifeDays } { 5, 0.8, 14 } How Auto learns which model fits which kind of work: recent tasks a model needs, the share it must pass, and how fast old results fade. false keeps the tier defaults. User config only.
notifications.quietHours { enabled, start, end } off, 22:00–07:00 No desktop, Slack or Teams messages in this window
editor.fontSize, editor.tabSize number 13, 2 The editor's text size and indent
editor.wordWrap, editor.formatOnSave, editor.minimap boolean false, false, true Editor behaviour
terminal.shell, terminal.fontSize, terminal.copyOnSelect string, number, boolean login shell, 13, false The terminal
git.branchPrefix string duscode/ Prefix for session branches
git.prDraft boolean false Open pull and merge requests as drafts
git.prBase string the session's base branch The branch pull requests target
git.commitStyle plain, conventional plain How suggested commit messages are written
sessions.newSession worktree, main worktree Where a new session works
sessions.autoArchiveDays number 0 (off) Archive sessions idle this many days
region.locale string system Date and number format, such as en-GB
region.currency, region.usdToGbp auto, USD or GBP, number auto, 0.75 Show costs in pounds as an estimate, at this rate. auto (not chosen) shows pounds when your format or browser language is British English, and dollars otherwise

Project instructions

Instructions in prose belong in DUSCODE.md (or AGENTS.md, CLAUDE.md, or the Cursor and Copilot rule files, which Dus also reads) in the project root, not in the config. See Project instructions.

Keys

API keys don't go in config files. Add them in Settings → Models & keys, or use environment variables. See Providers and models.

Something missing or wrong? Email support@duscode.com.