# SEO Checklist

> SEO gotchas for web development — easy-to-miss items that hurt search ranking. Covers meta tags, Open Graph, structured data (JSON-LD), sitemap, robots.txt, canonical URLs, and Naver/Google-specific requirements. Use when building or reviewing any public-facing web page, landing page, or marketing site. Must use this skill when user mentions SEO, search ranking, meta tags, or when deploying a web app that needs to be discoverable. Use when this capability is needed.

- Skill: `tomevault-io/seo-checklist` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/seo-checklist`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/seo-checklist/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/seo-checklist

---


# SEO Checklist

## Pre-check (K1)

> Is this a public-facing web page that needs search visibility? Internal tools, admin panels, and authenticated-only pages don't need SEO optimization.

## Easy-to-Miss Gotchas

### Meta & Social

| Gotcha | Why It Hurts | Fix |
|--------|-------------|-----|
| Missing `<link rel="canonical">` | Duplicate content penalty from URL variants | Set canonical on every page, including paginated |
| OG image wrong size | Cropped/pixelated on social share | Must be exactly **1200x630px** |
| Same title/description on all pages | Google treats as duplicate content | Unique title (50-60 chars) + description (150-160 chars) per page |
| Missing `og:type` | Defaults to "website" for articles | Set `article` for posts, `product` for products |

### Technical

| Gotcha | Why It Hurts | Fix |
|--------|-------------|-----|
| `robots.txt` blocks important pages | Pages not indexed | `Allow: /` for public, only block `/api/`, `/admin/` |
| No sitemap or stale sitemap | Crawler misses new pages | Auto-generate, include `<lastmod>` with real dates |
| `noindex` left in production | Entire site invisible | Verify `<meta name="robots">` in production build |
| Images without `width`/`height` | CLS layout shift penalty | Always set dimensions + `loading="lazy"` for below-fold |

### Core Web Vitals

| Metric | Target | Common Miss |
|--------|--------|-------------|
| LCP | ≤2.5s | Hero image not preloaded — add `<link rel="preload">` |
| INP | ≤200ms | Heavy JS on interaction — defer non-critical scripts |
| CLS | ≤0.1 | Dynamic content without reserved space — set `min-height` |

### Structured Data

| Gotcha | Fix |
|--------|-----|
| JSON-LD not validated | Test with Google Rich Results Test before deploy |
| Wrong `@type` | `Product` for products, `Article` for posts, `FAQPage` for FAQs |
| Missing `BreadcrumbList` | Add breadcrumb schema for all non-root pages |

## Done Criteria (K4)

- [ ] Every page has unique title, description, canonical URL
- [ ] OG images are 1200x630px on all shareable pages
- [ ] `robots.txt` and `sitemap.xml` present and correct
- [ ] Structured data validates in Rich Results Test
- [ ] Core Web Vitals green (LCP ≤2.5s, INP ≤200ms, CLS ≤0.1)
- [ ] No `noindex` tags in production

---
> Source: [su-record/vibe](https://github.com/su-record/vibe) — distributed by [TomeVault](https://tomevault.io).
<!-- tomevault:4.0:skill_md:2026-06-16 -->

