diff --git a/CLAUDE.md b/CLAUDE.md
index 3446892..65eeccf 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -5,7 +5,8 @@ Punkrock-Band aus Trier. Hugo-Seite, Deutsch, deployt mit `deploy.ps1`.
## Website
- Inhalte: `content/` (Startseite `_index.md`, Band `about.md`, Musik `music/_index.md`)
-- Shows: eine Datei pro Show in `content/shows/` (`title`, `date`, `location`, `poster`; `tba: true` für noch unbekannte Termine)
+- Shows: eine Datei pro Show in `content/shows/` (`title`, `date`, `location`, `poster`; `tba: true` für noch unbekannte Termine; optional `city` und `address` für die Event-Daten bei Google, nur bestätigte Adressen)
+- SEO: JSON-LD in `layouts/partials/schema.html` (Band auf der Startseite, kommende Shows auf `/shows/`), eigene Sitemap ohne Show-Einzelseiten in `layouts/_default/sitemap.xml`
- Release-Cover: `releases/JJJJMMTT_[Single|Album]_[Name].jpg`. Titel und Datum kommen aus dem Dateinamen.
- Design: `assets/css/main.css`. Farben `--deep #081226`, `--bolt #fff200` (Blitz-Gelb), `--red #e5232b`; Schriften Big Shoulders Display (Überschriften) und Archivo (Text), liegen in `static/fonts/`.
- Links und E-Mail stehen in `hugo.toml` unter `[params]`.
diff --git a/content/shows/2024_Pink_Future.md b/content/shows/2024_Pink_Future.md
index 0b9f390..f1b42f2 100644
--- a/content/shows/2024_Pink_Future.md
+++ b/content/shows/2024_Pink_Future.md
@@ -3,4 +3,5 @@ title: "Pink Future"
date: 2024-06-07
location: Palastgarten Trier
poster: /img/shows/2024_Pink_Future.jpeg
+aliases: ["/shows/2024_pink_future-copy/"]
---
diff --git a/content/shows/2026_Halloween.md b/content/shows/2026_Halloween.md
index a5e81f6..04f8a72 100644
--- a/content/shows/2026_Halloween.md
+++ b/content/shows/2026_Halloween.md
@@ -2,5 +2,6 @@
title: "Halloween Rock"
date: 2026-10-31
location: Gutweiler
-poster: /img/shows/2026_Haloween.jpeg
+poster: /img/shows/2026_Halloween.jpeg
+aliases: ["/shows/2026_haloween/"]
---
diff --git a/hugo.toml b/hugo.toml
index 2bf3608..dac1de8 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -3,6 +3,7 @@ baseURL = "https://www.deepwatersurvival.de/"
languageCode = "de"
defaultContentLanguage = "de"
disableKinds = ["taxonomy", "term", "RSS"]
+enableRobotsTXT = true
# Shows liegen in der Zukunft – ohne diese Option würde Hugo sie nicht bauen.
buildFuture = true
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index 4e77f32..557dc9e 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -23,6 +23,7 @@
{{ $css := resources.Get "css/main.css" | minify | fingerprint }}
+ {{ partial "schema.html" . }}
Zum Inhalt springen
diff --git a/layouts/_default/sitemap.xml b/layouts/_default/sitemap.xml
new file mode 100644
index 0000000..5015bb5
--- /dev/null
+++ b/layouts/_default/sitemap.xml
@@ -0,0 +1,18 @@
+{{- /*
+ Eigene Sitemap: Die Einzelseiten unter /shows/ sind noindex-Weiterleitungen
+ auf /shows/ und gehören nicht hinein. lastmod in der Zukunft (kommt von
+ kommenden Shows) wird weggelassen.
+*/ -}}
+{{ printf "" | safeHTML }}
+
+ {{- range .Pages }}
+ {{- if and .Permalink (not (and (eq .Section "shows") (eq .Kind "page"))) }}
+
+ {{ .Permalink }}
+ {{- if and (not .Lastmod.IsZero) (le .Lastmod now) }}
+ {{ safeHTML (.Lastmod.Format "2006-01-02T15:04:05-07:00") }}
+ {{- end }}
+
+ {{- end }}
+ {{- end }}
+
diff --git a/layouts/partials/schema.html b/layouts/partials/schema.html
new file mode 100644
index 0000000..7fbeccd
--- /dev/null
+++ b/layouts/partials/schema.html
@@ -0,0 +1,64 @@
+{{/*
+ JSON-LD für Suchmaschinen.
+ Startseite: die Band (MusicGroup) mit Besetzung, Album und Profilen.
+ /shows/: ein MusicEvent pro kommender Show mit Ort (TBA-Termine fehlen).
+ Optional im Show-Front-Matter: city (Ort, sonst wird location genommen)
+ und address (Straße und Hausnummer). Nur bestätigte Adressen eintragen.
+*/}}
+{{- $bandID := "/#band" | absURL -}}
+{{- $band := dict "@type" "MusicGroup" "@id" $bandID "name" site.Title "url" site.Home.Permalink -}}
+
+{{- if .IsHome -}}
+ {{- $band = merge $band (dict
+ "description" site.Params.description
+ "genre" "Punkrock"
+ "email" site.Params.email
+ "logo" ("/img/logo-crop.png" | absURL)
+ "location" (dict "@type" "Place" "name" "Trier" "address" (dict "@type" "PostalAddress" "addressLocality" "Trier" "addressCountry" "DE"))
+ "sameAs" (slice site.Params.spotify site.Params.instagram site.Params.youtube)
+ ) -}}
+ {{- with resources.Get "img/AlbumReleaseParty_Stage_compressed.jpg" }}{{ with .Resize "1200x jpg q80" }}
+ {{- $band = merge $band (dict "image" .Permalink) -}}
+ {{- end }}{{ end -}}
+ {{- with site.GetPage "/about" }}{{ with .Params.members }}
+ {{- $members := slice -}}
+ {{- range . }}
+ {{- $members = $members | append (dict "@type" "OrganizationRole" "roleName" .role "member" (dict "@type" "Person" "name" .name)) -}}
+ {{- end }}
+ {{- $band = merge $band (dict "member" $members) -}}
+ {{- end }}{{ end -}}
+ {{- $albums := slice -}}
+ {{- range where (partial "releases.html" .) "kind" "Album" }}
+ {{- $album := dict "@type" "MusicAlbum" "name" .title "datePublished" (.date.Format "2006-01-02") "byArtist" (dict "@id" $bandID) -}}
+ {{- with .cover.Resize "800x webp q78" }}{{ $album = merge $album (dict "image" .Permalink) }}{{ end -}}
+ {{- $albums = $albums | append $album -}}
+ {{- end }}
+ {{- with $albums }}{{ $band = merge $band (dict "album" .) }}{{ end -}}
+ {{- $data := merge (dict "@context" "https://schema.org") $band }}
+
+{{- end -}}
+
+{{- if and (eq .Kind "section") (eq .Section "shows") -}}
+ {{- $events := slice -}}
+ {{- range (where .Pages "Date" "ge" now).ByDate }}
+ {{- if and (not .Params.tba) .Params.location }}
+ {{- $address := dict "@type" "PostalAddress" "addressLocality" (.Params.city | default .Params.location) "addressCountry" "DE" -}}
+ {{- with .Params.address }}{{ $address = merge $address (dict "streetAddress" .) }}{{ end -}}
+ {{- $event := dict
+ "@type" "MusicEvent"
+ "name" (printf "%s mit %s" .Title site.Title)
+ "startDate" (.Date.Format "2006-01-02")
+ "eventStatus" "https://schema.org/EventScheduled"
+ "eventAttendanceMode" "https://schema.org/OfflineEventAttendanceMode"
+ "location" (dict "@type" "Place" "name" .Params.location "address" $address)
+ "performer" $band
+ "url" $.Permalink
+ -}}
+ {{- with .Params.poster }}{{ $event = merge $event (dict "image" (. | absURL)) }}{{ end -}}
+ {{- $events = $events | append $event -}}
+ {{- end }}
+ {{- end }}
+ {{- with $events }}
+
+ {{- end }}
+{{- end -}}
diff --git a/layouts/robots.txt b/layouts/robots.txt
new file mode 100644
index 0000000..6b4c001
--- /dev/null
+++ b/layouts/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: {{ "sitemap.xml" | absURL }}