ux.sgit.ai

How it is built

A static site, generated by a small Python build with no dependencies, served as plain files. No framework, no client-side rendering: every page is complete HTML before any script runs, and the one script on the site (the findings filter) only hides and shows rows that are already there.

The files

PathWhat it is
data/findings.jsonThe register. The source of every finding page, list, filter and count
data/exemplars.jsonWhat good looks like: things that work, each linked to the findings it answers
data/principles.jsonThe principles, each with a rule, a reason and a test
data/taxonomy.jsonThe problem, visibility and recommendation vocabularies findings are indexed by
data/lab.jsonThe design lab: vaults and read keys, directions, screenshots, decisions
data/site.jsonName, navigation, the products findings belong to (sites, platform, prototypes, browsers), the sibling sites
data/versions.jsonThe release history; the first entry is the current version
content/**/*.mdHand-written pages, with {{directives}} the build fills from the data
admin/build/build.pyBuilds every .html, its .md twin, llms.txt, llms-full.txt, sitemap.xml
admin/build/md.pyThe markdown renderer (stdlib only)
admin/build/gate.pyThe release gate
assets/One stylesheet, one script, the icon
lab/shots/Phone screenshots from the lab's vaults
findings/img/Evidence screenshots attached to findings

Build and check

python3 admin/build/build.py     # write every generated file
python3 admin/build/gate.py      # must print GATE PASS
python3 -m http.server 8000      # then open http://localhost:8000/

The gate

CI runs it on every push, and a release is the commit it passes on. It fails if:

Versions

The version is shown once, in the footer, and links to what changed.

Each release bumps the last number (v0.4.0 → v0.4.1), unless the project lead asks for a larger step. Every release gets an entry in data/versions.json naming what changed and the files it touched.