For SvelteKit teams

Catch SvelteKit SEO bugs in the pull request, not in Search Console.

SEOCode reviews every PR against a SvelteKit-aware ruleset. It understands <svelte:head>, load functions, and layout inheritance, so it flags the real regressions - a missing title, a route with SSR disabled, meta rendered only on the client - without false-flagging your valid dynamic patterns.

Add to your repo → View sample report

Free on the Developer plan, full ruleset on every pull request. Works with server-rendered and prerendered routes.

SEO reviews by framework: Next.js · Astro · SvelteKit · Remix

# or run it locally / in CI, no GitHub App required
npx @qobi/seocode check --staged

SvelteKit's SEO lives in places a diff won't show you.

Metadata sits in <svelte:head>, rendering mode in a one-line export, canonical in a load function. Any of them can break without failing the build - you find out weeks later. These are the failure modes SEOCode was built to catch.

01

A route disables SSR

export const ssr = false on a route or in a layout means the server sends an empty shell. Crawlers get no title and no content - the most damaging SvelteKit SEO mistake, and invisible in a diff.

02

A new dynamic route ships with no <svelte:head>

Add [slug]/+page.svelte and forget the per-route <svelte:head>, and every page renders with the layout default title.

03

Meta set in onMount instead of <svelte:head>

Tags added imperatively in onMount only exist after hydration; the server HTML crawlers read has none of them.

04

Broken JSON-LD injected with {@html}

Structured data built in a script block and injected with {@html ...} can emit invalid JSON that search engines silently discard.

05

Prerender and canonical gaps

A route that isn't prerendered, or is missing its canonical, is easy to ship when the config lives in +page.ts or +layout.ts.

It reads your source the way SvelteKit does.

SEOCode parses your .svelte and route files, not just rendered HTML. It resolves <svelte:head> across a route and its layouts before it decides anything is wrong - so it catches the genuine gaps and stays quiet on valid code.

01

<svelte:head> resolution

Reads title, meta, and JSON-LD declared in <svelte:head> across a route and its layouts, so inherited meta is never flagged.

02

Load functions and layout inheritance

Understands metadata fed from +page.ts or +page.server.ts load into <svelte:head>, and resolves what a +layout.svelte provides to child routes.

03

SSR vs CSR

Flags routes that disable SSR (ssr = false) so their content and meta never reach crawlers, and tags added only on the client in onMount.

04

Structured data validity

Validates JSON-LD injected with {@html}, and checks entity schema for @id and sameAs - the signals that power rich results and AI citations.

05

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-provided <svelte:head> tags and load-driven meta do not trigger findings - so the review is signal, and your team keeps trusting it.

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.

01

Install in one click

Add SEOCode to your SvelteKit repo or whole org. Nothing to configure, it detects the framework automatically. Prefer your own pipeline? Use the @qobi/seocode CLI instead.

02

Open a pull request

SEOCode reviews the changed files, resolves your metadata, and runs the full ruleset, usually within seconds of the PR opening.

03

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.

Questions, answered.

Does it understand svelte:head and layout inheritance?
Yes. It resolves title, meta, and JSON-LD declared in <svelte:head> across a route and its +layout.svelte files, so a page is never flagged for meta a layout already provides.
Will it catch routes with SSR disabled?
Yes. export const ssr = false means crawlers receive an empty shell - SEOCode flags it as a critical SEO regression and points at the route.
Will it false-positive on load-driven meta?
No. It understands metadata fed from a load function into <svelte:head>. It flags the real gaps - a route with no <svelte:head> at all, or meta added only in onMount.
Can I run it in CI without the GitHub App?
Yes. The @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?
Yes. On the Developer plan the GitHub App runs the complete ruleset on every pull request in public repositories, and the @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.

Stop shipping SvelteKit 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.