Nested configs
A dbx.config.* in a non-root folder (a workspace, an app, a nested project) is merged over the nearest ancestor dbx.config.* found while walking up to the repository root (the walk stops at the .git boundary, so it never picks up a config from outside the repo).
The merge is recursive:
- Objects are merged key by key, so a child keeps every option it does not mention.
- Leaves — booleans, strings, numbers and arrays — in the child replace the root's value (arrays are not concatenated).
- Repository-scoped sections are not inherited:
ci,catalogsand the top-levelchangelog,tsconfig,vite.testandvite.run. A workflow, workspace tsconfig tree, test config or task list describes the repository or one workspace, so a child starts without the parent's values for them. In particular, the roottsconfigtask already expands every workspacetsconfig.json; inheriting it into each workspace would only re-scan that subtree.
Everything else is shared unless the child overrides it — vite.fmt, vite.lint, vite.plugins, logger, biome, templates, registry, and so on — so lint/format settings are cohesive across a monorepo by default.
export default defineConfig({
toolchain: {
logger: { level: 'debug', color: false },
vite: {
fmt: { printWidth: 100, singleQuote: true },
},
},
});
// <root>/packages/web/dbx.config.ts — inherits `vite.fmt`, tweaks `logger`
export default defineConfig({
toolchain: {
logger: { level: 'warn' }, // leaf overrides the root's level
vite: {
run: { tasks: { build: { command: 'tsdown' } } }, // not inherited
},
},
});The workspace above ends up with logger: { level: 'warn', color: false } and the root's vite.fmt settings. Its vite.run holds only the build task it declares — the root's tasks are not merged in.
Arrays replace, so repeat what you need. If a workspace sets
vite.fmt.ignorePatterns, that array replaces the root's list (it is not appended). Either keep the root patterns in the workspace array, or put the shared pattern on the root config — for example**/vite.config.tsthere covers every workspace's generated shim.
projectis inherited except its identity fields.name,scope,descriptionandtypeare per-project, so a non-root config keeps its own (or falls back to itspackage.json) and is still detected from its own files — a rootprojectnever renames a workspace. The shared fields (author,license,homepage,repo,packageManager, ...) flow down so theirpackage.jsonvalues and replacement tokens stay shared.project: { inherit: false }disables project inheritance entirely.hooksare not inherited either — a parent's hooks are code and do not run for a nested project's sync.