# Front Matter und SEO

> Alle Front-Matter-Parameter des Themes mit ihrer genauen Wirkung - Anzeige-Schalter, Werte, der discovery-Block und das Titelbild.

_Quelle: https://theme.docs.tbsch.de/de/post/2026-02-16-front-matter-und-seo/ · Stand: 2026-03-01_


Das Theme liest eine ganze Reihe eigener Front-Matter-Parameter. Fast jeder hat
einen globalen Default in `params.yaml` und lässt sich pro Seite (oder pro
Sektion via `cascade`) überschreiben. Die Auflösung ist:
**Front Matter → globaler Default → Theme-Fallback**.

> [!important] Theme-Parameter gehören in den `params:`-Block
> Alles, was das *Theme* auswertet, gehört in den `params:`-Block - so bleibt
> sichtbar, was von Hugo und was vom Theme kommt. Alle Beispiele hier zeigen es
> genau so.

> [!note] Lesezeit & Wortzahl fehlen hier mit Absicht
> Dieser Beitrag setzt `showReadingTime: false` und `showWordCount: false` im
> `params:`-Block - deshalb sind beide im Hero ausgeblendet. Bei allen anderen
> Beiträgen erscheinen sie.

## Aufbau des Front Matter

```yaml
---
title: "Mein Beitrag"        # von Hugo gelesen
date: 2026-02-16
draft: false
description: "…"
categories: ["Funktionen"]   # Taxonomien
tags: ["hugo"]

params:                      # alles Theme-spezifische in diesen Block
  showReadingTime: false
  featureimage: titel.webp
  discovery:
    noindex: true
---
```

## Anzeige-Schalter

Boolesche Schalter (Default in Klammern). Ein expliziter Wert im `params:`-Block
gewinnt - auch ein `false`:

```yaml
params:
  showDate: true            # (an)  Veröffentlichungsdatum im Hero
  showDateUpdated: true     # (an)  "Aktualisiert"-Datum aus lastmod im Hero
  showReadingTime: true     # (an)  Lesezeit in der Meta-Zeile
  showWordCount: true       # (an)  Wortzahl in der Meta-Zeile
  showTaxonomies: true      # (an)  Tags & Kategorien im Hero
  showTableOfContents: true # (an)  schwebendes Inhaltsverzeichnis (links)
  showHeadingAnchors: true  # (an)  Direktlink-Anker an jeder Überschrift
  showAuthor: true          # (an)  Autoren-Box am Ende
  showSharingLinks: true    # (an)  Teilen-Leiste
  showComments: true        # (an)  Reaktionen/Kommentare am Ende
  showPagination: true      # (an)  vor/zurück innerhalb der Sektion
  showRelatedContent: false # (AUS) "Verwandte Beiträge" unter dem Beitrag
  showDraftLabel: true      # (an)  "Entwurf"-Badge, solange draft: true
  seriesOpened: true        # (an)  Serien-Box startet aufgeklappt
```

## Werte-Parameter

Parameter mit einem Wert statt eines Schalters:

```yaml
params:
  # Nur diese Netzwerke in der Teilen-Leiste zeigen (Schlüssel aus
  # data/sharing.yaml); überschreibt den globalen Satz aus params.yaml.
  sharingLinks: ["bluesky", "mastodon", "email"]

  # Anzahl der "Verwandten Beiträge" (Default 3), wenn showRelatedContent an ist.
  relatedContentLimit: 5

  # Autorname NUR für die strukturierten Daten (Person/JSON-LD) dieser Seite;
  # überschreibt den Standardautor aus params.yaml.
  author: "Gastautorin"
```

## Social-Tags fürs Cross-Posting (`socialTags`)

`socialTags` ist **keine** flache Liste, sondern ein Block mit `hashtags` und
`mentions` (je Netzwerk). Er wird nicht auf der Seite gerendert, sondern in den
**JSON Feed** unter der Erweiterung `_social` geschrieben - von dort übernimmt
ihn ein Cross-Posting-Dienst und hängt beim automatischen Posten nach Mastodon
bzw. Bluesky die Hashtags und @-Erwähnungen an.

```yaml
params:
  socialTags:
    hashtags:
      - SelfHosted
      - DNS
      - PiHole
    mentions:
      mastodon: ["selfhosted@lemmy.world"]
      bluesky: ["mariushosting.com"]
```

## Titelbild (`featureimage`)

Das Hero-/Titelbild löst das Theme in dieser Reihenfolge auf:

1. `params.featureimage` (lokaler Pfad **oder** absolute URL),
2. ein Bild namens `*background*`/`*feature*`/`*cover*`/`*thumbnail*` im Bündel,
3. das `defaultBackgroundImage` aus `params.yaml`.

```yaml
params:
  featureimage: titelbild.webp     # Bild im Beitragsbündel …
  # featureimage: https://…/og.png # … oder eine absolute URL
```

## Der `discovery`-Block (Crawling, Index, Suche)

Für SEO bringt das Theme einen eigenen `discovery:`-Block mit - Hugo hat dafür
keine Entsprechung. Alle Schalter haben einen sinnvollen Default, du setzt nur
die Abweichung:

