Hugo page schema
Built-in id: hugo:page:0.165
Published at https://hawkeyexl.github.io/manni/schemas/hugo/0.165.json. A
$schema that names this URL resolves to the bundled copy, with no network
call.
hugo:page:0.165 checks the front matter Hugo 0.165 reads from a .md page. It
requires nothing, because Hugo builds a page with no front matter at all. That
makes it a pure shape check. It catches what Hugo accepts without complaint and
then acts on wrongly. It is one of the platform
schemas, which say what a generator
accepts rather than what your team agreed.
| Property | Value |
|---|---|
| Id | hugo:page:0.165 |
| Title | Hugo front matter v0.165 |
| Files it fits | .md |
| Dialect | Draft 2020-12 |
| Required fields | None |
| Additional properties | Allowed (additionalProperties: true) |
| Reference kind | builtin |
| On by default | No |
| Upstream reference | Front matter |
| JSON | hugo/0.165.json |
Use it
Section titled “Use it”Hugo’s content root is content/, and a docs section usually sits under it:
meta: overrides: - files: "content/**" schemas: - hugo:page:0.165For a one-off run, pass the id directly:
manni meta validate content/ -s hugo:page:0.165Fields
Section titled “Fields”The 28 fields Hugo itself defines. Everything else you see in a Hugo site is a
user-configured taxonomy or a custom parameter rather than something Hugo
defines. It passes as an unknown key. That covers tags, categories,
series, and whatever your theme reads.
| Field | Type | Notes |
|---|---|---|
title, linkTitle, description, summary | string | None required; Hugo derives a title from the file name. |
date, lastmod, publishDate, expiryDate | string | Typed, not format-checked. See the aside below. |
draft, headless, isCJKLanguage | boolean | A quoted "false" fails here, which is the point. |
weight | integer | Lower sorts first. A quoted number sorts as a string. |
aliases, keywords, outputs | string array | |
slug, url, layout, markup, type, translationKey | string | |
menus | string | array | map | One menu, several, or a map of per-menu options. |
cascade | map | array of maps | The array form carries a _target filter per entry. |
build | map | list, render, publishResources. |
sitemap | map | changefreq is enumerated; priority is 0–1. |
resources | array | Each entry needs src. |
params, sites | map |
The two checks that pay for this schema are weight and draft. Both are
routinely written quoted, both are accepted by Hugo without a word, and both
then behave wrongly. A string weight sorts lexically, so "10" lands before
"9". And draft: "false" is a non-empty string, which is truthy, so the page
does not publish.
Additional properties
Section titled “Additional properties”Allowed. Taxonomy terms such as tags and categories are configured per site
rather than defined by Hugo, so they pass unchecked, as do custom parameters.
Example page
Section titled “Example page”A page carrying the common fields, at legal values. This is
test/fixtures/platform/hugo-valid.md, and it passes.
---title: Configuring the cachelinkTitle: Cachedescription: How Hugo's build cache works and when to clear it.date: 2026-06-25lastmod: 2026-07-01draft: falseweight: 30aliases: - /old/cache/keywords: [cache, build]outputs: [html, json]menus: mainparams: team: docsbuild: list: always render: truesitemap: changefreq: weekly priority: 0.5resources: - src: diagram.png title: Cache diagram---A common mistake
Section titled “A common mistake”A quoted weight is a string. Hugo accepts it and sorts it lexically:
---title: Configuring the cacheweight: "30"---✗ test/fixtures/platform/hugo-bad-weight.md /weight must be integer (line 3) [hugo:page:0.165]
1 file checked, 0 passed, 1 failed, 1 errorDrop the quotes. A quoted draft: "false" fails the same way, with
/draft must be boolean.