Skip to content
Beta Multi-model support (OpenAI, Gemini, and more) launching soon.

seo-metadata-writer

Installable Ships in copy-localization-generator — or copy the raw skill below.
Open Claude.ai

Paste into Claude Code, Claude.ai, the desktop app, or the browser extension — ⌘/Ctrl+V.

ExperimentalNo security review

SEO Metadata Writer

Generate intent-matched, character-correct SEO metadata for every page in a site build or redesign. Covers <title>, meta description, Open Graph, Twitter Card, canonical, hreflang, and robots directives — mapped to the CMS field schema so content editors can paste directly without rekeying.

Usage

/seo-metadata-writer <page URL or brief>
  [--intent informational|navigational|transactional|commercial]
  [--cms sitecore|optimizely|umbraco|headless]
  [--locale <locale-code>]

Examples:

  • /seo-metadata-writer /products/platform-overview --intent commercial --cms sitecore
  • /seo-metadata-writer pages/about.md --cms umbraco
  • /seo-metadata-writer "Homepage for B2B SaaS analytics platform" --intent navigational

Phase 1 — Page intake

Collect the following before writing:

Input Source If missing
Page content / brief File path or URL; read it Ask for the page's primary topic and audience
Primary keyword From the brief or supplied keyword list Derive from page topic; flag as assumption
Search intent --intent flag Classify from page type (see Phase 2)
Brand name Voice guide or brief Required for title tag format
Locale --locale flag Default to en
CMS --cms flag Default to headless

If a page URL is given to an accessible local dev server, fetch it and read the existing copy to extract primary topic, keywords, and existing metadata.


Phase 2 — Intent classification

Match the page type to a search intent. This determines title tag formula and meta description approach:

Intent Page types Title formula Meta description goal
Informational Blog, guide, how-to, glossary, FAQ [Topic] — [Brand] or How to [action]: [result] Promise a clear answer; include the key question
Navigational Homepage, about, contact, login, pricing [Brand] — [short brand promise] or [Brand] | [page name] Confirm destination; reassure the user they've found the right place
Transactional Product detail, checkout, sign-up, pricing [Product/Offer] — [Brand] Lead with the offer; include a soft CTA; signal availability
Commercial Category pages, comparison, features, case studies [Category/Topic] [Brand] Describe what they'll find; differentiate from competitors; soft CTA

Phase 3 — Title tag

Character target: 50–60 characters (max 70 before truncation at ~580px). Required elements: Primary keyword near the front; brand name at the end separated by — or \|.

Title rules

  1. Primary keyword in the first 50 characters where possible.
  2. Do not keyword-stuff — title must read naturally.
  3. Brand name suffix: [Page topic] — [Brand] is the standard RBA format.
  4. Do not use ALL CAPS; title case for nouns, sentence case for long titles.
  5. Avoid starting with the brand name unless the page is the homepage or a brand-navigational page.
  6. Unique across the site — do not reuse the same title on multiple pages.

Output variants: Produce 2–3 title options ranked by preference. Annotate character count.


Phase 4 — Meta description

Character target: 120–155 characters (truncated by search engines beyond ~920px / ~155 chars). Note: Google rewrites > 62% of descriptions when the page content is a better match. Write for the user, not just the algorithm.

Description rules

  1. Match the search intent — promise the answer for informational, signal availability for transactional, confirm destination for navigational.
  2. Include the primary keyword naturally — Google bolds matching terms.
  3. Include a soft CTA for commercial/transactional pages: "Explore", "See how", "Get started".
  4. Never copy-paste the first sentence of the page body — it tells the user nothing new.
  5. Write in active voice; avoid "This page contains…" or "Here you will find…"
  6. Unique per page — duplicates dilute CTR signals.

Output variants: Produce 2 description options. Annotate character count.


Phase 5 — Open Graph and Twitter Card

Generate the full OG and Twitter Card tag set. Flag any field where the CMS requires a separate field (e.g. Sitecore OG Title is a separate field from the SEO title).

<!-- Open Graph -->
<meta property="og:title" content="[OG Title — can match title tag or be longer, max 95 chars]" />
<meta property="og:description" content="[OG Description — 55–200 chars; more permissive than meta]" />
<meta property="og:image" content="[Absolute URL — 1200×630px; WebP or JPEG; < 8 MB]" />
<meta property="og:image:alt" content="[Descriptive alt text for the OG image]" />
<meta property="og:url" content="[Canonical URL]" />
<meta property="og:type" content="[website | article | product]" />
<meta property="og:site_name" content="[Brand name]" />

