fix(seo): resolve Semrush Site Audit findings#97
Open
vpetersson wants to merge 2 commits into
Open
Conversation
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>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
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):
SoftwareApplicationtoProductwithadditionalType: SoftwareApplication. Google's product snippet rules acceptoffersalone, so it validates without ratings.Offerwithoutpriceis itself invalid). Community ($0) and Business ($199) remain.jsonifyin the structured data was re-escaped by Hugo's JS-context escaping, leaving stray literal quotes in every headline, description, and FAQ answer. Added| safeJSto 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.paginator.htmlpartial that mirrors the list templates'.Paginatecalls./blog/,/what-is-sbom/,/features/why-now/, and a new/authors/section index./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.<figure>via a Hugo render hook (Chroma output preserved inside, so styling is unchanged).<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).
dprintmarkdown 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