How this site is built
Hand-written static HTML, one generated chrome definition, one catalogue generator, and a pre-release gate that has to pass before anything is tagged or published. Same pipeline as every other *.sgit.ai site: validate → tag → deploy.
The pipeline
validate
node admin/build/validate.js. Structure, links, version agreement, canonical/CNAME agreement, the agent surface, block balance, the agent-block rule, and the catalogue contract. A failure stops the release: no tag, no publish.
tag-release
Every push to dev is a release and ends tagged v{release}.{major}.{minor}. The version is owned by admin/build/version.txt and must agree with the release commit's subject.
deploy
Publishes the tagged commit to GitHub Pages. Never runs when validation failed, never from a pull request.
What the gate checks
| # | Check | Why it is here, specifically for this site |
|---|---|---|
| 1–7 | Version agreement, links, canonical, agent surface, key-leak, block balance, agent block | The shared core, inherited from every sibling site |
| 8 | The catalogue contract — every library/<slug>/metadata.json must carry the required fields (source brief, source site, generator, licence, status…), and a published entry's declared image file must actually exist | This site's whole reason to exist is that a stored infographic stays traceable to its source. An entry that failed this check would have broken that promise silently |
The chrome and the catalogue generator
Every page is hand-written static HTML. The nav row and footer columns are defined once in admin/build/chrome.py and rewritten in place across the tree on every run. The gallery grid on library/index.html, the machine-readable library/data/catalogue.json, and the "catalogued so far" list in llms.txt are owned by admin/build/gen_library.py, driven from each entry's metadata.json — never hand-edited.
python3 admin/build/gen_library.py # rebuilds the gallery + catalogue.json from metadata.json
python3 admin/build/chrome.py # rewrites nav + footer everywhere, stamps the version
node admin/build/validate.js # the gate
Adding a catalogued infographic
1. mkdir library/<slug>
2. Drop the image file in, and write library/<slug>/metadata.json
(see briefs/01__catalogue-schema-and-storage.md for the required fields)
3. Write library/<slug>/index.html by hand — a detail page, following the
pattern of an existing entry
4. python3 admin/build/gen_library.py
5. python3 admin/build/chrome.py
6. Add the new page to sitemap.xml
7. node admin/build/validate.js
8. git commit -am "site vX.Y.Z: ..." && git push origin dev
Making a release
1. bump admin/build/version.txt (vX.Y.Z, exactly once)
add a row to admin/versions.html
update admin/comms.html
2. python3 admin/build/gen_library.py
3. python3 admin/build/chrome.py
4. node admin/build/validate.js
5. git commit -am "site vX.Y.Z: ..." && git push origin dev
The repository
.github/workflows/deploy-pages.yml validate → tag → deploy
admin/build/validate.js the gate
admin/build/chrome.py the single definition of nav and footer
admin/build/gen_library.py the catalogue generator
admin/build/version.txt the version, owned here
admin/comms.html tasks and requests, in public
admin/versions.html release history
assets/site.css assets/nav.js the sgit.ai design language
library/<slug>/ one folder per catalogued infographic
library/data/catalogue.json generated machine-readable index
network/ about/ sibling boundaries, participant disclosure
briefs/ the pack this site was built from
CNAME robots.txt sitemap.xml llms.txt index.md
LICENSE LICENSES.md code Apache 2.0, content CC BY 4.0