Skip to content

Writing the documentation

This site is built by zensical, the successor of mkdocs-material, from the Markdown files under docs/. The published copy at https://heig-tin-info.github.io/heig-quiz/ is rebuilt by GitHub Actions; a local copy is one command away.

Building it locally

zensical is a Python tool. Install it once, either as an isolated tool or into any Python environment:

uv tool install zensical      # or: pip install zensical

Then, from the root of the repository:

pnpm docs:serve               # zensical serve: live reload on http://127.0.0.1:8000
pnpm docs:build               # zensical build: the static site in site/ (gitignored)

uvx zensical serve works too, without installing anything.

Where things are

Path What
zensical.toml the site configuration: title, theme, Markdown extensions, and the navigation
docs/index.md the home page
docs/spec/README.md the specification reading index; detailed data model and history are loaded only for relevant tasks
docs/adr/README.md the topic index and reading protocol for architecture decisions
docs/development/ these pages
docs/PLAN-MVP.md the decisions D1–D20 of the phase-1 plan; the full plan is archived in docs/history/PLAN-MVP.md
docs/assets/screenshots/ the screenshots, two files per image (screenshots)

The nav array of zensical.toml controls the site navigation: one tab per audience. Guide is for teachers and students; Operations for whoever hosts the platform (deployment, a new server, the GitHub App, Teams, the kiosk stations); Developers, last, for contributors and agents, with the specification and the decision records as collapsed groups under "Reference" (zensical takes a README.md that is a direct child of a group as that group's index page, which is why each is a group of its own). The classroom merge record (merge/) left the nav with the cutover of 2026-10-11 and follows the archive rule below; the developer index keeps its entry link. A page that is built but listed nowhere is reached only through the links of the current pages: the ADR records, through the decision index, and every archived page (below). Links between pages are relative Markdown links to the .md file (../spec/05-architecture.md, deployment.md#rollback); zensical rewrites them at build time and warns about a target that does not exist, which is the check to read after pnpm docs:build.

Current context and history

Current specs and consolidated ADRs state the rules an agent should apply. Move long delivery chronicles and superseded alternatives into history/ only with a link back to the current source and a clear historical notice. Archived pages use search: { exclude: true } in YAML front matter so the site search does not present obsolete instructions alongside current ones, and they are never listed in the nav: the repository is public, so an archive is public whatever the site does, and the one lever is discoverability. They stay in the repository because the sources cite them (the "PLAN-MVP §x.y" comments, the former ADR addenda) and an agent in a worktree or a shallow clone cannot resolve such a citation from git history. Preserve existing URLs and section anchors as pointers when consolidating. 2026-10-09: an anchor list into history/ may be reduced to a correspondence table of the cited sections plus bare compatibility anchors.

Do not archive unresolved product questions or remove an accepted requirement because its code is not implemented. Record a verified delivery boundary and link its task. Exact library versions and declarations belong in manifests, contracts and schemas; documentation explains their purpose and constraints.

Publication

.github/workflows/docs.yml runs on every push to main that touches docs/**, zensical.toml or the workflow itself, and on the matching pull requests. It installs Python 3.12 and zensical, runs zensical build, and on a push deploys the site/ directory to GitHub Pages. A pull request only builds, which is enough to catch a broken link or a bad admonition before merging. The workflow can also be started by hand from the Actions tab (workflow_dispatch).

Language and style

Everything on this site is in English, like everything else in the repository that is not a string a user reads (invariant 1). The specification and the decision records were written in French and have been translated; the file names under docs/spec/ and docs/adr/ keep their original French slugs, so existing links and the nav keep working.

The style of these pages: precise prose in short paragraphs, a table where things are parallel, a fenced code block for every command, and no paraphrase of a source file when a link to it will do. Section headings are sentence case.

The Markdown extensions enabled in zensical.toml include admonitions and collapsible blocks:

!!! note "Optional title"

    Body, indented by four spaces.

!!! warning

    Same syntax, different colour.

??? info "Click to expand"

    A collapsible block, closed by default. `???+` opens it by default.

Also available: footnotes, definition lists, task lists, attr_list and md_in_html (which is what the card grid on the home page uses), fenced code blocks with syntax highlighting and a copy button, and Mermaid diagrams in a ```mermaid fence. Content tabs are not enabled; use headings or a table instead.

Images in light and dark

Every screenshot exists twice, <name>-light.png and <name>-dark.png, and a page embeds both so that the theme shows the one matching its palette. The markup, and the pipeline that produces both files for every screen, are described on their own page: screenshots.