SEO audits

On-demand, full-site SEO audits that render each page with a real headless Chromium — so the findings reflect what a browser (and a crawler) actually sees.

Enable the worker

Audits run in a separate service, off by default:

cd deploy
docker compose --env-file ../.env --profile seo up

It's a separate image on purpose: it carries Chromium (~1 GB against core's ~200 MB), and an out-of-memory kill while rendering a client's site must not be able to take analytics ingestion down. Skip it and everything else still works.

Run one

Click Run audit in the console. Enqueueing returns in milliseconds — a full-site render takes minutes — and the console polls for the result.

The audit reads the site's sitemap.xml, renders each page (up to a cap), and checks:

  • On-page — title, meta description, H1s, heading order, image alt text, canonical, robots.
  • Broken links — internal and outbound, with the URLs and what they returned.
  • Structured data — JSON-LD presence and validity.
  • Core Web Vitals — LCP, FCP, TTFB, CLS from the actual render.

Scores

Each page gets a score out of 100 — errors cost more than warnings, because they're the ones that lose traffic (a stray noindex, a missing title). The site score is the average across pages.

A crashed worker doesn't strand an audit: jobs left running are requeued when a worker starts and every five minutes after. A missing sitemap fails with a clear, actionable message rather than hanging.