SEO and GEO (Generative Engine Optimization) checklist for web projects. Load when reviewing page metadata, structured data, technical SEO, Core Web Vitals, and generative-engine optimization. Covers classic search visibility and LLM-crawler optimization.
Installs into .claude/skills of the current project.
Are you the author of Seo Checklist?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/ek33450505-seo-checklist)
---
name: seo-checklist
description: SEO and GEO (Generative Engine Optimization) checklist for web projects. Load when reviewing page metadata, structured data, technical SEO, Core Web Vitals, and generative-engine optimization. Covers classic search visibility and LLM-crawler optimization.
user-invocable: false
allowed-tools: []
---
# SEO & GEO Checklist
## Metadata Basics
- **Page `<title>`:** Unique, descriptive, ≤60 characters (fits Google SERP). For React/Next: use dynamic `<title>` tag or Next.js `metadata` export.
- **Meta description:** 120–160 characters, clearly summarizes page value. Should answer "why visit this page?"
- **Canonical URL:** Prevents duplicate-content penalties. Set `<link rel="canonical" href="...">` or via Next.js `metadata.metadataBase`.
- **Open Graph tags:** For social sharing and preview cards. Include `og:title`, `og:description`, `og:image` (1200×630 px recommended), `og:url`, `og:type`.
- **Twitter Card tags:** `twitter:card`, `twitter:title`, `twitter:description`, `twitter:image` for Twitter/X sharing preview.
## Structured Data (JSON-LD)
- **Format:** Use JSON-LD in `<script type="application/ld+json">` blocks (preferred by both Google and modern LLM crawlers).
- **Schema types:** Choose applicable types: `Organization` (company info), `Article` (blog posts/news), `Product` (e-commerce), `BreadcrumbList` (site navigation), `FAQPage` (Q&A content).
- **Why it matters:** Enables Google rich results (star ratings, recipes, job listings) AND helps LLM crawlers understand semantic structure for more accurate citations/excerpts.
- **Validation:** Test with [schema.org](https://schema.org) examples and Google's Rich Results Test.
## Technical SEO
- **Sitemap.xml:** Submit to search engines via robots.txt or Search Console. For Next.js: use `next-sitemap` or manually generate and serve from `/public/sitemap.xml`.
- **robots.txt:** Define crawl budget and disallowed paths. Basic rule: `User-agent: *` + `Allow: /`. For Vercel: robots.txt auto-generated; check `/robots.txt`.
- **Semantic HTML:** Single `<h1>` per page, no skipped heading levels (h1 → h2/h3, not h1 → h4). Use `<header>`, `<main>`, `<nav>`, `<article>`, `<section>` landmark elements. Overlaps with accessibility-first HTML — see `typescript-conventions` Accessibility section.
- **Duplicate content:** Avoid multiple URLs serving identical content. Use canonical tags to point to preferred version.
- **Index coverage is a separate question:** Everything above is "is the page well-formed". Whether a URL is actually *in* Google's index — and why not — is diagnosed differently: `Discovered – currently not indexed` is a crawl-budget signal, `Crawled – currently not indexed` is a content-quality verdict, and only GSC URL Inspection reports either. For that, plus the inspection quota arithmetic, stratified sampling, sitemap segmentation for per-family coverage, and the soak-window rule, load `seo-index-census`.
## Core Web Vitals (CWV)
Target thresholds (Google's metric for rank/user experience):
- **LCP (Largest Contentful Paint):** ≤2.5s. Optimized images, preload critical resources.
- **INP (Interaction to Next Paint):** ≤200ms. Break long JavaScript tasks, defer non-critical work.
- **CLS (Cumulative Layout Shift):** ≤0.1. Reserve space for late-loading fonts/ads, set image dimensions.
Common React/Vite culprits:
- Unoptimized images (use `<img>` with `width`/`height` or lazy-load). In Next.js, use `next/image` for automatic optimization.
- Late-loading web fonts (specify `font-display: swap` or preload via `<link rel="preload">`).
- JavaScript bundle size; code splitting with dynamic imports for route-based or intersection-observer-based chunks.
- Hydration cost on initial page load (minimize render work in client-side React, consider streaming SSR).
## GEO (Generative Engine Optimization)
- **llms.txt:** An emerging convention (not universally adopted yet) analogous to robots.txt for AI crawlers. Place at `/.well-known/llms.txt` or `/llms.txt`. Specifies which content is quotable/extractable and any usage policies. Example: `Allow: /blog/*` (LLMs may cite blog posts). Check [llms.txt specification](https://llmstxt.org) for current status before relying on it.
- **Quotable content:** Structure facts and claims clearly near the top of the page. LLMs prioritize declarative, extractable statements over marketing fluff. Avoid burying key information in prose; use lists, tables, or Q&A formats.
- **Q&A sections:** Direct question-answer content maps well to LLM-answer-engine excerpting. Pair each Q with a concise A. Markup with `<dl>` + schema `FAQPage` or `QAPage` JSON-LD for best results.
- **Byline and metadata:** Attribution, publication date, author expertise signals improve trustworthiness in LLM citations.
## Next.js-Specific
- **Metadata export:** Use Next.js 13+ `metadata` export in `page.tsx` instead of HTML `<meta>` tags.
```typescript
export const metadata: Metadata = {
title: "Page Title",
description: "Page description",
openGraph: { title: "...", description: "...", images: [{ url: "..." }] },
};
```
- **Sitemap and robots.txt:** Auto-generated by Next.js. Customize in `app/sitemap.ts` and `app/robots.ts` (App Router).
- **next/image:** Always use for images to enable automatic format negotiation, responsive sizing, and lazy-loading (improves CWV).
- **Dynamic routes:** If using `generateStaticParams()`, ensure all variants are covered for SEO discoverability.