<!-- Twitter Card -->
<meta name="twitter:card" content="[summary_large_image | summary]" />
<meta name="twitter:title" content="[Same as OG title or shorter]" />
<meta name="twitter:description" content="[Same as OG description or shorter, max 200 chars]" />
<meta name="twitter:image" content="[Same as OG image or optimised 2:1 variant]" />
<meta name="twitter:image:alt" content="[Same as OG image alt]" />

OG image brief

If no image URL is supplied, produce an OG image brief: size (1200×630), subject, text overlay (title + brand logo), and colour guidance from the brand palette if supplied.


Phase 6 — Canonical, hreflang, robots

Canonical

<link rel="canonical" href="[Self-referencing canonical — absolute URL]" />

Flag pages that have query-parameter variants (faceted search, filters) — these may need canonical pointing to the base URL with a robots.txt or <meta name="robots" content="noindex"> on the variant.

hreflang (multilingual sites)

When --locale is set or the site is multilingual, produce the full hreflang set:

<link rel="alternate" hreflang="en" href="https://example.com/page/" />
<link rel="alternate" hreflang="fr-CA" href="https://example.com/fr-ca/page/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/page/" />

CMS notes:

  • Sitecore XM Cloud: hreflang generated automatically from Language Fallback config when using Sitecore SXA or the JSS i18n module. Verify the language item paths are correctly mapped.
  • Optimizely: Language branches generate hreflang automatically if the alternate URL resolver is configured. Check IAlternateUrlResolver implementation.
  • Umbraco: hreflang requires either a custom property or a third-party package (e.g. Our.Umbraco.Hreflang). Document the required field structure in the metadata sheet.

Robots directive

Default: <meta name="robots" content="index, follow" /> Flag for noindex review:

  • Pagination pages beyond page 2 (often better to allow with canonical)
  • Thank-you / confirmation pages (post-transaction, no search value)
  • Admin or preview pages
  • Faceted/filtered pages with thin content

Phase 7 — Output

Produce a Metadata Sheet in Markdown table format, one row per page:

## [Site / Section] — SEO Metadata Sheet
Generated: [date] | Locale: [locale] | CMS: [cms]

| Page | Title tag (option 1) | Title chars | Meta description (option 1) | Desc chars | OG type | Canonical | Robots | Notes |
|---|---|---|---|---|---|---|---|---|
| Homepage | RBA Consulting — Digital Experience Experts | 43 | We design and build digital experiences on Sitecore, Optimizely, and Umbraco. Talk to our team. | 94 | website | /en/ | index, follow | |

If --format json is passed, also produce a JSON export compatible with the CMS bulk-import format (see reference.md for field mappings).


CMS field map — Sitecore XM Cloud

Metadata field Sitecore field Template section
Title tag Page Title Page meta
Meta description Meta Description Page meta
OG title OG Title (custom field or SXA meta field) Social
OG description OG Description Social
OG image OG Image (Image field, resolved to CDN URL) Social
Canonical URL Auto-generated from item path + site hostname Configured in SXA settings
robots Robots (Droptree or custom field) Indexing

Quality checklist

  • Every title is unique across pages in the sheet
  • Every description is unique across pages in the sheet
  • Primary keyword appears in title and description for commercial/informational pages
  • No title exceeds 70 characters
  • No description exceeds 155 characters
  • OG image alt text is descriptive (not "hero image" or "banner")
  • Canonical URL is absolute and self-referencing
  • hreflang set is complete and symmetrical (each locale references all others)
  • Thin/low-value pages are flagged for noindex review
Technical details
Plugin
copy-localization-generator
Author
Dakota Smith
Skill name
seo-metadata-writer
Maturity
experimental
Security review
No security review
Owners
  • design
  • strategy
Argument hint
<page URL or brief> [--intent informational|navigational|transactional|commercial] [--cms sitecore|optimizely|umbraco|headless] [--locale <locale-code>]
Allowed tools
  • Read
  • Write
  • Edit
  • Bash(find *)
  • Bash(ls *)
  • Bash(cat *)
  • Bash(grep *)
  • WebFetch(domain:localhost)
Source
plugins/copy-localization-generator/skills/seo-metadata-writer/SKILL.md

Edit this skill on GitHub — opens GitHub's web editor. No git knowledge needed.