diff --git a/content/authors/_index.md b/content/authors/_index.md new file mode 100644 index 0000000..b876a5d --- /dev/null +++ b/content/authors/_index.md @@ -0,0 +1,4 @@ +--- +title: Authors +description: "Meet the authors behind the sbomify blog: practitioners writing about SBOMs, software supply chain security, and compliance." +--- diff --git a/content/faq/what-is-an-sbom.md b/content/faq/what-is-an-sbom.md index 23a5318..2abd8a7 100644 --- a/content/faq/what-is-an-sbom.md +++ b/content/faq/what-is-an-sbom.md @@ -1,5 +1,5 @@ --- -title: "What is an SBOM?" +title: "What is an SBOM (Software Bill of Materials)?" description: "Learn what a Software Bill of Materials (SBOM) is, why it matters for supply chain security, and how it lists every component in your software." answer: "An SBOM (Software Bill of Materials) is a machine-readable inventory of all components, libraries, and dependencies that make up a piece of software - like an ingredients list for your code." tldr: "An SBOM (Software Bill of Materials) is a machine-readable inventory of all components, libraries, and dependencies that make up a piece of software - like an ingredients list for your code." diff --git a/content/features/why-now.md b/content/features/why-now.md index 8ec3de2..c20c6d6 100644 --- a/content/features/why-now.md +++ b/content/features/why-now.md @@ -1,6 +1,7 @@ --- title: The Growing Importance of SBOMs in Cybersecurity Compliance +description: "Why SBOMs matter now: Executive Order 14028, the EU Cyber Resilience Act, PCI DSS 4.0, and the FDA are turning SBOMs into a baseline compliance requirement across industries." --- The cybersecurity landscape has evolved rapidly in recent years, driven largely by increased awareness of software supply chain vulnerabilities. A significant milestone in this evolution was the US government's introduction of [Executive Order 14028](https://www.federalregister.gov/documents/2021/05/17/2021-10460/improving-the-nations-cybersecurity) in May 2021. This executive order responded directly to escalating cyber threats targeting critical infrastructure, government agencies, and private enterprises. One of its key components mandated Software Bill of Materials (SBOMs) for all vendors selling software to the federal government. diff --git a/content/posts/_index.md b/content/posts/_index.md index 4838aea..d3a1321 100644 --- a/content/posts/_index.md +++ b/content/posts/_index.md @@ -1,3 +1,4 @@ --- -title: "sbomify | the SBOM sharing and collaboration platform" +title: "The sbomify Blog" +description: "Articles, guides, and product updates on SBOMs, software supply chain security, and compliance from the sbomify team." --- diff --git a/content/what-is-sbom.md b/content/what-is-sbom.md index 85c2868..10cae66 100644 --- a/content/what-is-sbom.md +++ b/content/what-is-sbom.md @@ -1,6 +1,7 @@ --- url: /what-is-sbom/ title: What is an SBOM? +description: "A Software Bill of Materials (SBOM) is a machine-readable inventory of every component, library, and dependency in your software. Learn what SBOMs are, why regulations require them, and how to get started." tldr: "A Software Bill of Materials (SBOM) is a machine-readable inventory of every component, library, and dependency in your software. Think of it as an ingredients list for code. SBOMs are increasingly required by regulations like the EU Cyber Resilience Act and US Executive Order 14028, and are essential for vulnerability management, license compliance, and supply chain security." --- diff --git a/layouts/_default/_markup/render-codeblock.html b/layouts/_default/_markup/render-codeblock.html new file mode 100644 index 0000000..4562bf5 --- /dev/null +++ b/layouts/_default/_markup/render-codeblock.html @@ -0,0 +1,2 @@ +{{- $result := transform.HighlightCodeBlock . -}} +
{{ $result.Wrapped }}
diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 7c9da4e..0ed5658 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -1,6 +1,6 @@ {{ define "main" }}
-
+
{{ partial "aurora.html" . }}
@@ -13,15 +13,15 @@

+
{{ partial "tldr.html" . }} {{ .Content }}
-

