# Page parameters

> The full front matter table — every page key the theme actually reads, grouped by sidebar, shell, search, output, page end, Book, landing and release pages.

---

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

---

This page is the complete table of page-level parameters, listing only the keys
the OINK theme reads. Keys the theme reads solely to warn that they were
renamed or removed are not listed here — they are in
[Migration](/docs/design/migration/), and they are also kept out of the
generated editor schema. Hugo's own front matter fields (`slug`, `url`, `build`,
`sitemap`, `expiryDate` and the rest) work as usual; their meaning is in the
[Hugo documentation](https://gohugo.io/content-management/front-matter/). Site
parameters (`params.*` in `hugo.yml`) are in
[Configuration](/docs/customize/config/).

## How to read the tables {#how-to-read}
Precedence, highest first:

1. The page's own front matter;
2. The nearest `cascade` (when several cascade layers set the same key, the one closest to the page wins);
3. The site parameter in `hugo.yml`.

Keys whose *Default* column says "site value" fall back to the site parameter of
the same name when unset.

Page keys are written at the top level of the front matter, and the key name is
the site key with its `ui.` prefix dropped: the site's
`params.ui.section_index` is the page's `section_index`. Front matter never
carries a `ui:` block; the keys sit at the top level. A `ui:` block written
there is not read and not reported, so check the key name against this page
when a setting seems to have no effect.

```yaml {title="content/docs/wide-reference.md"}
---
title: Compatibility matrix
weight: 40
page_width: wide
footer_style: slim
image_zoom: true
section_index: list
---
```

Inside a `cascade` the key names are unchanged, just one level deeper:

```yaml {title="content/docs/reference/_index.md"}
cascade:
  pager: false
  section_index: list
```

An invalid value does not stop the build. The theme warns — naming the key, the
value it got and the fallback it used — and renders the page with the default in
the table, so one typo degrades one setting instead of serving HTTP 500 on every
URL under `hugo server`. It still never ships: every publishing gate builds with
`--panicOnWarning`, which turns that warning back into a hard failure where it
counts.

No front matter key stops the build; the theme's templates never raise an
error. Where carrying on would publish something wrong rather than merely
plain — an incomplete upstream attribution, for instance, because a partial
notice reads exactly like a complete one — the warning is followed by omitting
that block entirely rather than by a fallback. The one thing here that does
stop a build belongs to Hugo, not the theme: a reference that cannot resolve.

## Basics {#basic}

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `title` | string | — | Page heading, browser title, search result title. Required on every page |
| `linkTitle` | string | `title` | Short name in the sidebar, breadcrumbs, pager and cards |
| `description` | string | — | One-sentence summary: section cards, search snippet, `meta description`; rendered as a standfirst above the body on blog pages |
| `weight` | integer | `0` | Ordering among siblings; use multiples of 10. `0` (unset) sorts after every page that has a weight — see [Organizing content](/docs/write/organize/#weight) |
| `draft` | boolean | `false` | A draft never reaches the build output; `hugo server -D` previews it — see [Writing pages](/docs/write/pages/#drafts) |
| `date` | date | — | Blog date, and the sort key for release pages; a future date is excluded by default |
| `lastmod` | date | Git commit time | The page-end "last modified"; not needed by hand when the site enables `enableGitInfo` |
| `aliases` | string array | — | Redirects an old path to this page; for page migration, not for everyday navigation |
| `type` | string | top-level directory name | Decides the template and the shell: `docs`, `book`, `blog`, `swagger` — see [Organizing content](/docs/write/organize/#type-and-shell) |
| `layout` | string | — | Picks a layout for one page: `landing`, `releases` |
| `cascade` | map | — | Pushes the keys below down the whole subtree |
{.fields meta="type default"}

## Sidebar and navigation {#navigation}

The guide is [Organizing content](/docs/write/organize/).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `icon` | Font Awesome class pair | — | Icon in the sidebar, section cards and search results, e.g. `fa-solid fa-rocket` |
| `toc_hide` | boolean | `false` | Absent from the sidebar tree and from the pager sequence |
| `hide_summary` | boolean | `false` | Absent from the section index |
| `sidebar_divider` | boolean | `false` | The row renders as a sidebar group heading: not a link, and not in the pager sequence |
| `sidebar_expanded` | boolean | `true` for blog sections, `false` otherwise | This section is expanded by default in the sidebar |
| `sidebar_root_for` | `self` / `children` | — | Makes this section a sidebar tree root; `self` includes the section index, `children` covers descendants only. Any other value warns and is ignored |
| `sidebar_root_link_self` | boolean | `true` | The root row links to itself; `false` links to the parent section instead. A non-boolean warns and uses `true` |
| `sidebar_root_menu` | boolean | `true` | Whether a top-level section appears in the root switcher |
| `toc_root` | boolean | `false` | When the sidebar root is the site home, excludes this whole top-level section from the tree and the pager sequence |
| `manual_link` | URL | — | The sidebar and section index row points elsewhere |
| `manual_link_relref` | content reference | — | The same, resolved with `relref`; a missing target fails the build |
| `manual_link_title` | string | `title` | Hover title for the manual link |
| `manual_link_target` | string | — | For example `_blank`; the theme adds `noopener` |
| `no_list` | boolean | `false` | The section index generates no child list |
| `simple_list` | boolean | `false` | The child index renders as a compact bulleted list |
| `section_index` | `list` / `cards` | site value (`list`) | Style of the child index. An invalid value warns and falls back |
| `section_index_columns` | integer | `2` | Column count in the card style |
| `notoc` | boolean | `false` | Hides the right-hand page outline |
| `pager` | boolean | decided by `params.ui.pager_types` | `false` turns off previous / next for this page. A non-boolean warns and is ignored |
| `navbar_enabled` | boolean | site value (`true`) | Whether this page renders the navbar |
| `navbar_autohide` | boolean | site value (`false`) | The navbar hides itself on pointer devices |
| `breadcrumb` | boolean | shell default | Whether this page renders breadcrumbs; Docs/Book default on and Blog defaults off |
| `theme_color` | string | site value | `#rgb`/`#rrggbb` hex tinting this page's accent grounds. On a section root's `cascade` it gives the whole section an identity — see [Brand and appearance](/docs/customize/brand/#theme-color) |
| `theme_color_dark` | string | derived | The dark half of the accent. A page overriding `theme_color` under a cascade that also sets this key inherits that dark value, so override both. `theme_color: false` opts the page out of an inherited section color entirely |
| `page_context_menu` | boolean | site value (`true`) | The page action menu on the title row (copy Markdown, edit this page, print, …) |
| `page_context_menu.assistant_links` | boolean | site value (`false`) | The ChatGPT / Claude handover items, written `page_context_menu: { assistant_links: false }`. A page may only narrow the site policy, never enable it alone |
{.fields meta="type default"}

## Page shell {#shell}

Site-level defaults and what they do are in
[Layouts and page types](/docs/customize/layout/).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `page_width` | `normal` / `wide` / `full` | `normal` | Width of the content column. An invalid value warns and falls back |
| `reading_width` | `slim` / `normal` / `wide` | `normal` | Reading measure on Book pages; applies to `type: book` only |
| `footer_style` | `fat` / `slim` / `none` | site value (`fat`) | Footer shape. An invalid value warns and falls back |
| `body_class` | string | — | A class appended to `<body>` for the site's own CSS |
| `reading_time` | boolean | site value | Whether this page shows a reading time; `false` hides it |
| `sidebar_enabled` | boolean | `true` | Whether this page shows the left sidebar; `false` hides it |
| `scroll_spy` | boolean | site value | Scroll tracking in the outline; `true` enables it |
| `keyboard_nav` | boolean | site value (`true`) | Single-key keyboard navigation — see [Keyboard navigation](/docs/customize/keyboard/). A non-boolean warns and falls back |
| `lastmod_commit` | `subject` / `hash` / `none` | `subject` | How the commit is shown after "last modified". An invalid value warns and falls back |
| `sidebar_expand_levels`, `sidebar_menu_compact`, `sidebar_menu_foldable`, `sidebar_item_overflow` | as the site parameter | site value | Sidebar behaviour can be overridden per page too; the values are in [Configuration](/docs/customize/config/) |
| `sidebar_width_min`, `sidebar_width_max` | positive integer | site value (`220` / `480`) | Per-page lower and upper bounds for desktop sidebar resizing; a minimum above its maximum warns and restores the site pair |
| `code_copy` | boolean | site value (`true`) | Default copy control for code blocks on this page; an explicit fence `copy=` still wins |
| `toc_style` | `fixed` / `flow` | site value (`fixed`) | Fixed right-rail panel or a wider rail beginning in the content flow |
| `toc_taxonomies` | boolean | site value (`true`) | Whether taxonomy clouds join the right-rail outline |
| `taxonomy_icons` | map | site value | Per-taxonomy icon overrides for this page or section cascade |
{.fields meta="type default"}

## Search {#search}

The guide is [Search](/docs/customize/search/).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `search_keywords` | string or string array | — | Extra search terms, including synonyms and other languages |
| `search_boost` | positive number | `1.0` | Ranking multiplier; the final score is the text match score times this value. A non-numeric, non-finite, zero or negative value warns and falls back to `1.0` |
| `search_exclude` | boolean | `false` | Keeps the page out of the local index |
{.fields meta="type default"}

## Output formats {#outputs}

The guides are [AI-agent support](/docs/customize/agents/) (`.md` and
`llms.txt`) and [Print](/docs/customize/print/).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `outputs` | string array | site `outputs` | Which output formats this page generates; `[HTML]` stops the `.md` twin |
| `no_print` | boolean | `false` | Excluded from the whole-chapter and whole-book print aggregate |
{.fields meta="type default"}

## Page end: comments, feedback and provenance {#page-end}

The order is fixed as feedback → provenance → pager → comments; see
[Writing pages](/docs/write/pages/#page-end).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `comments` | boolean | site `params.comments.enable` (`false`) | Whether this page shows the giscus comment section — see [Comments](/docs/admin/comments/) |
| `feedback` | boolean or map | site `params.ui.feedback` (off) | The map form takes `enable` and `reasons`. Anything else warns and falls back |
| `annotation` | boolean | site `params.ui.annotation` (on) | The "last modified / provenance" block at the page end. Only a boolean is accepted; anything else warns and falls back |
| `backlinks` | boolean | site `params.ui.backlinks` (off) | Whether the right rail shows the "Backlinks" group beside the table of contents; a section can cascade it. Only a boolean is accepted; anything else warns and falls back — see [Navigation and menus](/docs/customize/navigation/#backlinks) |
| `translation_notice` | language code or `false` | site `params.ui.translation_notice` (off) | The language code of the authoritative version, so a translation can say so and link back; write `false` on a page authored natively in this language |
{.fields meta="type default"}

### Upstream attribution {#upstream}

When a page is derived from material elsewhere, `upstream_link` declares the
source and the page-end provenance line gives the work, the copyright holder,
the licence and a link to the full notice. This family resolves site parameters
→ the `data/upstreams` entry named by `upstream_source` → this page's front
matter, so the most specific declaration wins.

`upstream_link` is read from front matter only (a cascade counts, site
parameters do not) — a site-wide value would make every page claim the same
source. A companion key without `upstream_link` warns and the attribution is omitted.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `upstream_link` | URL | — | The address of the material this page is derived from. An empty string opts out of an inherited cascade value |
| `upstream_name` | string | — | The upstream work, as the attribution names it. Required once `upstream_link` is set |
| `upstream_copyright` | string | — | The copyright notice, retained as upstream wrote it. Required |
| `upstream_license` | SPDX identifier | — | Must be found in `data/licenses`, or it warns and the attribution is omitted. Required |
| `upstream_notice` | site path or URL | — | The page carrying the full notice (licence text, warranty disclaimer, upstream NOTICE, snapshot pin). Required |
| `upstream_ref` | string | — | The tag or commit the snapshot pins, shown in parentheses after the work |
| `upstream_source` | string | site parameter | The entry name in `data/upstreams`, for upstream facts shared by many pages; a missing entry warns and the attribution is omitted |
| `upstream_modified` | boolean | `false` | Changes the credit verb to say the work was adapted, and adds a "view history" link to that same sentence when the site has repository information — one line, not two. A non-boolean warns and the page is treated as unmodified |
{.fields meta="type default"}

Missing any one of the four required keys (`upstream_name`,
`upstream_copyright`, `upstream_license`, `upstream_notice`) warns and omits the attribution: a
partial attribution is worse than an obvious omission. The theme ships an SPDX
table at `data/licenses.yaml`, and a site adds to or overrides it with a file of
the same name.

## Image zoom {#image-zoom}

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `image_zoom` | boolean | site value (`false`) | Whether images on this page open full size — see [Images](/docs/components/image/). A non-boolean warns and falls back |
{.fields meta="type default"}

## Blog posts {#blog}

The guide is [Blog posts](/docs/write/blog/).

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `author` | string | — | Post byline; inline Markdown is allowed. Ignored on a page that has `authors` |
| `authors` | string array | — | Terms of the `authors` taxonomy, in byline order — see [Authors and bylines](/docs/write/blog/#authors). Needs `author: authors` under `taxonomies:` |
| `series` | string array | — | Terms of the `series` taxonomy. The strip above the body uses the first one — see [Series](/docs/write/blog/#series) |
| `series_weight` | integer | — | Place in the series. Weighted members come first in ascending order, the rest follow by ascending date |
| `tags` | string array | — | Tags — see [Taxonomies](/docs/customize/taxonomy/) |
| `categories` | string array | — | Categories, likewise |
| `images` | string array | — | The first entry becomes the post's featured image and share card; put it in a section `_index.md` cascade for a section-wide default. `images: []` opts the page out of an inherited cascade value; it does not suppress an image the page bundle already supplies under a `featured`, `cover` or `thumbnail` name |
| `byline` | string | — | Credit shown with the resolved featured image when that image is rendered |
| `featured_image` | `none` / `banner` / `wash` / `hero` | site value (`none`) | How this article renders its own featured image; `hero` paints the immersive full-bleed shell. An invalid value warns and falls back |
| `blog_index` | `list` / `cards` / `table` | site value (`list`) | Written on a blog root, the index form for that section. `table` lists the whole section without pagination. An invalid value warns and falls back |
| `blog_index_columns` | positive integer | site value (`3`) | Card columns at wide breakpoints; medium and narrow layouts retain their responsive limits |
| `blog_index_size` | positive integer | site value (`12`) | Posts per page for `list` and `cards`; `table` always lists the whole section |
| `blog_index_toggle` | boolean | site value (`false`) | Publishes all three index forms and lets the reader switch among them; hidden forms do not load images |
| `share` | string array or `false` | site `params.ui.share` (empty) | The page-end share targets, replacing any inherited list; `false` opts this page out — see [Share](/docs/write/blog/#share). An unknown target warns and is dropped |
| `summary` | string | — | Fallback excerpt for post rows on tag and category pages; `description` wins |
{.fields meta="type default"}

## Book {#book}

The guide is [Books](/docs/write/book/). A whole book sets `type: book` through
a section `cascade`.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `book_number` | string | — | Chapter number, shown before the page title and the sidebar entry |
| `book_status` | `draft` | — | Marks a draft chapter: flagged in the sidebar and contents, and left out of the indexes by default |
| `sidebar_headings` | `false` / `true` / integer 2–4 | site value (`false`) | Expands the h2–h4 branch under the current sidebar entry. Out of range warns and falls back |
| `book_draft_banner` | boolean | site value (`false`) | Adds a banner at the top of a draft chapter. A non-boolean warns and falls back |
{.fields meta="type default"}

## Landing {#landing}

The guide is [Home and landing pages](/docs/customize/home/). Any page with
`layout: landing` uses the landing shell.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `landing` | string | — | Data is taken from `data/landing/<key>/<language>.yaml` |
| `sections` | array | — | Section definitions inlined in front matter, taking precedence over `landing`. Anything but an array warns and no sections render |
{.fields meta="type default"}

## Release pages {#releases}

The guide is [Releases and downloads](/docs/write/releases/). A section with
`layout: releases` ignores `weight` and sorts by release date and SemVer,
newest first.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `release_url` | string | — | One GitHub release URL, `https://github.com/<owner>/<repo>/releases/tag/<tag>`. The theme derives the project, tag, date and asset list from it. Anything else warns and the release block is skipped |
{.fields meta="type default"}

## Related {#related}

- [Writing pages](/docs/write/pages/) — the handful of keys every page needs
- [Organizing content](/docs/write/organize/) — what the sidebar and navigation keys actually do
- [Configuration](/docs/customize/config/) — the full table of site parameters in `hugo.yml`

---

Backlinks:

- [Comments](/docs/admin/comments/)
- [Troubleshooting](/docs/admin/troubleshooting/)
- [Cards](/docs/components/cards/)
- [Fields](/docs/components/fields/)
- [Includes](/docs/components/include/)
- [AI-agent support](/docs/customize/agents/)
- [Configuration](/docs/customize/config/)
- [Layouts and page types](/docs/customize/layout/)
- [Repository links](/docs/customize/repository/)
- [Search](/docs/customize/search/)
- [Taxonomies](/docs/customize/taxonomy/)
- [Authoring](/docs/write/)
- [Blog posts](/docs/write/blog/)
- [Books](/docs/write/book/)
- [Organizing content](/docs/write/organize/)
- [Writing pages](/docs/write/pages/)
