seo-meta-tags

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.

16 stars

Best use case

seo-meta-tags is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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.

Teams using seo-meta-tags should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/seo-meta-tags/SKILL.md --create-dirs "https://raw.githubusercontent.com/diegosouzapw/awesome-omni-skill/main/skills/development/seo-meta-tags/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/seo-meta-tags/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How seo-meta-tags Compares

Feature / Agentseo-meta-tagsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# SEO Meta Tags

Boilerplate and component library for production-ready metadata across three framework targets.

## Decision Tree

Determine the correct framework path first:

1. **Static HTML site or any-backend project** — Read [references/html.md](references/html.md)
2. **Next.js 13+ App Router** — Read [references/nextjs.md](references/nextjs.md)
3. **Vite + React** — Read [references/vite.md](references/vite.md), React section
4. **Vite + Vue 3** — Read [references/vite.md](references/vite.md), Vue section
5. **Multiple frameworks at once** — Read all relevant reference files

Then determine action type:

- **Creating metadata from scratch?** — Read matching reference → copy boilerplate → replace placeholders.
- **Updating existing metadata?** — Load file → keep structure → change requested values → verify parity across tag families.
- **Auditing / reviewing metadata?** — Run through Quality Gate below → report issues.
- **Migrating between frameworks?** — Read source reference → read target reference → map fields.

## Framework Selection

| Framework   | When to use                     | Reference                                    |
| ----------- | ------------------------------- | -------------------------------------------- |
| **HTML**    | Static sites, any backend, SSGs | [references/html.md](references/html.md)     |
| **Next.js** | Next.js 13+ App Router projects | [references/nextjs.md](references/nextjs.md) |
| **Vite**    | Vite + React or Vite + Vue apps | [references/vite.md](references/vite.md)     |

Read only the reference file that matches the user's target framework.

## Metadata Families

Every framework target must keep parity across these families. When modifying one family, verify the others remain consistent.

### 1. Essential / Primary

| Tag                 | Constraint                                                                                              |
| ------------------- | ------------------------------------------------------------------------------------------------------- |
| `<title>` / `title` | Under 60 characters                                                                                     |
| `description`       | 150-160 characters                                                                                      |
| `keywords`          | 5-10 terms max, comma-separated                                                                         |
| `author`            | Full name                                                                                               |
| `robots`            | `index, follow` by default; include `max-image-preview:large`, `max-snippet:-1`, `max-video-preview:-1` |
| `canonical`         | Absolute URL, must match deployment URL                                                                 |
| `viewport`          | `width=device-width, initial-scale=1.0`                                                                 |

### 2. Open Graph (`og:*`)

| Property                             | Notes                                                                          |
| ------------------------------------ | ------------------------------------------------------------------------------ |
| `og:type`                            | `website` for home/landing; `article` for blog posts; `product` for e-commerce |
| `og:url`                             | Absolute URL                                                                   |
| `og:title`                           | Can differ from `<title>` for social context                                   |
| `og:description`                     | Can differ from meta description                                               |
| `og:image`                           | Absolute URL, 1200x630px, JPG or PNG, under 1 MB                               |
| `og:image:width` / `og:image:height` | `1200` / `630`                                                                 |
| `og:image:alt`                       | Required when image is present                                                 |
| `og:site_name`                       | Brand name                                                                     |
| `og:locale`                          | e.g. `en_US`                                                                   |

For `article` type also include: `article:published_time`, `article:modified_time`, `article:author`, `article:tag`.

### 3. Twitter Cards (`twitter:*`)

| Property              | Notes                                        |
| --------------------- | -------------------------------------------- |
| `twitter:card`        | `summary_large_image` (default) or `summary` |
| `twitter:site`        | Organization handle with `@` prefix          |
| `twitter:creator`     | Author handle with `@` prefix                |
| `twitter:title`       | Under 70 characters                          |
| `twitter:description` | Under 200 characters                         |
| `twitter:image`       | Same spec as OG image                        |
| `twitter:image:alt`   | Required when image is present               |

