Files
Markus GrafandClaude d36a18d28b feat: initialize Hugo static site with Bootstrap 5.x
Initialize minimal Hugo site structure with Bootstrap 5.3.2 integration for
markusgraf.ch conversion. Implements OpenSpec proposal add-minimal-hugo-site.

Features:
- Hugo project structure with standard directories
- Base layout template (baseof.html) with Bootstrap 5.3.2 via CDN
- Homepage (index.html) and single page (single.html) templates
- Reusable partials: header, footer, navigation
- Responsive Bootstrap grid layout
- Mobile-first design with semantic HTML5
- Valid HTML output with basic accessibility features
- Taxonomies disabled for minimal site (see docs/TAXONOMIES.md)

Documentation:
- IMPLEMENTATION_SUMMARY.md - Complete implementation guide
- docs/TAXONOMIES.md - Guide for re-enabling categories/tags
- static/README.md - Guide for placing static assets

Configuration:
- hugo.toml configured for markusgraf.ch
- .gitignore for Hugo build artifacts

All 24 tasks from OpenSpec proposal completed successfully.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 10:25:11 +01:00

5.2 KiB

Hugo Taxonomies Guide

Current Status

Taxonomies (categories and tags) are currently disabled in this Hugo site to keep it minimal.

What Are Taxonomies?

Hugo taxonomies are classification systems for your content:

  • Categories - Broad groupings (e.g., "Technology", "Personal", "Projects")
  • Tags - Specific keywords (e.g., "golang", "web-development", "tutorial")

They're useful for blogs and content-heavy sites where visitors need to filter and find related content.

Why Are They Disabled?

For a minimal personal website without a blog, taxonomies add unnecessary complexity:

  • Creates extra pages (/categories/, /tags/) that aren't used
  • Requires additional template files
  • Generates warning messages during builds

How to Re-enable Taxonomies

When you're ready to add a blog or need content categorization:

Step 1: Enable Taxonomies in Configuration

Edit hugo.toml and remove or comment out this line:

# Remove this line:
disableKinds = ['taxonomy', 'term']

Or comment it out to keep for reference:

# Taxonomies disabled for minimal site - uncomment to enable:
# disableKinds = ['taxonomy', 'term']

Step 2: Create Taxonomy Templates

Create two template files in layouts/_default/:

layouts/_default/taxonomy.html

This template displays all content items for a single category or tag.

{{ define "main" }}
<div class="container">
  <div class="row">
    <div class="col-lg-8 offset-lg-2">
      <header class="mt-5 mb-4">
        <h1 class="display-4">{{ .Title }}</h1>
        <p class="lead text-muted">{{ .Data.Plural }}: {{ len .Pages }} {{ if eq (len .Pages) 1 }}item{{ else }}items{{ end }}</p>
      </header>

      <div class="list-group">
        {{ range .Pages }}
        <a href="{{ .RelPermalink }}" class="list-group-item list-group-item-action">
          <div class="d-flex w-100 justify-content-between">
            <h5 class="mb-1">{{ .Title }}</h5>
            <small class="text-muted">{{ .Date.Format "Jan 2, 2006" }}</small>
          </div>
          {{ if .Description }}
          <p class="mb-1">{{ .Description }}</p>
          {{ end }}
        </a>
        {{ end }}
      </div>
    </div>
  </div>
</div>
{{ end }}

layouts/_default/terms.html

This template lists all available categories or all available tags.

{{ define "main" }}
<div class="container">
  <div class="row">
    <div class="col-lg-8 offset-lg-2">
      <header class="mt-5 mb-4">
        <h1 class="display-4">{{ .Title }}</h1>
        <p class="lead text-muted">Browse all {{ .Data.Plural | lower }}</p>
      </header>

      <div class="row">
        {{ range .Pages }}
        <div class="col-md-6 mb-3">
          <div class="card">
            <div class="card-body">
              <h5 class="card-title">
                <a href="{{ .RelPermalink }}">{{ .Title }}</a>
              </h5>
              <p class="card-text text-muted">{{ len .Pages }} {{ if eq (len .Pages) 1 }}post{{ else }}posts{{ end }}</p>
            </div>
          </div>
        </div>
        {{ end }}
      </div>
    </div>
  </div>
</div>
{{ end }}

Step 3: Add Taxonomies to Content

Add categories and tags to your content front matter:

---
title: "My Blog Post"
date: 2024-10-27
categories:
  - Technology
  - Web Development
tags:
  - hugo
  - golang
  - static-sites
---

Your content here...

Add taxonomy pages to your navigation in hugo.toml:

[menu]
  [[menu.main]]
    name = "Categories"
    url = "/categories/"
    weight = 10
  [[menu.main]]
    name = "Tags"
    url = "/tags/"
    weight = 20

Step 5: Optional - Customize Taxonomy Names

If you want different taxonomy names (e.g., "Topics" instead of "Categories"):

[taxonomies]
  topic = "topics"
  tag = "tags"

Then use in front matter:

---
topics:
  - Web Development
tags:
  - hugo
---

Testing After Re-enabling

After re-enabling and creating templates:

# Build the site
hugo

# Start the server
hugo server -D

# Visit in browser:
# http://localhost:1313/categories/
# http://localhost:1313/tags/
# http://localhost:1313/categories/technology/
# http://localhost:1313/tags/hugo/

You should see:

  • No warnings in build output
  • Category and tag listing pages
  • Individual category/tag pages showing filtered content

Custom Taxonomies

Hugo supports custom taxonomies beyond categories and tags:

[taxonomies]
  category = "categories"
  tag = "tags"
  series = "series"        # For blog post series
  author = "authors"       # For multi-author blogs
  project = "projects"     # For portfolio sites

Use in content:

---
series: ["Getting Started with Hugo"]
authors: ["Markus Graf"]
projects: ["Personal Website"]
---

References

See Also

  • IMPLEMENTATION_SUMMARY.md - Overview of the Hugo site structure
  • hugo.toml - Main configuration file
  • layouts/_default/ - Template directory