canary.json

Lives at a site's root. JSON, one config per environment — no dev/prod split, nav and routes are always derived from content.root plus the generated manifest, never redeclared here.

{
  "site": { "name": "...", "baseUrl": "https://..." },
  "content": { "root": "content" },
  "output": { "dir": "docs" },
  "renderMode": "hybrid",
  "nav": { "depth": 1 },
  "serve": { "port": 6913 },
  "theme": { "shell": "shell.html", "base": "css/framework.css", "theme": "css/theme.css" },
  "widgets": { "copyDefaultsOnInit": true, "preferBuiltIn": false },
  "tools": { "breadcrumb": "tools/breadcrumb.sh" },
  "publish": "git add docs && git commit -m Publish && git push"
}

site

content

output

renderMode

hybrid or static. See Guide → Render Modes. Defaults to hybrid.

nav

serve

theme

widgets

See Guide → Widgets.

tools

A name-to-shell-command map, the central registry a .toolchain.json in any content directory can reference by name. See Guide → Content Toolchain.

publish

Optional. A single arbitrary shell command, run by canary publish after a fresh build. Not set by default. See Guide → Publishing.

initialized

Written by canary init on a successful scaffold; not something you should hand-write or hand-edit. Lets a later init run against the same directory detect it's already a Canary project and refuse without --force.