Project Structure

A Codocation project is plain files: YAML configuration, locale-owned Markdown, and explicit asset and definition namespaces. Everything is readable, diffable, and belongs in version control.

codocation.yml            project configuration
error-registry.yml        project-wide diagnostic severity overrides
assets/
  media/                  non-localized browser/chrome media, including the favicon
  fonts/                  global font binaries
  css/                    global site CSS
  js/                     global site JavaScript and analytics
definitions/               invariant definition IDs and fields
library/
  snippets/               reusable Markdown, always read and never published
  code/                   code files a fence includes with src=, never published
content/                    authored and published content root
  <locale>/                 a catalog locale, such as en/
    <site id>.tree.yml       required for each declared site membership
    <site id>.pdf.yml        optional locale PDF overrides
    <site id>.seo.yml        optional locale SEO overrides
    <site id>.redirects.yml  optional locale redirects
    site-strings.yml         this locale's built-in chrome text
    pages/                   the locale's Markdown pages
      index.md
      getting-started.md
      posts/                 blog posts, when the site is a blog
    images/                  locale-owned page, branding, and PDF images
    attachments/             locale-owned downloadable files
    definitions/             translated definition payloads

library/ is project-global and never published: snippets/ holds reusable Markdown whose IDs are unique across the whole project, and code/ holds the files a fence pulls in with {src="…" lines="…"} (see Markdown Extensions). site-strings.yml is locale-owned rather than per site, and carries the text Codocation itself writes into a page - the footnotes heading, the empty-listing line, and the rest; a missing file or a missing key is a warning with a fix that writes it.

The root definitions/ directory includes keyed labels.yml and categories.yml files. Their locale-owned counterparts contain localized names, optional label compact text, and tooltips. Each locale may omit an identity (unavailable), provide a local entry, or contain the explicit inherited: true entry to use the complete payload from the current site's effective defaultLocale. inherited: true must be that entry's only field: it takes the whole payload or none of it, and cannot be combined with local ones. Optional fields omitted from a local entry remain absent in that locale, and omission never triggers automatic fallback.

codocation.yml

The single technical project configuration file: site ids and types, URL and web settings, build output settings, the canonical locale catalog, each site's published locale membership and defaultLocale, and the deploy target. Reader-facing title and description, localized PDF text, SEO meta tags, and redirects live in each declared pair's files.

The navigation tree

content/<locale>/<site id>.tree.yml owns the required site title, optional description, and what that locale's site shows and in what order: the header links, the table of contents (with nested sections and the home-page marker), and the footer links. Each declared site membership has an independent tree; there is no implicit merge between locales. The "Codocation" tool window edits it visually; see Navigation.

Pages

Markdown files under content/<locale>/pages/, each with a small frontmatter block. A page not referenced by any tree is simply not published. Blog posts live under content/<locale>/pages/posts/.

The physical file content/en/pages/guide.md is referenced by its logical tree path pages/guide.md; the physical content/<locale>/ prefix is never part of a tree reference. The catalog locales themselves are listed under locales:; each site's published variants are listed under sites.<siteId>.locales in codocation.yml.

Images, attachments, and assets

content/<locale>/images/ holds locale-owned pictures referenced from pages, along with locale-aware branding and PDF images. content/<locale>/attachments/ holds downloadable files linked from pages. The favicon is non-localized at assets/media/; fonts, CSS, JavaScript, and analytics are global under their corresponding assets/ subspaces. A build copies resolved resources into the matching output directory; see Build the Site. Images and attachments follow the page's source provenance: a page resolved from the default language and displayed in another uses the source locale's media first, then its permitted fallback.

Definitions

Root definitions/ stores stable IDs and invariant fields. Locale-owned content/<locale>/definitions/ stores translated payloads. A locale uses the current site's effective defaultLocale for supported fallback. Labels and categories require an explicit inherited: true entry; an omitted classifier identity is unavailable. Variables, glossary terms, and keymaps may use a missing entry from the site default. They are edited in the "Definitions" and "Catalog" tool windows; see Variables and Definitions.