OINK 1.5.1 — Duo View repairs and publishing correctness
OINK 1.5.1 is a maintenance release following 1.5.0. It publishes the review
repairs accumulated after the bilingual reader shipped: the reader is now
called Duo View, its loading and sync states are clearer, and static output
keeps its format boundaries. The release also tightens navigation identity,
safe fallbacks, search ranking, accessibility, and localization across the
theme. Existing params.ui.compare and compare_translations settings remain
valid, and no content migration is required.
Duo View
The two-pane translation reader now uses the name Duo View in English and
the corresponding localized name in all 32 interface catalogs. The page entry,
Command Palette action, title, keyboard help, and status messages use the same
terminology; the params.ui.compare setting and compare_translations action
ID do not change. With keyboard navigation enabled, B toggles the
reader from the page and from either pane.
The reader treats an iframe’s initial about:blank load as pending, then
shows a localized Retry action and a direct link when a document is still blank
after 15 seconds. A pane becomes readable after its article is parsed, so slow
images do not discard an otherwise usable page. Fragment links reveal hidden
tab panels, and the reader remeasures after OINK tab changes. Blog archive pages
after the first and translations that publish no HTML are no longer offered as
targets.
Sync Scroll is now a labelled switch. Its orange note distinguishes a partial heading match from overall-progress synchronization and appears only when the headings actually differ. Continuous trackpad scrolling keeps the follower in step, while discrete jumps still ease when motion is allowed. The last target language, sync setting, visible pane, and both reading positions survive reload and history restoration. Escape closes the reader from a closed language menu and restores the focus that opened it.
Publishing and output correctness
RSS rendering keeps its page summaries in RSS format state, sorts entries before
applying the feed limit, omits undated pubDate values, and emits static
component HTML without browser controls or raw Markdown. Blog archive
pagination and prev/next links apply only to HTML, so Print produces one
complete aggregate instead of repeating the archive for every page.
Nested shortcode and Markdown components now namespace generated IDs with their full ancestry, while shared URL rules reject unsafe Landing links. Navigation JSON and section indexes remain stable across language and deployment prefixes; version links no longer repeat the current deployment directory. Markdown, LLMS, Print, RSS, forced-colors navigation, RTL typography, and print links keep their static and accessibility contracts.
Authoring and validation
Ordinary builds remain usable for positional shortcode arguments, invalid Book
numbers, missing manual-link references, and malformed Landing records. Each
case warns and uses its documented safe fallback. Search now ranks a repeated
term in its strongest field above a passing mention in that same field, while
respecting field tiers; technical identifiers such as top_k keep their useful
ranking. Page descriptions are read through .Description, avoiding the
deprecated .Params.description path in newer Hugo releases.
The release was checked with the fixed Hugo Extended 0.168.0 and Go 1.27.3 toolchain: 49 theme checks, 67 documentation checks, and 519 browser checks passed, including the eight-language comparison coverage and the reproduced RSS, Print, and stalled-pane regressions.
Upgrade
Pin the published module at v1.5.1 and keep Hugo’s built-in LibSass compiler:
Commit the resulting go.mod and go.sum. Existing Duo View configuration
continues to work. Review the upgrade guide when
upgrading a site that uses a vendored theme copy or a Git submodule. Keep the
upstream LibSass deprecation warning visible, and do not enable
--panicOnWarning or HUGO_PANICONWARNING.
