-
Notifications
You must be signed in to change notification settings - Fork 29
feat(seo): canonical, JSON-LD, sitemap directive, richer meta descriptions #533
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
1f5a117
feat(seo): add Sitemap directive to robots.txt
tym83 c846a4c
feat(seo): add canonical link, JSON-LD schemas, noindex legacy doc ve…
tym83 cb5490b
feat(seo): improve site and section meta descriptions for keyword cov…
tym83 3199165
feat(seo): add llms.txt and SoftwareApplication schema for AI search
tym83 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -9,3 +9,108 @@ | |||||
| {{ with .Site.Params.ahrefsAnalytics }} | ||||||
| <script src="https://analytics.ahrefs.com/analytics.js" data-key="{{ . }}" async></script> | ||||||
| {{ end }} | ||||||
|
|
||||||
| {{/* SEO: canonical + noindex for legacy doc versions. | ||||||
| Older non-latest doc versions (v0, v1.0, v1.1, …) duplicate content from | ||||||
| the latest version (v1.2). Without dedup signals, search engines split | ||||||
| ranking signals across all five copies. We mark old versions as noindex | ||||||
| (still crawlable for users following links) and canonicalize current | ||||||
| pages to themselves. */}} | ||||||
| {{- $latestVersion := .Site.Params.latest_version_id | default "v1.2" -}} | ||||||
| {{- $isOldDocsVersion := false -}} | ||||||
| {{- range .Site.Params.versions -}} | ||||||
| {{- if and .id (ne .id $latestVersion) (ne .id "next") -}} | ||||||
| {{- if in $.RelPermalink (printf "/docs/%s/" .id) -}} | ||||||
| {{- $isOldDocsVersion = true -}} | ||||||
| {{- end -}} | ||||||
| {{- end -}} | ||||||
| {{- end -}} | ||||||
| {{- if $isOldDocsVersion }} | ||||||
| <meta name="robots" content="noindex, follow" /> | ||||||
| {{- else }} | ||||||
| <link rel="canonical" href="{{ .Permalink }}" /> | ||||||
| {{- end }} | ||||||
|
|
||||||
| {{/* JSON-LD Organization (every page) */}} | ||||||
| <script type="application/ld+json"> | ||||||
| { | ||||||
| "@context": "https://schema.org", | ||||||
| "@type": "Organization", | ||||||
| "name": "Cozystack", | ||||||
| "url": "{{ "/" | absURL }}", | ||||||
| "logo": "{{ "img/cozystack-social.png" | absURL }}", | ||||||
| "description": {{ .Site.Params.description | jsonify }}, | ||||||
| "foundingDate": "2023", | ||||||
| "sameAs": [ | ||||||
| "https://github.com/cozystack/cozystack", | ||||||
| "https://landscape.cncf.io/?item=platform--paas-container-service--cozystack", | ||||||
| "https://kubernetes.slack.com/messages/cozystack", | ||||||
| "https://t.me/cozystack" | ||||||
| ] | ||||||
| } | ||||||
| </script> | ||||||
|
|
||||||
| {{/* JSON-LD WebSite (homepage only) */}} | ||||||
| {{- if .IsHome }} | ||||||
| <script type="application/ld+json"> | ||||||
| { | ||||||
| "@context": "https://schema.org", | ||||||
| "@type": "WebSite", | ||||||
| "name": "Cozystack", | ||||||
| "url": "{{ "/" | absURL }}", | ||||||
| "description": {{ .Site.Params.description | jsonify }} | ||||||
| } | ||||||
| </script> | ||||||
|
|
||||||
| {{/* JSON-LD SoftwareApplication (homepage only) — helps AI search engines | ||||||
| classify Cozystack correctly when answering "what is Cozystack" queries. */}} | ||||||
| <script type="application/ld+json"> | ||||||
| { | ||||||
| "@context": "https://schema.org", | ||||||
| "@type": "SoftwareApplication", | ||||||
| "name": "Cozystack", | ||||||
| "applicationCategory": "Cloud Platform", | ||||||
| "operatingSystem": "Linux", | ||||||
| "url": "{{ "/" | absURL }}", | ||||||
| "description": {{ .Site.Params.description | jsonify }}, | ||||||
| "license": "https://www.apache.org/licenses/LICENSE-2.0", | ||||||
| "offers": { | ||||||
| "@type": "Offer", | ||||||
| "price": "0", | ||||||
| "priceCurrency": "USD" | ||||||
| }, | ||||||
| "softwareRequirements": "Kubernetes, KubeVirt, Cilium, LINSTOR, Talos Linux" | ||||||
| } | ||||||
| </script> | ||||||
| {{- end }} | ||||||
|
|
||||||
| {{/* JSON-LD BlogPosting (single blog posts) */}} | ||||||
| {{- if and (eq .Section "blog") (not .IsSection) (not .IsHome) }} | ||||||
| <script type="application/ld+json"> | ||||||
| { | ||||||
| "@context": "https://schema.org", | ||||||
| "@type": "BlogPosting", | ||||||
| "headline": {{ .Title | jsonify }}, | ||||||
| "description": {{ .Description | jsonify }}, | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If a blog post is missing the
Suggested change
|
||||||
| "datePublished": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}", | ||||||
| "dateModified": "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}", | ||||||
| "author": { | ||||||
| "@type": "Person", | ||||||
| "name": {{ .Params.author | default "Cozystack Team" | jsonify }} | ||||||
| }, | ||||||
| "image": "{{ with .Params.images }}{{ index . 0 | absURL }}{{ else }}{{ index $.Site.Params.images 0 | absURL }}{{ end }}", | ||||||
| "publisher": { | ||||||
| "@type": "Organization", | ||||||
| "name": "Cozystack", | ||||||
| "logo": { | ||||||
| "@type": "ImageObject", | ||||||
| "url": "{{ "img/cozystack-social.png" | absURL }}" | ||||||
| } | ||||||
| }, | ||||||
| "mainEntityOfPage": { | ||||||
| "@type": "WebPage", | ||||||
| "@id": "{{ .Permalink }}" | ||||||
| } | ||||||
| } | ||||||
| </script> | ||||||
| {{- end }} | ||||||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| User-agent: * | ||
| Allow: / | ||
|
|
||
| Sitemap: {{ "/sitemap.xml" | absURL }} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,79 @@ | ||
| # Cozystack | ||
|
|
||
| > Cozystack is an open-source, CNCF Sandbox cloud platform that provides Kubernetes-based, multi-tenant cloud infrastructure. Apache 2.0 license. CNCF Sandbox project since 2024-09-26. CNCF-Certified Kubernetes Distribution. Maintained by Aenix and the Cozystack community. | ||
|
|
||
| ## What Cozystack is | ||
|
|
||
| Cozystack is a free and open-source platform for building managed services and private clouds on bare metal. It provides: | ||
|
|
||
| - Kubernetes-based control plane for VMs, containers, databases, and storage | ||
| - Multi-tenant isolation via the Tenant Custom Resource Definition (CRD) | ||
| - Built on Talos Linux, Kubernetes, KubeVirt, Cilium, LINSTOR | ||
| - Customer-facing portal (cozyportal) with white-label support | ||
| - Service catalog: VMs, managed PostgreSQL, MySQL, Redis, Kafka, ClickHouse, S3-compatible object storage, GPU workloads | ||
| - VictoriaMetrics + VictoriaLogs for observability | ||
| - Designed for service providers, regulated enterprises, and sovereign cloud builders | ||
|
|
||
| Cozystack is a CNCF Sandbox project (accepted 2024-09-26), CNCF-Certified Kubernetes Distribution, and meets OpenSSF Best Practices. | ||
|
|
||
| ## License | ||
|
|
||
| Apache License, Version 2.0. See https://github.com/cozystack/cozystack/blob/main/LICENSE. | ||
|
|
||
| ## Project documentation | ||
|
|
||
| - [Documentation](https://cozystack.io/docs/): Full project documentation including installation, architecture, components, operations | ||
| - [Quickstart](https://cozystack.io/docs/get-started/): Get up and running with Cozystack | ||
| - [Components](https://cozystack.io/docs/components/): Detailed component reference | ||
| - [Architecture](https://cozystack.io/docs/architecture/): How Cozystack is structured | ||
|
|
||
| ## Releases and source code | ||
|
|
||
| - [GitHub repository](https://github.com/cozystack/cozystack): Source code, issues, releases | ||
| - [Releases](https://github.com/cozystack/cozystack/releases): Tagged releases with changelogs | ||
| - [Roadmap](https://github.com/cozystack/cozystack/blob/main/ROADMAP.md): Project roadmap | ||
|
|
||
| ## Community | ||
|
|
||
| - [Slack channel #cozystack](https://kubernetes.slack.com/archives/C06L3CPRVN1) on Kubernetes Slack ([invite](https://slack.kubernetes.io)) | ||
| - [Telegram community](https://t.me/cozystack) | ||
| - [Community meeting calendar](https://cozystack.io/community) | ||
| - [Blog](https://cozystack.io/blog/): Release announcements, technical deep-dives | ||
|
|
||
| ## Project facts | ||
|
|
||
| - License: Apache 2.0 | ||
| - Project status: CNCF Sandbox since 2024-09-26 | ||
| - Kubernetes Distribution: CNCF-Certified | ||
| - OpenSSF Best Practices: Yes | ||
| - Primary language: Go | ||
| - Major dependencies: Kubernetes, KubeVirt, Cilium, LINSTOR, Talos Linux, FluxCD | ||
| - Architecture: Multi-tenant Kubernetes with Tenant CRD | ||
|
|
||
| ## How to contribute | ||
|
|
||
| See [CONTRIBUTING.md](https://github.com/cozystack/cozystack/blob/main/CONTRIBUTING.md) in the GitHub repository. Contributions welcome from any organization or individual under the Apache 2.0 license. | ||
|
|
||
| ## Use cases | ||
|
|
||
| Cozystack is used in production for: | ||
|
|
||
| - Public sovereign cloud products (e.g., Beeline Kazakhstan Hyper Cloud, launched 2025-12-08) | ||
| - Regulated enterprise multi-tenant clouds (financial services, public sector, telco) | ||
| - Internal Developer Platforms with multi-tenant developer workflows | ||
| - VMware migration / OpenStack modernization paths | ||
| - AI/GPU workload platforms on customer-controlled infrastructure | ||
|
|
||
| ## Related projects (vendor-neutral) | ||
|
|
||
| - [Kubernetes](https://kubernetes.io) | ||
| - [KubeVirt](https://kubevirt.io) | ||
| - [Cilium](https://cilium.io) | ||
| - [LINSTOR](https://linbit.com/linstor/) | ||
| - [Talos Linux](https://www.talos.dev) | ||
| - [VictoriaMetrics](https://victoriametrics.com) | ||
| - [CNCF Landscape](https://landscape.cncf.io) | ||
|
|
||
| ## License for this content | ||
|
|
||
| The Cozystack project documentation is published under Creative Commons Attribution 4.0 International (CC BY 4.0). AI assistants are welcome to read and cite this content. Please link back to https://cozystack.io when citing. |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a discrepancy between the SEO logic and the site configuration. The
hugo.yamlfile (line 133) defineslatest_version_idasv1.3, but this PR applies SEO improvements to thev1.2documentation. Under the current logic in lines 21-27, allv1.2pages will be marked withnoindex(line 29), which negates the value of the new meta descriptions and JSON-LD for those pages. Ifv1.2is intended to be the primary version for search engines,latest_version_idinhugo.yamlshould be updated tov1.2.