Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add soilmass/vibe-coding-plugin --skill "seo-advanced"
Install specific skill from multi-skill repository
# Description
>
# SKILL.md
name: seo-advanced
description: >
Advanced SEO — JSON-LD structured data, dynamic sitemap.ts, robots.ts, OpenGraph image generation with opengraph-image.tsx
allowed-tools: Read, Grep, Glob
Advanced SEO
Purpose
Advanced SEO patterns beyond basic metadata. Covers JSON-LD structured data, dynamic sitemaps,
robots.txt configuration, and OpenGraph image generation. The ONE skill for SEO beyond meta tags.
When to Use
- Adding structured data (JSON-LD) for rich search results
- Generating dynamic sitemaps from database content
- Configuring robots.txt and creating dynamic OpenGraph images
When NOT to Use
- Basic page titles and descriptions →
nextjs-metadata - Route-level meta tags →
nextjs-metadata - Security headers →
security
Pattern
JSON-LD structured data
// src/components/JsonLd.tsx
export function JsonLd({ data }: { data: Record<string, unknown> }) {
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
/>
);
}
// Usage in page
export default async function ProductPage({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
const product = await getProduct(id);
const jsonLd = {
"@context": "https://schema.org",
"@type": "Product",
name: product.name,
description: product.description,
image: product.image,
offers: {
"@type": "Offer",
price: product.price,
priceCurrency: "USD",
availability: "https://schema.org/InStock",
},
};
return (
<>
<JsonLd data={jsonLd} />
<div>{product.name}</div>
</>
);
}
Dynamic sitemap.ts
// app/sitemap.ts
import type { MetadataRoute } from "next";
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await db.post.findMany({ select: { slug: true, updatedAt: true } });
return [
{ url: "https://myapp.com", lastModified: new Date(), priority: 1 },
...posts.map((post) => ({
url: `https://myapp.com/blog/${post.slug}`,
lastModified: post.updatedAt,
changeFrequency: "weekly" as const,
priority: 0.8,
})),
];
}
robots.ts
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: "*", allow: "/", disallow: ["/api/", "/dashboard/"] }],
sitemap: "https://myapp.com/sitemap.xml",
};
}
OpenGraph image generation
// app/blog/[slug]/opengraph-image.tsx
import { ImageResponse } from "next/og";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
export default async function Image({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const post = await getPost(slug);
return new ImageResponse(
<div style={{ display: "flex", fontSize: 48, background: "#000", color: "#fff",
width: "100%", height: "100%", alignItems: "center", justifyContent: "center" }}>
{post.title}
</div>,
{ ...size },
);
}
Anti-pattern
// WRONG: hardcoded sitemap URLs (breaks when pages are added/removed)
export default function sitemap() {
return [
{ url: "https://myapp.com/blog/post-1" },
{ url: "https://myapp.com/blog/post-2" }, // Must manually update!
];
}
Generate sitemaps dynamically from your database. Build JSON-LD from typed objects.
Common Mistakes
- Hardcoding sitemap URLs — generate from database instead
- Missing
metadataBase— relative URLs in sitemap break - JSON-LD without
@context— search engines ignore it - Not disallowing private routes in robots.txt
Checklist
- [ ]
sitemap.tsgenerates URLs from database - [ ]
robots.tsblocks private routes (/api/,/dashboard/) - [ ] JSON-LD structured data on key pages (products, articles, org)
- [ ] OpenGraph images generated dynamically for content pages
- [ ]
metadataBaseset in root layout - [ ] Canonical URLs set for duplicate content prevention
Composes With
nextjs-metadata— basic metadata complements advanced SEOnextjs-routing— sitemap reflects all public routesi18n— hreflang tags and locale-specific sitemaps
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.