Docs Design decisions
Design decisions
The key structural choices behind the site and hub — and a few things deliberately not done.
The notable structural choices behind fairyfox.io, and the reasoning for each.
Choices made
One repository holds the site, the notes, and the hub. The website, the living
notes/, and the cross-project hub/ all live in the same repository, with
notes/, hub/, and assets/references/ excluded from the rendered site. The hub
is the home page’s repository, so there is exactly one thing to clone and one
place the standards live.
A custom Jekyll build, no external theme. Hand-owned layouts, includes, and CSS instead of a gem theme — full control over a small surface, no upgrade churn, and markup that stays legible. The cost of writing the CSS is small for a site this size.
Build with the project’s own Bundler and Jekyll in Actions. GitHub’s built-in “deploy from a branch” build restricts plugins to an allowlist and pins Jekyll. Building through Actions lifts both limits and is the modern, recommended path. See deployment.
A user-site repository plus a custom domain. A GitHub user site (repository
named <username>.github.io) serves at the root, which suits a personal hub, and
the fairyfox.io domain is pointed at it. The same repository doubles as the
standards hub.
Navigation links into project Pages sites under the custom domain. Setting the domain on the user site causes the project Pages sites to be served under it too, so the hub and the project docs read as one connected set.
An on-site documentation library as a Jekyll collection. The docs are a _docs
collection rendered with a sidebar built from the category data, so the library has
consistent ordering and the header menu can be generated from the same source.
A neutral documentation voice. The site is written about the work, not in the owner’s first person and not as a personal brand — see principles and voice.
Things deliberately not done
Git submodules for sharing — rejected. Submodules pin a commit and couple repositories at clone and build time, the opposite of the loose wiring wanted here. Replaced by on-demand shallow clones in a git-ignored folder.
Automatic cross-repository triggers (webhooks, CI chaining) — rejected. Having one repository’s update automatically build another is the recursion risk the model avoids. Every sync pull is manual or on explicit request.
An off-the-shelf Jekyll theme — not used, to avoid upgrade churn and hidden markup.
Committing the reference clones — rejected. Tracking them would nest repositories and bloat history for content that is a throwaway read; they are git-ignored instead.
A second copy of the version number (for example in _config.yml) — rejected.
The single source of truth is the repository-root VERSION file; a second copy
would drift.