### 4. Theme Color

Provide three values:

- Default: `<meta name="theme-color" content="...">` or single value
- Light: `media="(prefers-color-scheme: light)"`
- Dark: `media="(prefers-color-scheme: dark)"`

Next.js uses the `themeColor` array in the Metadata object.

### 5. Icons and Manifest

| Asset                  | Size                | Format |
| ---------------------- | ------------------- | ------ |
| `favicon.ico`          | 32x32 or multi-size | ICO    |
| `icon-16x16.png`       | 16x16               | PNG    |
| `icon-32x32.png`       | 32x32               | PNG    |
| `apple-touch-icon.png` | 180x180             | PNG    |
| `site.webmanifest`     | n/a                 | JSON   |

Generate with [favicon.io](https://favicon.io/) or [RealFaviconGenerator](https://realfavicongenerator.net/).

### 6. Structured Data (JSON-LD)

Emit a `<script type="application/ld+json">` block (HTML/Vite) or use a separate Script component in Next.js. Required keys:

```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": "" }
	}
}
```

Common `@type` values: `WebSite`, `Article`, `Organization`, `Product`, `FAQPage`, `BreadcrumbList`.

### 7. Internationalization (hreflang)

```html
<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/" />
```

Next.js equivalent: `alternates.languages` in the Metadata object.

### 8. Performance Hints

Include when external resources are used:

```html
<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 Tokens

All boilerplate files use `{{PLACEHOLDER_NAME}}` tokens. Common tokens:

| Token                                                                                               | Purpose                                    |
| --------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| `{{PAGE_TITLE}}`                                                                                    | Page `<title>`                             |
| `{{PAGE_DESCRIPTION}}`                                                                              | Meta description                           |
| `{{PAGE_URL}}`                                                                                      | Page URL (absolute)                        |
| `{{CANONICAL_URL}}`                                                                                 | Canonical URL                              |
| `{{KEYWORDS}}`                                                                                      | Comma-separated keywords                   |
| `{{AUTHOR_NAME}}`                                                                                   | Content author                             |
| `{{SITE_NAME}}`                                                                                     | Brand / site name                          |
| `{{THEME_COLOR}}` / `{{THEME_COLOR_LIGHT}}` / `{{THEME_COLOR_DARK}}`                                | Hex color codes                            |
| `{{OG_TITLE}}` / `{{OG_DESCRIPTION}}` / `{{OG_IMAGE_URL}}` / `{{OG_IMAGE_ALT}}`                     | Open Graph                                 |
| `{{TWITTER_TITLE}}` / `{{TWITTER_DESCRIPTION}}` / `{{TWITTER_IMAGE_URL}}` / `{{TWITTER_IMAGE_ALT}}` | Twitter                                    |
| `{{TWITTER_HANDLE}}` / `{{TWITTER_CREATOR_HANDLE}}`                                                 | Twitter handles                            |
| `{{SCHEMA_TYPE}}` / `{{SCHEMA_IMAGE_URL}}`                                                          | JSON-LD                                    |
| `{{PUBLISHER_NAME}}` / `{{PUBLISHER_LOGO_URL}}`                                                     | Publisher org                              |
| `{{FAVICON_32x32_URL}}` / `{{FAVICON_16x16_URL}}` / `{{APPLE_TOUCH_ICON_URL}}`                      | Icons                                      |
| `{{AUTHOR_URL}}`                                                                                    | Author website URL (Next.js)               |
| `{{CREATOR_NAME}}`                                                                                  | Content creator name (Next.js)             |
| `{{CATEGORY}}`                                                                                      | Site category (Next.js)                    |
| `{{GOOGLE_VERIFICATION_CODE}}` / `{{YANDEX_VERIFICATION_CODE}}` / `{{FACEBOOK_VERIFICATION_CODE}}`  | Search engine verification codes (Next.js) |
| `{{EN_URL}}` / `{{ES_URL}}`                                                                         | Language-specific alternate URLs (Next.js) |
| `{{ALTERNATE_EN_URL}}` / `{{ALTERNATE_DEFAULT_URL}}`                                                | hreflang alternate URLs (HTML/Vite)        |

When implementing for a user, replace every `{{...}}` token. Never leave placeholders in production output.

## Quality Gate

Run these checks before considering any metadata task complete:

1. **No placeholders** — grep for `{{` in all modified files; count must be zero.
2. **Absolute URLs** — canonical, OG url, OG image, Twitter image, JSON-LD url/image must start with `https://`.
3. **Image alt text** — every `og:image` / `twitter:image` must have a corresponding alt field.
4. **No duplicate tags** — no two conflicting `<title>`, `description`, or `canonical` tags in the same scope.
5. **Title length** — verify under 60 characters.
6. **Description length** — verify 150-160 characters.
7. **JSON-LD validity** — valid JSON with required `@context` and `@type` keys.
8. **OG/Twitter parity** — if OG title is set, Twitter title should also be set (and vice versa).
9. **Canonical consistency** — canonical URL matches the actual page URL or intended redirect target.
10. **Theme color** — includes both light and dark media variants.
11. **hreflang** — includes `x-default` when language alternates exist.
12. **Robots** — allows indexing unless user explicitly requests noindex.

## Image Specifications

| 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      |

## Testing Tools

Recommend to users after deployment:

- [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/)
- [Twitter Card Validator](https://cards-dev.twitter.com/validator)
- [LinkedIn Post Inspector](https://www.linkedin.com/post-inspector/)
- [Open Graph Check](https://www.opengraph.xyz/)
- [Schema Markup Validator](https://validator.schema.org/)
- [Google Rich Results Test](https://search.google.com/test/rich-results)

## Common Mistakes

| Mistake                                                | Impact                                       | Fix                                                                    |
| ------------------------------------------------------ | -------------------------------------------- | ---------------------------------------------------------------------- |
| Relative URLs in `og:image` or `twitter:image`         | Social platforms can't fetch the image       | Always use absolute URLs starting with `https://`                      |
| Missing `<HelmetProvider>` in Vite React               | All `<SEO>` tags silently fail to render     | Wrap app root in `<HelmetProvider>` in `main.tsx`                      |
| Missing `createHead()` in Vite Vue                     | `useHead()` throws at runtime                | Call `app.use(createHead())` in `main.ts`                              |
| Committing verification codes to public repos          | Exposes site ownership tokens                | Use environment variables for `verification` values                    |
| Duplicate `<title>` or `description` tags              | Crawlers pick an unpredictable one           | Use only one source of truth per scope (layout vs. page)               |
| `og:image` set without `og:image:alt`                  | Accessibility failure, some validators warn  | Always pair image with alt text                                        |
| Using `generateMetadata` for static pages              | Unnecessary async overhead on every request  | Use static `export const metadata` when values are known at build time |
| Leaving `{{...}}` placeholder tokens                   | Broken display on social platforms, poor SEO | Grep for `{{` before shipping                                          |
| JSON-LD with trailing commas or comments               | Invalid JSON, structured data ignored        | Validate JSON before finishing                                         |
| `twitter:card` set to `summary` when image is 1200x630 | Image gets cropped to tiny square            | Use `summary_large_image` for landscape images                         |

## Migration Paths

| From                  | To                      | Notes                                                              |
| --------------------- | ----------------------- | ------------------------------------------------------------------ |
| `react-helmet`        | Vite React (`SEO.tsx`)  | Replace with `react-helmet-async`; wrap root in `<HelmetProvider>` |
| `vue-meta`            | Vite Vue (`SEO.vue`)    | Replace `metaInfo` with `@unhead/vue` `useHead()` composable       |
| `next-seo`            | Next.js (`metadata.ts`) | Remove `<NextSeo>`; use exported `metadata` or `generateMetadata`  |
| Pages Router `<Head>` | App Router              | Replace `import Head` with `export const metadata`                 |

Related Skills

rn-meta

16
from diegosouzapw/awesome-omni-skill

Primary entry point for React Native/Expo development. Use FIRST for any React Native work—new projects, UI, styling, navigation, state, lists, storage, forms, auth, or ANY library decision. Enforces an opinionated stack (Expo Router, TypeScript, Uniwind) with library rules that ALWAYS override suggestions from other React Native skills.

metasploit-framework

16
from diegosouzapw/awesome-omni-skill

This skill should be used when the user asks to "use Metasploit for penetration testing", "exploit vulnerabilities with msfconsole", "create payloads with msfvenom", "perform post-exp...

metalsmith-website-skills

16
from diegosouzapw/awesome-omni-skill

Build static websites using Metalsmith's component-based architecture. Triggers on phrases like "build me a website", "create a landing page", "help me make a site". Includes JavaScript and CSS development standards.

Meta Dispatcher & Task Orchestrator

16
from diegosouzapw/awesome-omni-skill

PRD 驱动的任务调度与技能管理专家。接收完整 PRD/需求文档,负责拆解业务、选择技术栈、路由到合适的专业 Skill,并维护从方案到落地的全流程。

meta-42cog

16
from diegosouzapw/awesome-omni-skill

This skill should be used when initializing a new project with Cognitive Agile methodology. It automatically generates real.md (reality constraints) and cog.md (cognitive model) by scanning the project directory and identifying key patterns.

bio-metagenomics-abundance

16
from diegosouzapw/awesome-omni-skill

Species abundance estimation using Bracken with Kraken2 output. Redistributes reads from higher taxonomic levels to species for more accurate estimates. Use when accurate species-level abundances are needed from Kraken2 classification output.

02-meta-skill-forge-150

16
from diegosouzapw/awesome-omni-skill

[02] META. Create new skills when existing ones don't cover the task. Analyze unique requirements, build framework (Frame → Research → Plan → Execute), integrate risks, and declare new skill. Use when facing novel problems that existing skills can't address.

repo-metadata

16
from diegosouzapw/awesome-omni-skill

This skill should be used when the user asks to "update repo description", "improve repository description", "generate topics", "add labels to repo", "optimize github metadata", "make repo more discoverable", "improve repo SEO", "update project description", or needs to create engaging repository descriptions and topics that improve discoverability. Analyzes project files to generate optimized GitHub metadata.

artifact-metadata

16
from diegosouzapw/awesome-omni-skill

Manage artifact metadata, versioning, ownership, and history tracking. Use when relevant to the task.

analyze-silver-miner-metal-ratio

16
from diegosouzapw/awesome-omni-skill

以「銀礦股價格 ÷ 白銀價格」的相對比率衡量礦業股板塊相對於金屬本體的估值區間(偏貴/偏便宜),並用歷史分位數與類比區間推導「底部/頂部」訊號與情境推演。

01-meta-chain-of-skills-150

16
from diegosouzapw/awesome-omni-skill

[01] META. Сканирует доступные skills, создает план выполнения и идет шаг за шагом с подтверждением каждого этапа. Triggers on complex tasks, multi-step work, or when structured execution is needed.

00-meta-chain-flow-150

16
from diegosouzapw/awesome-omni-skill

[00] META. Orchestrate skills into dynamic chains for complex tasks. Analyzes the task, discovers available skills, builds an optimal chain, explains why each skill is needed, and executes step-by-step with user confirmation. Use for any complex task requiring multiple thinking/research/analysis steps. Triggers on "plan this", "how to approach", "what's the strategy", "build a plan", or any multi-step problem requiring skill orchestration.