---
title: SEO
description: Every SEO rule svelte-vitals runs.
---

{/* rules-index:start */}

Resolved &lt;head&gt; metadata, structured data, and crawlability: what search engines actually see.

| Rule                                                                | Severity    | Summary                                                                                                  |
| ------------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------- |
| [`seo/title-presence`](/rules/seo/title-presence)                   | 🔴 critical | Every route should resolve a non-empty &lt;title&gt;.                                                    |
| [`seo/canonical-url`](/rules/seo/canonical-url)                     | 🟡 warning  | Every route should include a &lt;link rel="canonical"&gt; tag.                                           |
| [`seo/charset`](/rules/seo/charset)                                 | 🟡 warning  | The page should declare a character encoding with &lt;meta charset&gt;.                                  |
| [`seo/description-presence`](/rules/seo/description-presence)       | 🟡 warning  | Every route should include a &lt;meta name="description"&gt;.                                            |
| [`seo/duplicate-description`](/rules/seo/duplicate-description)     | 🟡 warning  | Each route should have a unique meta description.                                                        |
| [`seo/duplicate-title`](/rules/seo/duplicate-title)                 | 🟡 warning  | Each route should have a unique &lt;title&gt;.                                                           |
| [`seo/hreflang`](/rules/seo/hreflang)                               | 🟡 warning  | hreflang alternates should use valid codes; x-default is recommended for selector/redirect pages.        |
| [`seo/html-lang`](/rules/seo/html-lang)                             | 🟡 warning  | Your project's app.html should set the lang attribute on &lt;html&gt;.                                   |
| [`seo/image-alt`](/rules/seo/image-alt)                             | 🟡 warning  | Every &lt;img&gt; should have an alt attribute.                                                          |
| [`seo/json-ld-relative-url`](/rules/seo/json-ld-relative-url)       | 🟡 warning  | URLs in JSON-LD should be absolute.                                                                      |
| [`seo/json-ld-required-props`](/rules/seo/json-ld-required-props)   | 🟡 warning  | A recognized @type should include the properties its rich result requires.                               |
| [`seo/json-ld-validity`](/rules/seo/json-ld-validity)               | 🟡 warning  | A page's JSON-LD must be valid JSON with @context and @type.                                             |
| [`seo/og-image`](/rules/seo/og-image)                               | 🟡 warning  | Every route should include a &lt;meta property="og:image"&gt; tag.                                       |
| [`seo/og-title`](/rules/seo/og-title)                               | 🟡 warning  | Every route should include a &lt;meta property="og:title"&gt; tag.                                       |
| [`seo/og-url`](/rules/seo/og-url)                                   | 🟡 warning  | Every route should include an og:url with its canonical address.                                         |
| [`seo/robots-txt`](/rules/seo/robots-txt)                           | 🟡 warning  | Your project should provide a robots.txt file.                                                           |
| [`seo/single-h1`](/rules/seo/single-h1)                             | 🟡 warning  | Each page should have exactly one &lt;h1&gt;.                                                            |
| [`seo/sitemap-xml`](/rules/seo/sitemap-xml)                         | 🟡 warning  | Your project should provide a sitemap.xml file.                                                          |
| [`seo/ssr-disabled`](/rules/seo/ssr-disabled)                       | 🟡 warning  | export const ssr = false makes a route's content invisible to non-JS crawlers and slower to first paint. |
| [`seo/viewport`](/rules/seo/viewport)                               | 🟡 warning  | Pages should declare a responsive viewport meta tag.                                                     |
| [`seo/description-length`](/rules/seo/description-length)           | 🔵 info     | The meta description should be 70–160 characters.                                                        |
| [`seo/heading-level-skip`](/rules/seo/heading-level-skip)           | 🔵 info     | Heading levels should not be skipped.                                                                    |
| [`seo/indexability`](/rules/seo/indexability)                       | 🔵 info     | A route should not be accidentally set to noindex.                                                       |
| [`seo/json-ld`](/rules/seo/json-ld)                                 | 🔵 info     | Every route should include JSON-LD structured data.                                                      |
| [`seo/json-ld-date-format`](/rules/seo/json-ld-date-format)         | 🔵 info     | Date properties in JSON-LD should be ISO-8601.                                                           |
| [`seo/json-ld-deprecated-type`](/rules/seo/json-ld-deprecated-type) | 🔵 info     | Some schema types had their Google rich result dropped or restricted.                                    |
| [`seo/json-ld-placeholder`](/rules/seo/json-ld-placeholder)         | 🔵 info     | JSON-LD should not contain unreplaced placeholder text.                                                  |
| [`seo/og-description`](/rules/seo/og-description)                   | 🔵 info     | Every route should include an og:description.                                                            |
| [`seo/sitemap-in-robots`](/rules/seo/sitemap-in-robots)             | 🔵 info     | robots.txt should point crawlers at your sitemap.                                                        |
| [`seo/title-length`](/rules/seo/title-length)                       | 🔵 info     | The document title should be 30–60 characters.                                                           |
| [`seo/twitter-card`](/rules/seo/twitter-card)                       | 🔵 info     | Pages should declare a twitter:card for rich sharing on X/Twitter.                                       |

{/* rules-index:end */}

See [Configuration](/guides/configuration) to change a rule's severity or turn it off.
