Skip to content

fix(seo): resolve Semrush Site Audit findings#97

Open
vpetersson wants to merge 2 commits into
masterfrom
fix/semrush-schema-errors
Open

fix(seo): resolve Semrush Site Audit findings#97
vpetersson wants to merge 2 commits into
masterfrom
fix/semrush-schema-errors

Conversation

@vpetersson

@vpetersson vpetersson commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes three Semrush Site Audit findings: 55 invalid structured data items, duplicate meta descriptions, and low semantic HTML usage.

1. Invalid structured data (55 items)

All shared one error: "A value for the aggregateRating or review field is required" on the SoftwareApplication schema, which was emitted on every page. Since sbomify has no published reviews to reference (fabricating one risks a Google spam penalty):

  • Convert SoftwareApplication to Product with additionalType: SoftwareApplication. Google's product snippet rules accept offers alone, so it validates without ratings.
  • Emit it on the homepage only instead of site-wide.
  • Drop the price-less Enterprise offer (an Offer without price is itself invalid). Community ($0) and Business ($199) remain.
  • Fix double-encoded JSON-LD strings: every jsonify in the structured data was re-escaped by Hugo's JS-context escaping, leaving stray literal quotes in every headline, description, and FAQ answer. Added | safeJS to all 20 occurrences.

2. Duplicate meta descriptions

141 pages (tag/category terms, blog and author pagination, /blog/, /authors/, and a few content pages) fell back to the site-wide default description.

  • Generate descriptive fallbacks for term and taxonomy pages ("All sbomify blog posts tagged X...").
  • Give paginated pages a self-referencing canonical URL plus a "Page N of M" suffix on title and description, via a new paginator.html partial that mirrors the list templates' .Paginate calls.
  • Add real descriptions to /blog/, /what-is-sbom/, /features/why-now/, and a new /authors/ section index.
  • Disambiguate term page titles (/tags/integrations/ was titled identically to /features/integrations/) and the what-is-an-sbom FAQ title.

3. Low semantic HTML usage

Chroma syntax highlighting emits hundreds of token <span>s per code block, so code-heavy guide pages scored ~1% semantic elements.

  • Wrap fenced code blocks in <figure> via a Hugo render hook (Chroma output preserved inside, so styling is unchanged).
  • Use <header>/<section>/<aside>/<nav> for the page hero, content wrapper, TL;DR block, recent-posts block, and pagination controls.

Verification

Full production build: all 992 JSON-LD blocks across 317 pages parse as valid JSON, zero duplicate meta descriptions, zero duplicate titles (excluding alias redirect stubs), and guide page semantic-element ratios up from ~0.7% to ~2.5-3.5% (homepage level). dprint markdown lint passes.

Out of scope

Several flagged URLs are on trust.sbomify.com, which emits its own schema and has no meta descriptions at all - it needs equivalent fixes in that codebase.

🤖 Generated with Claude Code

vpetersson and others added 2 commits July 13, 2026 13:26
Google requires aggregateRating or review on SoftwareApplication, which
flagged the site-wide schema block as invalid on every page (55 items in
Semrush Site Audit). We have no published reviews to reference, so:

- Convert the block to Product (validates with offers alone) and keep
  the software semantics via additionalType
- Emit it on the homepage only instead of every page
- Drop the price-less Enterprise offer (an Offer without price is
  itself invalid under Product rules)
- Add safeJS after every jsonify in JSON-LD blocks; Hugo's JS-context
  escaping was double-encoding them, leaving stray literal quotes in
  every headline/description/answer field

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes two more Semrush Site Audit findings.

Duplicate meta descriptions: 141 pages (tag/category terms, blog and
author pagination, /blog/, /authors/, and a few content pages) fell
back to the site-wide default description.

- Generate descriptive fallbacks for term and taxonomy pages
- Give paginated pages a self-referencing canonical URL plus a
  "Page N of M" suffix on the title and description, via a new
  paginator partial that mirrors the list templates' .Paginate calls
- Add real descriptions to /blog/, /what-is-sbom/, /features/why-now/,
  and a new /authors/ section index
- Disambiguate term page titles ("Integrations Articles" vs the
  /features/integrations/ page) and the what-is-an-sbom FAQ title

Low semantic HTML usage: Chroma emits hundreds of token spans per code
block, so code-heavy guide pages scored ~1% semantic elements.

- Wrap fenced code blocks in <figure> via a render hook
- Use <header>/<section>/<aside>/<nav> for the page hero, content
  wrapper, TL;DR block, recent-posts block, and pagination controls

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vpetersson vpetersson changed the title fix(seo): resolve Semrush structured data errors fix(seo): resolve Semrush Site Audit findings Jul 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant