For Next.js teams
Catch Next.js SEO bugs in the pull request, not in Search Console.
SEOCode reviews every PR against a Next.js-aware ruleset. It understands the App Router Metadata API, generateMetadata, and layout inheritance, so it flags the real regressions - a missing title, an accidental noindex, metadata set only on the client - without false-flagging your valid dynamic patterns.
Free on the Developer plan, full ruleset on every pull request. Works with the App Router and the Pages Router.
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
Next.js makes SEO invisible until it's live.
The metadata that decides how you rank is spread across layouts, async functions, and client components. Nothing fails the build when it's wrong - you find out weeks later when impressions drop. These are the failure modes SEOCode was built to catch.
A new dynamic route ships with no metadata
You add app/products/[slug]/page.tsx and forget the generateMetadata export. Every product page renders with the site's default title. No error, no warning - just hundreds of pages competing for the same title tag.
Metadata set in a Client Component
Tags injected from a "use client" component or a useEffect only appear after hydration. Crawlers and AI search engines read the server HTML, where they're missing entirely.
An accidental noindex from staging
A robots: { index: false } in a shared layout or an env-gated flag slips through review and de-indexes the section it wraps. The single most damaging regression, and the easiest to miss in a diff.
Broken JSON-LD in dangerouslySetInnerHTML
Structured data assembled by hand or interpolated with unescaped values produces invalid JSON that search engines silently discard - so your rich results quietly disappear.
Layout vs page metadata confusion
Open Graph and canonical tags owned by a layout but overridden per page - or the reverse - lead to duplicated or missing tags that are almost impossible to see by reading one file.
Framework-aware
It reads your source the way Next.js does.
SEOCode parses your TSX and JSX, not just rendered HTML. It resolves the App Router metadata graph before it decides anything is wrong - so it catches the genuine gaps and stays quiet on valid dynamic code.
Static and dynamic metadata
Understands both the metadata export and async generateMetadata. A route that sets its title dynamically is correct; a route that sets nothing is flagged.
Layout inheritance
Resolves metadata defined in layout.tsx and inherited by child pages, so a page is never flagged for a title its layout already provides.
Server vs client rendering
Detects metadata and JSON-LD that only exist after hydration - the client-only tags crawlers never see - and tells you to move them server-side.
Structured data validity
Validates JSON-LD built with JSON.stringify inside dangerouslySetInnerHTML, 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. Valid dynamic metadata, layout-owned tags, and runtime 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 Next.js 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 support both the App Router and the Pages Router?
metadata export and async generateMetadata - as well as the Pages Router next/head component. It resolves metadata set in a layout.tsx and inherited by a page, so it will not flag a page as missing a title when the title is defined upstream.Will it false-positive on dynamic generateMetadata?
generateMetadata or JSON-LD built with JSON.stringify. It flags the real gaps - a dynamic route shipped with no metadata at all, or tags set only in a Client Component - not valid dynamic patterns.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.Does it work in a monorepo?
.seocode.json.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 Next.js 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.