diff --git a/.gitignore b/.gitignore
index 3693a51eb..ffa80b87f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,4 +16,4 @@ Gemfile.lock
.idea
.vale
modules/.vale.ini
-.vale.ini
\ No newline at end of file
+.vale.ini
diff --git a/assets/images/og-template-base.svg b/assets/images/og-template-base.svg
new file mode 100644
index 000000000..ff67c76e6
--- /dev/null
+++ b/assets/images/og-template-base.svg
@@ -0,0 +1,32 @@
+
+
diff --git a/config.yaml b/config.yaml
index e86cc6697..52770e0d1 100644
--- a/config.yaml
+++ b/config.yaml
@@ -7,6 +7,12 @@ paginate: 6
timeout: 300
params:
site_logo: /images/validated-patterns.png
+ # SEO and Social Media Settings
+ description: "Validated Patterns are GitOps-driven, automated, and rigorously tested application stacks for hybrid cloud deployments on Red Hat OpenShift. Deploy complex solutions with unprecedented speed and confidence."
+ default_share_image: /images/validated-patterns.png
+ twitter_handle: "@RedHat"
+ github_repo: "validatedpatterns/docs"
+ github_branch: "main"
security:
exec:
allow: ["^dart-sass-embedded$", "^go$", "^npx$", "^postcss$", "^asciidoctor$"]
@@ -45,3 +51,8 @@ menus:
- name: Workshop
url: https://play.validatedpatterns.io
weight: 25
+sitemap:
+ changeFreq: monthly
+ priority: 0.5
+ filename: sitemap.xml
+enableRobotsTXT: true
diff --git a/content/blog/2021-12-31-medical-diagnosis.md b/content/blog/2021-12-31-medical-diagnosis.md
index 035583283..59cc35c23 100644
--- a/content/blog/2021-12-31-medical-diagnosis.md
+++ b/content/blog/2021-12-31-medical-diagnosis.md
@@ -8,6 +8,15 @@ blog_tags:
- xray
- validated-pattern
aliases: /2021/12/31/medical-diagnosis/
+keywords:
+- medical diagnosis
+- ai machine learning
+- xray analysis
+- healthcare
+- validated patterns
+- pneumonia detection
+- knative
+- kafka
---
# Validated Pattern: Medical Diagnosis
diff --git a/content/blog/2022-03-23-acm-mustonlyhave.md b/content/blog/2022-03-23-acm-mustonlyhave.md
index 770d23b71..4eba7c6f8 100644
--- a/content/blog/2022-03-23-acm-mustonlyhave.md
+++ b/content/blog/2022-03-23-acm-mustonlyhave.md
@@ -6,6 +6,14 @@ author: Michele Baldessari
blog_tags:
- acm
aliases: /2022/03/23/acm-mustonlyhave/
+keywords:
+- rhacm
+- policy enforcement
+- musthave
+- mustonlyhave
+- validated patterns
+- cluster governance
+- openshift
---
Recently a user reported an issue when using the multicloud-gitops pattern: Namely, after testing changes in a feature branch (adding a helm application), said changes were not appearing on the remote clusters.
diff --git a/content/blog/2022-03-30-multicloud-gitops.md b/content/blog/2022-03-30-multicloud-gitops.md
index bee0ce443..f05b70012 100644
--- a/content/blog/2022-03-30-multicloud-gitops.md
+++ b/content/blog/2022-03-30-multicloud-gitops.md
@@ -8,6 +8,15 @@ blog_tags:
- xray
- validated-pattern
aliases: /2022/03/30/multicloud-gitops/
+keywords:
+- multicloud
+- gitops
+- argocd
+- rhacm
+- kubernetes
+- openshift
+- validated patterns
+- cluster management
---
# Validated Pattern: Multi-Cloud GitOps
diff --git a/content/blog/2022-06-30-ansible-edge-gitops.md b/content/blog/2022-06-30-ansible-edge-gitops.md
index 83411e9b8..029c17b6c 100644
--- a/content/blog/2022-06-30-ansible-edge-gitops.md
+++ b/content/blog/2022-06-30-ansible-edge-gitops.md
@@ -7,6 +7,13 @@ blog_tags:
- ansible-edge-gitops
- patterns
aliases: /2022/06/30/ansible-edge-gitops/
+keywords:
+- ansible automation
+- edge computing
+- gitops
+- openshift virtualization
+- validated patterns
+- hybrid cloud
---
# Validated Pattern: Ansible Edge GitOps
diff --git a/content/blog/2022-07-15-push-vs-pull.md b/content/blog/2022-07-15-push-vs-pull.md
index 7c68f77f7..13f52a875 100644
--- a/content/blog/2022-07-15-push-vs-pull.md
+++ b/content/blog/2022-07-15-push-vs-pull.md
@@ -8,6 +8,14 @@ blog_tags:
- patterns
- GitOps
aliases: /2022/07/15/push-vs-pull/
+keywords:
+- push vs pull
+- change management
+- gitops
+- ansible
+- validated patterns
+- edge computing
+- deployment strategies
---
# Push or Pull? Strategies for Large Scale Technology Change Management on the Edge
diff --git a/content/blog/2022-08-24-clustergroups.md b/content/blog/2022-08-24-clustergroups.md
index 9f2f298af..430d935e5 100644
--- a/content/blog/2022-08-24-clustergroups.md
+++ b/content/blog/2022-08-24-clustergroups.md
@@ -6,6 +6,14 @@ author: Martin Jackson
blog_tags:
- validated-pattern
aliases: /2022/08/24/clustergroups/
+keywords:
+- clustergroups
+- multicluster
+- validated patterns
+- kubernetes
+- openshift
+- cluster management
+- gitops
---
# What Is a clusterGroup?
diff --git a/content/blog/2022-09-02-route.md b/content/blog/2022-09-02-route.md
index 8fd7a49db..036d9d2bb 100644
--- a/content/blog/2022-09-02-route.md
+++ b/content/blog/2022-09-02-route.md
@@ -8,6 +8,13 @@ blog_tags:
- openshift
- route
aliases: /2022/09/02/route/
+keywords:
+- openshift routes
+- subdomain
+- kubernetes ingress
+- networking
+- validated patterns
+- dns
---
# What Is a route in OpenShift?
diff --git a/content/blog/2022-10-12-acm-provisioning.md b/content/blog/2022-10-12-acm-provisioning.md
index 6fc584601..77044bc1f 100644
--- a/content/blog/2022-10-12-acm-provisioning.md
+++ b/content/blog/2022-10-12-acm-provisioning.md
@@ -9,6 +9,14 @@ blog_tags:
- patterns
- GitOps
aliases: /2022/10/12/acm-provisioning/
+keywords:
+- rhacm
+- cluster provisioning
+- multicluster
+- gitops
+- validated patterns
+- openshift
+- cluster management
---
# Multi-cluster GitOps with Provisioning
diff --git a/content/blog/2022-11-20-argo-rollouts.md b/content/blog/2022-11-20-argo-rollouts.md
index 9b91edb78..07da9c103 100644
--- a/content/blog/2022-11-20-argo-rollouts.md
+++ b/content/blog/2022-11-20-argo-rollouts.md
@@ -7,6 +7,14 @@ blog_tags:
- patterns
- GitOps
aliases: /2022/11/03/argo-rollouts/
+keywords:
+- argo rollouts
+- progressive delivery
+- blue green deployment
+- canary deployment
+- gitops
+- validated patterns
+- kubernetes
---
# Progressive Delivery with Argo Rollouts
diff --git a/content/blog/2022-12-01-multicluster-devsecops.md b/content/blog/2022-12-01-multicluster-devsecops.md
index c08321dc8..750dcce1a 100644
--- a/content/blog/2022-12-01-multicluster-devsecops.md
+++ b/content/blog/2022-12-01-multicluster-devsecops.md
@@ -13,6 +13,15 @@ blog_tags:
- pipelines
- quay
aliases: /2022/12/01/multicluster-devsecops/
+keywords:
+- devsecops
+- openshift pipelines
+- security scanning
+- quay registry
+- advanced cluster security
+- validated patterns
+- ci/cd
+- gitops
---
# Multicluster DevSecOps
diff --git a/content/blog/2023-11-17-argo-configmanagement-plugins.md b/content/blog/2023-11-17-argo-configmanagement-plugins.md
index 3c379b792..14f4a4d48 100644
--- a/content/blog/2023-11-17-argo-configmanagement-plugins.md
+++ b/content/blog/2023-11-17-argo-configmanagement-plugins.md
@@ -11,6 +11,14 @@ blog_tags:
- pipelines
- gitops
aliases: /2023/11/17/argocd-cmps/
+keywords:
+- argocd
+- config management plugins
+- gitops
+- validated patterns
+- kubernetes
+- openshift
+- sidecar plugins
---
# Argo CD Configuration Management Plugins and the Validated Patterns Framework
diff --git a/content/blog/2023-12-01-new-pattern-tiers.md b/content/blog/2023-12-01-new-pattern-tiers.md
index 0279a80aa..8adba3355 100644
--- a/content/blog/2023-12-01-new-pattern-tiers.md
+++ b/content/blog/2023-12-01-new-pattern-tiers.md
@@ -7,6 +7,13 @@ blog_tags:
- patterns
- announce
aliases: /2023/12/01/pattern-tiers/
+keywords:
+- pattern tiers
+- validated patterns
+- sandbox
+- tested
+- maintained
+- pattern classification
---
The efforts here started off with 2 different classes of patterns: “Community” and “Validated”, however this terminology dates back to before the effort had arrived at “Validated Patterns” as the official project name.
diff --git a/content/blog/2023-12-05-nutanix-testing.md b/content/blog/2023-12-05-nutanix-testing.md
index f525b7332..7a6e2af53 100644
--- a/content/blog/2023-12-05-nutanix-testing.md
+++ b/content/blog/2023-12-05-nutanix-testing.md
@@ -8,6 +8,13 @@
- announce
- nutanix
aliases: /2023/12/04/nutanix-platform-announce/
+ keywords:
+ - nutanix platform
+ - multicloud gitops
+ - validated patterns
+ - platform testing
+ - openshift
+ - ci testing
---
I am pleased to announce the addition of the Nutanix platform to our CI dashboard for the Multi-cloud GitOps pattern.
diff --git a/content/blog/2023-12-15-understanding-namespaces.md b/content/blog/2023-12-15-understanding-namespaces.md
index 2b046a878..1432e79bc 100644
--- a/content/blog/2023-12-15-understanding-namespaces.md
+++ b/content/blog/2023-12-15-understanding-namespaces.md
@@ -6,6 +6,13 @@
blog_tags:
- patterns
aliases: /2023/12/15/understanding-namespaces/
+ keywords:
+ - kubernetes namespaces
+ - operator groups
+ - openshift
+ - validated patterns
+ - namespace management
+ - clustergroup
---
# Understanding Namespace Creation using the Validated Patterns Framework
diff --git a/content/blog/2023-12-20-private-repos.md b/content/blog/2023-12-20-private-repos.md
index 4ee92e925..6eb7904e3 100644
--- a/content/blog/2023-12-20-private-repos.md
+++ b/content/blog/2023-12-20-private-repos.md
@@ -7,6 +7,13 @@
- patterns
- announce
aliases: /2023/12/20/private-repositories/
+ keywords:
+ - private git repositories
+ - ssh authentication
+ - argocd
+ - validated patterns
+ - git security
+ - repository access
---
We're excited to announce that support for private repositories is now
diff --git a/content/blog/2024-01-16-deploying-mcg-with-cisco-flashstack-portworx.md b/content/blog/2024-01-16-deploying-mcg-with-cisco-flashstack-portworx.md
index 42c7c9de9..6c8085bd1 100644
--- a/content/blog/2024-01-16-deploying-mcg-with-cisco-flashstack-portworx.md
+++ b/content/blog/2024-01-16-deploying-mcg-with-cisco-flashstack-portworx.md
@@ -5,6 +5,14 @@
author: Lester Claudio
blog_tags:
- patterns
+ keywords:
+ - cisco flashstack
+ - portworx enterprise
+ - multicloud gitops
+ - validated patterns
+ - openshift
+ - data center
+ - storage
---
# Deploying Multicloud GitOps with Cisco FlashStack Data Center and Portworx Enterprise
diff --git a/content/blog/2024-01-26-more-secrets-options.md b/content/blog/2024-01-26-more-secrets-options.md
index 3a6c9eadb..b5dc63297 100644
--- a/content/blog/2024-01-26-more-secrets-options.md
+++ b/content/blog/2024-01-26-more-secrets-options.md
@@ -6,6 +6,13 @@
blog_tags:
- patterns
- secrets
+ keywords:
+ - secrets management
+ - hashicorp vault
+ - external secrets operator
+ - kubernetes secrets
+ - validated patterns
+ - security
---
# More Secrets Options Now Available with Validated Patterns
diff --git a/content/blog/2024-02-07-hcp-htpasswd-config.md b/content/blog/2024-02-07-hcp-htpasswd-config.md
index 658755376..ad85b8084 100644
--- a/content/blog/2024-02-07-hcp-htpasswd-config.md
+++ b/content/blog/2024-02-07-hcp-htpasswd-config.md
@@ -6,6 +6,14 @@ author: Jonny Rickard
blog_tags:
- patterns
- how-to
+keywords:
+- htpasswd
+- oauth
+- authentication
+- hosted control plane
+- openshift
+- validated patterns
+- cluster configuration
---
# Configure HTPasswd OAuth provider for hosted clusters
diff --git a/content/blog/2024-03-05-intel-accelerated-patterns.md b/content/blog/2024-03-05-intel-accelerated-patterns.md
index d06dbc5ee..55ea9522f 100644
--- a/content/blog/2024-03-05-intel-accelerated-patterns.md
+++ b/content/blog/2024-03-05-intel-accelerated-patterns.md
@@ -7,6 +7,15 @@ blog_tags:
- patterns
- announce
aliases: /2024/02/02/intel-patterns/
+keywords:
+- intel amx
+- hardware acceleration
+- ai workloads
+- machine learning
+- intel xeon
+- validated patterns
+- openshift ai
+- deep learning
---
# Intel AMX accelerated patterns increase AI performance while reducing cost
diff --git a/content/blog/2024-07-12-in-cluster-git.md b/content/blog/2024-07-12-in-cluster-git.md
index f3cea4adf..842da4715 100644
--- a/content/blog/2024-07-12-in-cluster-git.md
+++ b/content/blog/2024-07-12-in-cluster-git.md
@@ -6,6 +6,14 @@
blog_tags:
- patterns
- git
+ keywords:
+ - gitea
+ - in-cluster git
+ - git server
+ - validated patterns
+ - gitops
+ - kubernetes
+ - openshift
---
# In-cluster Git Server
diff --git a/content/blog/2024-07-19-write-token-kubeconfig.md b/content/blog/2024-07-19-write-token-kubeconfig.md
index d1399ff8a..f9088425f 100644
--- a/content/blog/2024-07-19-write-token-kubeconfig.md
+++ b/content/blog/2024-07-19-write-token-kubeconfig.md
@@ -5,6 +5,13 @@
author: Martin Jackson
blog_tags:
- patterns
+ keywords:
+ - kubeconfig
+ - kubernetes authentication
+ - token authentication
+ - openshift
+ - validated patterns
+ - cluster access
---
# Writing a Kubeconfig File if You Need One
diff --git a/content/blog/2024-08-30-push-secrets.md b/content/blog/2024-08-30-push-secrets.md
index 6fad88183..3e05c320a 100644
--- a/content/blog/2024-08-30-push-secrets.md
+++ b/content/blog/2024-08-30-push-secrets.md
@@ -5,6 +5,14 @@
author: Michele Baldessari
blog_tags:
- patterns
+ keywords:
+ - hashicorp vault
+ - kubernetes secrets
+ - secret management
+ - external secrets
+ - pushsecret
+ - validated patterns
+ - gitops
---
# Pushing Secrets to HashiCorp Vault
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index f76b3cfd7..c7bb0d272 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -1,5 +1,5 @@
-
+
{{- partial "head.html" . -}}
diff --git a/layouts/partials/generate-og-image-advanced.html b/layouts/partials/generate-og-image-advanced.html
new file mode 100644
index 000000000..bcc1f349d
--- /dev/null
+++ b/layouts/partials/generate-og-image-advanced.html
@@ -0,0 +1,83 @@
+{{- /*
+ Advanced OG Image Generator with Text Overlay
+ This requires Hugo Extended version with image filter support
+ Creates branded OG images with the post title overlaid on a base image
+*/ -}}
+
+{{- $ogImage := "" }}
+{{- $pageTitle := .Title }}
+{{- $truncatedTitle := $pageTitle }}
+{{- if gt (len $pageTitle) 80 }}
+ {{- $truncatedTitle = printf "%s..." (substr $pageTitle 0 77) }}
+{{- end }}
+
+{{- /* Check for custom image in front matter */ -}}
+{{- if .Params.og_image }}
+ {{- with resources.Get .Params.og_image }}
+ {{- $ogImage = . }}
+ {{- else }}
+ {{- $ogImage = .Params.og_image | absURL }}
+ {{- end }}
+{{- else if .Params.image }}
+ {{- with resources.Get .Params.image }}
+ {{- /* Resize custom image to OG dimensions */ -}}
+ {{- $ogImage = .Resize "1200x630 Center" }}
+ {{- else }}
+ {{- $ogImage = .Params.image | absURL }}
+ {{- end }}
+{{- else if .Params.featured_image }}
+ {{- with resources.Get .Params.featured_image }}
+ {{- $ogImage = .Resize "1200x630 Center" }}
+ {{- else }}
+ {{- $ogImage = .Params.featured_image | absURL }}
+ {{- end }}
+{{- end }}
+
+{{- /* Generate dynamic image for blog posts without custom images */ -}}
+{{- if and (not $ogImage) (eq .Section "blog") }}
+ {{- /* Try to get a base template image */ -}}
+ {{- $baseImage := resources.Get "images/og-template-base.png" }}
+
+ {{- if not $baseImage }}
+ {{- /* Fallback: use the site logo as base */ -}}
+ {{- $baseImage = resources.Get "images/validated-patterns.png" }}
+ {{- end }}
+
+ {{- if $baseImage }}
+ {{- /* Resize to OG dimensions */ -}}
+ {{- $resized := $baseImage.Fit "1200x630" }}
+
+ {{- /* Apply filters for a nice background effect */ -}}
+ {{- $processed := $resized }}
+ {{- $processed = $processed.Filter (images.Brightness 10) }}
+ {{- $processed = $processed.Filter (images.Contrast 10) }}
+
+ {{- /* Note: Text overlay would require Hugo Extended with overlay filter
+ For now, we create a visually appealing base image
+ Consider using external service or pre-generated templates for text */ -}}
+
+ {{- /* Store the processed image */ -}}
+ {{- $filename := printf "og-generated/%s.jpg" .File.ContentBaseName }}
+ {{- $ogImage = $processed }}
+ {{- end }}
+{{- end }}
+
+{{- /* Ultimate fallback */ -}}
+{{- if not $ogImage }}
+ {{- $ogImage = resources.Get "images/validated-patterns.png" }}
+ {{- if $ogImage }}
+ {{- $ogImage = $ogImage.Resize "1200x630" }}
+ {{- end }}
+{{- end }}
+
+{{- /* Return the image permalink or URL */ -}}
+{{- if $ogImage }}
+ {{- if reflect.IsMap $ogImage }}
+ {{- return $ogImage.Permalink }}
+ {{- else }}
+ {{- return $ogImage }}
+ {{- end }}
+{{- else }}
+ {{- return (.Site.Params.site_logo | absURL) }}
+{{- end }}
+
diff --git a/layouts/partials/generate-og-image.html b/layouts/partials/generate-og-image.html
new file mode 100644
index 000000000..c46e2b6bc
--- /dev/null
+++ b/layouts/partials/generate-og-image.html
@@ -0,0 +1,88 @@
+{{- /*
+ Generate a dynamic Open Graph image for blog posts
+ This partial creates a custom OG image with the blog post title
+ Falls back to default images if generation fails
+*/ -}}
+
+{{- $ogImage := "" }}
+{{- $pageTitle := .Title }}
+{{- $pageDate := .Date.Format "January 2, 2006" }}
+{{- $author := .Params.author | default "Validated Patterns" }}
+
+{{- /* Check if page has a custom image first */ -}}
+{{- if .Params.image }}
+ {{- with resources.Get .Params.image }}
+ {{- $ogImage = . }}
+ {{- else }}
+ {{- /* Image is a URL, return it directly */ -}}
+ {{- $ogImage = .Params.image }}
+ {{- end }}
+{{- else if .Params.featured_image }}
+ {{- with resources.Get .Params.featured_image }}
+ {{- $ogImage = . }}
+ {{- else }}
+ {{- $ogImage = .Params.featured_image }}
+ {{- end }}
+{{- else if eq .Section "blog" }}
+ {{- /* Generate dynamic OG image for blog posts */ -}}
+ {{- $baseImage := resources.Get "images/validated-patterns.png" }}
+ {{- if $baseImage }}
+ {{- /* Create a processed version of the image for OG */ -}}
+ {{- $ogImage = $baseImage.Resize "1200x630 Center" }}
+ {{- $ogImage = $ogImage.Filter (images.GaussianBlur 2) }}
+ {{- $ogImage = $ogImage.Filter (images.Brightness -20) }}
+ {{- end }}
+
+ {{- /* If we want to use SVG-based generation instead */ -}}
+ {{- /* Note: SVG generation for better text rendering */ -}}
+ {{- if not $ogImage }}
+ {{- $svg := printf `
+ ` (substr $pageTitle 0 60) $pageDate }}
+
+ {{- $svgContent := $svg | resources.FromString (printf "og-images/blog/%s.svg" .File.BaseFileName) }}
+ {{- $ogImage = $svgContent }}
+ {{- end }}
+{{- end }}
+
+{{- /* Fallback to site defaults */ -}}
+{{- if not $ogImage }}
+ {{- if .Site.Params.default_share_image }}
+ {{- $ogImage = resources.Get .Site.Params.default_share_image }}
+ {{- if not $ogImage }}
+ {{- $ogImage = .Site.Params.default_share_image }}
+ {{- end }}
+ {{- else }}
+ {{- $ogImage = resources.Get "images/validated-patterns.png" }}
+ {{- end }}
+{{- end }}
+
+{{- /* Return the final image URL */ -}}
+{{- if $ogImage }}
+ {{- if reflect.IsMap $ogImage }}
+ {{- /* It's a Hugo resource */ -}}
+ {{- return $ogImage.Permalink }}
+ {{- else }}
+ {{- /* It's a string URL */ -}}
+ {{- return ($ogImage | absURL) }}
+ {{- end }}
+{{- else }}
+ {{- return (.Site.Params.site_logo | absURL) }}
+{{- end }}
+
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
index 93a390fa7..26688cedb 100644
--- a/layouts/partials/head.html
+++ b/layouts/partials/head.html
@@ -1,6 +1,129 @@
+
+ {{- /* Description Meta Tag */ -}}
+ {{- $description := "" }}
+ {{- if .Description }}
+ {{- $description = .Description }}
+ {{- else if .Summary }}
+ {{- $description = .Summary | truncate 155 }}
+ {{- else if .Site.Params.description }}
+ {{- $description = .Site.Params.description }}
+ {{- else }}
+ {{- $description = "Validated Patterns are an evolution of how you deploy applications in a hybrid cloud. Deploy full application stacks through GitOps-based frameworks for business-centric solutions with CI." }}
+ {{- end }}
+
+
+ {{- /* Author Meta Tag for Blog Posts */ -}}
+ {{- if and (eq .Section "blog") .Params.author }}
+
+ {{- end }}
+
+ {{- /* Keywords Meta Tag */ -}}
+ {{- if .Params.keywords }}
+
+ {{- end }}
+
+ {{- /* Theme Color for Mobile Browsers */ -}}
+
+
+ {{- /* Canonical URL */ -}}
+ {{- if .Params.canonical_url }}
+
+ {{- else }}
+
+ {{- end }}
+
+ {{- /* Favicon */ -}}
+
+
+
+ {{- /* DNS Prefetch and Preconnect for Performance */ -}}
+
+
+
+
+ {{- /* Open Graph Meta Tags */ -}}
+ {{- $ogTitle := .Title }}
+ {{- if .IsHome }}
+ {{- $ogTitle = .Site.Title }}
+ {{- end }}
+
+
+
+
+
+
+ {{- /* Open Graph Image - Use dynamic generation for blog posts */ -}}
+ {{- $ogImage := "" }}
+ {{- if .Params.og_image }}
+ {{- /* Custom OG image specified in front matter */ -}}
+ {{- $ogImage = .Params.og_image | absURL }}
+ {{- else if .Params.image }}
+ {{- $ogImage = .Params.image | absURL }}
+ {{- else if .Params.featured_image }}
+ {{- $ogImage = .Params.featured_image | absURL }}
+ {{- else if and (eq .Section "blog") (not .IsHome) }}
+ {{- /* Generate dynamic OG image for blog posts */ -}}
+ {{- $ogImage = partial "render-blog-og-image.html" . }}
+ {{- else if .Site.Params.default_share_image }}
+ {{- $ogImage = .Site.Params.default_share_image | absURL }}
+ {{- else }}
+ {{- $ogImage = .Site.Params.site_logo | absURL }}
+ {{- end }}
+ {{- if $ogImage }}
+
+
+
+
+ {{- end }}
+
+ {{- /* Open Graph Type and Article Metadata */ -}}
+ {{- if eq .Section "blog" }}
+
+ {{- if .Date }}
+
+ {{- end }}
+ {{- if .Lastmod }}
+
+ {{- end }}
+ {{- if .Params.author }}
+
+ {{- end }}
+ {{- if .Params.blog_tags }}
+ {{- range .Params.blog_tags }}
+
+ {{- end }}
+ {{- end }}
+ {{- else }}
+
+ {{- end }}
+
+ {{- /* Twitter Card Meta Tags */ -}}
+
+
+
+ {{- if $ogImage }}
+
+
+ {{- end }}
+ {{- if .Site.Params.twitter_handle }}
+
+
+ {{- end }}
+
+ {{- /* Structured Data - JSON-LD Schemas */ -}}
+ {{ partial "schema-website.html" . }}
+ {{ partial "schema-organization.html" . }}
+ {{ partial "schema-breadcrumbs.html" . }}
+ {{- if eq .Section "blog" }}
+ {{ partial "schema-article.html" . }}
+ {{- end }}
+ {{- if eq .Section "patterns" }}
+ {{ partial "schema-techarticle.html" . }}
+ {{- end }}
+
{{ $sass := resources.Get "sass/patternfly.scss" }}
{{ $style := $sass | resources.ToCSS }}
@@ -12,7 +135,7 @@
{{ if eq .IsHome false }}{{ .Title }} | {{ end }}{{ .Site.Title }}
-
+
+{{- end -}}
+
diff --git a/layouts/partials/schema-breadcrumbs.html b/layouts/partials/schema-breadcrumbs.html
new file mode 100644
index 000000000..fd3353405
--- /dev/null
+++ b/layouts/partials/schema-breadcrumbs.html
@@ -0,0 +1,38 @@
+{{- if not .IsHome -}}
+{{- $url := .Permalink -}}
+{{- $sections := split .RelPermalink "/" -}}
+{{- $position := 1 -}}
+{{- $breadcrumbItems := slice -}}
+
+{{- /* Add Home breadcrumb */ -}}
+{{- $homeItem := dict "@type" "ListItem" "position" $position "name" "Home" "item" .Site.BaseURL -}}
+{{- $breadcrumbItems = $breadcrumbItems | append $homeItem -}}
+{{- $position = add $position 1 -}}
+
+{{- /* Build breadcrumb path */ -}}
+{{- $currentPath := "" -}}
+{{- range $index, $section := $sections -}}
+ {{- if and (ne $section "") (ne $section "index.html") -}}
+ {{- $currentPath = printf "%s/%s" $currentPath $section -}}
+ {{- $sectionPage := $.Site.GetPage $currentPath -}}
+ {{- $name := $section | humanize | title -}}
+ {{- if $sectionPage -}}
+ {{- $name = $sectionPage.Title -}}
+ {{- end -}}
+ {{- $item := dict "@type" "ListItem" "position" $position "name" $name "item" (printf "%s%s" $.Site.BaseURL $currentPath) -}}
+ {{- $breadcrumbItems = $breadcrumbItems | append $item -}}
+ {{- $position = add $position 1 -}}
+ {{- end -}}
+{{- end -}}
+
+{{- if gt (len $breadcrumbItems) 1 -}}
+
+{{- end -}}
+{{- end -}}
+
diff --git a/layouts/partials/schema-organization.html b/layouts/partials/schema-organization.html
new file mode 100644
index 000000000..6314c07f9
--- /dev/null
+++ b/layouts/partials/schema-organization.html
@@ -0,0 +1,27 @@
+{{- if .IsHome -}}
+
+{{- end -}}
+
diff --git a/layouts/partials/schema-techarticle.html b/layouts/partials/schema-techarticle.html
new file mode 100644
index 000000000..e6904279a
--- /dev/null
+++ b/layouts/partials/schema-techarticle.html
@@ -0,0 +1,80 @@
+{{- if and (eq .Section "patterns") (not .IsNode) -}}
+{{- $image := "" -}}
+{{- if .Params.image -}}
+ {{- $image = .Params.image | absURL -}}
+{{- else if .Params.featured_image -}}
+ {{- $image = .Params.featured_image | absURL -}}
+{{- else if .Site.Params.default_share_image -}}
+ {{- $image = .Site.Params.default_share_image | absURL -}}
+{{- else -}}
+ {{- $image = .Site.Params.site_logo | absURL -}}
+{{- end -}}
+
+{{- $description := "" -}}
+{{- if .Description -}}
+ {{- $description = .Description -}}
+{{- else if .Summary -}}
+ {{- $description = .Summary -}}
+{{- else -}}
+ {{- $description = .Site.Params.description | default "Validated Patterns documentation" -}}
+{{- end -}}
+
+
+{{- end -}}
+
diff --git a/layouts/partials/schema-website.html b/layouts/partials/schema-website.html
new file mode 100644
index 000000000..920780044
--- /dev/null
+++ b/layouts/partials/schema-website.html
@@ -0,0 +1,21 @@
+{{- if .IsHome -}}
+
+{{- end -}}
+
diff --git a/layouts/sitemap.xml b/layouts/sitemap.xml
new file mode 100644
index 000000000..dd95cb2b9
--- /dev/null
+++ b/layouts/sitemap.xml
@@ -0,0 +1,15 @@
+{{ printf "" | safeHTML }}
+
+ {{ range .Pages }}
+
+ {{ .Permalink }}
+ {{ if not .Lastmod.IsZero }}
+ {{ .Lastmod.Format "2006-01-02T15:04:05-07:00" | safeHTML }}
+ {{ end }}
+ {{ with .Sitemap.ChangeFreq }}
+ {{ . }}
+ {{ end }}
+
+ {{ end }}
+
\ No newline at end of file
diff --git a/static/llms.txt b/static/llms.txt
new file mode 100644
index 000000000..ec8e99a2d
--- /dev/null
+++ b/static/llms.txt
@@ -0,0 +1,60 @@
+# Validated Patterns
+
+> Validated Patterns are GitOps-driven, automated, and rigorously tested application stacks for hybrid cloud deployments on Red Hat OpenShift. They go beyond traditional reference architectures by providing deployable, testable software artifacts with automated deployment that enhance speed, reliability, and consistency across environments.
+
+Important notes:
+
+- Validated Patterns are built on OpenShift Container Platform (Kubernetes) and leverage GitOps principles using ArgoCD, Red Hat Advanced Cluster Management (RHACM), and Tekton
+- They are designed for IT architects, advanced developers, and system administrators familiar with Kubernetes and OpenShift
+- Patterns can be deployed using either the OpenShift-based Validated Patterns framework or the Ansible GitOps Framework (AGOF)
+- All patterns require an available OpenShift 4.12+ cluster with cluster-admin privileges, at least 8 CPU cores, 16GB RAM, and dynamic storage provisioning
+- Each pattern includes values files (values-global.yaml, values-hub.yaml) for customization and secrets management without committing sensitive data to git repositories
+
+## Getting Started
+
+- [Patterns quick start](https://validatedpatterns.io/learn/quickstart/): Streamlined guide to deploying your first validated pattern with step-by-step instructions
+- [About Validated Patterns](https://validatedpatterns.io/learn/about-validated-patterns/): Overview of what Validated Patterns are, why they exist, and their advantages over traditional reference architectures
+- [Key concepts](https://validatedpatterns.io/learn/keyconcepts/): Core concepts and terminology used throughout the Validated Patterns framework
+- [Workflow](https://validatedpatterns.io/learn/workflow/): Understanding the deployment workflow and GitOps processes
+
+## Core Documentation
+
+- [Validated Patterns frameworks](https://validatedpatterns.io/learn/validated_patterns_frameworks/): Overview of the OpenShift and Ansible-based frameworks
+- [Using the Validated Pattern Operator](https://validatedpatterns.io/learn/using-validated-pattern-operator/): How to install and use the operator for pattern deployment
+- [Values files](https://validatedpatterns.io/learn/values-files/): Understanding and customizing values files for pattern configuration
+- [Secrets management](https://validatedpatterns.io/learn/secrets-management-in-the-Validated-Patterns-framework/): How secrets are managed securely in the framework
+- [ClusterGroup in values files](https://validatedpatterns.io/learn/clustergroup-in-values-files/): Understanding ClusterGroup configuration for multi-cluster deployments
+- [Importing a cluster](https://validatedpatterns.io/learn/importing-a-cluster/): How to import edge or managed clusters into the hub cluster
+
+## Pattern Examples
+
+- [Multicloud GitOps](https://validatedpatterns.io/patterns/multicloud-gitops/): Foundational pattern demonstrating GitOps across multiple clusters - recommended starting point
+- [Industrial Edge](https://validatedpatterns.io/patterns/industrial-edge/): Edge computing pattern for manufacturing and industrial use cases
+- [Medical Diagnosis](https://validatedpatterns.io/patterns/medical-diagnosis/): AI/ML pattern for medical imaging and diagnosis with Intel optimizations
+- [Retail](https://validatedpatterns.io/patterns/retail/): Retail industry pattern with edge deployments for store locations
+- [Ansible Edge GitOps](https://validatedpatterns.io/patterns/ansible-edge-gitops/): Pattern combining Ansible Automation Platform with GitOps at the edge
+- [DevSecOps](https://validatedpatterns.io/patterns/devsecops/): Secure software supply chain and development pipeline pattern
+- [RAG LLM GitOps](https://validatedpatterns.io/patterns/rag-llm-gitops/): Retrieval-Augmented Generation pattern for Large Language Models
+- [OpenShift AI](https://validatedpatterns.io/patterns/openshift-ai/): Pattern for deploying and managing AI/ML workloads on OpenShift
+
+## Advanced Topics
+
+- [Pattern structure](https://validatedpatterns.io/learn/vp_structure_vp_pattern/): Deep dive into the structure and components of a validated pattern
+- [Ansible GitOps Framework (AGOF)](https://validatedpatterns.io/learn/vp_agof/): Using Ansible for GitOps-based deployments
+- [OpenShift framework](https://validatedpatterns.io/learn/vp_openshift_framework/): Details on the OpenShift-based framework
+- [Infrastructure](https://validatedpatterns.io/learn/infrastructure/): Infrastructure considerations for pattern deployments
+- [Cluster sizing](https://validatedpatterns.io/learn/ocp-cluster-general-sizing/): General guidance on OpenShift cluster sizing for patterns
+
+## Contributing
+
+- [Contribute to Validated Patterns](https://validatedpatterns.io/contribute/): How to contribute to the project
+- [Documentation guidelines](https://validatedpatterns.io/contribute/documentation-guidelines/): Guidelines for contributing to documentation
+- [Preview documentation locally](https://validatedpatterns.io/contribute/contribute-to-docs/): How to build and preview the documentation site
+
+## Optional
+
+- [FAQ](https://validatedpatterns.io/learn/faq/): Frequently asked questions about Validated Patterns
+- [About pattern tiers and types](https://validatedpatterns.io/learn/about-pattern-tiers-types/): Understanding different pattern maturity levels and classifications
+- [HashiCorp Vault](https://validatedpatterns.io/learn/vault/): Using Vault for secrets management in patterns
+- [All available patterns](https://validatedpatterns.io/patterns/): Browse all 30+ patterns by industry, product, and use case
+