Repository navigation
Fix Semrush Site Audit findings: redirects, email obfuscation, titles, internal links - #163
Merged
vpetersson merged 7 commits intoOct 25, 2026
Conversation
Semrush Site Audit reported a redirect chain on every page. The footer and social links pointed at https://sbomify.com/slack, which 302s to join.slack.com, which redirects again to the workspace invite. Link the invite URL directly (single source in data/main.yml, plus the two pricing page links). Also fix the remaining internal links that only resolved via a redirect: a case study link without its trailing slash, the LinkedIn URL without its trailing slash, and two old app.sbomify.com public pages that now redirect (to a login wall, or to the trust center). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Semrush Site Audit reported broken internal links and a 4xx page at /cdn-cgi/l/email-protection. Cloudflare's Email Address Obfuscation rewrites every mailto: link, and every email-shaped string outside code blocks (PURLs such as pkg:pypi/name@1.2.3 in inline code), into a link to that path, which 404s for crawlers and for visitors without JavaScript. The <!--email_off--> markers only wrapped fenced code blocks. Wrap the whole rendered content instead; the addresses on the site are public role addresses that are also listed in security.txt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Semrush Site Audit flagged six pages whose <title> runs past ~70 characters. Set the existing seo_title front matter on them so the <title> fits the search result display limit, while the visible <h1> keeps the full editorial headline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Current Hugo resolves term pages (/tags/sbom/) to _default/taxonomy.html ahead of _default/term.html, so term.html was never used: term pages rendered as a bare grid of post titles, with no descriptions and no pagination, even though paginator.html already paginated them for the rel=prev/next links. Semrush Site Audit flagged most of them for low word count and low text to HTML ratio. Render both kinds from taxonomy.html, branching on .Kind, and drop the dead term.html. Term pages also link back to their taxonomy index and the blog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Semrush Site Audit listed pages that only one internal link points to: most FAQ answers (linked only from /faq/), the UK Software Security Code of Practice page (linked only from /compliance/), and tags used by a single post (/tags/ and /categories/ were not linked from anywhere). - FAQ answers list related questions (keyword matches plus the neighbouring questions in FAQ order). - Compliance framework pages list the other frameworks. - The blog index links the category and topic indexes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Semrush Site Audit flagged the code-heavy guides and runtime pages for low semantic HTML usage. The pages already use header/main/article/nav, but Chroma wraps each code line in two spans (.line > .cl) and each run of whitespace in a third (.w), which made up over a third of all elements on those pages. None of them are styled, so unwrap them in the code block render hook. This also trims the HTML size of every page with code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Semrush Site Audit reported links with no anchor text. The footer social links, author bio links and the About page LinkedIn links held only a decorative icon, with the name in aria-label or title, which crawlers do not treat as anchor text. Put the name in an sr-only span instead; screen readers announce the same name as before. assets/css/styles.css is regenerated with bun run build:css, which also picks up sm:grid-cols-2 used by the compliance framework list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
vpetersson
approved these changes
Oct 25, 2026
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.
Fixes for findings from a Semrush Site Audit of sbomify.com. One commit per area.
What changed
https://sbomify.com/slack, a Cloudflare redirect tojoin.slack.com, which redirects again. They now link the invite URL directly (single source indata/main.yml, plus two links on the pricing page). Trade-off: rotating the invite now takes a commit, not a Cloudflare rule change. Also fixed the other links that only resolved through a redirect: a case study link with no trailing slash, the LinkedIn company URL with no trailing slash, and two oldapp.sbomify.compublic pages that now redirect (one to a login wall) and have moved totrust.sbomify.com./cdn-cgi/l/email-protection: this came from Cloudflare's Email Address Obfuscation (Scrape Shield). It rewrites everymailto:link, and every email-shaped string outside code blocks, into a link to/cdn-cgi/l/email-protection. That path 404s for crawlers and for anyone without JavaScript. The strings it caught were PURLs in inline code, such aspkg:pypi/name@1.2.3, on the FAQ and sbomify-action configuration pages. The<!--email_off-->markers inpartials/content.htmlused to wrap only fenced code blocks. They now wrap all rendered content. The site only shows public role addresses (hello@, privacy@, security@).seo_titlefront matter so each<title>fits in about 60 characters. The<h1>keeps the full headline._default/taxonomy.htmlover_default/term.htmlfor term pages, soterm.htmlwas never used. Term pages showed only a grid of titles, with no descriptions and no pagination, which is why they were flagged for low word count and low text-to-HTML ratio. Both kinds now render fromtaxonomy.html, which branches on.Kind, and the unusedterm.htmlis gone./categories/and/tags/, which nothing linked to before. That was the reason single-post tags had only one inbound link. Term pages also link back to their index and the blog.header/main/article/nav. Most of their elements were Chroma's unstyled wrapper spans: two per code line plus one per whitespace run. The code block render hook now unwraps them. Highlighted lines (hl_lines) are left alone. On/guides/cpp/the span count drops from 942 to 430.aria-label/title. The name is now in ansr-onlyspan, so crawlers see anchor text and screen readers announce the same name.How it was verified
bun run build:cssandhugo --minify --environment production(Hugo extended 0.168.0, the same "latest" version CI installs) build with no errors.bun run lint:markdownpasses.public/with scripts:email_offregion./privacy/now has a plainmailto:link.<title>s are shortened, and their<h1>s are unchanged.innerText./tags/pqc/shows post cards, and the compliance and FAQ related lists render.curlbefore changing the links.Not addressed
http://www.sbomify.com: it goes tohttps://www.sbomify.com/and then tohttps://sbomify.com/. That is Cloudflare configuration. A single redirect rule straight tohttps://sbomify.com/would remove the extra hop.rel="nofollow noopener noreferrer"by site policy ([params.links]inhugo.toml, documented in CLAUDE.md)./resources/: the page setsnoindex: trueon purpose.utm_*query strings: these URLs come from links in the app and trust center (another repo). They resolve to the homepage, which has a canonical URL.<title>s over 65 characters. Shortening them is an editorial choice, so it is left for a follow-up.https://app.sbomify.comCTA links: they redirect through the app's login flow, which is outside this repo.🤖 Generated with Claude Code