diff --git a/.devcontainer/on-create.sh b/.devcontainer/on-create.sh
index 7e6df42d8d..68440f5802 100755
--- a/.devcontainer/on-create.sh
+++ b/.devcontainer/on-create.sh
@@ -5,7 +5,7 @@ set -euo pipefail
cd $(mktemp -d)
# hugo
-scurl -O https://github.com/gohugoio/hugo/releases/download/v0.156.0/hugo_0.156.0_linux-amd64.deb
+scurl -O https://github.com/gohugoio/hugo/releases/download/v0.158.0/hugo_0.158.0_linux-amd64.deb
sudo dpkg -i hugo*.deb
rm hugo*.deb
diff --git a/linkerd.io/README.md b/linkerd.io/README.md
index 98bddea4fb..351c80d7eb 100644
--- a/linkerd.io/README.md
+++ b/linkerd.io/README.md
@@ -31,9 +31,9 @@ Or download the release of Hugo from the GitHub
## Hugo version requirements
-The minimum version of Hugo needed to build the site is `v0.156.0`.
+The minimum version of Hugo needed to build the site is `v0.158.0`.
-When linkerd.io is deployed to production, we use Hugo `v0.156.0`.
+When linkerd.io is deployed to production, we use Hugo `v0.158.0`.
### Run Hugo locally
@@ -65,11 +65,12 @@ Next, create an `index.md` file in the folder with the following frontmatter:
```yaml
title: # The title of your blog post
-description: # The description of your blog post
+description: # Optional meta description of your blog post, defaults to auto generated content summary
date: # The date of your post in the format: `2024-01-01T00:00:00Z`
-slug: # The URL slug for the page. Only set this param if you want to use a different slug than the title.
+slug: # Optional URL slug for the page. Only set this param if you want to use a different slug than the title.
keywords: [] # An array of keywords are used to relate blog posts
params:
+ metaTitle: # Optional meta title of your blog post, defaults to title
author: # The author of the blog post
```
diff --git a/linkerd.io/config/_default/params.yaml b/linkerd.io/config/_default/params.yaml
index 9c272f5dc9..32bdf9a0a7 100644
--- a/linkerd.io/config/_default/params.yaml
+++ b/linkerd.io/config/_default/params.yaml
@@ -1,17 +1,16 @@
# Min/max version of Hugo required to build linkerd.io
# Set `maxHugoVersion` to "latest" if there is not a max version required
-minHugoVersion: "0.156.0"
-maxHugoVersion: "latest"
+minHugoVersion: '0.158.0'
+maxHugoVersion: 'latest'
# Open Graph and Twitter Card defaults
description: |-
Linkerd is an ultralight service mesh for Kubernetes. It gives you
observability, reliability, and security without requiring any code changes.
#images: [/logos/linkerd.png]
-
# Set the value of `twitter:site` in Twitter Card
social:
twitter: Linkerd
# Latest major version of Linkerd
-latestMajorVersion: "2.20"
+latestMajorVersion: '2.20'
diff --git a/linkerd.io/content/blog/2026/0624-federating-clusters-for-zero-downtime-kubernetes/index.md b/linkerd.io/content/blog/2026/0624-federating-clusters-for-zero-downtime-kubernetes/index.md
index c3facd0340..f9214227d9 100644
--- a/linkerd.io/content/blog/2026/0624-federating-clusters-for-zero-downtime-kubernetes/index.md
+++ b/linkerd.io/content/blog/2026/0624-federating-clusters-for-zero-downtime-kubernetes/index.md
@@ -2,8 +2,12 @@
date: 2026-06-24T00:00:00Z
title: |-
Federating Clusters for Zero-Downtime Kubernetes
+description: |-
+ Linkerd multicluster supports 3 modes: federated, flat, and gateway. Wire all 3 across 3 GKE clusters, run a chaos test, and see automatic failover in action.
keywords: [linkerd, multicluster, federated]
params:
+ metaTitle: |-
+ Linkerd Multicluster: Federation, Mirroring on GKE
author:
name: Dominik Táskai, Linkerd Ambassador
avatar: dominik-taskai.jpg
diff --git a/linkerd.io/layouts/_partials/head-meta.html b/linkerd.io/layouts/_partials/head-meta.html
index d2c9cd7cdc..0cbe8aaa63 100644
--- a/linkerd.io/layouts/_partials/head-meta.html
+++ b/linkerd.io/layouts/_partials/head-meta.html
@@ -2,7 +2,7 @@
{{ end }}
-
+
-{{ partial "opengraph.html" . }}
-{{ partial "twitter_cards.html" . }}
+{{ partial "head-opengraph.html" . }}
+{{ partial "head-twitter-cards.html" . }}
diff --git a/linkerd.io/layouts/_partials/head-opengraph.html b/linkerd.io/layouts/_partials/head-opengraph.html
new file mode 100644
index 0000000000..5fbf51f95b
--- /dev/null
+++ b/linkerd.io/layouts/_partials/head-opengraph.html
@@ -0,0 +1,76 @@
+{{- /*
+
+Modified Open Graph template
+https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_partials/opengraph.html
+
+*/}}
+
+
+{{- with or site.Title site.Params.title | plainify }}
+
+{{- end }}
+
+
+
+
+
+{{- with or .Params.locale site.Language.Locale }}
+
+{{- end }}
+
+{{- if .IsPage }}
+
+ {{- with .Section }}
+
+ {{- end }}
+ {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }}
+ {{- with .PublishDate }}
+
+ {{- end }}
+ {{- with .Lastmod }}
+
+ {{- end }}
+ {{- range .GetTerms "tags" | first 6 }}
+
+ {{- end }}
+{{- else }}
+
+{{- end }}
+
+{{- with partial "_funcs/get-page-images" . }}
+ {{- range . | first 6 }}
+
+ {{- end }}
+{{- end }}
+
+{{- with .Params.audio }}
+ {{- range . | first 6 }}
+
+ {{- end }}
+{{- end }}
+
+{{- with .Params.videos }}
+ {{- range . | first 6 }}
+
+ {{- end }}
+{{- end }}
+
+{{- range .GetTerms "series" }}
+ {{- range .Pages | first 7 }}
+ {{- if ne $ . }}
+
+ {{- end }}
+ {{- end }}
+{{- end }}
+
+{{- with site.Params.social }}
+ {{- if reflect.IsMap . }}
+ {{- with .facebook_app_id }}
+
+ {{- else }}
+ {{- with .facebook_admin }}
+
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/linkerd.io/layouts/_partials/head-twitter-cards.html b/linkerd.io/layouts/_partials/head-twitter-cards.html
new file mode 100644
index 0000000000..bff02454ba
--- /dev/null
+++ b/linkerd.io/layouts/_partials/head-twitter-cards.html
@@ -0,0 +1,30 @@
+{{- /*
+
+Modified Twitter Cards template
+https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_partials/twitter_cards.html
+
+*/}}
+{{- $images := partial "_funcs/get-page-images" . }}
+{{- with index $images 0 }}
+
+
+{{- else }}
+
+{{- end }}
+
+
+
+
+
+{{- $twitterSite := "" }}
+{{- with site.Params.social }}
+ {{- if reflect.IsMap . }}
+ {{- with .twitter }}
+ {{- $content := . }}
+ {{- if not (strings.HasPrefix . "@") }}
+ {{- $content = printf "@%v" . }}
+ {{- end }}
+
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/linkerd.io/layouts/_partials/meta-description.html b/linkerd.io/layouts/_partials/meta-description.html
new file mode 100644
index 0000000000..1016e73210
--- /dev/null
+++ b/linkerd.io/layouts/_partials/meta-description.html
@@ -0,0 +1,3 @@
+{{- with or .Description .Summary site.Params.description | truncate 160 | plainify | htmlUnescape }}
+ {{- trim . "\n\r\t " | replaceRE "[\n\r\t]+" " " }}
+{{- end -}}
diff --git a/linkerd.io/layouts/_partials/meta-title.html b/linkerd.io/layouts/_partials/meta-title.html
new file mode 100644
index 0000000000..564da36de7
--- /dev/null
+++ b/linkerd.io/layouts/_partials/meta-title.html
@@ -0,0 +1,3 @@
+{{- with or .Params.metaTitle .Title site.Title site.Params.title | plainify }}
+ {{- . }}
+{{- end -}}
diff --git a/linkerd.io/layouts/_partials/page-description.html b/linkerd.io/layouts/_partials/page-description.html
deleted file mode 100644
index aca57e1dba..0000000000
--- a/linkerd.io/layouts/_partials/page-description.html
+++ /dev/null
@@ -1,3 +0,0 @@
-{{- with or .Description (.Summary | truncate 160) site.Params.description | plainify | htmlUnescape }}
- {{- trim . "\n\r\t " | replaceRE "[\n\r\t]+" " " }}
-{{- end -}}
diff --git a/netlify.toml b/netlify.toml
index ade4d0684e..5f6ad0a851 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -4,7 +4,7 @@ publish = "public"
command = "make production-build"
[build.environment]
-HUGO_VERSION = "0.156.0"
+HUGO_VERSION = "0.158.0"
[context.deploy-preview]
command = "make preview-build"