HugoBlog

hugo-seotax — Hugo Blog Template

By minyeamer

hugo-seotax is a Hugo blog theme built around dynamic search of categories and tags to help readers discover content, with multilingual interface, dark mode, and series navigation.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-09-30View source

What stands out

A quick read of the recorded project description.

01

Dynamic fuzzy search based on Fuse.js, supporting keyword, parent/child category, single tag, and multi-tag AND/OR combination queries

02

Two-level taxonomy system with configurable category menu order; the sidebar can display the category tree and recent posts

03

Client-side interface translations for 27 languages; switching languages does not refresh the page or change the URL

04

Dark mode follows system preference, supports keyboard shortcut toggling, and syncs with the Disqus comment area

05

Mac-style code blocks with highlight.js syntax highlighting, line numbers, copy button, and language label

06

Series navigation, Schema.org structured data, PWA precaching, and giscus/Disqus comment support

Template Details

hugo-seotax is a Hugo theme for blogs. Its name combines Search and Taxonomies, and its core idea is to let readers discover articles through search and category filtering rather than relying on many static pages generated by tags or categories. The theme provides dynamic fuzzy search based on Fuse.js, supporting five query modes: keyword, parent category, child category, single tag, and multi-tag AND/OR combinations. It can be triggered via the / or s keyboard shortcuts or by clicking the search bar.

The taxonomy system uses a two-level structure: the first item in front matter categories is the parent category, and the second is the child category. The sidebar can display the category tree and recent posts, and the category order can be configured by weight via params.menu.categoryOrder. The post list sorting can be configured as newest, oldest, or disabled, and the search page has four sorting modes: relevance, newest, oldest, and disabled.

The theme includes client-side interface translations for 27 languages. Language switching happens instantly in the toolbar without refreshing the page or changing the URL; this is independent of Hugo's own multilingual content system. On multilingual sites, the search index and search resources are generated separately per content language, and results are not mixed across languages.

Other features include: dark mode (follows system preference, can be toggled with Cmd/Ctrl + Shift + S, and syncs with the Disqus comment area), responsive layout (collapsible sidebar, mobile overlay table of contents, adaptive thumbnails), Mac-style code blocks (highlight.js syntax highlighting, line numbers, copy button, language label), series navigation, Schema.org structured data, IcoMoon subset icon font, PWA Service Worker precaching, Disqus and giscus comments, and reading time calculated from text, images, code blocks, and tables.

Usage limitations: the theme requires Hugo 0.158 or later extended version; it is recommended to disable the term kind via disableKinds to avoid generating many static tag pages; image-related configuration must use params.images rather than params.image; when params.posts.sort is set to disabled, the homepage still sorts by newest first, and post-list pages can set params.sort separately. If remote images need their dimensions extracted at build time to prevent CLS, copies must be stored under assets/_images/.

HugoBlog

Is it right for your project?

Use Cases

  • Building a personal technical blog where browsing is primarily through category and tag retrieval
  • Sites that need a multilingual interface but do not want to repeatedly generate pages for each language
  • Blogs that want to replace many static pages generated by tags/categories with a single dynamic search page
  • Developer writing scenarios that require continuous series reading, code block display, and dark mode

Suitable For

  • Bloggers who use Hugo and are familiar with YAML/TOML configuration
  • Technical writing sites whose content is organized by two-level categories and tags
  • Personal sites that need a client-side multilingual interface and dark mode
  • Blogs that want to reduce the number of static taxonomy pages and use search as the main entry point

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Hugo 0.158 or later extended version

  2. 2

    Can be installed via Git submodule, Hugo Module, or by copying exampleSite

  3. 3

    It is recommended to set disableKinds: ["term"] in the configuration to replace static tag-generated pages with a single dynamic search page

  4. 4

    Image-related parameters use params.images; remote images need copies stored in assets/_images/ to extract dimensions at build time

  5. 5

    When params.posts.sort is set to disabled, the homepage still sorts by newest first; post-list pages can set params.sort separately

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.

