Install
Terminal · npx$
npx skills add https://github.com/laguagu/claude-code-nextjs-skills --skill nextjs-seoWorks 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 packSource file
SKILL.md227 linesExpandCollapse
---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}`, }, };}```Related skills
1password
Install 1password skill for Claude Code from steipete/clawdis.
3d Web Experience
Install 3d Web Experience skill for Claude Code from sickn33/antigravity-awesome-skills.
Ab Test Setup
This handles the full A/B testing workflow from hypothesis formation to statistical analysis. It walks you through proper test design, calculates sample sizes,