This is the multi-page printable view of this section. .

Return to the regular view of this page.

Oink project and website documentation

How the Oink theme and website are built, maintained, and deployed.
Section under construction.

Content (planned)

Planned content organization (tentative):

  • About: High-level information about the project, including its purpose, ownership, and overall status.
  • Design: Architectural design, Information Architecture (IA), layout, UX choices, theme related decisions, and other design-level artifacts.
  • Implementation: Code-level structure and conventions, Hugo/Docsy templates, SCSS/JS customizations, patches, and internal shims.
  • Build: Tooling, local development setup, CI/CD workflows, deployment environments, and automation details.
  • Quality: Link checking, accessibility standards, tests, review practices, and other quality-related processes.
  • Roadmap: Milestones, backlog, priorities, technical debt, and design/implementation decisions.

Site build information

Oink version: v0.2.0

1 - About the project

High-level information about the project, including its purpose, ownership, and overall status.

This section is under development.

1.1 - ReadMe

Oink theme README

Oink is a local-first Hugo theme for engineering documentation. It ships its styles, fonts, search, diagrams, API documentation runtimes, and content components with the theme, so consuming sites need only Hugo Extended, Go, and Git.

Read the current theme README for installation instructions, requirements, and attribution.

1.2 - Docsy changelog archive

Historical upstream Docsy changes retained for the imported release articles.

This page preserves the upstream Docsy changelog referenced by the imported Docsy release articles. It is historical context, not the OINK theme changelog or the project site’s release status.

For current OINK changes, read the OINK release reports or the theme’s source changelog. Upstream references below continue to point to Docsy so their original version links and terminology remain accurate.

Useful upstream links: Docsy releases, tags, the latest release, and milestones.

Style guide

  • Use past tense when describing releases.
  • Generally, start each change entry with a verb (in the past tense). For example: Added, Changed, Deprecated, Fixed.
  • It’s ok to follow that with “you can now…”. For example:

    Feature abc: you can now…".

  • For additional guidance, see Keep a Changelog1.

Definitions

Definitions...

Public customization surface

As a Hugo theme, Docsy exposes various features that client projects may rely on, such as:

  • Layouts
  • Styles
  • Configuration options
  • Runtime behavior

Aspects of these features are part of Docsy’s public contract, which we also refer to as the public customization surface. We refer to such feature aspects as public for short.

Because Docsy follows semantic versioning, we will not introduce breaking changes to the public customization surface outside of major version releases.2

Private/internal features

Aspects outside the public customization surface are considered private and internal features and implementation details.

Experimental features

Experimental features are not part of the public customization surface and may change or be removed in future releases.

We release experimental features so that projects can try them out and share feedback.

Breaking change

A breaking change is a backward-incompatible change to Docsy’s public contract that requires client projects to update their configuration, content, or customizations in order to:

  • Build successfully (without errors), or
  • Preserve existing, significant site functionality or user experience, including visual design

See semver.

Official support

Docsy is maintained with very limited resources and only supports the latest releases of Docsy, its dependencies & tools, and operating systems.

Specifically, the Docsy team officially supports the following:

  • Production use: the latest official release of Docsy — a stable semver version from the following sources:

    npm installs of Docsy from GitHub (google/docsy) are for development and testing only, not production use.

  • Issue reports: over the latest official release, a current pre-release, or the main branch.

  • The tool versions as specified for the Docsy release you are using:

  • Operating systems: macOS (latest minor release) and Linux.

Everything else — including Windows — is supported on a best-effort basis.

Bug fixes

We define a bug as undesirable behavior documented through an issue. Classify bug-fix commits or pull requests (PRs) under Fixed or Other changes, unless they extend beyond a fix and affect user-facing functionality. In that case, classify them as a Breaking change or New functionality, depending on scope. Prefer narrow, focused PRs where possible.

v0.16.0

