content/
├── blogs/
│ ├── _index.md # title of the blog list page
│ └── my-post.md
├── gallery.md # see Gallery page
├── projects/ # optional, see Project Pages
├── es/ … # per-language content, see Internationalization
The blog URL is /blogs/. The menu item url: /blogs and footer.recentPosts.path: "blogs" point at it; if you use a different section name (e.g. posts), update both.
hugo new content content/blogs/my-post.md
This uses archetypes/default.md:
---
title: "My Post"
date: 2025-01-01T10:00:00+00:00
draft: true
author:
tags:
image:
description:
toc:
---
Set draft: false (or run hugo server -D) to publish.
| Key | Used by | Description |
|---|---|---|
title |
list, single, search | Post title. |
date |
list, single, footer | Publication date (formatted per language). |
draft |
Hugo | true hides the post from production builds. |
author |
single | Shown before the date. |
tags |
single | Rendered as links in the sidebar and used for tag pages (/tags/<tag>/). |
image |
list, single, footer, search | Featured image (path under static/ or URL). |
description |
<meta>, search, LinkedIn share text |
Short summary. |
toc |
single | Table of contents sidebar; shown by default (see note). |
socialShare |
single | Per-post override for share buttons. |
enableReadingTime |
single | Show reading time even if disabled globally. |
enableScrollProgress |
single | Show scroll bar even if disabled globally. |
mathjax |
scripts | true loads MathJax for this page only. |
github_link |
– | Example posts include it; not used by the layouts. |
Note on booleans: several templates use
… | default true, and Hugo treatsfalseas “unset”, so writingfalsein these options may not turn the feature off. If a switch does not work, remove the corresponding partial/section via a layout override.
layouts/_default/list.html renders cards (image, title, date, summary, Read button) with pagination (pagination.pagerSize). Hide card images with:
params:
listPages:
disableFeaturedImage: true
The label “Read” comes from params.terms.read or the read i18n key.
~225 words/minute, computed client-side by static/js/readingTime.js).image..TableOfContents) in a sticky sidebar.singlePages.tags.openInNewTab is true.params.hostName, the page permalink, title/description and tags.static/js/scrollProgressBar.js).services.disqus.shortname is set.:smile: shortcodes are converted (emojify).params:
singlePages:
socialShare: true
readTime:
enable: true
content: "min read"
scrollprogress:
enable: true
tags:
openInNewTab: true
The example posts under exampleSite/content/blogs/ demonstrate everything supported:
| Post | Shows |
|---|---|
markdown-syntax.md |
Headings, quotes, tables, code blocks, lists, inline HTML |
rich-content.md |
Hugo built-in shortcodes: X/Twitter, Vimeo, YouTube, Instagram, GitHub gists… |
math.md |
MathJax equations (needs mathjax) |
emoji-support.md |
Emoji shortcodes |
placeholder-text.md |
Long-form filler |
Raw HTML in Markdown requires markup.goldmark.renderer.unsafe: true (set in the example config).
Enable globally (params.mathjax: true) or per post (mathjax: true). Inline math uses \( … \), display math uses $$ … $$.
See Integrations.
Standard Hugo taxonomies apply: tags in front matter automatically create /tags/ and /tags/<term>/ list pages that use the same list layout. Terms with special characters (e.g. C#) are URL-safe.
With outputs.page/home containing RSS Hugo generates index.xml feeds.