Claude Agent Skill · by Laguagu

Nextjs Seo

Install Nextjs Seo skill for Claude Code from laguagu/claude-code-nextjs-skills.

Install
Terminal · npx
$npx skills add https://github.com/laguagu/claude-code-nextjs-skills --skill nextjs-seo
Works with Paperclip

How Nextjs Seo fits into a Paperclip company.

Nextjs Seo drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.

S
SaaS FactoryPaired

Pre-configured AI company — 18 agents, 18 skills, one-time purchase.

$27$59
Explore pack
Source file
SKILL.md227 lines
Expand
---name: nextjs-seodescription: Next.js SEO optimization guide. Use when building Next.js apps, optimizing for search engines, fixing Google indexing issues, implementing metadata, sitemaps, robots.txt, JSON-LD, or auditing SEO.argument-hint: "[question or URL]"--- # Next.js SEO Optimization Comprehensive SEO guide for Next.js 16+ applications using App Router. > Next.js 16+ App Router (latest stable) ## Quick SEO Audit Run this checklist for any Next.js project: 1. **Check robots.txt**: `curl https://your-site.com/robots.txt`2. **Check sitemap**: `curl https://your-site.com/sitemap.xml`3. **Check metadata**: View page source, search for `<title>` and `<meta name="description">`4. **Check JSON-LD**: View page source, search for `application/ld+json`5. **Check Core Web Vitals**: Run Lighthouse in Chrome DevTools ## Essential Files ### app/layout.tsx - Root Metadata ```typescriptimport type { Metadata, Viewport } from 'next'; // Viewport (separate export required in Next.js 14+).// `themeColor`, `colorScheme`, and `viewport` inside the `metadata` object// are deprecated since Next.js 13.2.0 — they must be exported via `viewport`.export const viewport: Viewport = {  width: 'device-width',  initialScale: 1,  maximumScale: 5,  userScalable: true,  themeColor: [    { media: '(prefers-color-scheme: light)', color: '#ffffff' },    { media: '(prefers-color-scheme: dark)', color: '#0a0a0a' },  ],}; export const metadata: Metadata = {  metadataBase: new URL('https://your-site.com'),  title: {    default: 'Site Title - Main Keyword',    template: '%s | Site Name',  },  description: 'Compelling description with keywords (150-160 chars; Google typically displays this range)',  keywords: ['keyword1', 'keyword2', 'keyword3'],  openGraph: {    type: 'website',    locale: 'en_US',    url: 'https://your-site.com',    siteName: 'Site Name',    title: 'Site Title',    description: 'Description for social sharing',    images: [{ url: '/og-image.png', width: 1200, height: 630, alt: 'Site preview' }],  },  twitter: {    card: 'summary_large_image',    title: 'Site Title',    description: 'Description for Twitter',    images: ['/og-image.png'],  },  alternates: {    canonical: '/',  },  robots: {    index: true,    follow: true,  },};``` ### app/sitemap.ts - Dynamic Sitemap ```typescriptimport type { MetadataRoute } from 'next'; export default function sitemap(): MetadataRoute.Sitemap {  const baseUrl = 'https://your-site.com';   return [    {      url: baseUrl,      lastModified: new Date(),      changeFrequency: 'weekly',      priority: 1,      images: [`${baseUrl}/og-image.png`], // Next.js 16 Image Sitemap    },    {      url: `${baseUrl}/about`,      lastModified: new Date(),      changeFrequency: 'monthly',      priority: 0.8,    },  ];}``` ### app/robots.ts - Robots Configuration ```typescriptimport type { MetadataRoute } from 'next'; export default function robots(): MetadataRoute.Robots {  const baseUrl = 'https://your-site.com';   return {    rules: [      {        userAgent: '*',        allow: '/',        disallow: ['/api/', '/admin/'],        // Do NOT disallow /_next/ — crawlers need render-critical CSS/JS        // Do NOT add bot-specific rules (Googlebot, Bingbot) unless overriding wildcard      },    ],    sitemap: `${baseUrl}/sitemap.xml`,    host: baseUrl,  };}``` ## Key Principles ### Cache Components & SEO (Next.js 16+) With `cacheComponents: true` in next.config.ts, use the `"use cache"` directive for SEO-critical server components: ```typescript// app/(home)/sections/hero-section.tsxexport async function HeroSection() {  "use cache";  cacheLife("minutes");   // Built-in profile: ~15 min  cacheTag("hero");       // For targeted invalidation via revalidateTag("hero")   const data = await fetchData();  return <div>{/* SEO-visible content */}</div>;}``` **Key rules:**- `"use cache"` must be the first statement in the function body- No `cookies()`/`headers()` inside cache scope- Use `cacheLife()` + `cacheTag()` instead of `export const revalidate`- Sitemaps and metadata are static by default — only use `"use cache"` if they fetch dynamic data ### Rendering Strategy for SEO | Strategy | Use When | SEO Impact ||----------|----------|------------|| "use cache" | Server components with periodic data | Best - cached HTML, fast TTFB || SSG (Static) | Content rarely changes | Best - pre-rendered HTML || SSR | Dynamic content per request | Great - server-rendered || CSR | Dashboards, authenticated areas | Poor - avoid for SEO pages | ### Core Web Vitals Targets | Metric | Target | Impact ||--------|--------|--------|| LCP (Largest Contentful Paint) | < 2.5s | Loading speed || INP (Interaction to Next Paint) | < 200ms | Interactivity || CLS (Cumulative Layout Shift) | < 0.1 | Visual stability | ## References - **Metadata API**: See [references/metadata-api.md](references/metadata-api.md)- **Sitemap & Robots**: See [references/sitemap-robots.md](references/sitemap-robots.md)- **JSON-LD Structured Data**: See [references/json-ld.md](references/json-ld.md)- **SEO Audit Checklist**: See [references/checklist.md](references/checklist.md)- **Troubleshooting**: See [references/troubleshooting.md](references/troubleshooting.md) ## Common Mistakes to Avoid 1. **Mixing next-seo with Metadata API** - Use only Metadata API in App Router2. **Missing canonical URLs** - Always set `alternates.canonical`3. **Using CSR for SEO pages** - Use SSG/SSR for indexable content4. **Blocking `/_next/` in robots.txt** - Crawlers need render-critical CSS/JS; never disallow `/_next/`5. **Missing metadataBase** - Required for relative URLs in metadata6. **Viewport in metadata** - Must be separate export in Next.js 14+7. **Mixing metadata object and generateMetadata** - Use one or the other, not both ## Quick Fixes ### Add noindex to a page ```typescriptexport const metadata: Metadata = {  robots: {    index: false,    follow: false,  },};``` ### Dynamic metadata per page ```typescripttype Props = { params: Promise<{ id: string }> }; export async function generateMetadata({ params }: Props): Promise<Metadata> {  const { id } = await params;            // params is a Promise in Next.js 15+  const product = await getProduct(id);  return {    title: product.name,    description: product.description,  };}``` ### Canonical for dynamic routes ```typescripttype Props = { params: Promise<{ slug: string }> }; export async function generateMetadata({ params }: Props): Promise<Metadata> {  const { slug } = await params;  return {    alternates: {      canonical: `/products/${slug}`,    },  };}```