@@ -96,6 +96,45 @@ does not, the release fails at `loading go mod information`, before it builds an
9696sets ` GOTOOLCHAIN=auto ` so ` go.mod ` stays the only pin, matching the workflow, which resolves its
9797toolchain from ` go-version-file: go.mod ` .
9898
99+ ## The documentation site
100+
101+ This site is the other thing the repository publishes, and it ships on its own schedule: not on a
102+ tag, but on every push to ` main ` that touches ` docs/** ` or the workflow itself.
103+ [ ` .github/workflows/docs.yml ` ] ( https://github.com/specsnl/labelsync/blob/main/.github/workflows/docs.yml )
104+ runs ` hugo --minify ` in ` docs/ ` and hands ` docs/public/ ` to ` actions/deploy-pages ` . There is no
105+ ` gh-pages ` branch: Pages is configured with ** GitHub Actions** as its source, so the artifact the
106+ workflow uploads * is* the deployment.
107+
108+ Three details are load-bearing:
109+
110+ - ** ` fetch-depth: 0 ` .** ` hugo.toml ` sets ` enableGitInfo ` , which dates each page from the last commit
111+ that touched it. A shallow clone has no such commit for most files, and the dates silently
112+ collapse onto the checkout.
113+ - ** ` concurrency: { group: pages, cancel-in-progress: false } ` .** Pages allows one deployment at a
114+ time. Cancelling in progress would abort a deploy midway and leave the live site on whatever the
115+ half-uploaded artifact contained, so runs queue instead.
116+ - ** The Hugo version is pinned to the ` hugomods/hugo ` tag in ` compose.yml ` .** Hextra is consumed as
117+ a Hugo module and tracks Hugo's template API; a floating ` latest ` in CI means the site that
118+ builds locally is not the site that builds on ` main ` . One version, two places, kept in step by
119+ hand.
120+
121+ The theme itself is cached across runs by ` docs/go.sum ` , which is why the module download does not
122+ show up in the build time of a typical docs change.
123+
124+ ### The custom domain
125+
126+ ` labelsync.specs.dev ` is set in Settings → Pages rather than in a ` CNAME ` file under
127+ ` docs/static/ ` — the same arrangement as ` cli.specs.dev ` . Keeping it in settings means a local
128+ ` hugo ` build never emits a ` CNAME ` that could disagree with what the repository is actually
129+ configured to serve.
130+
131+ DNS is a ` CNAME ` at ` labelsync.specs.dev ` pointing at ** ` specsnl.github.io ` ** — the * account* , not
132+ the repository. A record pointing at ` labelsync.github.io ` resolves anyway, because ` *.github.io `
133+ is a wildcard onto the same Pages edge addresses and the edge routes on the ` Host ` header, but
134+ GitHub's Pages DNS check flags it and it can block certificate issuance. Domain ownership is
135+ already proven by the ` _github-pages-challenge-specsnl ` TXT record on the ` specs.dev ` apex, which
136+ covers subdomains, so no per-repository verification step is needed.
137+
99138---
100139
101140The design record this grew out of — including why a ` gh ` CLI extension was considered and rejected
0 commit comments