For an introduction to this release, see the 0.16.0 release report. For Hugo-specific notes, see the Hugo 0.158+ upgrade guide. For the full list of changes, see the 0.16.0 release page or the git history since 0.15.0.

New:

Breaking changes:

Other changes:

Experimental:

  • Added a shared chrome build mode (td.chrome) that renders the repeated chrome (navbar, footer, left-nav) once per locale, for much cheaper link checking of large sites (#2659).

For maintainers:

  • Reorganized the repository package boundary: theme/package.json owns theme runtime dependencies, and the root package orchestrates the oink.pgsty.com and theme workspaces (#2617).
  • Added build and test guards (Hugo deprecation output, fixture-site regressions) and moved link checking from htmltest to Lychee. See 0.16.0 release report.

v0.15.0

For an introduction to this release, see the 0.15.0 release report. For the full list of changes, see the 0.15.0 release page.

New:

Breaking changes:

  • Community and footer link paths changed for multilingual sites; see blog (#2580).
  • Version menu markup and mobile visibility changed for sites using params.versions; see Version menu entries (#2557, #2586).
  • card shortcode rendering changed for Markdown arguments; breakage risk is low. See blog.

Other changes:

v0.14.3

Patch release 0.14.3 applies the layout fix for #2561, which ensures .td-main > .row grows vertically (#2569).

v0.14.2

Key fix for this patch: Apply .td-main flex only when sidebar exists (#2546).

For the full list of changes, see the release report and 0.14.2 release page.

Breaking changes (style-only):

New:

Other changes:

  • Added name attribute to search form field for better semantics and autofill (#2549).
  • Package version build metadata and footer icon tweaks (#2547).

v0.14.1

Patch release 0.14.1: fixed ToC sidebar width in xl viewports (#2538).

v0.14.0

Resources:

Breaking changes:

New:

Other changes:

v0.13.0

Resources:

Breaking changes:

New:

Other changes:

  • Improved accessibility: color contrast and typography (#2285).
  • Dark mode fixes and improvements:
  • Mobile navbar: added scroll indicators for overflow navigation (#2406).
  • Better NPM support: resolved optional and peer dependency issues (#2115). See breaking changes in the blog post.
  • Dependency updates: Bootstrap 5.3.8, Hugo 0.152.2, Node LTS ≥24.
  • Updated translations: added Occitan locale (#2173) and refreshed Simplified Chinese (#2313) and Ukrainian (#2331).
  • TOC visibility control: documented the notoc page parameter (available since 2016) for hiding the table of contents on specific pages (#2405).
  • Build-time rendering of mathematical and chemical formulae: now uses Hugo’s embedded KaTeX engine (#2276, #2394, #2395). For details, see LaTeX support with KaTeX.

Experimental:

v0.12.0

For the full list of changes, see the 0.12.0 release page.

Breaking changes:

  • Renamed the default Docsy heading render hook and heading self-link partials. This is a breaking change only if your project uses this feature. For details, see Heading self links (#2223).
  • Relocated and adapted layouts in response to Hugo’s new template system. For details, see Adapt to new template system in Hugo v0.146.0 #2243.
  • IMPORTANT: if your project overrides any of the layout files mentioned in #2243, then apply the same name changes in your project files. In particular, note that:
    • Taxonomy-related layout files: names have been swapped, and terms.html is now singular (#2257):
      • Renames _default/taxonomy.html to term.html (singular)
      • Renames _default/terms.html to taxonomy.html
    • Renames layouts/**/content.html by adding a _td- filename prefix (#2259).

Potential breaking changes:

  • Removed shortcode figure, hugo’s built-in shortcode figure can/will be used instead.

New:

Other changes:

  • Blog section index page content and title were ignored, they are now displayed (#1787). To recover the old behavior use the following style override: .td-section.td-blog .td-content { display: none; }.
  • Adds a comment shortcode, as a drop-in replacement for the one removed from Hugo’s built-in shortcode.

v0.11.0

For the full list of changes, see the 0.11.0 release page.

New:

v0.10.0

For an introduction to this release, see the 0.10.0 release report. For the full list of changes, see the 0.10.0 release page.

New: color themes and dark-mode support! For details, see Color themes and dark-mode support.

Breaking changes:

  • Removed shortcode card-code that was deprecated in 0.7.0; use shortcode card with named parameter code=true instead.
  • The following SCSS variables are inlined in favor of dark-mode compatible styling: $border-color, $td-sidebar-tree-root-color, $td-sidebar-bg-color, $td-sidebar-border-color (#1952)

Style changes (potentially breaking):

  • Adjusted the style of various shortcodes and elements so that they are compatible with light/dark mode. For details, see Important style changes in Color themes and dark-mode support.

v0.9.1

Patch release. For details, see 0.9.1.

v0.9.0

For an introduction and commentary, see the 0.9.0 release report. For the full list of commits, see the 0.9.0 release page. The most significant changes of this release are listed next.

Breaking changes:

  • Repository Links now work for multi-language sites (#1744).

    For any given page, repository links are now computed from a page’s resolved File path — as resolved through mount points, if any. That is, the path used is the one that refers to the file’s actual location on disk, not its logical path in Hugo’s union file system.

    This is a breaking change for pages of sites that use mounts and path_base_for_github_subdir. Projects will need to adjust the value of path_base_for_github_subdir to be relative to the file’s physical location.

  • Class names to disable repository links were misnamed with a suffix of the form --KIND. The new suffix is __KIND. For details, see Disabling links.

  • Heading self-link support has been reimplemented and projects must now explicitly enable the feature. For details, see Heading self links.

Footer changes: refactoring, for easier customization, and simplification. For details concerning all footer changes, see #1818.

  • Footer layout factored into parts: left, right, and center, with copyright a subpart of center. For details see Footer layout
  • Footer copyright, supports date-range, and site copyright fallback. For details, see Footer copyright.
  • Footer streamlined: the About-page footer link and All-rights-reserved text are now hidden by default. For details, see Footer streamlined.

Other changes:

v0.8.0

For the full list of changes, see the 0.8.0 release page.

Breaking changes:

  • Docsy is packaged as a single Hugo module (#1120). For details, see Use Docsy as a Hugo Module.
  • Important: for non-Hugo-module projects, running npm install in the Docsy theme directory now creates a github.com sibling folder (via Docsy’s postinstall script). For guidance on the Hugo-reported “failed to load modules” error, see #2116.
  • Page feedback, or User feedback:
    • In support of projects configuring analytics outside of Docsy, feedback functionality is enabled regardless of whether site.Config.Services.GoogleAnalytics.ID is set (#1727).
    • Feedback-event attribute changes (#1726):
      • Event name is page_helpfulrather thanclick
      • Event value for “yes” is 100 by default, rather than 1, allowing for more response options in the future. To override the default set params.ui.feedback.max_value.
  • SCSS: @function prepend() and file assets/scss/support/_functions.scss have been dropped. Instead use the more general SASS/SCSS list join() function (#1385).

v0.7.2

For the full list of changes, see the 0.7.2 release page. We mention some noteworthy changes here:

  • Algolia
    • #1651 DocSearch fixed for mobile and for sites with two search boxes (in the top and left navs).
    • #1662 DocSearch is supported by Docsy through site config.
    • For details, see Algolia DocSearch.
  • Tabbed panes:
    • persistLang is deprecated, use persist instead
    • Persistence is enabled by default (independent of the old persistLang parameter value) ; to disable use persist=disabled
    • Various fixes and enhancements, with more to come; for details, see #1641 and Tabbed panes.
  • Left-nav, and right-nav (TOC + page meta): spacing issues have been resolved; for details, see #1661.

v0.7.1

For the full list of changes, see the 0.7.1 release page.

Followup changes to Bootstrap (BS) 5.2 upgrade (#470):

  • td-blog-posts-list__item and td-blog-posts-list__body replace the .media and .media-body classes, dropped by BS 5 #1560.
  • Docsy test for Bootstrap version has been made more robust, and can be disabled. For details, see #1579.

v0.7.0

For the full list of changes, see the 0.7.0 release page.

New:

  • Click to copy button for Chroma-highlighted code blocks: If you already implemented this functionality on your website, you can disable it. For details see Chroma highlighting docs.

Breaking changes:

  • Hugo release 0.110.0 or later is required.
  • Upgraded Bootstrap (#470) to v5.2. For a list of Bootstrap’s breaking changes, see the Bootstrap migration page. Docsy-specific changes:
    • Clean up of unused, or rarely used, variables, functions, and mixins:
      • Dropped $primary-light
      • Dropped color-diff()
      • Dropped bg-gradient-variant() mixin (#1369)
    • Docsy’s RTL support has been removed because it is incompatible with BSv5. For progress on the reintroduction of RTL support, see #1442.
  • Shortcodes:
    • Now using Hugo’s native support for processing HTML & markdown, not file extension testing. (#906)
    • Dropped support for pre-Hugo-0.54.x behavior of shortcodes with markdown, {{%...%}}. (#939)
    • blocks/section: default and accepted values of the type argument have changed! For details, see blocks/section (#1472).
    • Card shortcodes (#1376)]:
      • Renamed CSS class td-card-deck to td-card-group.
      • card, card-code: markup of inner content (HTML/markdown) now depends on the syntax of the calling shortcode, not on extension of page file any more #906.
      • card-code is deprecated; use card with named parameter code=true instead.
  • Detection of draw.io diagrams is now disabled by default #1185

Other changes:

  • $list-inline-padding is increased in support of footer icons (#1523). If this global adjustment is a problem for your project, let us know and we can contextualize the adjustment to the footer.
  • Non-breaking changes that result from the Bootstrap v5 upgrade:
    • Draw.io diagram edit button: replaced custom colors by BS’s outline primary.

v0.6.0

For the full list of changes, see the 0.6.0 release page.

With this release we declare a feature freeze while we migrate to the newest Bootstrap version. See the announcement for more information.

New:

  • Simplified use of mermaid diagrams: when using a mermaid code block on your page, mermaid is now automatically enabled (needs hugo version >= 0.93.0). For existing sites built with hugo 0.93.0+, parameter mermaid.enable can be removed from site config.

  • Add render hook for chem code blocks: add auto-activation of math and chem blocks via KaTeX and mhchem. Support for formula rendering activation on individual pages only. Hugo version >= 0.93.0 required.

v0.5.1

For the full list of changes, see the 0.5.1 release page. BREAKING CHANGES are documented below.

After you update your project’s Docsy:

  • Update your project setup (see 0.4.0) if you haven’t already.
  • Run npm install.

New:

Breaking changes:

  • Tabbed panes, text display. By default, the content of a tab inside a tabbed pane is shown as code. As of version 0.4 of the shortcode, you can add the parameter code=false to your tabpane or tab shortcode in order to render tab content(s) as text (markdown or html). As of version 0.5 the name of this parameter was changed, we now use text=true in order to mark content as text.
  • Display logo by default. Most projects show their logo in the navbar. In support of this majority, Docsy now displays a logo by default. For details on how to hide the logo (or your brand name), see Styling your project logo and name.
  • Upgraded Bootstrap to v4.6.2 from v4.6.1, resulting in some style changes (such as an adjustment in the size of small). For details, see v4.6.2 release page.
  • Upgraded FontAwesome to v6 from v5. While many icons were renamed, the v5 names still work. For details about icon renames and more, see What’s changed in v6.
  • Search-box: the HTML structure and class names have changed, due to the Font Awesome upgrade, for both online and offline search. This may affect your project if you have overridden search styling or scripts.

Other changes:

v0.5.0

Unpublished.

v0.4.0

For the full list of changes, see the 0.4.0 release page. Potential BREAKING CHANGES are documented below.

After you update your project’s Docsy, run npm install.

Update your project setup:

If your project uses Docsy as follows:

Docsy now fetches Bootstrap and FontAwesome as NPM packages rather than git submodules. This has an impact on your project-build setup. To migrate your site, follow these steps (execute commands from your project’s root directory):

  1. Delete obsolete Docsy Git submodules:
    BASH
    git rm themes/docsy/assets/vendor/Font-Awesome
    git rm themes/docsy/assets/vendor/bootstrap
    These commands remove the submodules from Git’s tracking, from the .gitmodules file, and deletes the submodule files under themes/docsy/assets/vendor.
  2. Get Docsy dependencies:
    BASH
    (cd themes/docsy && npm install)
  3. Update your build scripts to fetch Docsy dependencies automatically. For example, if your site build uses NPM scripts, consider getting Docsy dependencies via a prepare script as follows:
    JSON
    {
      "name": "my-website",
      "scripts": {
        "prepare": "cd themes/docsy && npm install",
        "...": "..."
      },
      "...": "..."
    }
  4. (Optional) Build script cleanup. If your project uses Docsy as a git submodule, Docsy updates no longer require the --recursive flag when running git submodule update. Consider dropping the flag if you have no other recursive git submodules.

Proceed as usual to build or serve your site.

v0.3.0

For the full list of changes, see the 0.3.0 release page.

Breaking changes:

v0.2.0

For the full list of changes, see the 0.2.0 release page.

New:


  1. Old entries might not follow this guidance; feel free to update them as needed. ↩︎

  2. Docsy is not yet at version 1.0.0, so we are bound by the pre-v1 semantic versioning rules. We treat minor releases as if they were major releases. ↩︎

2 - Build

Tooling, local development setup, CI/CD workflows, deployment environments, and automation details.

2.1 - CI/CD

Agent-support checks

The site has an AFDocs configuration and npm script to generate a scorecard locally:

To generate a fresh scorecard, run each of these commands in separate terminals:

BASH
npm run serve             # From one terminal
npm run check:afdocs:dev  # From another terminal

The latter command saves the generated scorecard to docs/advanced/agent-support/afdocs-scorecard.txt under content, which will be included in Scorecard examples on the next build.

Note that the scorecard generation is not run as a part of the full CI/CD pipeline. It needs to be run manually.

Read more: AFDocs config file format.

Prettier formatting

We use Prettier to format the project-site files using the following command:

BASH
npm run check:format

To fix formatting, run:

BASH
npm run fix:format

Workaround for i18n files

The translation files in the i18n directory are formatted using Prettier. But Prettier removes the blank line before the # Feedback section heading. This seems to be a known issue, for example see:

We’ve worked around this bug, and avoided using prettier-ignore directives, by formatting the preceding entry in the YAML file to be a block scalar, like this:

YAML
community_guideline: >-
  Contribution Guidelines

This ensures that the blank line is preserved. Hopefully Prettier will be fixed and we’ll be able to remove this hack.

2.2 - Git repository layout and branch model

Repositories

Oink uses two focused repositories:

Repository Responsibility
Oink theme Published Hugo Module, layouts, assets, and i18n
Oink project site Documentation, examples, regression tests, and CI

The theme repository includes a deliberately small exampleSite/ for checking the theme checkout, but no project-site content or npm workspace. Consumer sites import github.com/pgsty/oink; the independent project site is one such consumer.

For local development, clone both repositories as siblings and connect them with an ignored Go workspace:

TEXT
~/pgsty/
├── oink/
└── oink.pgsty.com/
BASH
cd ~/pgsty/oink.pgsty.com
go work init .
go work edit -replace=github.com/pgsty/oink=../oink
export HUGO_MODULE_WORKSPACE=go.work
npm ci
npm run serve

Branch model

The theme repository uses:

  • main for the next theme release;
  • release for the current stable release and maintenance work;
  • vX.Y.Z tags for immutable public releases.

The site repository uses:

  • main as its only long-lived branch for documentation, previews, and production deployment.

Site-only changes do not require a theme release. Theme changes are first validated against a local sibling checkout, released from the theme repository, then pinned in the site’s go.mod.

Published site variants

The site has a single configuration file, hugo.yml at the repository root. There are no per-environment config overlays, so production, previews, and local builds all resolve the same parameters; the Hugo environment (-e) only selects build-time behavior such as asset fingerprinting and minification.

The production workflow builds directly from main, uploads public/ as a GitHub Pages artifact, and deploys it through the Pages API. The repository does not maintain a generated Pages branch.

Release workflow

  1. Develop the theme on main and test it against the sibling site checkout.
  2. Merge the release candidate to release and create the vX.Y.Z tag in the theme repository.
  3. Update the site with hugo mod get github.com/pgsty/oink@vX.Y.Z, run its checks, and merge the resulting go.mod and go.sum changes.
  4. Merge and push the reviewed site update to main; that push triggers the production deployment.

This keeps theme artifacts immutable and lets documentation deploy on its own schedule.

3 - Implementation

Code-level structure and conventions, Hugo/Docsy templates, SCSS/JS customizations, patches, and internal shims.

This section documents code-level implementation details for the Docsy website, including patches, internal shims, and customizations.

Patches and workarounds

3.1 - ScrollSpy patch

Runtime patch for Bootstrap ScrollSpy to handle invalid CSS selector IDs.

As of Docsy 0.13.0

Problem

As of Bootstrap 5.3.8 (the version used by Docsy 0.13.0), ScrollSpy fails if a page contains a heading ID that is not also a valid CSS # selector. This can happen, for example, if a heading ID starts with a digit. For technical details about this bug, see #2329.

Solution

Docsy 0.13.0 implements a runtime patch for ScrollSpy that intercepts ScrollSpy’s initialization to properly handle heading IDs starting with digits or containing other characters that form invalid CSS selectors. This allows active TOC entry tracking to work correctly without altering the original heading IDs, so links to headings continue to work as expected.

The patch is automatically applied when ScrollSpy is enabled (which is the default). For implementation details, see #2382, #2383.

Maintenance

CI/CD automatically keeps the patch up-to-date when Bootstrap is updated. The ci:prepare script extracts the method from Bootstrap, applies the patch, and updates the runtime patch file. If the Bootstrap method code has changed to a degree that the patch no longer works, CI will fail, indicating that the patch file needs manual review and updates.

Until the upstream ScrollSpy fix is released in a future Bootstrap version, this patch ensures that active TOC entry tracking works reliably for all pages.

References

4 - Project repositories

Source repositories for the Oink theme and project site.

5 - Style guide

Writing and formatting conventions for Docsy project documentation.

This project follows Google’s developer documentation style guide, and uses Prettier and Markdownlint to enforce basic formatting rules.

Front matter

  • Do not quote string values unless doing so would otherwise cause ambiguity or unintended type interpretation.
  • Drop linkTitle when it is the same as title.

Content

Alerts

  • Prefer Hugo’s blockquote alert syntax over the legacy alert shortcode for new and edited content. Both render similar output, but the blockquote form is better supported by tools and agents, and naturally renders as is in Markdown format for AI agents.

Lists

  • Use periods when list items are complete sentences (including imperative steps).
  • Omit periods when list items are fragments, labels, or link-only bullets.
  • Keep punctuation consistent within each list. When this isn’t possible, ask the author how they prefer reworking the list item text: e.g., by making all sentences complete.

Verb tense

  • Use present tense for all content, except as noted below.
  • For release notes and upgrade posts:
    • Use present tense when referring to the release itself, for example:

      Docsy 0.14.0 adds …

    • Use past tense only when describing previous releases or pre-release behavior, for example:

      Before Docsy 0.14.0, the navbar was …

  • For the Changelog: use past tense; see its style guide.