+
{{ end }} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b5aed54..7864ef1 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,22 +1,58 @@ + {{- /* Paginated pages (/blog/page/2/ etc.) need their own canonical URL, + title, and description so they don't count as duplicates of page 1. */ -}} + {{- $paginator := partial "paginator.html" . -}} + {{- $pageSuffix := "" -}} + {{- $canonical := .Permalink -}} + {{- with $paginator -}} + {{- if gt .PageNumber 1 -}} + {{- $pageSuffix = printf " - Page %d of %d" .PageNumber .TotalPages -}} + {{- $canonical = .URL | absURL -}} + {{- end -}} + {{- end -}} + {{- $desc := or .Params.description "" -}} + {{- if not $desc -}} + {{- if eq .Kind "term" -}} + {{- if eq .Data.Plural "categories" -}} + {{- $desc = printf "All sbomify blog posts in the %s category: articles on SBOMs, software supply chain security, and compliance." (.Title | lower) -}} + {{- else -}} + {{- $desc = printf "All sbomify blog posts tagged %s: articles on SBOMs, software supply chain security, and compliance." (.Title | lower) -}} + {{- end -}} + {{- else if eq .Kind "taxonomy" -}} + {{- $desc = printf "Browse the sbomify blog by %s to find articles on SBOMs, software supply chain security, and compliance." (.Title | lower) -}} + {{- else -}} + {{- $desc = site.Params.description -}} + {{- end -}} + {{- end -}} + {{- $desc = printf "%s%s" $desc $pageSuffix -}} + {{- /* Distinguish term page titles from same-named content pages + (e.g. /tags/integrations/ vs /features/integrations/). */ -}} + {{- $title := .Title -}} + {{- if eq .Kind "term" -}} + {{- if eq .Data.Plural "categories" -}} + {{- $title = printf "%s Category" .Title -}} + {{- else -}} + {{- $title = printf "%s Articles" .Title -}} + {{- end -}} + {{- end -}} - {{ if eq .RelPermalink "/" }}{{ .Title | default site.Title }}{{ else }}{{ .Title }} | {{ site.Title }}{{ end }} - + {{ if eq .RelPermalink "/" }}{{ $title | default site.Title }}{{ else }}{{ $title }}{{ $pageSuffix }} | {{ site.Title }}{{ end }} + - + - - + + - + {{- $ogImage := .Params.image | default site.Params.social.image -}} @@ -38,8 +74,8 @@ - - + + {{- $twitterHandle := "" -}} @@ -51,8 +87,8 @@ - - + + @@ -88,19 +124,27 @@ "sameAs": [ {{ range $i, $p := site.Params.social.profiles }}{{ if $i }},{{ end }}"{{ $p.url }}"{{ end }} ], - "description": {{ site.Params.description | jsonify }} + "description": {{ site.Params.description | jsonify | safeJS }} } - + {{ if .IsHome }} + + {{ end }} {{ if eq .Type "posts" }} @@ -156,8 +187,8 @@ "@type": "WebPage", "@id": "{{ .Permalink }}" }, - "headline": {{ .Title | jsonify }}, - "description": {{ (.Params.description | default site.Params.description) | jsonify }}, + "headline": {{ .Title | jsonify | safeJS }}, + "description": {{ (.Params.description | default site.Params.description) | jsonify | safeJS }}, "image": "{{ $ogImage | absURL }}", "author": { "@type": "Person", @@ -210,7 +241,7 @@ { "@type": "ListItem", "position": 3, - "name": {{ .Title | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, "item": "{{ .Permalink }}" } ] @@ -224,8 +255,8 @@ { "@context": "https://schema.org", "@type": "Article", - "headline": {{ .Title | jsonify }}, - "description": {{ (.Params.description | default site.Params.description) | jsonify }}, + "headline": {{ .Title | jsonify | safeJS }}, + "description": {{ (.Params.description | default site.Params.description) | jsonify | safeJS }}, "image": "{{ (.Params.logo | default site.Params.social.image) | absURL }}", "publisher": { "@type": "Organization", @@ -265,7 +296,7 @@ { "@type": "ListItem", "position": 3, - "name": {{ .Title | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, "item": "{{ .Permalink }}" } ] @@ -283,10 +314,10 @@ {{ range $i, $qa := .Params.faq }} {{ if $i }},{{ end }}{ "@type": "Question", - "name": {{ $qa.question | jsonify }}, + "name": {{ $qa.question | jsonify | safeJS }}, "acceptedAnswer": { "@type": "Answer", - "text": {{ $qa.answer | jsonify }} + "text": {{ $qa.answer | jsonify | safeJS }} } } {{ end }} @@ -311,8 +342,8 @@ { "@context": "https://schema.org", "@type": "TechArticle", - "name": {{ .Title | jsonify }}, - "description": {{ (.Params.description | default site.Params.description) | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, + "description": {{ (.Params.description | default site.Params.description) | jsonify | safeJS }}, "image": "{{ $ogImage | absURL }}", "proficiencyLevel": "Beginner", "inLanguage": "en-US" @@ -411,10 +442,10 @@ {{ range $i, $faq := .Pages.ByWeight }} {{ if $i }},{{ end }}{ "@type": "Question", - "name": {{ $faq.Title | jsonify }}, + "name": {{ $faq.Title | jsonify | safeJS }}, "acceptedAnswer": { "@type": "Answer", - "text": {{ $faq.Params.answer | jsonify }} + "text": {{ $faq.Params.answer | jsonify | safeJS }} } } {{ end }} @@ -438,7 +469,7 @@ "@type": "ListItem", "position": {{ add $i 1 }}, "url": "{{ $faq.Permalink }}", - "name": {{ $faq.Title | jsonify }} + "name": {{ $faq.Title | jsonify | safeJS }} } {{ end }} ] @@ -478,10 +509,10 @@ "mainEntity": [ { "@type": "Question", - "name": {{ .Title | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, "acceptedAnswer": { "@type": "Answer", - "text": {{ .Params.answer | jsonify }} + "text": {{ .Params.answer | jsonify | safeJS }} } } ] @@ -493,8 +524,8 @@ { "@context": "https://schema.org", "@type": "WebPage", - "name": {{ .Title | jsonify }}, - "description": {{ (.Params.description | default site.Params.description) | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, + "description": {{ (.Params.description | default site.Params.description) | jsonify | safeJS }}, "url": "{{ .Permalink }}", "dateModified": "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}", "isPartOf": { @@ -534,7 +565,7 @@ { "@type": "ListItem", "position": 3, - "name": {{ .Title | jsonify }}, + "name": {{ .Title | jsonify | safeJS }}, "item": "{{ .Permalink }}" } ] diff --git a/layouts/partials/pagination.html b/layouts/partials/pagination.html index b9b1309..b60eb9f 100644 --- a/layouts/partials/pagination.html +++ b/layouts/partials/pagination.html @@ -1,6 +1,6 @@ {{ $paginator := .Paginator }} -
+
+ diff --git a/layouts/partials/paginator.html b/layouts/partials/paginator.html new file mode 100644 index 0000000..9b5bcc4 --- /dev/null +++ b/layouts/partials/paginator.html @@ -0,0 +1,15 @@ +{{- /* Returns the page's paginator for paginated list pages, or "" otherwise. + Mirrors the .Paginate calls in posts.html (via posts/list.html and + authors/list.html) and term.html: Hugo errors if .Paginate is invoked + with different arguments for the same page, so keep these in sync. */ -}} +{{- $paginator := "" -}} +{{- if eq .Kind "term" -}} + {{- $paginator = .Paginate .Pages -}} +{{- else if and (eq .Kind "section") (eq .Section "posts") -}} + {{- $paginator = .Paginate (where site.RegularPages "Section" "posts") -}} +{{- else if and (eq .Kind "section") .Params.author_key -}} + {{- with index site.Data.authors .Params.author_key -}} + {{- $paginator = $.Paginate (where (where site.RegularPages "Section" "posts") ".Params.author.display_name" .display_name) -}} + {{- end -}} +{{- end -}} +{{- return $paginator -}} diff --git a/layouts/partials/tldr.html b/layouts/partials/tldr.html index 0d579b8..a4b1964 100644 --- a/layouts/partials/tldr.html +++ b/layouts/partials/tldr.html @@ -1,6 +1,6 @@ {{ if .Params.tldr }} -
+
+ {{ end }} diff --git a/layouts/posts/single.html b/layouts/posts/single.html index 9d2be49..e470a2d 100644 --- a/layouts/posts/single.html +++ b/layouts/posts/single.html @@ -1,6 +1,6 @@ {{ define "main" }}
-
+
{{ partial "aurora.html" . }}
@@ -44,9 +44,9 @@

+
{{ partial "tldr.html" . }} @@ -58,15 +58,15 @@

+

+ {{ end }}