# svelte-vitals
> Your SvelteKit app's code health, checked before it ships. Statically, no browser — SEO, performance, correctness, security, architecture, accessibility.
## Docs
- [svelte-vitals](https://oekazuma.github.io/svelte-vitals): Your SvelteKit app's code health, checked before it ships. Statically, no browser. Covers SEO, Performance, Correctness, Security, Architecture, and Accessibility.
## Guides
### Getting started
- [Getting started](https://oekazuma.github.io/svelte-vitals/guides/getting-started): Install svelte-vitals and run your first health check in seconds.
- [Choosing a package](https://oekazuma.github.io/svelte-vitals/guides/choosing-a-package): Which svelte-vitals package to use, and when to combine them. CLI, Vite plugin, GitHub Action, or Agent Skills.
### CLI & setup
- [CLI reference](https://oekazuma.github.io/svelte-vitals/guides/cli): Complete reference for all svelte-vitals command-line flags.
- [svelte-vitals install](https://oekazuma.github.io/svelte-vitals/guides/install): Set up the Vite integration, Cursor rules, the config file, and CI.
- [Config file](https://oekazuma.github.io/svelte-vitals/guides/configuration): Configure svelte-vitals once with svelte-vitals.config, instead of repeating flags.
### Vite integration
- [Plugin mode](https://oekazuma.github.io/svelte-vitals/guides/plugin-mode): Integrate svelte-vitals into vite build to analyze prerendered HTML at build time.
- [Live dashboard](https://oekazuma.github.io/svelte-vitals/guides/dev-dashboard): A live, filterable code-health dashboard during `vite dev`. Enabled by default, no build step needed.
### AI agents
- [Agent Skills](https://oekazuma.github.io/svelte-vitals/guides/agent-skills): Slash-command skills that teach Claude Code, Cursor, and Codex how to derive a config file for a project adopting svelte-vitals, how to run a project-wide improvement audit, and the rules themselves.
### Reporting & CI
- [Reporters](https://oekazuma.github.io/svelte-vitals/guides/reporters): Choose how svelte-vitals formats and outputs its findings.
- [Health score](https://oekazuma.github.io/svelte-vitals/guides/health-report): Understand the weighted Health score and use --min-health as a CI gate.
- [CI integration](https://oekazuma.github.io/svelte-vitals/guides/ci): Gate pull requests on svelte-vitals findings with a generated GitHub Actions workflow.
## Rules
- [Rules](https://oekazuma.github.io/svelte-vitals/rules): Every check svelte-vitals runs, grouped by category.
### SEO
- [SEO](https://oekazuma.github.io/svelte-vitals/rules/seo): Every SEO rule svelte-vitals runs.
- [seo/canonical-url · Canonical URL](https://oekazuma.github.io/svelte-vitals/rules/seo/canonical-url): Every route should include a tag.
- [seo/charset · Character encoding](https://oekazuma.github.io/svelte-vitals/rules/seo/charset): The page should declare a character encoding with .
- [seo/description-length · Description length](https://oekazuma.github.io/svelte-vitals/rules/seo/description-length): The meta description should be 70–160 characters.
- [seo/description-presence · Description presence](https://oekazuma.github.io/svelte-vitals/rules/seo/description-presence): Every route should include a .
- [seo/duplicate-description · Duplicate description](https://oekazuma.github.io/svelte-vitals/rules/seo/duplicate-description): Each route should have a unique meta description.
- [seo/duplicate-title · Duplicate title](https://oekazuma.github.io/svelte-vitals/rules/seo/duplicate-title): Each route should have a unique
.
- [seo/heading-level-skip · Heading order](https://oekazuma.github.io/svelte-vitals/rules/seo/heading-level-skip): Heading levels should not be skipped.
- [seo/hreflang · hreflang validity](https://oekazuma.github.io/svelte-vitals/rules/seo/hreflang): hreflang alternates should use valid codes; x-default is recommended for selector/redirect pages.
- [seo/html-lang · ](https://oekazuma.github.io/svelte-vitals/rules/seo/html-lang): Your project's app.html should set the lang attribute on .
- [seo/image-alt · Image alt text](https://oekazuma.github.io/svelte-vitals/rules/seo/image-alt): Every should have an alt attribute.
- [seo/indexability · Indexability](https://oekazuma.github.io/svelte-vitals/rules/seo/indexability): A route should not be accidentally set to noindex.
- [seo/json-ld · JSON-LD structured data](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld): Every route should include JSON-LD structured data.
- [seo/json-ld-date-format · JSON-LD date format](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-date-format): Date properties in JSON-LD should be ISO-8601.
- [seo/json-ld-deprecated-type · Deprecated structured-data type](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-deprecated-type): Some schema types had their Google rich result dropped or restricted.
- [seo/json-ld-placeholder · JSON-LD placeholder text](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-placeholder): JSON-LD should not contain unreplaced placeholder text.
- [seo/json-ld-relative-url · JSON-LD relative URL](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-relative-url): URLs in JSON-LD should be absolute.
- [seo/json-ld-required-props · JSON-LD required properties](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-required-props): A recognized @type should include the properties its rich result requires.
- [seo/json-ld-validity · JSON-LD validity](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-validity): A page's JSON-LD must be valid JSON with @context and @type.
- [seo/og-description · Open Graph description](https://oekazuma.github.io/svelte-vitals/rules/seo/og-description): Every route should include an og:description.
- [seo/og-image · Open Graph image](https://oekazuma.github.io/svelte-vitals/rules/seo/og-image): Every route should include a tag.
- [seo/og-title · Open Graph title](https://oekazuma.github.io/svelte-vitals/rules/seo/og-title): Every route should include a tag.
- [seo/og-url · Open Graph URL](https://oekazuma.github.io/svelte-vitals/rules/seo/og-url): Every route should include an og:url with its canonical address.
- [seo/robots-txt · robots.txt](https://oekazuma.github.io/svelte-vitals/rules/seo/robots-txt): Your project should provide a robots.txt file.
- [seo/single-h1 · Heading hierarchy](https://oekazuma.github.io/svelte-vitals/rules/seo/single-h1): Each page should have exactly one
.
- [seo/sitemap-in-robots · Sitemap referenced in robots.txt](https://oekazuma.github.io/svelte-vitals/rules/seo/sitemap-in-robots): robots.txt should point crawlers at your sitemap.
- [seo/sitemap-xml · sitemap.xml](https://oekazuma.github.io/svelte-vitals/rules/seo/sitemap-xml): Your project should provide a sitemap.xml file.
- [seo/ssr-disabled · SSR disabled](https://oekazuma.github.io/svelte-vitals/rules/seo/ssr-disabled): export const ssr = false makes a route's content invisible to non-JS crawlers and slower to first paint.
- [seo/title-length · Title length](https://oekazuma.github.io/svelte-vitals/rules/seo/title-length): The document title should be 30–60 characters.
- [seo/title-presence · Title presence](https://oekazuma.github.io/svelte-vitals/rules/seo/title-presence): Every route should resolve a non-empty .
- [seo/twitter-card · Twitter Card](https://oekazuma.github.io/svelte-vitals/rules/seo/twitter-card): Pages should declare a twitter:card for rich sharing on X/Twitter.
- [seo/viewport · Viewport](https://oekazuma.github.io/svelte-vitals/rules/seo/viewport): Pages should declare a responsive viewport meta tag.
### Performance
- [Performance](https://oekazuma.github.io/svelte-vitals/rules/performance): Every Performance rule svelte-vitals runs.
- [performance/font-preload-crossorigin · Font preload missing crossorigin](https://oekazuma.github.io/svelte-vitals/rules/performance/font-preload-crossorigin): A font preload must set crossorigin so the preloaded file is actually used.
- [performance/heavy-import · Heavy dependency import](https://oekazuma.github.io/svelte-vitals/rules/performance/heavy-import): Avoid importing large, non-tree-shakeable packages.
- [performance/iframe-loading · Iframe loading attribute](https://oekazuma.github.io/svelte-vitals/rules/performance/iframe-loading): An offscreen iframe eagerly loads an entire third-party document of scripts, fonts and media, usually costing more than an offscreen image; loading="lazy" defers it.
- [performance/image-dimensions · Image dimensions](https://oekazuma.github.io/svelte-vitals/rules/performance/image-dimensions): Every should have explicit width and height attributes.
- [performance/image-loading-hint · Image loading hint](https://oekazuma.github.io/svelte-vitals/rules/performance/image-loading-hint): Every should have an explicit loading attribute.
- [performance/lcp-image · LCP image eager loading](https://oekazuma.github.io/svelte-vitals/rules/performance/lcp-image): The first (likely LCP) image should not be lazy-loaded.
- [performance/load-waterfall · Load waterfall](https://oekazuma.github.io/svelte-vitals/rules/performance/load-waterfall): Dependent sequential awaits in a universal load cost a network round trip from the browser per hop.
- [performance/minify-disabled · Minification disabled](https://oekazuma.github.io/svelte-vitals/rules/performance/minify-disabled): A build.minify:false left in vite.config ships unminified JS/CSS to production.
- [performance/namespace-import · Namespace import](https://oekazuma.github.io/svelte-vitals/rules/performance/namespace-import): Prefer named imports over import * as for tree-shaking.
- [performance/preconnect · Preconnect third-party origin](https://oekazuma.github.io/svelte-vitals/rules/performance/preconnect): Preconnect to third-party origins used by the page.
- [performance/preload-missing-as · Preload missing as](https://oekazuma.github.io/svelte-vitals/rules/performance/preload-missing-as): Every should declare an as attribute.
- [performance/render-blocking-script · Render-blocking script](https://oekazuma.github.io/svelte-vitals/rules/performance/render-blocking-script): A head