Must comply with when using

  • Allows free use, modification, commercial use, and distribution of that version's code.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Using this theme requires Hugo 0.158 or later extended version; lower versions or non-extended versions cannot build properly.
  • The official recommendation is to disable the term kind via disableKinds in the configuration to avoid generating many static pages divided by tags; this is a recommended configuration, not mandatory.
  • Image-related configuration must use params.images rather than params.image; using the wrong parameter name will have no effect.
  • If you want to extract remote image dimensions at build time to prevent CLS, you need to store copies of remote images in the assets/_images/ directory; otherwise this optimization cannot be obtained.
  • When params.posts.sort is set to disabled, it only hides the sorting control; the homepage still sorts by newest first, and sorting is not turned off.
  • When params.search.sort on the search page is set to disabled, it only hides the sorting control; the search page still processes by default newest first and responds to the sort query parameter.
  • Comment functionality requires choosing either giscus or disqus and configuring the corresponding parameters (such as repo, repoId, shortname); otherwise comments are unavailable.
  • If site analytics are needed, you must provide the Google Analytics tagId yourself; this feature depends on an external service.
  • Search engine verification requires filling in the respective verification codes for Google, Naver, Bing, and Yandex yourself, depending on external platform accounts.
  • Some shortcode components (columns, hint, mermaid, katex, tabs, details) are reused from the Hugo Book project; note their origin when using them.
  • Icons use the IcoMoon subset font; adding new icons requires regenerating the subset font in IcoMoon and updating icon.css.
  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; they cannot be judged solely by the code's MIT license.
  • External services such as domain, hosting, database, payment, or AI may incur additional charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

- Hugo **0.158** or higher (extended version)

Original README

# Recommended: use a single dynamic search page instead of per-tag static pages disableKinds: ["term"]

Original README

Use `params.images`, not `params.image`.

Original README

Store copies of remote images locally in assets/_images/ for build-time dimension extraction

Original README

Set it to `disabled` to hide the sort control; the home page then uses newest-first order

Original README

`disabled` hides the sort control only; the search page continues to process its default newest-first order and any `sort` query parameter.

Original README

provider: "giscus" # "giscus" | "disqus"

Original README

GoogleAnalytics: tagId: "G-XXXXXXXXXX"

Original README

siteVerificationTag: "google-site-verification-code"

Original README

SeoTax reuses the following shortcode components from Hugo Book.

Original README

