skills/frontend-seo/SKILL.md
A portable, framework-agnostic SEO system for any React or React Native-for-web frontend. Centralizes site metadata in one constants module, derives canonical URLs from a single base, builds per-route
npx skillsauth add ranbot-ai/awesome-skills frontend-seoInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when you need a portable, framework-agnostic SEO system for any React or React Native-for-web frontend. Centralizes site metadata in one constants module, derives canonical URLs from a single base, builds per-route metadata (title, description, canonical, Open Graph, Twitter/X cards), generates...
Portable skill — readable by Claude Code, OpenCode, Codex, Cursor, Windsurf, and others. This skill describes an SEO system — a set of pure builder functions plus a thin framework adapter — not a component library or a visual style. It pairs with the frontend-architecture skill: the SEO system lives in a single service module (
services/seo/) and is consumed through one barrel.
The goal: every route ships correct, consistent, machine-readable metadata without
anyone copy-pasting <meta> tags. Site identity lives in one constants module, URLs are
always absolute and canonical, and search engines get a sitemap, robots rules, an RSS
feed, and typed JSON-LD derived from the same content the app already renders.
constants/seo module. Nothing about the site's identity is hardcoded anywhere else.canonicalUrl(path) function turns any path into an absolute, trailing-slash-normalized URL. Every sitemap entry, RSS link, OG URL, and JSON-LD @id flows through it.JsonLd type and a small set of schema.org builders (Person, WebSite, BlogPosting, CreativeWork, BreadcrumbList, FAQPage). Entities cross-reference each other by stable @id.sitemap.xml, robots.txt, and the RSS feed are built from the same content collections the app renders — never maintained by hand, never drifting.Everything below is the mechanical application of these five ideas.
The SEO system is one service module plus its constants and types. It slots directly into the
frontend-architecture shape (shared/ or services/).
src/
├── constants/
│ └── seo.ts ← SINGLE source of truth for site identity
├── types/
│ └── seo.ts ← SchemaType, RouteDescriptor, SitemapEntry,
│ RobotsConfig, RssItem, Redirect, JsonLd
├── services/seo/
│ ├── index.ts ← barrel: canonicalUrl, buildMetadata,
│ │ sitemapEntries, robots, rssItems,
│ │ structuredData, redirects
│ └── structured-data.ts ← per-type JSON-LD builders (Person, WebSite, …)
└── app/ (or routes/) ← THIN adapter: route files call the builders
├── layout.tsx ← global default metadata (from constants/seo)
├── sitemap.ts ← mounts sitemapEntries()
├── robots.ts ← mounts robots()
└── feed.xml/route.ts ← mounts rssItems()
Rule of thumb: builders never import the framework (except the one buildMetadata adapter);
route files never build SEO data inline — they call a builder and mount the result.
constants/seo)Everything about the site's identity is a named constant. No bare strings scattered across route files, no second copy of the description, no hardcoded base URL.
// constants/seo.ts
export const SITE_URL = "https://example.com"; // no trailing slash
export const SITE_NAME = "Jane Doe";
export const SITE_HANDLE = "@janedoe";
export const SITE_LOCALE = "en_US";
export const SITE_TITLE_DEFAULT = "Jane Doe — Senior Engineer";
export const SITE_TITLE_TEMPLATE = "%s | Jane Doe"; // child pages fill %s
export const SITE_DESCRIPTION =
"Senior engineer building cross-platform products with React and TypeScript.";
export const SITE_KEYWORDS = ["Jane Doe", "React", "TypeScript", "Engineer"];
export const AUTHOR_NAME = "Jane Doe";
export const AUTHOR_EMAIL = "[email protected]";
export const AUTHOR_GITHUB = "https://github.com/janedoe";
export const AUTHOR_LINKEDIN = "https://www.linkedin.com/in/janedoe/";
export const OG_IMAGE_PATH = "/og-image.png"; // relative; canonicalized at use
export const OG_IMAGE_WIDTH = 1200;
export const OG_IMAGE_HEIGHT = 630;
export const GOOGLE_SITE_VERIFICATION = "your-search-console-token";
Why: changing the description or the OG image touches one line. Structured data, OG tags, and Twitter c
tools
Use when a user asks to mine or update a private, evidence-backed work profile from local Claude Code, Codex, Copilot CLI, or OpenCode sessions.
data-ai
Use when diagnosing Android overheating, idle heat, thermal throttling, charging or radio heat, or abnormal battery drain with read-only ADB evidence and approval gates.
research
Research public competitor ads, analyze creative patterns and landing pages, and produce an evidence-labeled strategic teardown.
tools
Compiled CLI covering all 52 endpoints of the Anytype local API — objects, properties, tags, search, chat, files — one binary, no MCP server needed.