canary.jsonc

Lives at a site's root. JSONC — // comments and trailing commas are allowed; unquoted keys and single-quoted strings are not. One config per environment — no dev/prod split, nav and routes are always derived from content.root plus the generated manifest, never redeclared here. canary init scaffolds a commented canary tools build example into the file.

{
  "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",
    "logo": "img/logo.svg",
    "favicon": "img/logo.svg"
  },
  "widgets": { "copyDefaultsOnInit": true, "preferBuiltIn": false },
  "tools": { "breadcrumb": "tools/breadcrumb.sh" },
  "publish": "git add docs && git commit -m Publish && git push"
}

site

content

output

Files that must land at the output root under a fixed name (GitHub Pages' CNAME, .nojekyll, a robots.txt/favicon.ico override) go in root-copy/ next to canary.jsonc, not here. See Project Layout.

renderMode

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

nav

Per-directory hide/allow/deny, sort order, and nonav live in that directory's .nav.json, not here. Depth and .nav.json together are the nav story. See Nav and .nav.json.

serve

theme

This documentation site sets both to img/logo.svg.

widgets

See Guide → Widgets.

tools

A name-to-command map, the central registry a .toolchain.json in any content directory can reference by name. A value is either a bare shell command string ("breadcrumb": "tools/breadcrumb.sh"), or an object opting a C# tool into precompilation: "curtain": { "command": "tools/bin/curtain.exe", "source": "tools/curtain.cs" }. See Guide → Content Toolchain for the full picture, including canary tools build.

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.