# Oink 0.4.0 — Scenario components for complete publishing workflows

> Oink 0.4.0 adds sequential reading and release surfaces, reusable landing pages, Book publishing with stable references, and a keyboard-first site shell in one consolidated Scenario Components release.

---

LLMS index: [llms.txt](/llms.txt)

---

**Release date:** 2026-08-14 · **Signed theme tag:**
[v0.4.0](https://github.com/pgsty/oink/tree/v0.4.0) · **Repository:**
[pgsty/oink](https://github.com/pgsty/oink)

Oink 0.4.0 delivers the complete Scenario Components system. The original design
separated Reading & Release, Landing, and Book work into 0.4, 0.5, and 0.6
milestones. The public release consolidates those tracks into one signed
`v0.4.0` tag so consumers can adopt one coherent contract instead of a chain of
interdependent previews.

The release remains local-first: consumer sites still build with Hugo Extended
and Go, without Node.js, a browser-time API, or a CDN. Interactive behavior is
progressive enhancement; HTML, print, Markdown, and RSS output retain the
content needed to understand each surface.

**v0\.4\.0 · 2026-08-14**
- [View release](https://github.com/pgsty/oink/releases/tag/v0.4.0)
- [Source · tar\.gz](https://github.com/pgsty/oink/archive/refs/tags/v0.4.0.tar.gz)
- [Source · zip](https://github.com/pgsty/oink/archive/refs/tags/v0.4.0.zip)
- [Compare changes](https://github.com/pgsty/oink/compare/v0.3.0...v0.4.0)
- [pgsty\/oink](https://github.com/pgsty/oink)

## Release highlights {#release-highlights}

### Reading and release {#reading-and-release}

Documentation, Book, and blog pages now have a sequential pager derived from the
same flattened navigation tree readers see in the sidebar. Previous and next
links also appear as same-origin `rel` metadata in the document head. Explicit
navigation data, link-only entries, sidebar dividers, and blog time order keep
their own semantics instead of becoming accidental destinations.

Math can use Goldmark passthrough with the theme's local KaTeX renderer. Sites
that cannot enable passthrough yet have a strict, parameter-free `eq` escape
hatch for display math. Numbered Book equations use the same shortcode only when
an explicit `num` is supplied.

Release pages can render local front-matter facts, release cards, checksums, and
asset lists without querying GitHub from the browser. A validated
`data/download/<key>.yaml` model feeds both the `download` shortcode and Landing
download sections, with separate rolling and pinned channels and an explicit
pending-release state.

See [Sequential reading and mathematics](/docs/scenarios/reading/) and
[Releases and downloads](/docs/scenarios/releases/) for the complete contracts.

### Landing pages {#landing-pages}

The data-driven homepage renderer is now a reusable `layout: landing` shell for
ordinary pages. A page may load inline data or language-aware records from
`data/landing/<key>/`, then compose 21 built-in sections including pricing,
comparison tables, command boxes, steps, timelines, code plates, case studies,
downloads, and bar charts.

All facts are local at build time. Optional reveal, count-up, copy, theme-image,
and compact-menu behavior loads only when a Landing page needs it. Without
JavaScript, the same page remains complete; marquees pause on focus or request,
respect reduced motion, and hide duplicate tracks from assistive technology.

See [Landing pages](/docs/scenarios/landing/) for data resolution, all 21
section types, local-fact rules, and the output matrix.

### Book publishing {#book-publishing}

Long-form manuals can declare Book metadata on the existing documentation shell.
Chapters gain draft labels, active-page sidebar headings, and semantic `fig`,
`tbl`, numbered `eq`, and language-aware `xref` targets. Whole-Book figure lists
and tables of contents use those same registries.

An opt-in aggregate print document rewrites cross-chapter component links into
document-local references and namespaces repeated heading IDs. The accompanying
migration tool is dry-run first and idempotent, with reproducible TPME, DDIA,
and pg-internal recipes, machine-readable reports, ambiguity skips, and a
second-run zero-change check.

See [Book publishing](/docs/scenarios/book/) for the authoring and migration
contract.

### Keyboard and shell {#keyboard-and-shell}

The shell now supports single-key reading navigation. `w` and `s` move through
the sidebar, `a` and `d` fold or unfold groups, `j` and `k` move through the
page outline, and `q` and `e` follow the sequential pager. `h` toggles a session
reading mode; `l`, `t`, `f`, and `c` switch language, theme, search, and command
surfaces. Every binding yields to editable controls, composition, held
modifiers, and dialogs.

The navbar now spans documentation, blog, taxonomy, and Swagger layouts with one
compact state instead of a second mobile menu. Page actions move into the
breadcrumb row as a Copy Markdown split button. Footers support validated `fat`,
`slim`, and `none` styles, while readers can collapse the fat footer's link grid
and retain that preference.

See [Keyboard navigation](/docs/advanced/keyboard/) and
[Navigation and menus](/docs/configure/navigation/).

## Compatibility and behavior changes {#compatibility}

- Hugo Extended 0.160.1 remains the minimum supported version.
- The module path remains `github.com/pgsty/oink`; consumers still need no
  frontend toolchain.
- Pagers default to the `docs`, `book`, and `blog` content types. Set an
  explicit type list or `pager: false` when a page should opt out.
- `/` now opens full search; `\` opens command-only mode. The `>` prefix still
  selects command mode inside the Palette.
- `params.footer_icp` and `params.footer_icp_url` are replaced by one inline
  Markdown value, `params.footer_center_info`. An explicit empty string hides
  the center region.
- `params.ui.navbar_enabled` defaults to `true`. Sites can override it globally,
  by section cascade, or on one page.
- Legacy homepage data and Docsy block shortcodes remain compatible, but new
  Landing work should use the canonical section registry.

## Upgrade to 0.4.0 {#upgrade}

1. Pin the signed tag and tidy the module graph.
2. Replace ICP-specific footer fields with `footer_center_info` if the site used
   them.
3. Review pager defaults, `/` and `\` shortcuts, and any local navbar or footer
   overrides.
4. Remove copied theme partials only after comparing their local differences
   with the 0.4 implementation.
5. Build representative docs, blog, Landing, Book, print, Markdown, mobile, and
   color-mode surfaces.

```sh
hugo mod get github.com/pgsty/oink@v0.4.0
hugo mod tidy
hugo --gc --minify
```

Follow the project-site [0.4.0 upgrade guide](/docs/upgrade/v0-4/) for the
consumer checklist. The theme repository retains the frozen
[PRD 5 migration reference](https://github.com/pgsty/oink/blob/v0.4.0/docs/prd5-migration-guide.md).

## Verification {#verification}

The signed tag resolves to the same commit as the released theme source. Theme
CI exercises Hugo Extended 0.160.1 and 0.164.0, 32-locale parity, vendored
assets, runtime unit tests, every PRD 4/5/6 contract, and the warning-strict
example site. The project site pins the public tag and covers bilingual source,
rendered Markdown, internal links, alternate builds, browser behavior, and the
full multilingual WCAG AA matrix.

Representative documentation, portal, Book, and archive sites also build from
the public `v0.4.0` module with workspaces disabled.

Source validation, a public tag, a consumer pin, and hosted deployment are
separate evidence gates. Publishing this note does not replace a smoke test of
the deployed URL after the site pipeline finishes.

## Full change set {#full-change-set}

See the complete source diff from
[v0.3.0 to v0.4.0](https://github.com/pgsty/oink/compare/v0.3.0...v0.4.0).
