Changelog¶
Every change to the reusable workflows, the theme package and the tools, newest first, from CHANGELOG.md.
[Unreleased]¶
Added (unversioned sites, link check)¶
ru-mkdocs-publish.yml:versioninginput (defaulttrue).falsebuilds an unversioned site (the organisation portal) and publishes it from the default branch as the whole content of the deployment branch, at its root, in one ordinary commit; tags publish nothing. The custom domain comes from aCNAMEfile in the site (docs/CNAME), never from what the branch held before, so a staleCNAMEcannot take the site over.- Theme plugin:
versionedoption (unset: versioned, except<org>.github.io), overridden byHARDFOC_DOCS_VERSIONED; an unversioned site gets the Pages root assite_urland no version selector. hardfoc-docs publish-root: the publish step for unversioned sites, with unit tests against a scratch remote.ru-docs-linkcheck.yml:exclude_own_site(defaulttrue) skips links to the repository's own Pages site on pull requests and until itslatest/answers, so a repository's first MkDocs pull request no longer fails on its own/latest/links.ru-mkdocs-publish.yml:check_commandsrun withGH_TOKENset to the job's read-only token, so a site can generate pages from the GitHub API at build time (the organisation portal's repository catalogue).- Theme: a filterable catalogue component (
.hf-filtersearch field,.hf-chipbtntopic buttons,.hf-repocards), used by the organisation portal's repository list. - Theme:
navigation.pruneis on by default, so a page carries only the navigation it shows; on a site of about 85 pages it halves the HTML of every page and keeps it inside the Lighthouse performance budget. - Theme package unit tests (
packages/hardfoc-mkdocs-theme/tests/), run by the self-CI.
Changed (documentation platform)¶
- This repository's documentation site is built with the platform itself (
ru-mkdocs-publishat the same commit,theme: hardfoc): a quickstart, the workflow catalogue, one page per workflow with jobs, permissions and inputs generated from the YAML, the permissions contract, versioning, the platform guide and the self-CI. The Jekyll site files (_config/_config.yml,_includes,_layouts,assets) and the Jekyll-era guides are gone. - Root
404.htmlof versioned sites: a branded page (HardFOC mark, theme colours and font, light and dark) that says "Redirecting to the latest documentation" whileversions.jsonloads, and shows "Page not found" with links only when no redirect applies, after two seconds, or without JavaScript. - Theme: from tablet width up, tables fill the column and their text cells wrap, instead of cutting off the last column (identifiers in code stay whole); on a phone, figures keep a readable size and scroll sideways instead of shrinking.
Fixed (documentation platform)¶
- Theme: figure-heavy pages (architecture pages: a figkit figure near the top, a Mermaid diagram further down) missed the Lighthouse performance budget on phones (0.63 to 0.77 against 0.8). Three causes, all fixed in the theme, nothing to change in a site:
- Figures had a width but no height, so the text below jumped when the SVG arrived (cumulative layout shift
0.074 to 0.19). Each figure image now carries
height(fromfigures.json, else from the SVG), so the browser reserves its box. - Every figure was
loading="lazy", including the first one, which is the page's largest element: it was requested only after the page's scripts ran (largest contentful paint 4.0 to 4.8 s). The first figure of a page now loads at once; later figures stay lazy. - Material loaded Mermaid (about 950 KB of script and 250 to 500 ms of main-thread work on a phone) as soon as a page with a diagram opened, wherever the diagram was. A stand-in in the page head now loads Mermaid when a diagram comes within a screen of the viewport (or the page is printed), and Material renders it as before. A unit test fails if a Material update changes the calls the stand-in answers.
- Theme: on a phone, wide figures now keep a readable size and scroll sideways, as intended in the previous release; the rule was overridden by the general figure rule that came after it.
- Theme: no layout shift when the web fonts arrive. Text is laid out in local fallback faces with Inter's and
JetBrains Mono's metrics (
size-adjust,ascent-override,descent-override), so the swap to the web font keeps every line in place; text-heavy pages (pin maps, long tables) no longer miss the Lighthouse performance budget on cumulative layout shift. hardfoc-docs screenshotswithout--pagecrashed (UnboundLocalError).- Theme plugin: a link from
docs/to a repository file that does not exist was turned into a GitHub link that 404s; it is now a warning, somkdocs build --strictfails (a folder that is empty, a submodule not checked out, is not reported). tools/docs-migrate.py: the Doxyfile'sINPUTandUSE_MDFILE_AS_MAINPAGEno longer point at the README (sources plusdocs/_doxygen/mainpage.md, written when missing),CASE_SENSE_NAMES = NO, a final newline always; the caller workflow is named📚 Docs; Material'shide:front matter is kept.- Theme plugin: a link or figure marker written as inline code (an example on a page, such as
[`x.hpp`](../inc/x.hpp)) is left as it is instead of being rewritten or embedded. - Theme plugin: a link into the API reference (
[API](api/index.html)) from a page that builds into a folder was re-based twice and published as a GitHub link to a file that does not exist (the API button of every site); it now points at the merged API reference. - Template:
examples/esp32/main/basic.cpp, the file the template's examples table links. - Theme plugin: a link whose text holds brackets (
[`table[]`](../src/x.cpp)) is rewritten like any other. hardfoc-docs genno longer fills regions in a folder with its ownmkdocs.yml(a template or fixture inside the repository), which belong to that site.ru-mkdocs-publish.yml: a Doxyfile without a final newline no longer swallows the stylesheet line the workflow appends.
Added (documentation platform)¶
packages/hardfoc-mkdocs-theme: the HardFOC documentation theme as one pip package:theme: hardfoc(brand, header with the organisation crumb, footer, admonition / code / table / figure styles, hero, cards, chip and board card, Mermaid theming, light and dark),plugins: [hardfoc](shared configuration, Markdown dialect with snippets, strict validation, the link / figure hooks, page checks for Jekyll leftovers and missing headings), figkit,hardfoc-docs(figures, generated regions, screenshots) and the pinned toolchain.ru-mkdocs-publish.yml: installs the theme from the workflow's own commit (theme_refto override); aqualityjob with a Lighthouse budget (lighthouse,lighthouse_budgets) and phone / desktop screenshots (screenshots) as artifacts;release_version(tags publishvX.Y.Zby default);prune_legacyremoves the pre-MkDocs site fromgh-pagesin the first publish commit; a root404.htmlthat redirects old addresses; the HardFOC Doxygen stylesheet when a Doxyfile has none; Doxygen's output folder is created first.tools/docs-migrate.py: mechanical Jekyll-to-MkDocs migration of a repository, with--check.docs/MIGRATING-TO-MKDOCS.mdanddocs/DOCS-STYLE-GUIDE.md.- Automatic patch release on every push to
main(release.yml), unless Unreleased has a### Breakingsection.
Changed (documentation platform)¶
templates/mkdocs-siteis a driver skeleton on the theme package; it no longer copies CSS, overrides, hooks or figkit into a repository.ru-mkdocs-publish.yml: avX.Y.Ztag publishes versionvX.Y.Z(wasX.Y;release_version: minorkeeps the old behaviour).requirementsis optional.
Fixed¶
ru-docs-publish: copy static assets kept next to the Jekyll config (for example_config/assets/css/custom.css) into the site source before the build. Jekyll skips underscore folders, so driver sites never received their custom CSS and JavaScript.ru-docs-publish: set the generated config'surlto the publishing repository's Pages host, so canonical links and the sitemap stop pointing at an old owner.ru-mkdocs-publish: call themikecommand;python3 -m mikefails because mike has no__main__, so every deploy step failed.ru-docs-publish: stop appending the version name to the site title; it made the sidebar title wrap. The version stays available asversion.
[1.1.0] - 2026-11-02¶
First release callers pin as @v1 (v1.0.0 was cut before the platform work
below had landed). No input has been removed and no workflow needs more
permissions than before.
Added¶
ru-ci-gate.yml: one required check (CI gate / gate) that passes only if every needed job succeeded or is an allowed skip. It also verifies that the calling workflow lists every job inneedsand runs the gate withif: always().ru-host-ci.yml: host CMake configure (preset or-S/-B), build, ctest, and clang-tidy 18 and cppcheck on one file set selected fromcompile_commands.json.ru-docs-publish.yml: optional inputartifact_name.ru-docs-publish.yml: pre-flight checks. just-the-docscalloutsmust be mappings with acolor, and a Pages source set to "GitHub Actions" fails the deploy instead of leaving the site at 404.- Self-CI (
ci-self.yml): pinned actionlint and shellcheck, a check forrun:blocks ending in a barecond && cmd, the permissions contract check, the breaking-change check, and unit tests for these checks. - Self-tests:
ci-docs-publish.ymlbuilds a site whose Jekyll source is a subdirectory, andci-host-ci.ymlruns the host workflow on a fixture. - README permissions table: exactly what each caller must grant.
release.yml: on avX.Y.Ztag, creates a GitHub Release with generated notes and moves thevXmajor tag.- Dependabot for GitHub Actions (weekly).
Changed¶
- Every third-party action is pinned to a full commit SHA with a version
comment.
softprops/action-gh-releasemoves from v1 to v3.0.3, since the node16 runtime of v1 is no longer supported. - Every reusable workflow declares minimal permissions per job, with no
top-level
permissions. Inru-docs-publish.yml, only thebuildjob keepscontents: write.
Fixed¶
ru-docs-publish.yml: sites whosejekyll_sourceis a subdirectory failed with "No such file or directory - _config_generated.yml".ru-docs-publish.yml: the root-redirect step pushed togh-pagesfrom pull requests whendeploy_pageswas true. Pull requests now always take the build-only path.ru-docs-publish.yml: Doxygen failed whenOUTPUT_DIRECTORYhad a missing parent. The directory is now created first.ru-docs-publish.yml:PAGES_REPO_NWOandJEKYLL_GITHUB_TOKENare set for jekyll-github-metadata ("No repo name found").ru-docs-linkcheck.yml:fail_on_errors: falsestill failed on broken links, andverbosenever took effect. Both inputs were compared with the string'true'.ru-markdown-lint.yml(Docker path): the docker command was built as a string with literal quotes.