tanstack-seo
Complete SEO setup for TanStack Router / TanStack Start projects. Covers: dynamic OG image generation with Satori + Resvg, centralized SEO config and meta tag helpers, structured data (JSON-LD) for Organization/WebSite/Article/FAQ/Breadcrumb/Software schemas, dynamic XML sitemap, robots.txt, llms.tx
Install
mkdir -p .claude/skills/tanstack-seo && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16708" && unzip -o skill.zip -d .claude/skills/tanstack-seo && rm skill.zipInstalls to .claude/skills/tanstack-seo
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Complete SEO setup for TanStack Router / TanStack Start projects. Covers: dynamic OG image generation with Satori + Resvg, centralized SEO config and meta tag helpers, structured data (JSON-LD) for Organization/WebSite/Article/FAQ/Breadcrumb/Software schemas, dynamic XML sitemap, robots.txt, llms.txt for AI crawlers, per-route head functions with canonical URLs, Twitter Cards, Open Graph tags, web manifest, and favicon configuration. Use when setting up SEO for a new TanStack project, adding OG image generation, creating sitemaps, adding structured data, implementing meta tags, or optimizing a TanStack site for search engines and social sharing.About this skill
TanStack SEO
Complete SEO implementation for TanStack Router / TanStack Start projects. Nine layers covering crawlability, social sharing, structured data, and AI discoverability.
Dependencies
# OG image generation (server-side only)
bun add satori @resvg/resvg-js
No other SEO-specific dependencies. Everything uses TanStack Router's built-in head() API and server route handlers.
Architecture
src/
├── lib/
│ ├── seo.ts # Centralized config, meta helpers, JSON-LD generators
│ ├── og-image.tsx # Satori + Resvg OG image generator (JSX → SVG → PNG)
│ └── brand/index.ts # Brand constants (name, description, social, keywords)
├── routes/
│ ├── __root.tsx # Base HTML: charset, viewport, favicons, default OG, site-wide JSON-LD
│ ├── og[.]png.ts # Server handler: GET /og.png?title=...&description=...
│ ├── sitemap[.]xml.ts # Dynamic XML sitemap
│ ├── llms[.]txt.ts # Concise site summary for AI crawlers
│ ├── llms-full[.]txt.ts # Full content dump for AI crawlers
│ └── (every route) # Per-route head() with title, description, canonical, OG, JSON-LD
└── public/
├── robots.txt # Crawl rules + sitemap reference
├── site.webmanifest # PWA manifest
├── favicon.svg/.png/.ico
└── apple-touch-icon.png
Setup Workflow
1. Create Brand Config
Create src/lib/brand/index.ts:
export const brand = {
name: "Your App",
shortName: "App",
description: "Your app description for SEO.",
author: { name: "Your Name", url: "https://yoursite.com" },
social: { twitter: "@yourhandle", github: "https://github.com/you/repo" },
keywords: ["keyword1", "keyword2", "keyword3"],
} as const;
2. Create SEO Utility
See references/seo-utilities.md for the complete src/lib/seo.ts. Provides:
siteConfig— centralized site metadatagetAbsoluteUrl()/getCanonicalUrl()— URL helpersgetOGImageUrl(title, description?)— builds dynamic OG image URLsgenerateMetaTags(seo)— OG + Twitter + robots + keywords meta arraygenerateHead(seo)— meta + canonical link tags (used in every route)- Six JSON-LD generators: Organization, WebSite, Article, Breadcrumb, FAQ, Software
3. Create OG Image Generator
See references/og-image.md for:
src/lib/og-image.tsx— Satori + Resvg engine with Google Fontssrc/routes/og[.]png.ts— server route handler
4. Create Server Routes + Static Files
See references/server-routes.md for:
- Dynamic sitemap at
/sitemap.xml robots.txt(static inpublic/)llms.txtandllms-full.txtfor AI crawlerssite.webmanifestfor PWA
5. Wire Up Root Layout + Per-Route Heads
See references/route-patterns.md for:
__root.tsxhead: charset, viewport, favicons, manifest, default OG/Twitter, site-wide JSON-LD- Three per-route patterns: static pages, pages with custom OG, dynamic pages (blog/docs)
Key Conventions
- Filename escaping:
[.]escapes dots.og[.]png.ts→/og.png,sitemap[.]xml.ts→/sitemap.xml. - Title suffixing:
generateMetaTags()auto-appends| Site Nameto titles that don't already include it. - Cache headers: OG images 24h, sitemaps 1h, llms.txt 24h.
- Server handlers: Non-HTML routes (PNG, XML, plaintext) use
server.handlers.GETwith no React component. <html lang="en">: Set in the root layout.