For Astro teams
Catch Astro SEO bugs in the pull request, not in Search Console.
SEOCode reviews every PR against an Astro-aware ruleset. It understands layout delegation, frontmatter meta, and props-driven <title>, so it flags the real regressions - a missing title, an accidental noindex, meta stranded in a client island - without false-flagging your valid layout patterns.
Free on the Developer plan, full ruleset on every pull request. Works with Astro pages, layouts, and content collections.
SEO reviews by framework: Next.js · Astro · SvelteKit · Remix
# or run it locally / in CI, no GitHub App required
npx @qobi/seocode check --staged
The problem
Astro ships static HTML - and silent SEO gaps with it.
Astro renders to static HTML, which is great for SEO right up until a page forgets to pass its title, or a new layout drops a canonical. Nothing fails the build - you find out weeks later. These are the failure modes SEOCode was built to catch.
A new page forgets to pass its title
Pages delegate <head> to a shared Layout through props. Add a page that doesn't pass title or description and it inherits the layout default, or renders empty - with no build error.
Meta stranded in a client island
Tags rendered from a client:load component only appear after hydration. Astro serves static HTML; crawlers read that, where island-injected meta is missing entirely.
A new layout with no <head> essentials
Spin up a second Layout for a section and it's easy to omit the canonical, Open Graph, or the charset and viewport that every page needs.
Broken JSON-LD from the frontmatter
Structured data assembled in the component script and interpolated into the template can emit invalid JSON that search engines silently discard.
Content collection pages missing metadata
MDX or Markdown entries rendered through a dynamic route like [slug].astro that doesn't map frontmatter to <title> and description ship with no unique meta.
Framework-aware
It reads your source the way Astro does.
SEOCode parses your .astro, .md, and .mdx files, not just rendered HTML. It resolves layout delegation before it decides anything is wrong - so it catches the genuine gaps and stays quiet on valid patterns.
Layout delegation
Resolves title and description passed as props from a page into its Layout's <head>, so a page is never flagged for meta its layout renders.
Frontmatter and template
Reads the component script (frontmatter) and the template, so a dynamic {title} bound from props or a content collection is understood, not flagged.
Static vs island rendering
Detects meta and JSON-LD that only exist inside a hydrated island - the client-only tags crawlers never see - and tells you to move them into the static head.
Structured data validity
Validates JSON-LD emitted from frontmatter, and checks entity schema for @id and sameAs - the signals that power rich results and AI citations.
The rest of the SEO and GEO ruleset
Titles, meta descriptions, canonical URLs, Open Graph and Twitter cards, heading structure, image alt and lazy-loading, blocked AI crawlers in robots.txt, and more - the same checks on every PR.
Zero-noise by design
SEOCode only comments when it finds something worth fixing. Layout-delegated meta, props-driven titles, and valid frontmatter JSON-LD do not trigger findings - so the review is signal, and your team keeps trusting it.
How it works
Three minutes to wire in, then it's automatic.
No config to write, no CI to maintain. Install once and SEOCode reviews every pull request from then on.
Install in one click
Add SEOCode to your Astro repo or whole org. Nothing to configure, it detects the framework automatically. Prefer your own pipeline? Use the @qobi/seocode CLI instead.
Open a pull request
SEOCode reviews the changed files, resolves your metadata, and runs the full ruleset, usually within seconds of the PR opening.
Get fixes in the comment
Issues are grouped by severity, each with the exact fix. Critical, deploy-blocking problems lead, and you can require the check to pass before a merge.
FAQ
Questions, answered.
Does it understand Astro's layout delegation?
title and description passed as props from a page into the Layout that renders <head>, so it will not flag a page for meta the layout already provides.Does it work with content collections and MDX?
.astro, .md, and .mdx files changed in a PR, including dynamic collection routes like [slug].astro, and checks that each maps frontmatter to real page metadata.Will it false-positive on props-driven meta?
{title} bound from props or a collection entry is recognised. It flags the genuine gaps - a page that passes nothing, or meta stranded in a client island.Can I run it in CI without the GitHub App?
@qobi/seocode CLI runs the full ruleset locally or in any CI pipeline. Use seocode check --staged in a pre-commit hook, or run it as a step in GitHub Actions, GitLab CI, or CircleCI. The CLI is free on any repository, public or private. The GitHub App is the zero-config option; the CLI is for teams that want it inside their existing pipeline.Is it free?
@qobi/seocode CLI runs it on any code, public or private, free. The Studio plan ($19/mo per organization, or $190/yr) adds the GitHub App on private repositories, plus team alerts. No rules are gated behind the paid plan.Get started
Stop shipping Astro SEO regressions.
Add SEOCode to your repository and the next pull request gets reviewed automatically. Or scan a live URL first to see what it finds.