Loading...
Loading...
Comprehensive SEO and social metadata implementation for HTML, Next.js App Router, and Vite (React & Vue) projects. Use when: (1) Creating, editing, or reviewing meta tags, Open Graph, Twitter Cards, canonical/hreflang links, JSON-LD structured data, theme-color, or favicon/manifest config; (2) Working with html/index.html, nextjs/metadata.ts, nextjs/dynamic-metadata-example.tsx, vite/index.html, vite/SEO.tsx, or vite/SEO.vue; (3) Adding SEO to a new page or route; (4) Migrating from react-helmet, vue-meta, or next-seo; (5) Generating dynamic metadata for content-driven pages; (6) Auditing metadata for completeness or best-practice compliance.
npx skill4agent add jeremy0x/meta-tag-boilerplate seo-meta-tags| Framework | When to use | Reference |
|---|---|---|
| HTML | Static sites, any backend, SSGs | references/html.md |
| Next.js | Next.js 13+ App Router projects | references/nextjs.md |
| Vite | Vite + React or Vite + Vue apps | references/vite.md |
| Tag | Constraint |
|---|---|
| Under 60 characters |
| 150-160 characters |
| 5-10 terms max, comma-separated |
| Full name |
| |
| Absolute URL, must match deployment URL |
| |
og:*| Property | Notes |
|---|---|
| |
| Absolute URL |
| Can differ from |
| Can differ from meta description |
| Absolute URL, 1200x630px, JPG or PNG, under 1 MB |
| |
| Required when image is present |
| Brand name |
| e.g. |
articlearticle:published_timearticle:modified_timearticle:authorarticle:tagtwitter:*| Property | Notes |
|---|---|
| |
| Organization handle with |
| Author handle with |
| Under 70 characters |
| Under 200 characters |
| Same spec as OG image |
| Required when image is present |
<meta name="theme-color" content="...">media="(prefers-color-scheme: light)"media="(prefers-color-scheme: dark)"themeColor| Asset | Size | Format |
|---|---|---|
| 32x32 or multi-size | ICO |
| 16x16 | PNG |
| 32x32 | PNG |
| 180x180 | PNG |
| n/a | JSON |
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "",
"description": "",
"url": "",
"image": { "@type": "ImageObject", "url": "", "width": 1200, "height": 630 },
"author": { "@type": "Person", "name": "" },
"publisher": {
"@type": "Organization",
"name": "",
"logo": { "@type": "ImageObject", "url": "" }
}
}@typeWebSiteArticleOrganizationProductFAQPageBreadcrumbList<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />alternates.languages<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="dns-prefetch" href="https://www.google-analytics.com" />{{PLACEHOLDER_NAME}}| Token | Purpose |
|---|---|
| Page |
| Meta description |
| Page URL (absolute) |
| Canonical URL |
| Comma-separated keywords |
| Content author |
| Brand / site name |
| Hex color codes |
| Open Graph |
| |
| Twitter handles |
| JSON-LD |
| Publisher org |
| Icons |
| Author website URL (Next.js) |
| Content creator name (Next.js) |
| Site category (Next.js) |
| Search engine verification codes (Next.js) |
| Language-specific alternate URLs (Next.js) |
| hreflang alternate URLs (HTML/Vite) |
{{...}}{{https://og:imagetwitter:image<title>descriptioncanonical@context@typex-default| Use case | Dimensions | Ratio | Format | Max size |
|---|---|---|---|---|
| OG / Twitter | 1200x630 | 1.91:1 | JPG or PNG | 1 MB |
| Favicon 32 | 32x32 | 1:1 | PNG | n/a |
| Favicon 16 | 16x16 | 1:1 | PNG | n/a |
| Apple Touch | 180x180 | 1:1 | PNG | n/a |
| Mistake | Impact | Fix |
|---|---|---|
Relative URLs in | Social platforms can't fetch the image | Always use absolute URLs starting with |
Missing | All | Wrap app root in |
Missing | | Call |
| Committing verification codes to public repos | Exposes site ownership tokens | Use environment variables for |
Duplicate | Crawlers pick an unpredictable one | Use only one source of truth per scope (layout vs. page) |
| Accessibility failure, some validators warn | Always pair image with alt text |
Using | Unnecessary async overhead on every request | Use static |
Leaving | Broken display on social platforms, poor SEO | Grep for |
| JSON-LD with trailing commas or comments | Invalid JSON, structured data ignored | Validate JSON before finishing |
| Image gets cropped to tiny square | Use |
| From | To | Notes |
|---|---|---|
| Vite React ( | Replace with |
| Vite Vue ( | Replace |
| Next.js ( | Remove |
Pages Router | App Router | Replace |