```yaml
params:
  discovery:
    noindex: true   # default false → <meta name="robots" content="noindex">
    nofollow: true  # default false → ergänzt nofollow
    sitemap: false  # default true  → Seite aus sitemap.xml entfernen
    search: false   # default true  → Seite aus der Pagefind-Suche entfernen
    llms: false     # default true  → Seite aus llms.txt entfernen
```

`partials/seo-robots.html` ist die einzige Quelle für die Robots-Direktive
(Front Matter → 404 → Default `index, follow`); es schreibt nur die Opt-out-
Tokens (`noindex`/`nofollow`), nie das implizite `index, follow`. Die Sitemap
ist daran gekoppelt: **jede `noindex`-Seite fällt automatisch aus der Sitemap.**

Die dünnen Schlagwort-Seiten setzen genau das per `cascade` in
`content/tags/_index.md`; die Rechtsseiten (siehe
[Datenschutz](/de/datenschutz/)) kombinieren `noindex` mit
`search: false` + `llms: false` und `outputs: ["HTML"]`.

## Agent-Discovery (llms.txt v2)

Jede Seite mit Markdown-Zwilling kündigt ihn im `<head>` per
`<link rel="alternate" type="text/markdown" href="…/index.md">` an, und jede
Seite verweist per `<link rel="describedby">` auf die `llms.txt`, die sie
abdeckt - die Discovery-Relationen des [llms.txt-v2-Vorschlags](https://llmstxt.org/).
Auf mehrsprachigen Sites verlinkt jede Sprache ihre eigene Datei (`/de/llms.txt`
für `/de/`). Seiten mit `outputs: ["HTML"]` (die Rechtsseiten) haben keinen
Markdown-Zwilling und daher keinen `alternate`-Link.

## Kuratierte Schlagwort-Hubs (`linkTitle` + `discovery`)

Eine Schlagwort-Seite ist standardmäßig dünn und `noindex` (die Cascade oben).
Um ein Schlagwort in einen indexierbaren **Evergreen-Hub** zu verwandeln - eine
kuratierte Landing-Page, die den Hauptbegriff besetzt, während die einzelnen
Beiträge ihre Long-Tails behalten - gib dem Schlagwort ein eigenes `_index.md`
unter `content/tags/<tag>/`:

```yaml
# content/tags/seo/_index.md
---
title: "Suchmaschinen-Optimierung"  # <h1> der Seite + SEO-Titel
linkTitle: "seo"                    # kurzes Label in den Tag-Chips
description: "…"                    # Hero-Lede + Meta-Description
discovery:
  noindex: false                    # zurück in den Index, überschreibt die Thin-Tag-Cascade
  sitemap: true
---

Einleitungsabsatz/-absätze, gerendert über der Liste der getaggten Beiträge.
```

Das eigene `discovery` der Seite überschreibt die `kind: term`-Cascade aus
`content/tags/_index.md`, sodass dieses eine Schlagwort `index, follow` wird und
wieder in der Sitemap steht; der Body erscheint als Intro über den Beiträgen.

> [!tip] title vs. linkTitle
> Die Tag-**Chips** (die `#tag`-Pills im Beitrags-Hero und in der `/tags/`-Wolke)
> rendern `.LinkTitle`, die Hub-**Seite** rendert `.Title` als ihr `<h1>`. So kann
> ein beschreibender `title: "Suchmaschinen-Optimierung"` die Überschrift der
> Seite bleiben, während `linkTitle: "seo"` jeden Chip als knappes `#seo` hält -
> ohne `linkTitle` würde der volle Titel in jeden Chip lecken. (Chips werden per
> CSS kleingeschrieben, `linkTitle` braucht also nur die Kurzform, nicht die
> exakte Groß-/Kleinschreibung.)

## Autorenprofil (`authorProfile`)

Auf einer "Über mich"-Seite sorgt `authorProfile: true` für `ProfilePage`- und
`Person`-JSON-LD (mit `sameAs`-Links aus `params.author.links`) - siehe die
Seite [Über mich](/de/me/).

```yaml
params:
  authorProfile: true
```

## Kategorie-Icon (`categoryIcon`)

Im `_index.md` einer Kategorie (`content/categories/<name>/`) bestimmt
`categoryIcon` das *Tabler*-Icon, das auf der Kategorie-Karte erscheint
(Default `tag`):

```yaml
# content/categories/funktionen/_index.md
params:
  categoryIcon: rocket
```

## Hugo-eigene Schlüssel

Diese liest Hugo selbst, nicht das Theme:

- `title`, `date`, `lastmod`, `draft` - Titel und Daten. `lastmod` wird (bei
  aktivem `showDateUpdated`) als "Aktualisiert"-Datum angezeigt.
- `description`, `summary` - Meta-Description bzw. Lede/Teaser.
- `categories`, `tags`, `series` - die drei Taxonomien des Themes.
- `translationKey` - verbindet die Sprachvarianten eines Beitrags.
- `slug`, `url` - URL-Steuerung. `outputs` - Ausgabeformate (z. B. nur `HTML`).
- `aliases` - clientseitige Weiterleitungs-Stubs (automatisch `noindex`),
  praktisch für alte oder Kurz-URLs:

```yaml
aliases:
  - /alte-url/
  - /l/kurzlink
```

Die vollständige Liste dieser Schlüssel steht in der
[Hugo-Dokumentation zum Front Matter](https://gohugo.io/content-management/front-matter/).