The theme uses an [IcoMoon](https://icomoon.io/) subset font with 26 icons.

Original README
https://github.com/minyeamer/hugo-seotax/blob/main/LICENSEhttps://github.com/minyeamer/hugo-seotax/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-01. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 83 / 100
Technologies
Hugo
Website type
Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-20
Screenshot last checked
2026-10-01

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Hugo as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 532b591c45cc37bd665e2e45f142b71546c7ecffa2223052ba2058184e80d302

2026-10-01T14:00:28.250Z

Source file / repository
# Hugo SeoTax Theme

[![Hugo](https://img.shields.io/badge/hugo-0.158-blue.svg)](https://gohugo.io)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

### A Hugo blog theme with dynamic taxonomy search and reader-first experience

> **SeoTax** = **Sea**rch + **Tax**onomies — built around the idea
> that readers should discover content effortlessly.

![Screenshot](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/main.png?raw=true)

- [Features](#features)
- [Demo](#demo)
- [Requirements](#requirements)
- [Installation](#installation)
- [Configuration](#configuration)
- [Page Layouts](#page-layouts)
- [Shortcodes](#shortcodes)
- [Customization](#customization)
- [Contributing](#contributing)

## Features

- **Dynamic Search** — Fuse.js-powered fuzzy search with instant results; no extra static pages generated
- **Advanced Taxonomy Filters** — Filter by category, tag, or combination without a keyword
- **Configurable List Sorting** — Choose newest or oldest post lists, plus relevance sorting for search and optional sort controls
- **27-Language i18n** — Client-side translation; no page reload, no per-language page duplication
- **Dark Mode** — Auto-detects system preference; toggleable with keyboard shortcut (`Cmd/Ctrl + Shift + S`)
- **Responsive Design** — Collapsible sidebar, overlay ToC on mobile, adaptive thumbnails
- **Mac-style Code Blocks** — Syntax highlighting (highlight.js), line numbers, copy button, language label
- **Series Support** — Velog-style series navigation across related posts
- **SEO Optimized** — Schema.org structured data, CLS < 0.01, optimized Core Web Vitals
- **Lightweight Icons** — IcoMoon subset font (~40 KB vs 800+ KB Font Awesome)
- **PWA Ready** — Service Worker with precache support
- **Disqus Comments** — With dark mode synchronization
- **Reading Time** — Calculated from text, images, code blocks, and tables

### Search

![Search Demo](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/search-demo.gif?raw=true)

A single dynamic search page replaces hundreds of per-tag/per-category static pages.
Search is triggered via the `/` or `s` hotkey, or by clicking the search bar.
Supports 5 query types: keyword search, parent category, child category,
single tag, and multi-tag with AND/OR operators.

### Internationalization

![i18n Demo](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/i18n-demo.gif?raw=true)

All 27 languages are served from a single HTML page. The language switcher
in the toolbar translates UI text, dates, and ARIA labels instantly on
the client side — no page navigation, no URL changes.

### Dark Mode

![Dark Mode Demo](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/light-dark-demo.gif?raw=true)

Switches between light and dark themes using CSS variables on a single
`data-theme` attribute. Persisted in `localStorage`. Disqus comments are
synchronized via iframe reload.

### Code Blocks

![Code Block](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/codeblock.png?raw=true)

Mac-style window dots, line numbers (with copy exclusion), one-click copy
with visual feedback, and a language label chip. Light theme uses
**Xcode** colors; dark theme uses **VS2015** colors.

## Demo

| Desktop | Mobile |
|---------|--------|
| ![Main Page](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-main-desktop.png?raw=true) | ![Mobile Main](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-main-mobile.png?raw=true) |
| ![Search Page](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-search-desktop.png?raw=true) | ![Mobile Search](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-search-mobile.png?raw=true) |
| ![Content Page](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-content-desktop.png?raw=true) | ![Mobile Menu](https://github.com/minyeamer/minyeamer/blob/main/images/hugo-seotax/ss-content-mobile.png?raw=true) |

## Requirements

- Hugo **0.158** or higher (extended version)
- [Hugo Installation Guide](https://gohugo.io/installation/)

## Installation

### As a Git Submodule

```bash
cd your-hugo-site
git submodule add https://github.com/minyeamer/hugo-seotax themes/seotax
```

Then set the theme in your configuration file:

```yaml
theme: "seotax"
```

### As a Hugo Module

Initialize Hugo modules if not already done:

```bash
hugo mod init github.com/your/repo
```

Add to your `hugo.toml`:

```toml
[module]
[[module.imports]]
path = 'github.com/minyeamer/hugo-seotax'
```

Then fetch the module and run:

```bash
hugo mod get -u
hugo server --minify
```

### From Scratch

```bash
hugo new site myblog && cd myblog
git init
git submodule add https://github.com/minyeamer/hugo-seotax themes/seotax
cp -R themes/seotax/exampleSite/* .
hugo server --minify
```

## Configuration

### Site Configuration

Below is a full `config.yaml` example with all supported parameters:

```yaml
baseURL: "https://example.com/"
title: "My Blog"
theme: "seotax"
defaultContentLanguage: "en"
languageCode: "en"

enableRobotsTXT: true
buildDrafts: false
buildFuture: false
buildExpired: false
enableEmoji: true

# Recommended: use a single dynamic search page instead of per-tag static pages
disableKinds: ["term"]

minify:
  disableXML: true
  minifyOutput: true

# SEO-friendly URL structure
permalinks:
  posts: "/blog/:slugorcontentbasename/"

markup:
  goldmark:
    extensions:
      typographer:
        disable: true
    renderer:
      unsafe: true
  highlight:
    noClasses: false
    codeFences: true
  tableOfContents:
    startLevel: 2
    endLevel: 4

params:
  author: "Your Name"
  keywords: ["blog", "tech"]

  posts:
    section: "posts"             # Content section for blog posts
    sort: "newest"               # ["newest" | "oldest" | "disabled"]

  # Search
  search:
    enabled: true
    sort: "newest"               # ["relevance" | "newest" | "oldest" | "disabled"]

  assets:
    favicon: "/images/favicon.ico"
    favicon16x16: "/images/favicon-16x16.png"
    favicon32x32: "/images/favicon-32x32.png"
    apple_touch_icon: "/images/apple-touch-icon.png"
    safari_pinned_tab: "/images/safari-pinned-tab.svg"
    opengraph: "/images/og.jpg"

  # Sidebar menu
  menu:
    profileImage: "/images/profile.jpg"    # Sidebar profile image
    categories: true                       # Show category tree
    recentPosts: true                      # Show recent posts list

  social:
    github: "https://github.com/username"
    twitter: "https://x.com/username"

  # Comments
  comments:
    enabled: true
    provider: "giscus"                     # "giscus" | "disqus"
    # disqus:
    #   shortname: "your-shortname"
    # giscus:
    #   repo: "owner/repo"
    #   repoId: "R_kgDO..."
    #   category: "Comments"
    #   categoryId: "DIC_kwDO..."
    #   mapping: "pathname"
    #   inputPosition: "bottom"

  # i18n translation directory
  i18nDir: "themes/seotax/i18n"

  # Image CLS prevention (optional)
  # Store copies of remote images locally in assets/_images/ for build-time dimension extraction
  images:
    rootPath: "_images"
    maxImageSize: 1920
    roundedCorners: false
    rotateLandscapeImages: true

  # Enable Hugo portable links for relative Markdown links and images
  portableLinks: true

  # PWA Service Worker ("precache" to enable)
  serviceWorker: "precache"

  # Table of Contents
  tableOfContents:
    startLevel: 2
    endLevel: 4

  # Optional per-page ToC toggle default
  toc:
    enabled: true

  # Analytics
  GoogleAnalytics:
    tagId: "G-XXXXXXXXXX"

  # Search engine verification
  searchEngine:
    google:
      siteVerificationTag: "google-site-verification-code"
    naver:
      siteVerificationTag: "naver-site-verification-code"
    bing:
      siteVerificationTag: "bing-site-verification-code"
    yandex:
      siteVerificationTag: "yandex-site-verification-code"

  # Schema.org structured data
  schema:
    publisherType: "Person"
    sameAs:
      - "https://github.com/username"
```

### Static Post Lists

`params.posts.sort` controls the sort order of the home page.
The default sort uses `/` and `/page/2/`; the example site also provides
static archive pages at `/list/newest/` and `/list/oldest/`, with additional
pages under `/page/2/`.

Set it to `disabled` to hide the sort control; the home page then uses newest-first
order, while a `post-list` page can still set its own `params.sort`.

Create matching list index files for each content language to enable the
archive routes in your site:

```yaml
# content/en/list/oldest/_index.md
title: "Oldest posts"
type: "post-list"
params:
  sort: "oldest"
```

Create the equivalent `newest` page and translated files for each additional language.
If `params.sort` is omitted in a `post-list` page, it falls back to `params.posts.sort`.

### Search Sort

`params.search.sort` controls the default sort mode of `/search`.
Supported values are `relevance`, `newest`, `oldest`, and `disabled`.
`disabled` hides the sort control only; the search page continues to process
its default newest-first order and any `sort` query parameter.

- When the current sort matches `params.search.sort`, the search page omits
  the `sort` query parameter.
- When the user selects a different sort, SeoTax writes `?sort=...` into the
  search URL and reorders the current results on the client.

### Category Menu Order

Set `params.menu.categoryOrder` to control the sidebar category order. Lower
`weight` values are shown first; categories without a configured weight follow
in alphabetical order.

```yaml
params:
  menu:
    categoryOrder:
      - name: "Guide"
        weight: 10
      - name: "Features"
        weight: 20
```

For a multilingual site, place the same setting under each language's `params`
to define language-specific names and ordering. The order is applied to both
parent and child categories.

### Image Settings

Use `params.images`, not `params.image`.

- `rootPath` sets the asset directory used to resolve local image dimensions during the build.
- `maxImageSize` limits the resized image width used for CLS prevention.
- `roundedCorners` adds rounded styling to rendered Markdown images and the `image` shortcode.
- `rotateLandscapeImages` rotates landscape images in the image zoom viewer on narrow screens.

### Multi-Language Support

SeoTax supports Hugo's [multilingual mode](https://gohugo.io/content-management/multilingual/).
When multiple languages are configured, a language selector appears in the sidebar menu.

```yaml
languages:
  en:
    languageName: "English"
    weight: 1
  ko:
    languageName: "한국어"
    weight: 2
```

In addition, the theme includes **client-side i18n** for UI elements
(menus, labels, dates) across 27 languages. This works independently of
Hugo's multilingual content system and requires no extra configuration.

The Hugo language menu opens a translated page when one exists. On localized
taxonomy, search, and list pages without a page translation, it preserves the
current path in the selected language and carries query parameters and hashes
across. Search indexes and generated search assets are scoped per content
language, so results do not mix between languages.

### Post Front Matter

```yaml
---
title: "My Post Title"
date: 2026-01-01
summary: "A brief description of the post."
categories: ["Parent Category", "Child Category"]
tags: ["tag1", "tag2"]
series: ["Series Name"]
cover:
  image: "/images/cover.jpg"
---
```

The theme uses a **two-level category hierarchy**.
The first item in `categories` is the parent; the second is the child.
Previous/next navigation prioritizes posts within the same child category,
then parent category, then all posts.

## Page Layouts

| Page | Description |
|------|-------------|
| **Home** | Post list with title, summary, date, categories, tags, and cover thumbnail. Pagination with 10 posts per page. |
| **Single Post** | Header with category breadcrumb, title, date, reading time, cover image, content, tags, prev/next navigation, and Disqus comments. |
| **Search** | Dynamic search page with keyword, category, and tag filters. Accessed via the search modal, category/tag chips, or the sidebar. |
| **Categories** | Two-level category tree with post counts. Up to 3 posts are shown per category with a "see more" link. |
| **Tags** | All tags displayed as clickable chips. |

## Shortcodes

### Hugo Book Shortcode Components

SeoTax reuses the following shortcode components from Hugo Book.

| Shortcode | Description |
|-----------|-------------|
| `{{</* columns */>}}` | Multi-column flexbox layout with `<--->` separator and optional `ratio` parameter |
| `{{</* hint [info\|success\|warning\|danger] */>}}` | Colored callout boxes |
| `{{</* mermaid */>}}` | Mermaid diagrams |
| `{{</* katex */>}}` | KaTeX math equations |
| `{{</* tabs */>}}` | Tabbed content panels |
| `{{</* details */>}}` | Collapsible content blocks |

### SeoTax Custom

#### Bookmark

Generates a rich link card by fetching Open Graph metadata from a URL.

```markdown
{{</* bookmark url="https://example.com" */>}}
```

Optional overrides: `title`, `description`, `image`, `fetch` (default `true`).

#### Data Table

Renders CSV-formatted text as a styled HTML table.

```markdown
{{</* data-table delimiter="," headers="1" file-name="data.csv" */>}}
Name,Age,City
Alice,30,Seoul
Bob,25,Tokyo
{{</* /data-table */>}}
```

Supports `align-center`, `enable-download`, and custom `class`.

#### Image

Enhanced image shortcode with click-to-zoom, automatic CLS prevention, and full layout control.

```markdown
{{</* image src="/images/photo.jpg" alt="Description" caption="Figure 1" max-width="600px" */>}}
```

Parameters: `src`, `alt`, `caption`, `class`, `loading`, `align`, `href`,
`target`, `width`, `min-width`, `max-width`, `height`, `min-height`,
`max-height`.

On mobile, landscape images rotate 90° when tapped for full-screen viewing.

#### Series

Velog-style series navigation that groups posts sharing the same `series` front matter value.

```markdown
{{</* series "My Tutorial Series" */>}}
```

Optional second parameter: regex pattern to strip common prefixes from titles.
Includes collapsible post list and prev/next links.

## Customization

### Overriding Styles

Create `assets/css/_custom.scss` in your site root to add or override styles:

```scss
// Example: change link color
:root {
  --color-link: #0055bb;
}
```

### SCSS Variables

Key variables are defined in `assets/css/variables/`:

| File | Contents |
|------|----------|
| `_colors.scss` | Color palette and theme mixins (`theme-light`, `theme-dark`) |
| `_defaults.scss` | Spacing, font sizes, border radii, breakpoints, z-indices |
| `_fonts.scss` | Font family definitions |

### Icons

The theme uses an [IcoMoon](https://icomoon.io/) subset font with 26 icons.
Icon classes follow the pattern `icon-*`
(e.g., `icon-search`, `icon-folder`, `icon-moon`). To add more icons,
regenerate the subset font and update `assets/css/main/icon.css`.

### Directory Structure

```
seotax/
├── archetypes/           # Post templates
├── assets/
│   ├── css/              # SCSS source files
│   │   ├── main/         # Normalize, icons, utilities, print
│   │   ├── themes/       # Light/dark theme definitions
│   │   └── variables/    # Colors, defaults, fonts
│   ├── data/             # Build-time JSON (search index, categories, tags, i18n)
│   ├── js/
│   │   ├── core/         # Theme toggle, i18n, toolbar, sidebar
│   │   ├── partials/     # Reading time, ToC, image overlay, pagination
│   │   ├── search/       # Search engine, filters, rendering
│   │   └── shortcodes/   # Series, data-table, code block scripts
│   ├── main.scss         # SCSS entry point
│   └── sw.js             # Service Worker
├── i18n/                 # 27 language YAML translation files
├── layouts/
│   ├── _markup/          # Render hooks (code blocks, images, links)
│   ├── _partials/        # Template partials (menu, header, footer, content)
│   ├── _shortcodes/      # Shortcode templates
│   ├── baseof.html       # Base layout
│   ├── index.html        # Home page
│   ├── list.html         # List page
│   └── single.html       # Single post page
├── static/               # Static assets (fonts, images)
└── theme.toml
```

## Performance

The theme is optimized for Core Web Vitals:

| Metric | Score |
|--------|-------|
| CLS | 0.002 |
| TBT | 0 ms |
| Performance | 82+ |

Optimizations include: build-time image dimension extraction to prevent
layout shifts, subset icon font to minimize font loading impact, hybrid
server/client reading time calculation, and `font-display: swap` for zero FOIT.

## Contributing

Contributions are welcome. Primary goals:

- Keep it simple and focused on blog use cases
- Minimize JavaScript where CSS can solve the problem
- Maintain cross-browser compatibility
- Preserve the reader-first exploration experience

Feel free to open issues or pull requests on [GitHub](https://github.com/minyeamer/hugo-seotax).

## License

[MIT](LICENSE)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.