seo-metadata-writer
Paste into Claude Code, Claude.ai, the desktop app, or the browser extension — ⌘/Ctrl+V. ✓ Copied. Switch to Claude and paste — ⌘/Ctrl+V.
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
- Primary keyword in the first 50 characters where possible.
- Do not keyword-stuff — title must read naturally.
- Brand name suffix:
[Page topic] — [Brand]is the standard RBA format. - Do not use ALL CAPS; title case for nouns, sentence case for long titles.
- Avoid starting with the brand name unless the page is the homepage or a brand-navigational page.
- 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
- Match the search intent — promise the answer for informational, signal availability for transactional, confirm destination for navigational.
- Include the primary keyword naturally — Google bolds matching terms.
- Include a soft CTA for commercial/transactional pages: "Explore", "See how", "Get started".
- Never copy-paste the first sentence of the page body — it tells the user nothing new.
- Write in active voice; avoid "This page contains…" or "Here you will find…"
- 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
IAlternateUrlResolverimplementation. - 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
-
ReadWriteEditBash(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.