Skip to content

Skill · 07 of 09

seo findable by search engines, AI engines and agents

SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…

skills/seo/SKILL.md123 lines5 referencesupdated 16 Sept 2026

When Claude Code loads it

Use when building or launching any public website, landing page, blog, docs or product page; when adding pages, metadata, generateMetadata, sitemap, robots, OG images or schema; when asked about SEO, AI SEO, GEO, AEO, llms.txt, rich results, or "why isn't my site showing in Google/ChatGPT"; or when `void seo` or `void geo` report findings.

Classic SEO is the foundation of GEO. Nearly all measurable AI-search visibility comes from being indexed, snippet-eligible and having complete raw HTML. Canonical implementations live in templates/next/: src/site.config.ts (facts), src/content/pages.ts (page registry), src/lib/seo.ts (pageMetadata), src/lib/schema.ts + src/components/json-ld.tsx, src/app/{sitemap.ts,robots.ts,manifest.ts,opengraph-image.tsx}, src/app/llms.txt/route.ts, src/app/md/[...slug]/route.ts, next.config.ts (htmlLimitedBots, .md rewrites). Copy from there. The references hold the same code for other projects.

The 10 rules that matter most

  1. The raw HTML response is complete. Main content in reading order, full , JSON-LD and links, without running JavaScript. OpenAI, Anthropic, Perplexity and Meta crawlers don't execute JS.
  2. Exactly one </code>, <code><meta name="description"></code> and absolute <code><link rel="canonical"></code> in <code><head></code> of the raw HTML</strong> on every indexable page. The canonical is self-referential and set per page, <strong>never in the root layout</strong>.</li> <li><strong>Real HTTP status codes.</strong> 200 for pages, 404 for unknown URLs (never a 200 "not found"), 301/308 for moves. In Next, call <code>notFound()</code> <strong>before</strong> any <code><Suspense></code>.</li> <li><strong>Keep metadata static</strong> (prerendered, or <code>'use cache'</code>). If a route must be request-time, add Googlebot and the AI bots to <code>htmlLimitedBots</code>, or Next streams title and canonical into <code><body></code>.</li> <li><strong>One metadata helper</strong> (<code>pageMetadata()</code>) for every page. Next merges metadata <strong>shallowly</strong>, so a page's <code>openGraph</code> silently drops the layout's <code>siteName</code>, <code>locale</code> and images.</li> <li><strong>One <code><h1></code> per page</strong> that matches the title's topic. Landmarks <code><header></code>, <code><nav></code>, <code><main></code>, <code><footer></code>; <code><article></code> for posts.</li> <li><strong>Structured data describes only what is visible and true.</strong> No invented ratings, reviews, prices or FAQs. One <code>@graph</code> with stable <code>@id</code>s. Escape <code><</code> in JSON-LD.</li> <li><strong>robots.txt separates training bots from retrieval bots.</strong> Blocking <code>GPTBot</code> is a business choice. Blocking <code>OAI-SearchBot</code>, <code>Claude-SearchBot</code> or <code>PerplexityBot</code> removes you from AI answers. Previews send <code>Disallow: /</code>.</li> <li><strong>Sitemap <code>lastModified</code> is the real content date</strong>, never <code>new Date()</code> or the build time. Exclude noindex, auth and utility routes.</li> <li><strong>Write to be quoted.</strong> Answer first, then evidence: numbers with units and dates, links to primary sources, named quotes. Keep key facts visible, not hidden in tabs or images.</li> </ol> <h2 id="the-four-readers-design-for-the-weakest"><a class="heading-anchor" href="#the-four-readers-design-for-the-weakest">The four readers (design for the weakest)</a></h2> <div class="table-wrap" tabindex="0" role="region" aria-label="Table 1"><table> <thead> <tr> <th>Reader</th> <th>Examples</th> <th>Runs JS?</th> <th>Needs</th> </tr> </thead> <tbody><tr> <td>Rendering search crawler</td> <td>Googlebot, Applebot</td> <td>Yes, deferred</td> <td>Raw <code><head></code> (canonical, robots) + rendered DOM</td> </tr> <tr> <td>HTML-only index crawler</td> <td>Bingbot (feeds Copilot and ChatGPT search), OAI-SearchBot, Claude-SearchBot, PerplexityBot</td> <td><strong>No</strong></td> <td>Everything in raw HTML</td> </tr> <tr> <td>User-triggered fetcher</td> <td>ChatGPT-User, Claude-User, Perplexity-User</td> <td>No</td> <td>Raw HTML; may ignore robots.txt</td> </tr> <tr> <td>Agent / coding tool</td> <td>Claude Code, Cursor, Codex</td> <td>No</td> <td>Clean HTML, <code>/llms.txt</code>, <code>.md</code> mirrors</td> </tr> </tbody></table></div> <p>Test: <code>curl -sA "GPTBot/1.4" https://site/page | grep -c "<main"</code>. If the text isn't there, it doesn't exist for most AI search.</p> <h2 id="must-ship-checklist-per-page-type"><a class="heading-anchor" href="#must-ship-checklist-per-page-type">Must-ship checklist per page type</a></h2> <div class="table-wrap" tabindex="0" role="region" aria-label="Table 2"><table> <thead> <tr> <th>Page</th> <th>Must emit</th> </tr> </thead> <tbody><tr> <td><strong>Root layout</strong></td> <td><code>metadataBase</code>; <code>title: { default, template: "%s | Brand" }</code>; description; <code>openGraph.siteName</code> + <code>locale</code>; <code>twitter.card: "summary_large_image"</code>; <code>robots.googleBot["max-image-preview"]: "large"</code>; <code>viewport.themeColor</code> (light/dark); <code><html lang></code>; landmarks; <code><link rel="describedby" href="/llms.txt"></code>. <strong>No canonical here.</strong></td> </tr> <tr> <td><strong>Home</strong></td> <td><code>canonical: "/"</code>; Organization + WebSite in the <code>@graph</code> (on this page or emitted from the root layout); <code>opengraph-image</code>; one h1 naming what the product is and who it's for; first paragraph states it in 1–2 sentences</td> </tr> <tr> <td><strong>Content page</strong> (about, features, pricing)</td> <td><code>pageMetadata({ path, title, description })</code>; BreadcrumbList if nested; one h1; descriptive h2s; comparison <code><div class="table-wrap" tabindex="0" role="region" aria-label="Table 3"><table></code> where relevant</td> </tr> <tr> <td><strong>Article / blog post</strong></td> <td><code>pageMetadata({ type: "article", publishedTime, modifiedTime })</code>; BlogPosting + BreadcrumbList; visible byline + <code><time dateTime></code> "Updated" date matching JSON-LD; per-post <code>opengraph-image</code>; <code>.md</code> mirror; <code>generateStaticParams</code> + <code>dynamicParams = false</code> or <code>notFound()</code> before Suspense</td> </tr> <tr> <td><strong>Product / app / pricing</strong></td> <td>Product (buyable goods) or SoftwareApplication with the real, visible price. Add <code>aggregateRating</code> <strong>only</strong> when real ratings are shown on the page (without it SoftwareApplication is valid but not rich-result eligible). Prices in visible text</td> </tr> <tr> <td><strong>Docs page</strong></td> <td>TechArticle + BreadcrumbList; <code>.md</code> mirror advertised with <code>alternates.types["text/markdown"]</code>; listed in llms.txt; stable URLs; version in text</td> </tr> <tr> <td><strong>Author page</strong></td> <td>ProfilePage + Person with <code>sameAs</code>; linked from <code>Article.author.url</code></td> </tr> <tr> <td><strong>App / auth / search results</strong></td> <td><code>robots: { index: false, follow: true }</code>; not in sitemap, llms.txt or internal nav meant for crawlers; <code>/login</code> never canonicalizes to <code>/</code></td> </tr> <tr> <td><strong>Site-wide files</strong></td> <td><code>robots.ts</code> (preview guard + AI policy + <code>sitemap</code>), <code>sitemap.ts</code>, <code>llms.txt</code>, <code>manifest.ts</code>, <code>favicon.ico</code> <strong>plus</strong> <code>icon.png</code> (Google doesn't list SVG favicons), <code>apple-icon</code> 180×180, 404 page returning 404</td> </tr> </tbody></table></div> <h2 id="metadata-rules"><a class="heading-anchor" href="#metadata-rules">Metadata rules</a></h2> <ul> <li><strong>Title:</strong> unique, 10–60 chars, <code>Topic | Brand</code>. The brand name appears in every title; the home page uses an absolute tagline title (the helper does this for <code>path: "/"</code>). Don't put a plain string <code>title</code> in a nested <code>layout.tsx</code>: it resets the template for every child page.</li> <li><strong>Description:</strong> unique, 50–160 chars, a summary sentence rather than a keyword list. Fill it on every page.</li> <li><strong>Canonical:</strong> absolute (via <code>metadataBase</code>), no fragment, one URL form site-wide (https, one host, no trailing slash in Next's default). The same form in sitemap, internal links and hreflang. Never combine <code>noindex</code> with a cross-page canonical.</li> <li><strong>OG:</strong> <code>og:title</code>, <code>og:type</code>, <code>og:image</code> (1200×630 PNG/JPEG, absolute, ≤ 8 MB, not SVG), <code>og:url</code> = canonical, <code>og:site_name</code>, <code>og:locale</code>. Use the file convention <code>opengraph-image.tsx</code> per section or post. It also fills <code>twitter:image</code>.</li> <li><strong>Viewport:</strong> Next adds <code>width=device-width, initial-scale=1</code>. Never add <code>maximum-scale=1</code> or <code>user-scalable=no</code>.</li> <li><strong><code>keywords</code> meta is useless.</strong> Don't spend tokens on it.</li> <li>Don't set <code>nosnippet</code> or a low <code>max-snippet</code>; they also remove you from AI Overviews. Put <code>data-nosnippet</code> only on cookie banners and boilerplate.</li> <li>Uncompressed HTML < 1 MB (Googlebot stops at 2 MB, and the inlined RSC payload roughly doubles text weight).</li> </ul> <p>Recipes: <a class="code-link" href="/docs/seo/next-metadata"><code>references/next-metadata.md</code></a>.</p> <h2 id="next-js-16-traps-verified-on-16-3-5"><a class="heading-anchor" href="#next-js-16-traps-verified-on-16-3-5">Next.js 16 traps (verified on 16.3.5)</a></h2> <div class="table-wrap" tabindex="0" role="region" aria-label="Table 4"><table> <thead> <tr> <th>Trap</th> <th>Symptom</th> <th>Fix</th> </tr> </thead> <tbody><tr> <td><strong>Streaming metadata.</strong> A request-time <code>generateMetadata</code> (using <code>cookies()</code>, <code>headers()</code>, <code>connection()</code> or uncached fetches) streams <code><title></code>/canonical into <code><body></code> for every UA not in <code>htmlLimitedBots</code>. The default list has <strong>no AI bots and no Googlebot</strong>. Google only accepts canonical in <code><head></code>. Suspense content arrives in <code><div hidden id="S:n"></code>, out of order</td> <td><code>curl -A GPTBot</code> shows <code><link rel="canonical"></code> after <code></head></code></td> <td>Prefer static metadata (<code>generateStaticParams</code>, <code>'use cache'</code>). Otherwise extend <code>htmlLimitedBots</code> <strong>and keep Next's default list in the regex</strong> (setting it replaces the default). Recipe: <code>next-metadata.md</code> §3</td> </tr> <tr> <td><strong><code>notFound()</code> inside Suspense → HTTP 200</strong> + <code><meta name="robots" content="noindex"></code> (soft 404)</td> <td>Unknown slug returns 200</td> <td>Look up the entity at the top of <code>page.tsx</code>/<code>generateMetadata</code> and call <code>notFound()</code> before rendering any <code><Suspense></code>. Or <code>dynamicParams = false</code>. Same for <code>redirect()</code></td> </tr> <tr> <td><strong>Shallow merge.</strong> A page's <code>openGraph</code> replaces the layout's whole <code>openGraph</code> (loses <code>siteName</code>, <code>locale</code>, <code>images</code>). A page's <code>alternates</code> drops the layout's <code>alternates.types</code></td> <td><code>og:site_name</code> missing on subpages</td> <td>Always build page metadata with <code>pageMetadata()</code>, which re-adds every field</td> </tr> <tr> <td><strong>Async params.</strong> <code>params</code>, <code>searchParams</code>, <code>generateSitemaps</code> <code>id</code> and <code>generateImageMetadata</code> <code>id</code> are Promises in 16</td> <td>Type errors or <code>undefined</code></td> <td><code>const { slug } = await params</code></td> </tr> <tr> <td><strong><code>middleware</code> → <code>proxy</code>.</strong> The file is <code>proxy.ts</code> and exports <code>proxy</code></td> <td>Middleware silently not running</td> <td>Rename</td> </tr> <tr> <td><strong><code>generateSitemaps</code> makes no index</strong></td> <td><code>/sitemap.xml</code> lists nothing for split sitemaps</td> <td>Add a <code>sitemap-index.xml</code> route (<code>next-metadata.md</code> §6)</td> </tr> <tr> <td><strong><code>Vary: Accept</code> overwritten</strong> on prerendered HTML</td> <td>CDN serves Markdown to browsers when negotiating</td> <td>Use explicit <code>.md</code> URLs, not <code>Accept</code> negotiation (<code>llms-txt-markdown.md</code>)</td> </tr> </tbody></table></div> <h2 id="structured-data-policy"><a class="heading-anchor" href="#structured-data-policy">Structured data policy</a></h2> <ul> <li><strong>Still yields Google rich results or knowledge features:</strong> Organization, WebSite (site name), BreadcrumbList, Article/BlogPosting/NewsArticle, Product (snippet or merchant listing), SoftwareApplication (<strong>requires <code>aggregateRating</code> or <code>review</code></strong>), ProfilePage, VideoObject, Event, QAPage/DiscussionForumPosting, Recipe, JobPosting, LocalBusiness.</li> <li><strong>Gone. Don't add for rich results:</strong> FAQPage (not shown since 2026-05-07), HowTo (2023), sitelinks SearchAction (2024-11), plus ClaimReview, course info, estimated salary, vehicle listing, special announcement, practice problem.</li> <li><strong>Never fabricate.</strong> Every <code>name</code>, <code>headline</code>, <code>price</code>, <code>ratingValue</code>, <code>author.name</code> must appear in the visible text. No self-serving reviews on your own Organization. "Only publish what exists."</li> <li>JSON-LD is server-rendered in raw HTML via a native <code><script type="application/ld+json"></code> (not <code>next/script</code>), with <code><</code> escaped as <code>\u003c</code>.</li> <li>Organization + WebSite: once per page graph, on the home page at minimum (the template emits them from the root layout). Other nodes reference <code>{"@id": "https://site/#organization"}</code>.</li> <li>Dates are ISO 8601 with a timezone. <code>dateModified ≥ datePublished</code>, matching the visible date.</li> <li>Types, required properties and a <code>@graph</code> builder: <a class="code-link" href="/docs/seo/structured-data"><code>references/structured-data.md</code></a>.</li> </ul> <h2 id="robots-txt-and-ai-policy"><a class="heading-anchor" href="#robots-txt-and-ai-policy">robots.txt and AI policy</a></h2> <div class="table-wrap" tabindex="0" role="region" aria-label="Table 5"><table> <thead> <tr> <th>Group</th> <th>Tokens</th> <th>Default</th> </tr> </thead> <tbody><tr> <td>Search engines</td> <td><code>Googlebot</code>, <code>Bingbot</code>, <code>Applebot</code>, <code>DuckDuckBot</code></td> <td>Allow</td> </tr> <tr> <td>AI <strong>retrieval</strong> (cites you in answers)</td> <td><code>OAI-SearchBot</code>, <code>Claude-SearchBot</code>, <code>PerplexityBot</code>, <code>DuckAssistBot</code>, <code>MistralAI-Index</code>, <code>Amzn-SearchBot</code>, <code>meta-webindexer</code></td> <td><strong>Allow</strong> (blocking removes you from ChatGPT search, Claude and Perplexity answers)</td> </tr> <tr> <td>AI <strong>user fetchers</strong> (a person asked)</td> <td><code>ChatGPT-User</code>, <code>Claude-User</code>, <code>Perplexity-User</code>, <code>MistralAI-User</code></td> <td>Allow (several ignore robots anyway)</td> </tr> <tr> <td>AI <strong>training</strong></td> <td><code>GPTBot</code>, <code>ClaudeBot</code>, <code>Google-Extended</code>, <code>Applebot-Extended</code>, <code>CCBot</code>, <code>meta-externalagent</code>, <code>Amazonbot</code>, <code>MistralAI-Training</code>, <code>Bytespider</code></td> <td>Owner's choice (<code>site.ai.training</code> in <code>site.config.ts</code>; template default: disallow). Blocking doesn't affect search or AI Overviews</td> </tr> </tbody></table></div> <ul> <li>A bot obeys <strong>only its most specific group</strong>. Repeat <code>Disallow: /api/</code> in every named group.</li> <li>Previews and staging: <code>Disallow: /</code> (keyed on <code>VERCEL_ENV</code> or equivalent). Production never.</li> <li>Don't disallow pages that carry <code>noindex</code>; crawlers must fetch them to see it. Don't block <code>/_next/</code>.</li> <li><code>Google-Extended</code> doesn't remove you from AI Overviews. Only <code>noindex</code>/<code>nosnippet</code> does.</li> <li>Full crawler table + <code>robots.ts</code>: <a class="code-link" href="/docs/seo/ai-crawlers"><code>references/ai-crawlers.md</code></a>.</li> </ul> <h2 id="llms-txt-and-markdown-mirrors-cheap-extras-info-level"><a class="heading-anchor" href="#llms-txt-and-markdown-mirrors-cheap-extras-info-level">llms.txt and Markdown mirrors (cheap extras, <code>info</code> level)</a></h2> <ul> <li>Ship <code>/llms.txt</code>: <code># Brand</code>, a <code>> one-sentence summary</code>, curated <code>## Docs</code> / <code>## Blog</code> link lists pointing to <code>.md</code> URLs, and <code>## Optional</code>. It's under 100 KB and prerendered.</li> <li>It mainly serves <strong>coding agents</strong>, not answer engines: 97% of llms.txt files got zero requests in a 137K-domain study, and Google says it doesn't use them. Never claim it improves ranking. A 5xx is an error (Lighthouse fails it); a missing file is fine.</li> <li>Docs and posts: <code>page.md</code> mirror with <code>X-Robots-Tag: noindex</code> + <code>Link: <html-url>; rel="canonical"</code>, advertised with <code><link rel="alternate" type="text/markdown"></code>. Not in the sitemap.</li> <li>Recipes: <a class="code-link" href="/docs/seo/llms-txt-markdown"><code>references/llms-txt-markdown.md</code></a>.</li> </ul> <h2 id="content-that-gets-cited"><a class="heading-anchor" href="#content-that-gets-cited">Content that gets cited</a></h2> <p>Evidence (KDD 2024 GEO study, NeurIPS 2025 C-SEO Bench, Microsoft and Google guidance): adding <strong>citations, statistics and quotations</strong> lifted AI visibility 30–40%, most for pages not ranked #1. Keyword stuffing and "authoritative tone" did nothing. AI engines favor third-party (earned) coverage.</p> <ol> <li><strong>Answer first.</strong> The first paragraph under the h1 and under each question-style h2 answers in 1–2 self-contained sentences (≤ 320 chars) that name the entity ("Acme is…", not "It is…").</li> <li><strong>Evidence.</strong> Numbers with units and dates ("cuts build time from 47 s to 4.5 s, measured Sept 2026"), links to primary sources, <code><blockquote cite></code> quotes from named people.</li> <li><strong>Structure.</strong> Descriptive h2/h3 (often questions users ask), <code><ul></code>/<code><ol></code> for steps, <code><div class="table-wrap" tabindex="0" role="region" aria-label="Table 6"><table></code> for comparisons and specs, and paragraphs under ~150 words.</li> <li><strong>Entity clarity.</strong> The same brand and product name in title, h1, <code>og:site_name</code>, JSON-LD <code>name</code> and the llms.txt H1. A clear "what it is / who it's for / pricing / license" block.</li> <li><strong>Freshness.</strong> A visible "Updated" date that matches <code>dateModified</code> and sitemap <code>lastmod</code>. Update facts, not just dates.</li> <li><strong>Visible.</strong> Key facts are not only in images, video, PDFs, canvas, carousels or closed tabs. Use <code><details open></code> or plain sections.</li> <li><strong>Non-commodity.</strong> First-hand data, benchmarks, original examples, clear opinions. Near-duplicate pages get clustered and only one is used.</li> </ol> <p>Don't: generate keyword-variant pages, rewrite content "for AI", chunk into micro-pages, add FAQPage for rich results, or fake mentions. Patterns and examples: <a class="code-link" href="/docs/seo/content-for-citation"><code>references/content-for-citation.md</code></a>.</p> <h2 id="verify"><a class="heading-anchor" href="#verify">Verify</a></h2> <ol> <li><code>void lint</code> (static): <a class="code-link" href="/rules/lint/missing-metadata-base"><code>lint/missing-metadata-base</code></a>, <a class="code-link" href="/rules/lint/missing-metadata"><code>lint/missing-metadata</code></a>, <a class="code-link" href="/rules/lint/canonical-in-root-layout"><code>lint/canonical-in-root-layout</code></a>, <a class="code-link" href="/rules/lint/og-merge-drops-parent"><code>lint/og-merge-drops-parent</code></a>, <a class="code-link" href="/rules/lint/not-found-in-suspense"><code>lint/not-found-in-suspense</code></a>, <a class="code-link" href="/rules/lint/dynamic-metadata-streaming"><code>lint/dynamic-metadata-streaming</code></a>, <a class="code-link" href="/rules/lint/page-level-use-client"><code>lint/page-level-use-client</code></a>, <a class="code-link" href="/rules/lint/dangerously-set-jsonld-unescaped"><code>lint/dangerously-set-jsonld-unescaped</code></a>, <a class="code-link" href="/rules/lint/jsonld-deprecated-type"><code>lint/jsonld-deprecated-type</code></a>, <a class="code-link" href="/rules/lint/sitemap-lastmod-now"><code>lint/sitemap-lastmod-now</code></a>, <a class="code-link" href="/rules/lint/missing-sitemap"><code>lint/missing-sitemap</code></a>, <a class="code-link" href="/rules/lint/missing-robots"><code>lint/missing-robots</code></a>, <a class="code-link" href="/rules/lint/missing-og-image"><code>lint/missing-og-image</code></a>, <a class="code-link" href="/rules/lint/missing-icon"><code>lint/missing-icon</code></a>, <a class="code-link" href="/rules/lint/missing-llms-txt"><code>lint/missing-llms-txt</code></a>, <a class="code-link" href="/rules/lint/missing-alt"><code>lint/missing-alt</code></a>, <a class="code-link" href="/rules/lint/multiple-h1"><code>lint/multiple-h1</code></a>.</li> <li><code>next build</code>, then <code>void seo --start "next start -p 3000" --port 3000 --format md</code>: status codes (<a class="code-link" href="/rules/seo/http-status"><code>seo/http-status</code></a>, <a class="code-link" href="/rules/seo/soft-404"><code>seo/soft-404</code></a>), head placement per UA (<a class="code-link" href="/rules/seo/metadata-in-body"><code>seo/metadata-in-body</code></a>), canonical (<code>seo/canonical-*</code>), titles/descriptions, h1, links, OG image fetch, icons, robots.txt, sitemap. Include an unknown URL in <code>--routes</code> (e.g. <code>/this-page-does-not-exist</code>) to prove 404s.</li> <li><code>void geo</code> (same flags): raw-vs-rendered content (<a class="code-link" href="/rules/geo/js-dependency"><code>geo/js-dependency</code></a>, <a class="code-link" href="/rules/geo/hidden-streamed-content"><code>geo/hidden-streamed-content</code></a>), JSON-LD (<a class="code-link" href="/rules/geo/jsonld-parse-error"><code>geo/jsonld-parse-error</code></a>, <a class="code-link" href="/rules/geo/jsonld-required"><code>geo/jsonld-required</code></a>, <a class="code-link" href="/rules/geo/jsonld-not-visible"><code>geo/jsonld-not-visible</code></a>, <a class="code-link" href="/rules/geo/faq-deprecated"><code>geo/faq-deprecated</code></a>), AI robots (<a class="code-link" href="/rules/geo/search-bots-blocked"><code>geo/search-bots-blocked</code></a>, <a class="code-link" href="/rules/geo/robots-ai-policy"><code>geo/robots-ai-policy</code></a>), llms.txt (<code>geo/llms-txt-*</code>), Markdown mirrors (<code>geo/markdown-*</code>), content heuristics (<a class="code-link" href="/rules/geo/answer-first"><code>geo/answer-first</code></a>, <a class="code-link" href="/rules/geo/no-citations"><code>geo/no-citations</code></a>, info level).</li> <li><strong>Gates must pass</strong> (each caps the score at 49): <a class="code-link" href="/rules/seo/http-status"><code>seo/http-status</code></a>, <a class="code-link" href="/rules/seo/noindex"><code>seo/noindex</code></a>, <a class="code-link" href="/rules/seo/canonical-missing"><code>seo/canonical-missing</code></a>, <a class="code-link" href="/rules/seo/canonical-invalid"><code>seo/canonical-invalid</code></a>, <a class="code-link" href="/rules/seo/canonical-broken"><code>seo/canonical-broken</code></a>, <a class="code-link" href="/rules/seo/robots-blocks-all"><code>seo/robots-blocks-all</code></a>, <a class="code-link" href="/rules/seo/sitemap-url-status"><code>seo/sitemap-url-status</code></a>, <a class="code-link" href="/rules/geo/js-dependency"><code>geo/js-dependency</code></a>, <a class="code-link" href="/rules/geo/jsonld-parse-error"><code>geo/jsonld-parse-error</code></a>. Targets: seo ≥ 95, geo ≥ 90. <code>info</code> GEO findings are review prompts, not failures.</li> <li>Manual spot checks: <code>curl -sA "Googlebot/2.1" URL | head -c 3000</code>; Google Rich Results Test for new types; Search Console and Bing Webmaster Tools "AI Performance" after launch. Details: the <a class="code-link" href="/docs/audit"><code>audit</code></a> skill.</li> </ol> </div><footer class="mt-16 border-t border-line-subtle pt-8 pb-20"><div class="flex flex-wrap items-center justify-between gap-3 font-mono text-xs text-fg-muted"><span>Updated <time dateTime="2026-09-16">16 Sept 2026</time></span><span class="flex gap-4"><a href="/docs/seo.md" class="hover:text-fg">View as Markdown</a><a href="https://github.com/ParthKapoor-dev/design/blob/main/skills/seo/SKILL.md" rel="noopener noreferrer" class="hover:text-fg">Edit on GitHub</a></span></div><div class="mt-8 grid gap-3 sm:grid-cols-2"><a class="press group flex flex-col gap-1 rounded-lg border border-line-subtle p-4 transition-colors duration-(--duration-fast) hover:border-line-strong" href="/docs/speed/rendering-smoothness"><span class="label-mono flex items-center gap-1.5 text-fg-muted"><svg aria-hidden="true" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="size-3"><path d="M13 8H3.5M7.5 4l-4 4 4 4" stroke-linecap="round" stroke-linejoin="round"></path></svg> Previous</span><span class="text-sm text-fg">speed: rendering smoothness</span></a><a class="press group flex flex-col items-end gap-1 rounded-lg border border-line-subtle p-4 text-right transition-colors duration-(--duration-fast) hover:border-line-strong" href="/docs/seo/ai-crawlers"><span class="label-mono flex items-center gap-1.5 text-fg-muted">Next <svg aria-hidden="true" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="size-3"><path d="M3 8h9.5M8.5 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><span class="text-sm text-fg">seo: ai crawlers</span></a></div></footer></article><aside aria-label="Page contents" class="hidden xl:block"><div data-lenis-prevent="true" class="sticky top-(--header-h) max-h-[calc(100dvh-var(--header-h))] overflow-y-auto pt-4 pb-10 [scrollbar-width:thin]"><nav aria-label="On this page" class="text-sm"><p class="label-mono mb-3 text-fg-muted">On this page</p><ul class="grid gap-1.5 border-l border-line-subtle"><li><a href="#the-10-rules-that-matter-most" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">The 10 rules that matter most</a></li><li><a href="#the-four-readers-design-for-the-weakest" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">The four readers (design for the weakest)</a></li><li><a href="#must-ship-checklist-per-page-type" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Must-ship checklist per page type</a></li><li><a href="#metadata-rules" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Metadata rules</a></li><li><a href="#next-js-16-traps-verified-on-16-3-5" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Next.js 16 traps (verified on 16.3.5)</a></li><li><a href="#structured-data-policy" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Structured data policy</a></li><li><a href="#robots-txt-and-ai-policy" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">robots.txt and AI policy</a></li><li><a href="#llms-txt-and-markdown-mirrors-cheap-extras-info-level" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">llms.txt and Markdown mirrors (cheap extras, info level)</a></li><li><a href="#content-that-gets-cited" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Content that gets cited</a></li><li><a href="#verify" class="block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4">Verify</a></li></ul></nav></div></aside></div></div><!--$--><!--/$--></main><footer class="relative mt-24 overflow-hidden border-t border-line px-(--gutter)"><div aria-hidden="true" class="pointer-events-none absolute -bottom-[40vw] left-1/2 size-[80vw] -translate-x-1/2 rounded-full bg-[radial-gradient(closest-side,color-mix(in_oklab,var(--flare)_12%,transparent),transparent)]"></div><div class="relative mx-auto grid max-w-7xl gap-12 py-16 md:grid-cols-12 md:gap-8"><div class="md:col-span-5"><a class="inline-flex items-center gap-2.5 text-ink" aria-label="void home" href="/"><svg viewBox="0 0 32 32" class="size-6" aria-hidden="true"><defs><radialGradient id="mk" cx="50%" cy="50%" r="50%"><stop offset="0.52" stop-color="#000"></stop><stop offset="0.6" stop-color="var(--flare-2)"></stop><stop offset="0.8" stop-color="var(--flare)" stop-opacity="0.6"></stop><stop offset="1" stop-color="var(--flare)" stop-opacity="0"></stop></radialGradient></defs><ellipse cx="16" cy="16" rx="15" ry="5" fill="none" stroke="var(--flare)" stroke-opacity="0.8" stroke-width="1.4" transform="rotate(-18 16 16)"></ellipse><circle cx="16" cy="16" r="10" fill="url(#mk)"></circle></svg><span class="text-lg font-medium tracking-tight">void</span></a><p class="mt-4 max-w-[44ch] text-mute">A design system for AI coding agents. This site is built with it and audited by it on every change.</p><p class="mt-6 inline-flex flex-wrap items-center gap-x-4 gap-y-1 rounded-full border border-line-2 bg-black/40 px-4 py-2 font-mono text-xs text-mute"><span class="text-flare-2">void audit</span><span>perf<!-- --> <span class="text-ink tabular-nums">100</span></span><span>a11y<!-- --> <span class="text-ink tabular-nums">100</span></span><span>seo<!-- --> <span class="text-ink tabular-nums">99</span></span><span>geo<!-- --> <span class="text-ink tabular-nums">100</span></span></p></div><nav aria-label="Product" class="md:col-span-2 md:first-of-type:col-start-7"><p class="kicker">Product</p><ul class="mt-4 grid gap-2"><li><a class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink" href="/docs">Docs</a></li><li><a class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink" href="/cli">CLI reference</a></li><li><a class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink" href="/rules">Rules</a></li><li><a class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink" href="/directions">Directions</a></li><li><a class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink" href="/evals">Evals</a></li></ul></nav><nav aria-label="For agents" class="md:col-span-2 md:first-of-type:col-start-7"><p class="kicker">For agents</p><ul class="mt-4 grid gap-2"><li><a href="/llms.txt" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">llms.txt</a></li><li><a href="/llms-full.txt" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">llms-full.txt</a></li><li><a href="/index.md" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">index.md</a></li><li><a href="/sitemap.xml" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">sitemap.xml</a></li></ul></nav><nav aria-label="Source" class="md:col-span-2 md:first-of-type:col-start-7"><p class="kicker">Source</p><ul class="mt-4 grid gap-2"><li><a href="https://github.com/ParthKapoor-dev/design" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">GitHub</a></li><li><a href="https://github.com/ParthKapoor-dev/design/blob/main/LICENSE" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">MIT licence</a></li><li><a href="https://parthkapoor.me" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink">Parth Kapoor</a></li></ul></nav></div><p aria-hidden="true" class="wordmark relative mx-auto max-w-7xl select-none text-center font-semibold leading-[0.72] tracking-[-0.06em] text-[clamp(6rem,24vw,22rem)]">void</p><div class="relative mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 border-t border-line py-6 font-mono text-xs text-mute"><span>© 2026 <!-- -->Parth Kapoor<!-- --> · <!-- -->MIT</span><span>void-design.vercel.app</span></div></footer><div class="grain" aria-hidden="true"></div><script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://void-design.vercel.app/#organization","name":"void","url":"https://void-design.vercel.app/","logo":"https://void-design.vercel.app/icon-512.png","sameAs":["https://github.com/ParthKapoor-dev/design"]},{"@type":"WebSite","@id":"https://void-design.vercel.app/#website","name":"void","url":"https://void-design.vercel.app/","description":"void is an open-source design system for AI coding agents: Claude Code skills, Tailwind v4 tokens and a CLI that audits speed, accessibility, SEO and design.","inLanguage":"en","publisher":{"@id":"https://void-design.vercel.app/#organization"}}]}</script><script src="/_next/static/immutable/chunks/39mze7sr9bsct.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[46810,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\"],\"SmoothScroll\"]\n3:I[45110,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\"],\"Cursor\"]\n4:I[75514,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\"],\"Magnetic\"]\n5:I[88287,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"default\"]\n6:I[74895,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"default\"]\n7:I[821,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\"],\"Nav\"]\n8:I[23408,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\"],\"CanvasRoot\"]\n9:I[57715,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\",\"/_next/static/immutable/chunks/10-jx0r2jtr5s.js\",\"/_next/static/immutable/chunks/2-9e3j82g4al3.js\",\"/_next/static/immutable/chunks/15spxoq7fze2b.js\"],\"PageHero\"]\na:I[4561,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\",\"/_next/static/immutable/chunks/10-jx0r2jtr5s.js\",\"/_next/static/immutable/chunks/2-9e3j82g4al3.js\",\"/_next/static/immutable/chunks/15spxoq7fze2b.js\"],\"\"]\n16:I[52576,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\"],\"default\",1]\n:HL[\"/_next/static/immutable/chunks/0qj2_6xwr7iux.css\",\"style\"]\n:HL[\"/_next/static/immutable/media/797e433ab948586e-s.p.1v5bejj26fx9h.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/immutable/media/7ebf22b5a21034f8-s.p.3strvg7o-g5v2.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/immutable/media/caa3a2e1cccd8315-s.p.0zr6hhvz-h9nw.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n14:X\n0:{\"P\":null,\"c\":[\"\",\"docs\",\"seo\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"(pages)\",{\"children\":[\"docs\",{\"children\":[[\"skill\",\"seo\",\"d\",[]],{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/immutable/chunks/0qj2_6xwr7iux.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"geist_e799d87a-module__u8MhCG__variable geist_mono_8f04fc5a-module__ZGwrmq__variable instrument_serif_d5a02a32-module__PnFala__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"document.documentElement.classList.add(\\\"js\\\")\"}}],[\"$\",\"link\",null,{\"rel\":\"describedby\",\"type\":\"text/markdown\",\"href\":\"/llms.txt\"}]]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"$L7\",null,{}],[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"children\":[\"$\",\"$L8\",null,{}]}],[\"$\",\"main\",null,{\"id\":\"main\",\"className\":\"page-shell relative px-(--gutter)\",\"children\":[\"$\",\"$L9\",null,{\"scene\":\"snow\",\"crumbs\":[{\"name\":\"void\",\"path\":\"/\"},{\"name\":\"404\"}],\"kicker\":\"HTTP 404 · noindex\",\"title\":[\"Nothing measured \",[\"$\",\"span\",null,{\"className\":\"serif hot\",\"children\":\"at this address.\"}]],\"lead\":\"The link may be old, or a rule id was renamed. Everything that exists is one of these.\",\"children\":[\"$\",\"div\",null,{\"className\":\"enter mt-10 max-w-xl overflow-hidden rounded-2xl border border-line-2 bg-black/60 font-mono text-sm backdrop-blur-md\",\"style\":{\"--d\":\"0.45s\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-10 items-center justify-between border-b border-line px-4\",\"children\":[[\"$\",\"span\",null,{\"className\":\"label-mono text-fg-subtle\",\"children\":\"~/void\"}],[\"$\",\"span\",null,{\"className\":\"label-mono text-danger\",\"children\":\"exit 3\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-4 py-4 leading-7\",\"children\":[[\"$\",\"p\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",[\"$\",\"span\",null,{\"className\":\"text-fg\",\"children\":\"curl -sI this-page\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-fg-muted\",\"children\":[\"HTTP/2 \",[\"$\",\"span\",null,{\"className\":\"text-danger\",\"children\":\"404\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-3 text-fg-subtle\",\"children\":\"# try one of these\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"cd /docs\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"install, the starter, the skills\"]}]]}]}],[\"$\",\"li\",\"/rules\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/rules\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"void rules\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"every rule id the CLI can print\"]}]]}]}],[\"$\",\"li\",\"/cli\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/cli\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"void --help\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"commands, flags and exit codes\"]}]]}]}],[\"$\",\"li\",\"/\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"cd ~\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"home\"]}]]}]}]]}]]}]]}]}]}],[\"$\",\"footer\",null,{\"className\":\"relative mt-24 overflow-hidden border-t border-line px-(--gutter)\",\"children\":[[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"className\":\"pointer-events-none absolute -bottom-[40vw] left-1/2 size-[80vw] -translate-x-1/2 rounded-full bg-[radial-gradient(closest-side,color-mix(in_oklab,var(--flare)_12%,transparent),transparent)]\"}],\"$Lb\",\"$Lc\",\"$Ld\"]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],\"$Le\",\"$Lf\"]}]]}]]}],{\"children\":[\"$L10\",{\"children\":[\"$L11\",{\"children\":[\"$L12\",{\"children\":[\"$L13\",{},null,false,null]},null,false,\"$14\"]},null,false,\"$14\"]},null,false,null]},null,false,null],\"$L15\",false]],\"m\":\"$undefined\",\"G\":[\"$16\",[\"$L17\"]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"kQQT0nsN5xJVQW80oWLeY\"}\n18:I[821,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\"],\"Mark\"]\n26:I[51858,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"OutletBoundary\"]\n27:\"$Sreact.suspense\"\n29:I[51858,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"ViewportBoundary\"]\n2b:I[51858,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"MetadataBoundary\"]\nb:[\"$\",\"div\",null,{\"className\":\"relative mx-auto grid max-w-7xl gap-12 py-16 md:grid-cols-12 md:gap-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"md:col-span-5\",\"children\":[[\"$\",\"$La\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center gap-2.5 text-ink\",\"aria-label\":\"void home\",\"children\":[[\"$\",\"$L18\",null,{\"className\":\"size-6\"}],[\"$\",\"span\",null,{\"className\":\"text-lg font-medium tracking-tight\",\"children\":\"void\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[44ch] text-mute\",\"children\":\"A design system for AI coding agents. This site is built with it and audited by it on every change.\"}],[\"$\",\"p\",null,{\"className\":\"mt-6 inline-flex flex-wrap items-center gap-x-4 gap-y-1 rounded-full border border-line-2 bg-black/40 px-4 py-2 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare-2\",\"children\":\"void audit\"}],[[\"$\",\"span\",\"perf\",{\"children\":[\"perf\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"a11y\",{\"children\":[\"a11y\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"seo\",{\"children\":[\"seo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"99\"}]]}],[\"$\",\"span\",\"geo\",{\"children\":[\"geo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}]]]}]]}],[[\"$\",\"nav\",\"Product\",{\"aria-label\":\"Product\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Docs\"}]}],[\"$\",\"li\",\"/cli\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/cli\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"CLI reference\"}]}],[\"$\",\"li\",\"/rules\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/rules\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Rules\"}]}],[\"$\",\"li\",\"/directions\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/directions\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Directions\"}]}],[\"$\",\"li\",\"/evals\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/evals\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Evals\"}]}]]}]]}],[\"$\",\"nav\",\"For agents\",{\"aria-label\":\"For agents\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"For agents\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/llms.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms.txt\"}]}],[\"$\",\"li\",\"/llms-full.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms-full.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms-full.txt\"}]}],[\"$\",\"li\",\"/index.md\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/index.md\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"index.md\"}]}],[\"$\",\"li\",\"/sitemap.xml\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/sitemap.xml\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"sitemap.xml\"}]}]]}]]}],[\"$\",\"nav\",\"Source\",{\"aria-label\":\"Source\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Source\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"GitHub\"}]}],[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"MIT licence\"}]}],\"$L19\"]}]]}]]]}]\nc:[\"$\",\"p\",null,{\"aria-hidden\":\"true\",\"className\":\"wordmark relative mx-auto max-w-7xl select-none text-center font-semibold leading-[0.72] tracking-[-0.06em] text-[clamp(6rem,24vw,22rem)]\",\"children\":\"void\"}]\nd:[\"$\",\"div\",null,{\"className\":\"relative mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 border-t border-line py-6 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"© 2026 \",\"Parth Kapoor\",\" · \",\"MIT\"]}],[\"$\",\"span\",null,{\"children\":\"void-design.vercel.app\"}]]}]\ne:[\"$\",\"div\",null,{\"className\":\"grain\",\"aria-hidden\":\"true\"}]\nf:[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"Organization\\\",\\\"@id\\\":\\\"https://void-design.vercel.app/#organization\\\",\\\"name\\\":\\\"void\\\",\\\"url\\\":\\\"https://void-design.vercel.app/\\\",\\\"logo\\\":\\\"https://void-design.vercel.app/icon-512.png\\\",\\\"sameAs\\\":[\\\"https://github.com/ParthKapoor-dev/design\\\"]},{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://void-design.vercel.app/#website\\\",\\\"name\\\":\\\"void\\\",\\\"url\\\":\\\"https://void-design.vercel.app/\\\",\\\"description\\\":\\\"void is an open-source design system for AI coding agents: Claude Code skills, Tailwind v4 tokens and a CLI that audits speed, accessibility, SEO and design.\\\",\\\"inLanguage\\\":\\\"en\\\",\\\"publisher\\\":{\\\"@id\\\":\\\"https://void-design.vercel.app/#organization\\\"}}]}\"}}]\n10:[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/immutable/chunks/1635pnmauuvxi.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[[\"$\",\"a\",null,{\"href\":\"#main\",\"className\":\"sr-only z-[60] rounded-full bg-flare px-4 py-2 text-sm font-medium text-black focus:not-sr-only focus:fixed focus:left-4 focus:top-4\",\"children\":\"Skip to content\"}],[\"$\",\"$L7\",null,{}],[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"children\":[\"$\",\"$L8\",null,{}]}],[\"$\",\"main\",null,{\"id\":\"main\",\"className\":\"page-shell relative\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"$L7\",null,{}],[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"children\":[\"$\",\"$L8\",null,{}]}],[\"$\",\"main\",null,{\"id\":\"main\",\"className\":\"page-shell relative px-(--gutter)\",\"children\":[\"$\",\"$L9\",null,{\"scene\":\"snow\",\"crumbs\":[{\"name\":\"void\",\"path\":\"/\"},{\"name\":\"404\"}],\"kicker\":\"HTTP 404 · noindex\",\"title\":[\"Nothing measured \",[\"$\",\"span\",null,{\"className\":\"serif hot\",\"children\":\"at this address.\"}]],\"lead\":\"The link may be old, or a rule id was renamed. Everything that exists is one of these.\",\"children\":[\"$\",\"div\",null,{\"className\":\"enter mt-10 max-w-xl overflow-hidden rounded-2xl border border-line-2 bg-black/60 font-mono text-sm backdrop-blur-md\",\"style\":{\"--d\":\"0.45s\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-10 items-center justify-between border-b border-line px-4\",\"children\":[[\"$\",\"span\",null,{\"className\":\"label-mono text-fg-subtle\",\"children\":\"~/void\"}],[\"$\",\"span\",null,{\"className\":\"label-mono text-danger\",\"children\":\"exit 3\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-4 py-4 leading-7\",\"children\":[[\"$\",\"p\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",[\"$\",\"span\",null,{\"className\":\"text-fg\",\"children\":\"curl -sI this-page\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-fg-muted\",\"children\":[\"HTTP/2 \",[\"$\",\"span\",null,{\"className\":\"text-danger\",\"children\":\"404\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-3 text-fg-subtle\",\"children\":\"# try one of these\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"cd /docs\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"install, the starter, the skills\"]}]]}]}],[\"$\",\"li\",\"/rules\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/rules\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"void rules\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"every rule id the CLI can print\"]}]]}]}],[\"$\",\"li\",\"/cli\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/cli\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"void --help\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"commands, flags and exit codes\"]}]]}]}],[\"$\",\"li\",\"/\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/\",\"className\":\"group flex min-h-7 flex-wrap items-center gap-x-3 text-fg transition-colors hover:text-brand-text\",\"children\":[[\"$\",\"span\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare\",\"children\":\"$$\"}],\" \",\"cd ~\"]}],[\"$\",\"span\",null,{\"className\":\"text-fg-subtle group-hover:text-fg-muted\",\"children\":[\"# \",\"home\"]}]]}]}]]}]]}]]}]}]}],[\"$\",\"footer\",null,{\"className\":\"relative mt-24 overflow-hidden border-t border-line px-(--gutter)\",\"children\":[[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"className\":\"pointer-events-none absolute -bottom-[40vw] left-1/2 size-[80vw] -translate-x-1/2 rounded-full bg-[radial-gradient(closest-side,color-mix(in_oklab,var(--flare)_12%,transparent),transparent)]\"}],[\"$\",\"div\",null,{\"className\":\"relative mx-auto grid max-w-7xl gap-12 py-16 md:grid-cols-12 md:gap-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"md:col-span-5\",\"children\":[[\"$\",\"$La\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center gap-2.5 text-ink\",\"aria-label\":\"void home\",\"children\":[\"$L1a\",\"$L1b\"]}],\"$L1c\",\"$L1d\"]}],[\"$L1e\",\"$L1f\",\"$L20\"]]}],\"$L21\",\"$L22\"]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],\"$L23\",\"$L24\"]]}]\n11:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n12:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n13:[\"$\",\"$1\",\"c\",{\"children\":[\"$L25\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/immutable/chunks/10-jx0r2jtr5s.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/immutable/chunks/2-9e3j82g4al3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/immutable/chunks/15spxoq7fze2b.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L26\",null,{\"children\":[\"$\",\"$27\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@28\"}]}]]}]\n15:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L29\",null,{\"children\":\"$L2a\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L2b\",null,{\"children\":[\"$\",\"$27\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L2c\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n17:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/immutable/chunks/0qj2_6xwr7iux.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n31:I[5246,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\"],\"CopyDelegate\"]\n14:C\n19:[\"$\",\"li\",\"https://parthkapoor.me\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://parthkapoor.me\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Parth Kapoor\"}]}]\n1a:[\"$\",\"$L18\",null,{\"className\":\"size-6\"}]\n1b:[\"$\",\"span\",null,{\"className\":\"text-lg font-medium tracking-tight\",\"children\":\"void\"}]\n1c:[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[44ch] text-mute\",\"children\":\"A design system for AI coding agents. This site is built with it and audited by it on every change.\"}]\n1d:[\"$\",\"p\",null,{\"className\":\"mt-6 inline-flex flex-wrap items-center gap-x-4 gap-y-1 rounded-full border border-line-2 bg-black/40 px-4 py-2 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare-2\",\"children\":\"void audit\"}],[[\"$\",\"span\",\"perf\",{\"children\":[\"perf\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"a11y\",{\"children\":[\"a11y\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"seo\",{\"children\":[\"seo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"99\"}]]}],[\"$\",\"span\",\"geo\",{\"children\":[\"geo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}]]]}]\n1e:[\"$\",\"nav\",\"Product\",{\"aria-label\":\"Product\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Docs\"}]}],[\"$\",\"li\",\"/cli\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/cli\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"CLI reference\"}]}],[\"$\",\"li\",\"/rules\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/rules\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Rules\"}]}],[\"$\",\"li\",\"/directions\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/directions\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Directions\"}]}],[\"$\",\"li\",\"/evals\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/evals\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Evals\"}]}]]}]]}]\n1f:[\"$\",\"nav\",\"For agents\",{\"aria-label\":\"For agents\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"For agents\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/llms.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms.txt\"}]}],[\"$\",\"li\",\"/llms-full.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms-full.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms-full.txt\"}]}],[\"$\",\"li\",\"/index.md\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/index.md\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"index.md\"}]}],[\"$\",\"li\",\"/sitemap.xml\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/sitemap.xml\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"sitemap.xml\"}]}]]}]]}]\n20:[\"$\",\"nav\",\"Source\",{\"aria-label\":\"Source\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Source\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"GitHub\"}]}],[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"MIT licence\"}]}],[\"$\",\"li\",\"https://parthkapoor.me\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://parthkapoor.me\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Parth Kapoor\"}]}]]}]]}]\n21:[\"$\",\"p\",null,{\"aria-hidden\":\"true\",\"className\":\"wordmark relative mx-auto max-w-7xl select-none text-center font-semibold leading-[0.72] tracking-[-0.06em] text-[clamp(6rem,24vw,22rem)]\",\"children\":\"void\"}]\n22:[\"$\",\"div\",null,{\"className\":\"relative mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 border-t border-line py-6 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"© 2026 \",\"Parth Kapoor\",\" · \",\"MIT\"]}],[\"$\",\"span\",null,{\"children\":\"void-design.vercel.app\"}]]}]\n23:[\"$\",\"footer\",null,{\"className\":\"relative mt-24 overflow-hidden border-t border-line px-(--gutter)\",\"children\":[[\"$\",\"div\",null,{\"aria-hidden\":\"true\",\"className\":\"pointer-events-none absolute -bottom-[40vw] left-1/2 size-[80vw] -translate-x-1/2 rounded-full bg-[radial-gradient(closest-side,color-mix(in_oklab,var(--flare)_12%,transparent),transparent)]\"}],[\"$\",\"div\",null,{\"className\":\"relative mx-auto grid max-w-7xl gap-12 py-16 md:grid-cols-12 md:gap-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"md:col-span-5\",\"children\":[[\"$\",\"$La\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center gap-2.5 text-ink\",\"aria-label\":\"void home\",\"children\":[[\"$\",\"$L18\",null,{\"className\":\"size-6\"}],[\"$\",\"span\",null,{\"className\":\"text-lg font-medium tracking-tight\",\"children\":\"void\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[44ch] text-mute\",\"children\":\"A design system for AI coding agents. This site is built with it and audited by it on every change.\"}],[\"$\",\"p\",null,{\"className\":\"mt-6 inline-flex flex-wrap items-center gap-x-4 gap-y-1 rounded-full border border-line-2 bg-black/40 px-4 py-2 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-flare-2\",\"children\":\"void audit\"}],[[\"$\",\"span\",\"perf\",{\"children\":[\"perf\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"a11y\",{\"children\":[\"a11y\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}],[\"$\",\"span\",\"seo\",{\"children\":[\"seo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"99\"}]]}],[\"$\",\"span\",\"geo\",{\"children\":[\"geo\",\" \",[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"100\"}]]}]]]}]]}],[[\"$\",\"nav\",\"Product\",{\"aria-label\":\"Product\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Docs\"}]}],[\"$\",\"li\",\"/cli\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/cli\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"CLI reference\"}]}],[\"$\",\"li\",\"/rules\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/rules\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Rules\"}]}],[\"$\",\"li\",\"/directions\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/directions\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Directions\"}]}],[\"$\",\"li\",\"/evals\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/evals\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Evals\"}]}]]}]]}],[\"$\",\"nav\",\"For agents\",{\"aria-label\":\"For agents\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"For agents\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"/llms.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms.txt\"}]}],[\"$\",\"li\",\"/llms-full.txt\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/llms-full.txt\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"llms-full.txt\"}]}],[\"$\",\"li\",\"/index.md\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/index.md\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"index.md\"}]}],[\"$\",\"li\",\"/sitemap.xml\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/sitemap.xml\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"sitemap.xml\"}]}]]}]]}],[\"$\",\"nav\",\"Source\",{\"aria-label\":\"Source\",\"className\":\"md:col-span-2 md:first-of-type:col-start-7\",\"children\":[[\"$\",\"p\",null,{\"className\":\"kicker\",\"children\":\"Source\"}],[\"$\",\"ul\",null,{\"className\":\"mt-4 grid gap-2\",\"children\":[[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"GitHub\"}]}],\"$L2d\",\"$L2e\"]}]]}]]]}],\"$L2f\",\"$L30\"]}]\n24:[\"$\",\"$L31\",null,{}]\n2d:[\"$\",\"li\",\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design/blob/main/LICENSE\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"MIT licence\"}]}]\n2e:[\"$\",\"li\",\"https://parthkapoor.me\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://parthkapoor.me\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex min-h-6 items-center text-sm text-mute transition-colors hover:text-ink\",\"children\":\"Parth Kapoor\"}]}]\n2f:[\"$\",\"p\",null,{\"aria-hidden\":\"true\",\"className\":\"wordmark relative mx-auto max-w-7xl select-none text-center font-semibold leading-[0.72] tracking-[-0.06em] text-[clamp(6rem,24vw,22rem)]\",\"children\":\"void\"}]\n30:[\"$\",\"div\",null,{\"className\":\"relative mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 border-t border-line py-6 font-mono text-xs text-mute\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"© 2026 \",\"Parth Kapoor\",\" · \",\"MIT\"]}],[\"$\",\"span\",null,{\"children\":\"void-design.vercel.app\"}]]}]\n33:I[50835,[\"/_next/static/immutable/chunks/3kyyc8_ntqnp4.js\",\"/_next/static/immutable/chunks/1635pnmauuvxi.js\",\"/_next/static/immutable/chunks/10-jx0r2jtr5s.js\",\"/_next/static/immutable/chunks/2-9e3j82g4al3.js\",\"/_next/static/immutable/chunks/15spxoq7fze2b.js\"],\"DocsNav\"]\n32:T5db,{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https://void-design.vercel.app/docs/seo#webpage\",\"url\":\"https://void-design.vercel.app/docs/seo\",\"name\":\"seo skill: findable by search engines, AI engines and agents\",\"description\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\",\"isPartOf\":{\"@id\":\"https://void-design.vercel.app/#website\"},\"inLanguage\":\"en\",\"dateModified\":\"2026-09-16\"},{\"@type\":\"TechArticle\",\"@id\":\"https://void-design.vercel.app/docs/seo#article\",\"headline\":\"seo skill: findable by search engines, AI engines and agents\",\"description\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\",\"datePublished\":\"2026-09-16\",\"dateModified\":\"2026-09-16\",\"mainEntityOfPage\":{\"@id\":\"https://void-design.vercel.app/docs/seo#webpage\"},\"author\":{\"@id\":\"https://void-design.vercel.app/#organization\"},\"publisher\":{\"@id\":\"https://void-design.vercel.app/#organization\"},\"image\":[\"https://void-design.vercel.app/docs/seo/opengraph-image\"]},{\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"void\",\"item\":\"https://void-design.vercel.app/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"docs\",\"item\":\"https://void-design.vercel.app/docs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"seo\",\"item\":\"https://void-design.vercel.app/docs/seo\"}]}]}25:[\"$\",\"div\",null,{\"className\":\"px-(--gutter)\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$32\"}}],[\"$\",\"$L9\",null,{\"crumbs\":[{\"name\":\"void\",\"path\":\"/\"},{\"name\":\"docs\",\"path\":\"/docs\"},{\"name\":\"seo\",\"path\":\"/docs/seo\"}],\"kicker\":\"Skill · 07 of 09\",\"title\":[\"$\",\"span\",null,{\"className\":\"block text-[clamp(2.2rem,4.4vw,4.4rem)] leading-[0.98]\",\"children\":[\"seo\",[\"$\",\"span\",null,{\"className\":\"serif text-mute\",\"children\":[\" \",\"findable by search engines, AI engines and agents\"]}]]}],\"lead\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\",\"meta\":[[\"$\",\"span\",null,{\"children\":[\"skills/\",\"seo\",\"/SKILL.md\"]}],[\"$\",\"span\",null,{\"children\":[123,\" lines\"]}],[\"$\",\"span\",null,{\"children\":[5,\" references\"]}],[\"$\",\"span\",null,{\"children\":[\"updated \",\"16 Sept 2026\"]}]],\"scene\":\"ether\"}],[\"$\",\"div\",null,{\"className\":\"mx-auto grid max-w-7xl gap-x-12 lg:grid-cols-[13rem_minmax(0,1fr)] xl:grid-cols-[13rem_minmax(0,1fr)_12rem]\",\"children\":[[\"$\",\"div\",null,{\"className\":\"lg:hidden\",\"children\":[\"$\",\"button\",null,{\"type\":\"button\",\"popoverTarget\":\"docs-nav\",\"className\":\"flex h-11 w-full items-center gap-2.5 rounded-xl border border-line bg-bg-subtle px-4 text-sm text-fg transition-colors hover:border-line-strong\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":true,\"viewBox\":\"0 0 16 16\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":1.5,\"className\":\"size-4 text-fg-muted\",\"children\":[\"$\",\"path\",null,{\"d\":\"M2.5 5.5h11M2.5 10.5h11\",\"strokeLinecap\":\"round\"}]}],\"Browse docs\"]}]}],[\"$\",\"aside\",null,{\"id\":\"docs-nav\",\"aria-label\":\"Documentation sections\",\"popover\":\"auto\",\"data-lenis-prevent\":true,\"className\":\"docs-aside m-0 max-h-[80dvh] w-[min(20rem,calc(100vw-2rem))] overflow-y-auto overscroll-contain rounded-2xl border border-line bg-surface-raised p-5 text-fg shadow-3 [scrollbar-color:var(--line-strong)_transparent] [scrollbar-width:thin]\",\"children\":[\"$\",\"$L33\",null,{\"groups\":[{\"title\":\"Start\",\"items\":[{\"href\":\"/docs\",\"label\":\"Getting started\"},{\"href\":\"/cli\",\"label\":\"CLI reference\"},{\"href\":\"/rules\",\"label\":\"Rules\"},{\"href\":\"/directions\",\"label\":\"Directions\"}]},{\"title\":\"Skills\",\"items\":[{\"href\":\"/docs/website\",\"label\":\"website\"},{\"href\":\"/docs/website/copy-and-content\",\"label\":\"copy and content\",\"parent\":\"/docs/website\"},{\"href\":\"/docs/website/page-types\",\"label\":\"page types\",\"parent\":\"/docs/website\"},{\"href\":\"/docs/website/section-archetypes\",\"label\":\"section archetypes\",\"parent\":\"/docs/website\"},{\"href\":\"/docs/craft\",\"label\":\"craft\"},{\"href\":\"/docs/craft/anti-slop\",\"label\":\"anti slop\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/color\",\"label\":\"color\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/depth-and-detail\",\"label\":\"depth and detail\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/directions\",\"label\":\"directions\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/layout\",\"label\":\"layout\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/tailwind-v4\",\"label\":\"tailwind v4\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/craft/typography\",\"label\":\"typography\",\"parent\":\"/docs/craft\"},{\"href\":\"/docs/motion\",\"label\":\"motion\"},{\"href\":\"/docs/motion/3d-scenes\",\"label\":\"3d scenes\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/CREDITS\",\"label\":\"CREDITS\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/backgrounds\",\"label\":\"backgrounds\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/fallbacks\",\"label\":\"fallbacks\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/recipes\",\"label\":\"recipes\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/timing\",\"label\":\"timing\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/motion/webgl-canvas\",\"label\":\"webgl canvas\",\"parent\":\"/docs/motion\"},{\"href\":\"/docs/components\",\"label\":\"components\"},{\"href\":\"/docs/components/audit-checklist\",\"label\":\"audit checklist\",\"parent\":\"/docs/components\"},{\"href\":\"/docs/components/catalogue\",\"label\":\"catalogue\",\"parent\":\"/docs/components\"},{\"href\":\"/docs/components/recipes\",\"label\":\"recipes\",\"parent\":\"/docs/components\"},{\"href\":\"/docs/components/upstream-bugs\",\"label\":\"upstream bugs\",\"parent\":\"/docs/components\"},{\"href\":\"/docs/inspire\",\"label\":\"inspire\"},{\"href\":\"/docs/inspire/effect-downgrades\",\"label\":\"effect downgrades\",\"parent\":\"/docs/inspire\"},{\"href\":\"/docs/inspire/extraction-guide\",\"label\":\"extraction guide\",\"parent\":\"/docs/inspire\"},{\"href\":\"/docs/inspire/font-alternatives\",\"label\":\"font alternatives\",\"parent\":\"/docs/inspire\"},{\"href\":\"/docs/speed\",\"label\":\"speed\"},{\"href\":\"/docs/speed/images-fonts\",\"label\":\"images fonts\",\"parent\":\"/docs/speed\"},{\"href\":\"/docs/speed/next-performance\",\"label\":\"next performance\",\"parent\":\"/docs/speed\"},{\"href\":\"/docs/speed/react-pitfalls\",\"label\":\"react pitfalls\",\"parent\":\"/docs/speed\"},{\"href\":\"/docs/speed/rendering-smoothness\",\"label\":\"rendering smoothness\",\"parent\":\"/docs/speed\"},{\"href\":\"/docs/seo\",\"label\":\"seo\"},{\"href\":\"/docs/seo/ai-crawlers\",\"label\":\"ai crawlers\",\"parent\":\"/docs/seo\"},{\"href\":\"/docs/seo/content-for-citation\",\"label\":\"content for citation\",\"parent\":\"/docs/seo\"},{\"href\":\"/docs/seo/llms-txt-markdown\",\"label\":\"llms txt markdown\",\"parent\":\"/docs/seo\"},{\"href\":\"/docs/seo/next-metadata\",\"label\":\"next metadata\",\"parent\":\"/docs/seo\"},{\"href\":\"/docs/seo/structured-data\",\"label\":\"structured data\",\"parent\":\"/docs/seo\"},{\"href\":\"/docs/a11y\",\"label\":\"a11y\"},{\"href\":\"/docs/a11y/patterns\",\"label\":\"patterns\",\"parent\":\"/docs/a11y\"},{\"href\":\"/docs/audit\",\"label\":\"audit\"},{\"href\":\"/docs/audit/ci\",\"label\":\"ci\",\"parent\":\"/docs/audit\"},{\"href\":\"/docs/audit/commands\",\"label\":\"commands\",\"parent\":\"/docs/audit\"}]}]}]}],\"$L34\",\"$L35\"]}]]}]\n36:T629b,\u003cp\u003eClassic SEO is the foundation of GEO. Nearly all measurable AI-search visibility comes from being indexed, snippet-eligible and having complete raw HTML.\nCanonical implementations live in \u003ccode\u003etemplates/next/\u003c/code\u003e: \u003ccode\u003esrc/site.config.ts\u003c/code\u003e (facts), \u003ccode\u003esrc/content/pages.ts\u003c/code\u003e (page registry), \u003ccode\u003esrc/lib/seo.ts\u003c/code\u003e (\u003ccode\u003epageMetadata\u003c/code\u003e), \u003ccode\u003esrc/lib/schema.ts\u003c/code\u003e + \u003ccode\u003esrc/components/json-ld.tsx\u003c/code\u003e, \u003ccode\u003esrc/app/{sitemap.ts,robots.ts,manifest.ts,opengraph-image.tsx}\u003c/code\u003e, \u003ccode\u003esrc/app/llms.txt/route.ts\u003c/code\u003e, \u003ccode\u003esrc/app/md/[...slug]/route.ts\u003c/code\u003e, \u003ccode\u003enext.config.ts\u003c/code\u003e (\u003ccode\u003ehtmlLimitedBots\u003c/code\u003e, \u003ccode\u003e.md\u003c/code\u003e rewrites). Copy from there. The references hold the same code for other projects.\u003c/p\u003e\n\u003ch2 id=\"the-10-rules-that-matter-most\"\u003e\u003ca class=\"heading-anchor\" href=\"#the-10-rules-that-matter-most\"\u003eThe 10 rules that matter most\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eThe raw HTML response is complete.\u003c/strong\u003e Main content in reading order, full \u003ccode\u003e\u003chead\u003e\u003c/code\u003e, JSON-LD and \u003ccode\u003e\u003ca href\u003e\u003c/code\u003e links, without running JavaScript. OpenAI, Anthropic, Perplexity and Meta crawlers don\u0026#39;t execute JS.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExactly one \u003ccode\u003e\u003ctitle\u003e\u003c/code\u003e, \u003ccode\u003e\u003cmeta name=\"description\"\u003e\u003c/code\u003e and absolute \u003ccode\u003e\u003clink rel=\"canonical\"\u003e\u003c/code\u003e in \u003ccode\u003e\u003chead\u003e\u003c/code\u003e of the raw HTML\u003c/strong\u003e on every indexable page. The canonical is self-referential and set per page, \u003cstrong\u003enever in the root layout\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReal HTTP status codes.\u003c/strong\u003e 200 for pages, 404 for unknown URLs (never a 200 \u0026quot;not found\u0026quot;), 301/308 for moves. In Next, call \u003ccode\u003enotFound()\u003c/code\u003e \u003cstrong\u003ebefore\u003c/strong\u003e any \u003ccode\u003e\u003cSuspense\u003e\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKeep metadata static\u003c/strong\u003e (prerendered, or \u003ccode\u003e'use cache'\u003c/code\u003e). If a route must be request-time, add Googlebot and the AI bots to \u003ccode\u003ehtmlLimitedBots\u003c/code\u003e, or Next streams title and canonical into \u003ccode\u003e\u003cbody\u003e\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOne metadata helper\u003c/strong\u003e (\u003ccode\u003epageMetadata()\u003c/code\u003e) for every page. Next merges metadata \u003cstrong\u003eshallowly\u003c/strong\u003e, so a page\u0026#39;s \u003ccode\u003eopenGraph\u003c/code\u003e silently drops the layout\u0026#39;s \u003ccode\u003esiteName\u003c/code\u003e, \u003ccode\u003elocale\u003c/code\u003e and images.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOne \u003ccode\u003e\u003ch1\u003e\u003c/code\u003e per page\u003c/strong\u003e that matches the title\u0026#39;s topic. Landmarks \u003ccode\u003e\u003cheader\u003e\u003c/code\u003e, \u003ccode\u003e\u003cnav\u003e\u003c/code\u003e, \u003ccode\u003e\u003cmain\u003e\u003c/code\u003e, \u003ccode\u003e\u003cfooter\u003e\u003c/code\u003e; \u003ccode\u003e\u003carticle\u003e\u003c/code\u003e for posts.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStructured data describes only what is visible and true.\u003c/strong\u003e No invented ratings, reviews, prices or FAQs. One \u003ccode\u003e@graph\u003c/code\u003e with stable \u003ccode\u003e@id\u003c/code\u003es. Escape \u003ccode\u003e\u003c\u003c/code\u003e in JSON-LD.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003erobots.txt separates training bots from retrieval bots.\u003c/strong\u003e Blocking \u003ccode\u003eGPTBot\u003c/code\u003e is a business choice. Blocking \u003ccode\u003eOAI-SearchBot\u003c/code\u003e, \u003ccode\u003eClaude-SearchBot\u003c/code\u003e or \u003ccode\u003ePerplexityBot\u003c/code\u003e removes you from AI answers. Previews send \u003ccode\u003eDisallow: /\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSitemap \u003ccode\u003elastModified\u003c/code\u003e is the real content date\u003c/strong\u003e, never \u003ccode\u003enew Date()\u003c/code\u003e or the build time. Exclude noindex, auth and utility routes.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWrite to be quoted.\u003c/strong\u003e Answer first, then evidence: numbers with units and dates, links to primary sources, named quotes. Keep key facts visible, not hidden in tabs or images.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"the-four-readers-design-for-the-weakest\"\u003e\u003ca class=\"heading-anchor\" href=\"#the-four-readers-design-for-the-weakest\"\u003eThe four readers (design for the weakest)\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 1\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eReader\u003c/th\u003e\n\u003cth\u003eExamples\u003c/th\u003e\n\u003cth\u003eRuns JS?\u003c/th\u003e\n\u003cth\u003eNeeds\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003eRendering search crawler\u003c/td\u003e\n\u003ctd\u003eGooglebot, Applebot\u003c/td\u003e\n\u003ctd\u003eYes, deferred\u003c/td\u003e\n\u003ctd\u003eRaw \u003ccode\u003e\u003chead\u003e\u003c/code\u003e (canonical, robots) + rendered DOM\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHTML-only index crawler\u003c/td\u003e\n\u003ctd\u003eBingbot (feeds Copilot and ChatGPT search), OAI-SearchBot, Claude-SearchBot, PerplexityBot\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eNo\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eEverything in raw HTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser-triggered fetcher\u003c/td\u003e\n\u003ctd\u003eChatGPT-User, Claude-User, Perplexity-User\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eRaw HTML; may ignore robots.txt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgent / coding tool\u003c/td\u003e\n\u003ctd\u003eClaude Code, Cursor, Codex\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eClean HTML, \u003ccode\u003e/llms.txt\u003c/code\u003e, \u003ccode\u003e.md\u003c/code\u003e mirrors\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eTest: \u003ccode\u003ecurl -sA \"GPTBot/1.4\" https://site/page | grep -c \"\u003cmain\"\u003c/code\u003e. If the text isn\u0026#39;t there, it doesn\u0026#39;t exist for most AI search.\u003c/p\u003e\n\u003ch2 id=\"must-ship-checklist-per-page-type\"\u003e\u003ca class=\"heading-anchor\" href=\"#must-ship-checklist-per-page-type\"\u003eMust-ship checklist per page type\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 2\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage\u003c/th\u003e\n\u003cth\u003eMust emit\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eRoot layout\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emetadataBase\u003c/code\u003e; \u003ccode\u003etitle: { default, template: \"%s | Brand\" }\u003c/code\u003e; description; \u003ccode\u003eopenGraph.siteName\u003c/code\u003e + \u003ccode\u003elocale\u003c/code\u003e; \u003ccode\u003etwitter.card: \"summary_large_image\"\u003c/code\u003e; \u003ccode\u003erobots.googleBot[\"max-image-preview\"]: \"large\"\u003c/code\u003e; \u003ccode\u003eviewport.themeColor\u003c/code\u003e (light/dark); \u003ccode\u003e\u003chtml lang\u003e\u003c/code\u003e; landmarks; \u003ccode\u003e\u003clink rel=\"describedby\" href=\"/llms.txt\"\u003e\u003c/code\u003e. \u003cstrong\u003eNo canonical here.\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eHome\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecanonical: \"/\"\u003c/code\u003e; Organization + WebSite in the \u003ccode\u003e@graph\u003c/code\u003e (on this page or emitted from the root layout); \u003ccode\u003eopengraph-image\u003c/code\u003e; one h1 naming what the product is and who it\u0026#39;s for; first paragraph states it in 1–2 sentences\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eContent page\u003c/strong\u003e (about, features, pricing)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epageMetadata({ path, title, description })\u003c/code\u003e; BreadcrumbList if nested; one h1; descriptive h2s; comparison \u003ccode\u003e\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 3\"\u003e\u003ctable\u003e\u003c/code\u003e where relevant\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eArticle / blog post\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epageMetadata({ type: \"article\", publishedTime, modifiedTime })\u003c/code\u003e; BlogPosting + BreadcrumbList; visible byline + \u003ccode\u003e\u003ctime dateTime\u003e\u003c/code\u003e \u0026quot;Updated\u0026quot; date matching JSON-LD; per-post \u003ccode\u003eopengraph-image\u003c/code\u003e; \u003ccode\u003e.md\u003c/code\u003e mirror; \u003ccode\u003egenerateStaticParams\u003c/code\u003e + \u003ccode\u003edynamicParams = false\u003c/code\u003e or \u003ccode\u003enotFound()\u003c/code\u003e before Suspense\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eProduct / app / pricing\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eProduct (buyable goods) or SoftwareApplication with the real, visible price. Add \u003ccode\u003eaggregateRating\u003c/code\u003e \u003cstrong\u003eonly\u003c/strong\u003e when real ratings are shown on the page (without it SoftwareApplication is valid but not rich-result eligible). Prices in visible text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eDocs page\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eTechArticle + BreadcrumbList; \u003ccode\u003e.md\u003c/code\u003e mirror advertised with \u003ccode\u003ealternates.types[\"text/markdown\"]\u003c/code\u003e; listed in llms.txt; stable URLs; version in text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAuthor page\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eProfilePage + Person with \u003ccode\u003esameAs\u003c/code\u003e; linked from \u003ccode\u003eArticle.author.url\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eApp / auth / search results\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erobots: { index: false, follow: true }\u003c/code\u003e; not in sitemap, llms.txt or internal nav meant for crawlers; \u003ccode\u003e/login\u003c/code\u003e never canonicalizes to \u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSite-wide files\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erobots.ts\u003c/code\u003e (preview guard + AI policy + \u003ccode\u003esitemap\u003c/code\u003e), \u003ccode\u003esitemap.ts\u003c/code\u003e, \u003ccode\u003ellms.txt\u003c/code\u003e, \u003ccode\u003emanifest.ts\u003c/code\u003e, \u003ccode\u003efavicon.ico\u003c/code\u003e \u003cstrong\u003eplus\u003c/strong\u003e \u003ccode\u003eicon.png\u003c/code\u003e (Google doesn\u0026#39;t list SVG favicons), \u003ccode\u003eapple-icon\u003c/code\u003e 180×180, 404 page returning 404\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003ch2 id=\"metadata-rules\"\u003e\u003ca class=\"heading-anchor\" href=\"#metadata-rules\"\u003eMetadata rules\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTitle:\u003c/strong\u003e unique, 10–60 chars, \u003ccode\u003eTopic | Brand\u003c/code\u003e. The brand name appears in every title; the home page uses an absolute tagline title (the helper does this for \u003ccode\u003epath: \"/\"\u003c/code\u003e). Don\u0026#39;t put a plain string \u003ccode\u003etitle\u003c/code\u003e in a nested \u003ccode\u003elayout.tsx\u003c/code\u003e: it resets the template for every child page.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDescription:\u003c/strong\u003e unique, 50–160 chars, a summary sentence rather than a keyword list. Fill it on every page.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCanonical:\u003c/strong\u003e absolute (via \u003ccode\u003emetadataBase\u003c/code\u003e), no fragment, one URL form site-wide (https, one host, no trailing slash in Next\u0026#39;s default). The same form in sitemap, internal links and hreflang. Never combine \u003ccode\u003enoindex\u003c/code\u003e with a cross-page canonical.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOG:\u003c/strong\u003e \u003ccode\u003eog:title\u003c/code\u003e, \u003ccode\u003eog:type\u003c/code\u003e, \u003ccode\u003eog:image\u003c/code\u003e (1200×630 PNG/JPEG, absolute, ≤ 8 MB, not SVG), \u003ccode\u003eog:url\u003c/code\u003e = canonical, \u003ccode\u003eog:site_name\u003c/code\u003e, \u003ccode\u003eog:locale\u003c/code\u003e. Use the file convention \u003ccode\u003eopengraph-image.tsx\u003c/code\u003e per section or post. It also fills \u003ccode\u003etwitter:image\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eViewport:\u003c/strong\u003e Next adds \u003ccode\u003ewidth=device-width, initial-scale=1\u003c/code\u003e. Never add \u003ccode\u003emaximum-scale=1\u003c/code\u003e or \u003ccode\u003euser-scalable=no\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003ekeywords\u003c/code\u003e meta is useless.\u003c/strong\u003e Don\u0026#39;t spend tokens on it.\u003c/li\u003e\n\u003cli\u003eDon\u0026#39;t set \u003ccode\u003enosnippet\u003c/code\u003e or a low \u003ccode\u003emax-snippet\u003c/code\u003e; they also remove you from AI Overviews. Put \u003ccode\u003edata-nosnippet\u003c/code\u003e only on cookie banners and boilerplate.\u003c/li\u003e\n\u003cli\u003eUncompressed HTML \u0026lt; 1 MB (Googlebot stops at 2 MB, and the inlined RSC payload roughly doubles text weight).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRecipes: \u003ca class=\"code-link\" href=\"/docs/seo/next-metadata\"\u003e\u003ccode\u003ereferences/next-metadata.md\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"next-js-16-traps-verified-on-16-3-5\"\u003e\u003ca class=\"heading-anchor\" href=\"#next-js-16-traps-verified-on-16-3-5\"\u003eNext.js 16 traps (verified on 16.3.5)\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 4\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTrap\u003c/th\u003e\n\u003cth\u003eSymptom\u003c/th\u003e\n\u003cth\u003eFix\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eStreaming metadata.\u003c/strong\u003e A request-time \u003ccode\u003egenerateMetadata\u003c/code\u003e (using \u003ccode\u003ecookies()\u003c/code\u003e, \u003ccode\u003eheaders()\u003c/code\u003e, \u003ccode\u003econnection()\u003c/code\u003e or uncached fetches) streams \u003ccode\u003e\u003ctitle\u003e\u003c/code\u003e/canonical into \u003ccode\u003e\u003cbody\u003e\u003c/code\u003e for every UA not in \u003ccode\u003ehtmlLimitedBots\u003c/code\u003e. The default list has \u003cstrong\u003eno AI bots and no Googlebot\u003c/strong\u003e. Google only accepts canonical in \u003ccode\u003e\u003chead\u003e\u003c/code\u003e. Suspense content arrives in \u003ccode\u003e\u003cdiv hidden id=\"S:n\"\u003e\u003c/code\u003e, out of order\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecurl -A GPTBot\u003c/code\u003e shows \u003ccode\u003e\u003clink rel=\"canonical\"\u003e\u003c/code\u003e after \u003ccode\u003e\u003c/head\u003e\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrefer static metadata (\u003ccode\u003egenerateStaticParams\u003c/code\u003e, \u003ccode\u003e'use cache'\u003c/code\u003e). Otherwise extend \u003ccode\u003ehtmlLimitedBots\u003c/code\u003e \u003cstrong\u003eand keep Next\u0026#39;s default list in the regex\u003c/strong\u003e (setting it replaces the default). Recipe: \u003ccode\u003enext-metadata.md\u003c/code\u003e §3\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003enotFound()\u003c/code\u003e inside Suspense → HTTP 200\u003c/strong\u003e + \u003ccode\u003e\u003cmeta name=\"robots\" content=\"noindex\"\u003e\u003c/code\u003e (soft 404)\u003c/td\u003e\n\u003ctd\u003eUnknown slug returns 200\u003c/td\u003e\n\u003ctd\u003eLook up the entity at the top of \u003ccode\u003epage.tsx\u003c/code\u003e/\u003ccode\u003egenerateMetadata\u003c/code\u003e and call \u003ccode\u003enotFound()\u003c/code\u003e before rendering any \u003ccode\u003e\u003cSuspense\u003e\u003c/code\u003e. Or \u003ccode\u003edynamicParams = false\u003c/code\u003e. Same for \u003ccode\u003eredirect()\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eShallow merge.\u003c/strong\u003e A page\u0026#39;s \u003ccode\u003eopenGraph\u003c/code\u003e replaces the layout\u0026#39;s whole \u003ccode\u003eopenGraph\u003c/code\u003e (loses \u003ccode\u003esiteName\u003c/code\u003e, \u003ccode\u003elocale\u003c/code\u003e, \u003ccode\u003eimages\u003c/code\u003e). A page\u0026#39;s \u003ccode\u003ealternates\u003c/code\u003e drops the layout\u0026#39;s \u003ccode\u003ealternates.types\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eog:site_name\u003c/code\u003e missing on subpages\u003c/td\u003e\n\u003ctd\u003eAlways build page metadata with \u003ccode\u003epageMetadata()\u003c/code\u003e, which re-adds every field\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAsync params.\u003c/strong\u003e \u003ccode\u003eparams\u003c/code\u003e, \u003ccode\u003esearchParams\u003c/code\u003e, \u003ccode\u003egenerateSitemaps\u003c/code\u003e \u003ccode\u003eid\u003c/code\u003e and \u003ccode\u003egenerateImageMetadata\u003c/code\u003e \u003ccode\u003eid\u003c/code\u003e are Promises in 16\u003c/td\u003e\n\u003ctd\u003eType errors or \u003ccode\u003eundefined\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econst { slug } = await params\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003emiddleware\u003c/code\u003e → \u003ccode\u003eproxy\u003c/code\u003e.\u003c/strong\u003e The file is \u003ccode\u003eproxy.ts\u003c/code\u003e and exports \u003ccode\u003eproxy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMiddleware silently not running\u003c/td\u003e\n\u003ctd\u003eRename\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003egenerateSitemaps\u003c/code\u003e makes no index\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/sitemap.xml\u003c/code\u003e lists nothing for split sitemaps\u003c/td\u003e\n\u003ctd\u003eAdd a \u003ccode\u003esitemap-index.xml\u003c/code\u003e route (\u003ccode\u003enext-metadata.md\u003c/code\u003e §6)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003eVary: Accept\u003c/code\u003e overwritten\u003c/strong\u003e on prerendered HTML\u003c/td\u003e\n\u003ctd\u003eCDN serves Markdown to browsers when negotiating\u003c/td\u003e\n\u003ctd\u003eUse explicit \u003ccode\u003e.md\u003c/code\u003e URLs, not \u003ccode\u003eAccept\u003c/code\u003e negotiation (\u003ccode\u003ellms-txt-markdown.md\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003ch2 id=\"structured-data-policy\"\u003e\u003ca class=\"heading-anchor\" href=\"#structured-data-policy\"\u003eStructured data policy\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eStill yields Google rich results or knowledge features:\u003c/strong\u003e Organization, WebSite (site name), BreadcrumbList, Article/BlogPosting/NewsArticle, Product (snippet or merchant listing), SoftwareApplication (\u003cstrong\u003erequires \u003ccode\u003eaggregateRating\u003c/code\u003e or \u003ccode\u003ereview\u003c/code\u003e\u003c/strong\u003e), ProfilePage, VideoObject, Event, QAPage/DiscussionForumPosting, Recipe, JobPosting, LocalBusiness.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGone. Don\u0026#39;t add for rich results:\u003c/strong\u003e FAQPage (not shown since 2026-05-07), HowTo (2023), sitelinks SearchAction (2024-11), plus ClaimReview, course info, estimated salary, vehicle listing, special announcement, practice problem.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNever fabricate.\u003c/strong\u003e Every \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003eheadline\u003c/code\u003e, \u003ccode\u003eprice\u003c/code\u003e, \u003ccode\u003eratingValue\u003c/code\u003e, \u003ccode\u003eauthor.name\u003c/code\u003e must appear in the visible text. No self-serving reviews on your own Organization. \u0026quot;Only publish what exists.\u0026quot;\u003c/li\u003e\n\u003cli\u003eJSON-LD is server-rendered in raw HTML via a native \u003ccode\u003e\u003cscript type=\"application/ld+json\"\u003e\u003c/code\u003e (not \u003ccode\u003enext/script\u003c/code\u003e), with \u003ccode\u003e\u003c\u003c/code\u003e escaped as \u003ccode\u003e\\u003c\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eOrganization + WebSite: once per page graph, on the home page at minimum (the template emits them from the root layout). Other nodes reference \u003ccode\u003e{\"@id\": \"https://site/#organization\"}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eDates are ISO 8601 with a timezone. \u003ccode\u003edateModified ≥ datePublished\u003c/code\u003e, matching the visible date.\u003c/li\u003e\n\u003cli\u003eTypes, required properties and a \u003ccode\u003e@graph\u003c/code\u003e builder: \u003ca class=\"code-link\" href=\"/docs/seo/structured-data\"\u003e\u003ccode\u003ereferences/structured-data.md\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"robots-txt-and-ai-policy\"\u003e\u003ca class=\"heading-anchor\" href=\"#robots-txt-and-ai-policy\"\u003erobots.txt and AI policy\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 5\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGroup\u003c/th\u003e\n\u003cth\u003eTokens\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003eSearch engines\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eGooglebot\u003c/code\u003e, \u003ccode\u003eBingbot\u003c/code\u003e, \u003ccode\u003eApplebot\u003c/code\u003e, \u003ccode\u003eDuckDuckBot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAI \u003cstrong\u003eretrieval\u003c/strong\u003e (cites you in answers)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eOAI-SearchBot\u003c/code\u003e, \u003ccode\u003eClaude-SearchBot\u003c/code\u003e, \u003ccode\u003ePerplexityBot\u003c/code\u003e, \u003ccode\u003eDuckAssistBot\u003c/code\u003e, \u003ccode\u003eMistralAI-Index\u003c/code\u003e, \u003ccode\u003eAmzn-SearchBot\u003c/code\u003e, \u003ccode\u003emeta-webindexer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eAllow\u003c/strong\u003e (blocking removes you from ChatGPT search, Claude and Perplexity answers)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAI \u003cstrong\u003euser fetchers\u003c/strong\u003e (a person asked)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eChatGPT-User\u003c/code\u003e, \u003ccode\u003eClaude-User\u003c/code\u003e, \u003ccode\u003ePerplexity-User\u003c/code\u003e, \u003ccode\u003eMistralAI-User\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow (several ignore robots anyway)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAI \u003cstrong\u003etraining\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eGPTBot\u003c/code\u003e, \u003ccode\u003eClaudeBot\u003c/code\u003e, \u003ccode\u003eGoogle-Extended\u003c/code\u003e, \u003ccode\u003eApplebot-Extended\u003c/code\u003e, \u003ccode\u003eCCBot\u003c/code\u003e, \u003ccode\u003emeta-externalagent\u003c/code\u003e, \u003ccode\u003eAmazonbot\u003c/code\u003e, \u003ccode\u003eMistralAI-Training\u003c/code\u003e, \u003ccode\u003eBytespider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOwner\u0026#39;s choice (\u003ccode\u003esite.ai.training\u003c/code\u003e in \u003ccode\u003esite.config.ts\u003c/code\u003e; template default: disallow). Blocking doesn\u0026#39;t affect search or AI Overviews\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cul\u003e\n\u003cli\u003eA bot obeys \u003cstrong\u003eonly its most specific group\u003c/strong\u003e. Repeat \u003ccode\u003eDisallow: /api/\u003c/code\u003e in every named group.\u003c/li\u003e\n\u003cli\u003ePreviews and staging: \u003ccode\u003eDisallow: /\u003c/code\u003e (keyed on \u003ccode\u003eVERCEL_ENV\u003c/code\u003e or equivalent). Production never.\u003c/li\u003e\n\u003cli\u003eDon\u0026#39;t disallow pages that carry \u003ccode\u003enoindex\u003c/code\u003e; crawlers must fetch them to see it. Don\u0026#39;t block \u003ccode\u003e/_next/\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eGoogle-Extended\u003c/code\u003e doesn\u0026#39;t remove you from AI Overviews. Only \u003ccode\u003enoindex\u003c/code\u003e/\u003ccode\u003enosnippet\u003c/code\u003e does.\u003c/li\u003e\n\u003cli\u003eFull crawler table + \u003ccode\u003erobots.ts\u003c/code\u003e: \u003ca class=\"code-link\" href=\"/docs/seo/ai-crawlers\"\u003e\u003ccode\u003ereferences/ai-crawlers.md\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"llms-txt-and-markdown-mirrors-cheap-extras-info-level\"\u003e\u003ca class=\"heading-anchor\" href=\"#llms-txt-and-markdown-mirrors-cheap-extras-info-level\"\u003ellms.txt and Markdown mirrors (cheap extras, \u003ccode\u003einfo\u003c/code\u003e level)\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eShip \u003ccode\u003e/llms.txt\u003c/code\u003e: \u003ccode\u003e# Brand\u003c/code\u003e, a \u003ccode\u003e\u003e one-sentence summary\u003c/code\u003e, curated \u003ccode\u003e## Docs\u003c/code\u003e / \u003ccode\u003e## Blog\u003c/code\u003e link lists pointing to \u003ccode\u003e.md\u003c/code\u003e URLs, and \u003ccode\u003e## Optional\u003c/code\u003e. It\u0026#39;s under 100 KB and prerendered.\u003c/li\u003e\n\u003cli\u003eIt mainly serves \u003cstrong\u003ecoding agents\u003c/strong\u003e, not answer engines: 97% of llms.txt files got zero requests in a 137K-domain study, and Google says it doesn\u0026#39;t use them. Never claim it improves ranking. A 5xx is an error (Lighthouse fails it); a missing file is fine.\u003c/li\u003e\n\u003cli\u003eDocs and posts: \u003ccode\u003epage.md\u003c/code\u003e mirror with \u003ccode\u003eX-Robots-Tag: noindex\u003c/code\u003e + \u003ccode\u003eLink: \u003chtml-url\u003e; rel=\"canonical\"\u003c/code\u003e, advertised with \u003ccode\u003e\u003clink rel=\"alternate\" type=\"text/markdown\"\u003e\u003c/code\u003e. Not in the sitemap.\u003c/li\u003e\n\u003cli\u003eRecipes: \u003ca class=\"code-link\" href=\"/docs/seo/llms-txt-markdown\"\u003e\u003ccode\u003ereferences/llms-txt-markdown.md\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"content-that-gets-cited\"\u003e\u003ca class=\"heading-anchor\" href=\"#content-that-gets-cited\"\u003eContent that gets cited\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvidence (KDD 2024 GEO study, NeurIPS 2025 C-SEO Bench, Microsoft and Google guidance): adding \u003cstrong\u003ecitations, statistics and quotations\u003c/strong\u003e lifted AI visibility 30–40%, most for pages not ranked #1. Keyword stuffing and \u0026quot;authoritative tone\u0026quot; did nothing. AI engines favor third-party (earned) coverage.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eAnswer first.\u003c/strong\u003e The first paragraph under the h1 and under each question-style h2 answers in 1–2 self-contained sentences (≤ 320 chars) that name the entity (\u0026quot;Acme is…\u0026quot;, not \u0026quot;It is…\u0026quot;).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEvidence.\u003c/strong\u003e Numbers with units and dates (\u0026quot;cuts build time from 47 s to 4.5 s, measured Sept 2026\u0026quot;), links to primary sources, \u003ccode\u003e\u003cblockquote cite\u003e\u003c/code\u003e quotes from named people.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStructure.\u003c/strong\u003e Descriptive h2/h3 (often questions users ask), \u003ccode\u003e\u003cul\u003e\u003c/code\u003e/\u003ccode\u003e\u003col\u003e\u003c/code\u003e for steps, \u003ccode\u003e\u003cdiv class=\"table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Table 6\"\u003e\u003ctable\u003e\u003c/code\u003e for comparisons and specs, and paragraphs under ~150 words.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEntity clarity.\u003c/strong\u003e The same brand and product name in title, h1, \u003ccode\u003eog:site_name\u003c/code\u003e, JSON-LD \u003ccode\u003ename\u003c/code\u003e and the llms.txt H1. A clear \u0026quot;what it is / who it\u0026#39;s for / pricing / license\u0026quot; block.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFreshness.\u003c/strong\u003e A visible \u0026quot;Updated\u0026quot; date that matches \u003ccode\u003edateModified\u003c/code\u003e and sitemap \u003ccode\u003elastmod\u003c/code\u003e. Update facts, not just dates.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVisible.\u003c/strong\u003e Key facts are not only in images, video, PDFs, canvas, carousels or closed tabs. Use \u003ccode\u003e\u003cdetails open\u003e\u003c/code\u003e or plain sections.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNon-commodity.\u003c/strong\u003e First-hand data, benchmarks, original examples, clear opinions. Near-duplicate pages get clustered and only one is used.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eDon\u0026#39;t: generate keyword-variant pages, rewrite content \u0026quot;for AI\u0026quot;, chunk into micro-pages, add FAQPage for rich results, or fake mentions. Patterns and examples: \u003ca class=\"code-link\" href=\"/docs/seo/content-for-citation\"\u003e\u003ccode\u003ereferences/content-for-citation.md\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"verify\"\u003e\u003ca class=\"heading-anchor\" href=\"#verify\"\u003eVerify\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003evoid lint\u003c/code\u003e (static): \u003ca class=\"code-link\" href=\"/rules/lint/missing-metadata-base\"\u003e\u003ccode\u003elint/missing-metadata-base\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-metadata\"\u003e\u003ccode\u003elint/missing-metadata\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/canonical-in-root-layout\"\u003e\u003ccode\u003elint/canonical-in-root-layout\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/og-merge-drops-parent\"\u003e\u003ccode\u003elint/og-merge-drops-parent\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/not-found-in-suspense\"\u003e\u003ccode\u003elint/not-found-in-suspense\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/dynamic-metadata-streaming\"\u003e\u003ccode\u003elint/dynamic-metadata-streaming\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/page-level-use-client\"\u003e\u003ccode\u003elint/page-level-use-client\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/dangerously-set-jsonld-unescaped\"\u003e\u003ccode\u003elint/dangerously-set-jsonld-unescaped\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/jsonld-deprecated-type\"\u003e\u003ccode\u003elint/jsonld-deprecated-type\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/sitemap-lastmod-now\"\u003e\u003ccode\u003elint/sitemap-lastmod-now\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-sitemap\"\u003e\u003ccode\u003elint/missing-sitemap\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-robots\"\u003e\u003ccode\u003elint/missing-robots\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-og-image\"\u003e\u003ccode\u003elint/missing-og-image\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-icon\"\u003e\u003ccode\u003elint/missing-icon\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-llms-txt\"\u003e\u003ccode\u003elint/missing-llms-txt\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/missing-alt\"\u003e\u003ccode\u003elint/missing-alt\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/lint/multiple-h1\"\u003e\u003ccode\u003elint/multiple-h1\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enext build\u003c/code\u003e, then \u003ccode\u003evoid seo --start \"next start -p 3000\" --port 3000 --format md\u003c/code\u003e: status codes (\u003ca class=\"code-link\" href=\"/rules/seo/http-status\"\u003e\u003ccode\u003eseo/http-status\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/soft-404\"\u003e\u003ccode\u003eseo/soft-404\u003c/code\u003e\u003c/a\u003e), head placement per UA (\u003ca class=\"code-link\" href=\"/rules/seo/metadata-in-body\"\u003e\u003ccode\u003eseo/metadata-in-body\u003c/code\u003e\u003c/a\u003e), canonical (\u003ccode\u003eseo/canonical-*\u003c/code\u003e), titles/descriptions, h1, links, OG image fetch, icons, robots.txt, sitemap. Include an unknown URL in \u003ccode\u003e--routes\u003c/code\u003e (e.g. \u003ccode\u003e/this-page-does-not-exist\u003c/code\u003e) to prove 404s.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evoid geo\u003c/code\u003e (same flags): raw-vs-rendered content (\u003ca class=\"code-link\" href=\"/rules/geo/js-dependency\"\u003e\u003ccode\u003egeo/js-dependency\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/hidden-streamed-content\"\u003e\u003ccode\u003egeo/hidden-streamed-content\u003c/code\u003e\u003c/a\u003e), JSON-LD (\u003ca class=\"code-link\" href=\"/rules/geo/jsonld-parse-error\"\u003e\u003ccode\u003egeo/jsonld-parse-error\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/jsonld-required\"\u003e\u003ccode\u003egeo/jsonld-required\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/jsonld-not-visible\"\u003e\u003ccode\u003egeo/jsonld-not-visible\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/faq-deprecated\"\u003e\u003ccode\u003egeo/faq-deprecated\u003c/code\u003e\u003c/a\u003e), AI robots (\u003ca class=\"code-link\" href=\"/rules/geo/search-bots-blocked\"\u003e\u003ccode\u003egeo/search-bots-blocked\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/robots-ai-policy\"\u003e\u003ccode\u003egeo/robots-ai-policy\u003c/code\u003e\u003c/a\u003e), llms.txt (\u003ccode\u003egeo/llms-txt-*\u003c/code\u003e), Markdown mirrors (\u003ccode\u003egeo/markdown-*\u003c/code\u003e), content heuristics (\u003ca class=\"code-link\" href=\"/rules/geo/answer-first\"\u003e\u003ccode\u003egeo/answer-first\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/no-citations\"\u003e\u003ccode\u003egeo/no-citations\u003c/code\u003e\u003c/a\u003e, info level).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGates must pass\u003c/strong\u003e (each caps the score at 49): \u003ca class=\"code-link\" href=\"/rules/seo/http-status\"\u003e\u003ccode\u003eseo/http-status\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/noindex\"\u003e\u003ccode\u003eseo/noindex\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/canonical-missing\"\u003e\u003ccode\u003eseo/canonical-missing\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/canonical-invalid\"\u003e\u003ccode\u003eseo/canonical-invalid\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/canonical-broken\"\u003e\u003ccode\u003eseo/canonical-broken\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/robots-blocks-all\"\u003e\u003ccode\u003eseo/robots-blocks-all\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/seo/sitemap-url-status\"\u003e\u003ccode\u003eseo/sitemap-url-status\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/js-dependency\"\u003e\u003ccode\u003egeo/js-dependency\u003c/code\u003e\u003c/a\u003e, \u003ca class=\"code-link\" href=\"/rules/geo/jsonld-parse-error\"\u003e\u003ccode\u003egeo/jsonld-parse-error\u003c/code\u003e\u003c/a\u003e. Targets: seo ≥ 95, geo ≥ 90. \u003ccode\u003einfo\u003c/code\u003e GEO findings are review prompts, not failures.\u003c/li\u003e\n\u003cli\u003eManual spot checks: \u003ccode\u003ecurl -sA \"Googlebot/2.1\" URL | head -c 3000\u003c/code\u003e; Google Rich Results Test for new types; Search Console and Bing Webmaster Tools \u0026quot;AI Performance\u0026quot; after launch. Details: the \u003ca class=\"code-link\" href=\"/docs/audit\"\u003e\u003ccode\u003eaudit\u003c/code\u003e\u003c/a\u003e skill.\u003c/li\u003e\n\u003c/ol\u003e\n34:[\"$\",\"article\",null,{\"className\":\"min-w-0 max-w-[68ch] pt-8 lg:pt-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"relative overflow-hidden rounded-2xl border border-line bg-bg-subtle p-5\",\"children\":[[\"$\",\"span\",null,{\"aria-hidden\":\"true\",\"className\":\"absolute inset-y-0 left-0 w-px bg-gradient-to-b from-flare-2 via-flare to-transparent\"}],[\"$\",\"p\",null,{\"className\":\"label-mono text-brand-text\",\"children\":\"When Claude Code loads it\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-fg-muted\",\"children\":\"Use when building or launching any public website, landing page, blog, docs or product page; when adding pages, metadata, generateMetadata, sitemap, robots, OG images or schema; when asked about SEO, AI SEO, GEO, AEO, llms.txt, rich results, or \\\"why isn't my site showing in Google/ChatGPT\\\"; or when `void seo` or `void geo` report findings.\"}]]}],[\"$\",\"div\",null,{\"className\":\"prose mt-10\",\"dangerouslySetInnerHTML\":{\"__html\":\"$36\"}}],\"$L37\"]}]\n35:[\"$\",\"aside\",null,{\"aria-label\":\"Page contents\",\"className\":\"hidden xl:block\",\"children\":[\"$\",\"div\",null,{\"data-lenis-prevent\":true,\"className\":\"sticky top-(--header-h) max-h-[calc(100dvh-var(--header-h))] overflow-y-auto pt-4 pb-10 [scrollbar-width:thin]\",\"children\":[\"$\",\"nav\",null,{\"aria-label\":\"On this page\",\"className\":\"text-sm\",\"children\":[[\"$\",\"p\",null,{\"className\":\"label-mono mb-3 text-fg-muted\",\"children\":\"On this page\"}],[\"$\",\"ul\",null,{\"className\":\"grid gap-1.5 border-l border-line-subtle\",\"children\":[[\"$\",\"li\",\"the-10-rules-that-matter-most\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#the-10-rules-that-matter-most\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"The 10 rules that matter most\"}]}],[\"$\",\"li\",\"the-four-readers-design-for-the-weakest\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#the-four-readers-design-for-the-weakest\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"The four readers (design for the weakest)\"}]}],[\"$\",\"li\",\"must-ship-checklist-per-page-type\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#must-ship-checklist-per-page-type\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Must-ship checklist per page type\"}]}],[\"$\",\"li\",\"metadata-rules\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#metadata-rules\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Metadata rules\"}]}],[\"$\",\"li\",\"next-js-16-traps-verified-on-16-3-5\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#next-js-16-traps-verified-on-16-3-5\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Next.js 16 traps (verified on 16.3.5)\"}]}],[\"$\",\"li\",\"structured-data-policy\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#structured-data-policy\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Structured data policy\"}]}],[\"$\",\"li\",\"robots-txt-and-ai-policy\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#robots-txt-and-ai-policy\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"robots.txt and AI policy\"}]}],[\"$\",\"li\",\"llms-txt-and-markdown-mirrors-cheap-extras-info-level\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#llms-txt-and-markdown-mirrors-cheap-extras-info-level\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"llms.txt and Markdown mirrors (cheap extras, info level)\"}]}],[\"$\",\"li\",\"content-that-gets-cited\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#content-that-gets-cited\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Content that gets cited\"}]}],[\"$\",\"li\",\"verify\",{\"children\":[\"$\",\"a\",null,{\"href\":\"#verify\",\"className\":\"block py-0.5 pr-2 text-fg-muted transition-colors duration-(--duration-fast) hover:text-fg pl-4\",\"children\":\"Verify\"}]}]]}]]}]}]}]\n37:[\"$\",\"footer\",null,{\"className\":\"mt-16 border-t border-line-subtle pt-8 pb-20\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex flex-wrap items-center justify-between gap-3 font-mono text-xs text-fg-muted\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"Updated \",[\"$\",\"time\",null,{\"dateTime\":\"2026-09-16\",\"children\":\"16 Sept 2026\"}]]}],[\"$\",\"span\",null,{\"className\":\"flex gap-4\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/docs/seo.md\",\"className\":\"hover:text-fg\",\"children\":\"View as Markdown\"}],[\"$\",\"a\",null,{\"href\":\"https://github.com/ParthKapoor-dev/design/blob/main/skills/seo/SKILL.md\",\"rel\":\"noopener noreferrer\",\"className\":\"hover:text-fg\",\"children\":\"Edit on GitHub\"}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mt-8 grid gap-3 sm:grid-cols-2\",\"children\":[[\"$\",\"$La\",null,{\"href\":\"/docs/speed/rendering-smoothness\",\"className\":\"press group flex flex-col gap-1 rounded-lg border border-line-subtle p-4 transition-colors duration-(--duration-fast) hover:border-line-strong\",\"children\":[[\"$\",\"span\",null,{\"className\":\"label-mono flex items-center gap-1.5 text-fg-muted\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":true,\"viewBox\":\"0 0 16 16\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":1.5,\"className\":\"size-3\",\"children\":[\"$\",\"path\",null,{\"d\":\"M13 8H3.5M7.5 4l-4 4 4 4\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\"}]}],\" Previous\"]}],[\"$\",\"span\",null,{\"className\":\"text-sm text-fg\",\"children\":\"speed: rendering smoothness\"}]]}],[\"$\",\"$La\",null,{\"href\":\"/docs/seo/ai-crawlers\",\"className\":\"press group flex flex-col items-end gap-1 rounded-lg border border-line-subtle p-4 text-right transition-colors duration-(--duration-fast) hover:border-line-strong\",\"children\":[[\"$\",\"span\",null,{\"className\":\"label-mono flex items-center gap-1.5 text-fg-muted\",\"children\":[\"Next \",[\"$\",\"svg\",null,{\"aria-hidden\":true,\"viewBox\":\"0 0 16 16\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":1.5,\"className\":\"size-3\",\"children\":[\"$\",\"path\",null,{\"d\":\"M3 8h9.5M8.5 4l4 4-4 4\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\"}]}]]}],[\"$\",\"span\",null,{\"className\":\"text-sm text-fg\",\"children\":\"seo: ai crawlers\"}]]}]]}]]}]\n2a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#020203\"}],[\"$\",\"meta\",\"3\",{\"name\":\"color-scheme\",\"content\":\"dark\"}]]\n38:I[49310,[\"/_next/static/immutable/chunks/455sb5e0fgpzb.js\"],\"IconMark\"]\n28:null\n2c:[[\"$\",\"title\",\"0\",{\"children\":\"seo skill: findable by search engines, AI engines and agents | void\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"void\"}],[\"$\",\"link\",\"3\",{\"rel\":\"author\",\"href\":\"https://parthkapoor.me\"}],[\"$\",\"meta\",\"4\",{\"name\":\"author\",\"content\":\"Parth Kapoor\"}],[\"$\",\"link\",\"5\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"6\",{\"name\":\"keywords\",\"content\":\"design system,AI coding agents,Claude Code,WebGL,shaders,web performance,accessibility,SEO,Next.js,Tailwind\"}],[\"$\",\"meta\",\"7\",{\"name\":\"creator\",\"content\":\"Parth Kapoor\"}],[\"$\",\"meta\",\"8\",{\"name\":\"publisher\",\"content\":\"Parth Kapoor\"}],[\"$\",\"meta\",\"9\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"10\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"11\",{\"name\":\"category\",\"content\":\"technology\"}],[\"$\",\"link\",\"12\",{\"rel\":\"canonical\",\"href\":\"https://void-design.vercel.app/docs/seo\"}],[\"$\",\"link\",\"13\",{\"rel\":\"alternate\",\"type\":\"text/markdown\",\"href\":\"https://void-design.vercel.app/docs/seo.md\"}],[\"$\",\"meta\",\"14\",{\"name\":\"format-detection\",\"content\":\"telephone=no, address=no, email=no\"}],[\"$\",\"meta\",\"15\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"16\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"void\"}],[\"$\",\"meta\",\"17\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:title\",\"content\":\"seo skill: findable by search engines, AI engines and agents\"}],[\"$\",\"meta\",\"19\",{\"property\":\"og:description\",\"content\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\"}],[\"$\",\"meta\",\"20\",{\"property\":\"og:url\",\"content\":\"https://void-design.vercel.app/docs/seo\"}],[\"$\",\"meta\",\"21\",{\"property\":\"og:site_name\",\"content\":\"void\"}],[\"$\",\"meta\",\"22\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"23\",{\"property\":\"og:image\",\"content\":\"https://void-design.vercel.app/docs/seo/opengraph-image-1dv662?d56abb6face50325\"}],[\"$\",\"meta\",\"24\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"25\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"26\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"27\",{\"property\":\"og:image:alt\",\"content\":\"void skill\"}],[\"$\",\"meta\",\"28\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"29\",{\"property\":\"article:modified_time\",\"content\":\"2026-09-16\"}],[\"$\",\"meta\",\"30\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"31\",{\"name\":\"twitter:title\",\"content\":\"seo skill: findable by search engines, AI engines and agents\"}],[\"$\",\"meta\",\"32\",{\"name\":\"twitter:description\",\"content\":\"SEO and GEO (AI search / answer-engine visibility) for websites. Covers server-rendered content, titles, descriptions and canonicals, Open Graph images…\"}],[\"$\",\"meta\",\"33\",{\"name\":\"twitter:image\",\"content\":\"https://void-design.vercel.app/docs/seo/opengraph-image-1dv662?d56abb6face50325\"}],[\"$\",\"meta\",\"34\",{\"name\":\"twitter:image:alt\",\"content\":\"void skill\"}],[\"$\",\"meta\",\"35\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"36\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"37\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"38\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.07_7ic0_1d0u-.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"39\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.0uaj260ufluee.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"40\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?apple-icon.0wjwpgjlk50hj.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"$L38\",\"41\",{}]]\n"])</script></body></html>