Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when building Next.js 14+ applications with App Router, server components, or server actions. Invoke to configure route handlers, implement middleware, set up API routes, add streaming SSR, write generateMetadata for SEO, scaffold loading.tsx/error.tsx boundaries, or deploy to Vercel. Triggers on: Next.js, Next.js 14, App Router, RSC, use server, Server Components, Server Actions, React Server Components, generateMetadata, loading.tsx, Next.js deployment, Vercel, Next.js performance.
.claude/skills/jeffallan-nextjs-developer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 30% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 33% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 55% | 0% |
Senior Next.js developer with expertise in Next.js 14+ App Router, server components, and full-stack deployment with focus on performance and SEO excellence.
next build locally, confirm zero type errors, check NEXT_PUBLIC_* and server-only env vars are set, run Lighthouse/PageSpeed to confirm Core Web Vitals > 90Load detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | App Router | references/app-router.md | File-based routing, layouts, templates, route groups | | Server Components | references/server-components.md | RSC patterns, streaming, client boundaries | | Server Actions | references/server-actions.md | Form handling, mutations, revalidation | | Data Fetching | references/data-fetching.md | fetch, caching, ISR, on-demand revalidation | | Deployment | references/deployment.md | Vercel, self-hosting, Docker, optimization |
app/ directory), never Pages Router (pages/)'use client' only at the leaf boundary where interactivity is requiredfetch with explicit cache / next.revalidate options — do not rely on implicit cachinggenerateMetadata (or the static metadata export) for all SEO — never hardcode <title> or <meta> tags in JSXnext/image; never use a plain <img> tag for content imagesloading.tsx and error.tsx at every route segment that performs async data fetchingloading.tsx/error.tsx boundaries on async route segmentsnext build to confirm zero errorstsx// app/products/page.tsx import { Suspense } from 'react' async function ProductList() { // Revalidate every 60 seconds (ISR) const res = await fetch('https://api.example.com/products', { next: { revalidate: 60 }, }) if (!res.ok) throw new Error('Failed to fetch products') const products: Product[] = await res.json() return ( <ul> {products.map((p) => ( <li key={p.id}>{p.name}</li> ))} </ul> ) } export default function Page() { return ( <Suspense fallback={<p>Loading…</p>}> <ProductList /> </Suspense> ) }
tsx// app/products/actions.ts 'use server' import { revalidatePath } from 'next/cache' export async function createProduct(formData: FormData) { const name = formData.get('name') as string await db.product.create({ data: { name } }) revalidatePath('/products') } // app/products/new/page.tsx import { createProduct } from '../actions' export default function NewProductPage() { return ( <form action={createProduct}> <input name="name" placeholder="Product name" required /> <button type="submit">Create</button> </form> ) }
tsx// app/products/[id]/page.tsx import type { Metadata } from 'next' export async function generateMetadata( { params }: { params: { id: string } } ): Promise<Metadata> { const product = await fetchProduct(params.id) return { title: product.name, description: product.description, openGraph: { title: product.name, images: [product.imageUrl] }, } }
When implementing Next.js features, provide:
next.config.js, TypeScript)Next.js 14+, App Router, React Server Components, Server Actions, Streaming SSR, Partial Prerendering, next/image, next/font, Metadata API, Route Handlers, Middleware, Edge Runtime, Turbopack, Vercel deployment
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 25,375 | 25,570 | +1% | 1 | 1 | 0% | 6,013 | 7,409 | +23% | 0 | 0 | — |
case-02 | fail→pass | 26,141 | 20,810 | -20% | 1 | 1 | 0% | 5,775 | 6,424 | +11% | 0 | 0 | — |
case-03 | pass→pass | 15,631 | 13,467 | -14% | 1 | 1 | 0% | 3,171 | 4,125 | +30% | 0 | 0 | — |
case-04 | pass→pass | 15,187 | 12,395 | -18% | 1 | 1 | 0% | 2,853 | 3,782 | +33% | 0 | 0 | — |
case-05 | pass→pass | 12,795 | 13,722 | +7% | 1 | 1 | 0% | 2,712 | 4,193 | +55% | 0 | 0 | — |
case-06 | pass→pass | 10,376 | 7,282 | -30% | 1 | 1 | 0% | 2,068 | 2,551 | +23% | 0 | 0 | — |
case-07 | pass→pass | 6,671 | 5,575 | -16% | 1 | 1 | 0% | 1,382 | 2,347 | +70% | 0 | 0 | — |
case-08 | pass→pass | 10,541 | 11,505 | +9% | 1 | 1 | 0% | 1,938 | 3,353 | +73% | 0 | 0 | — |
case-09 | pass→pass | 9,077 | 9,442 | +4% | 1 | 1 | 0% | 1,931 | 3,301 | +71% | 0 | 0 | — |
case-10 | pass→pass | 4,290 | 6,376 | +49% | 1 | 1 | 0% | 815 | 2,351 | +188% | 0 | 0 | — |
case-11 | pass→pass | 13,694 | 14,326 | +5% | 1 | 1 | 0% | 2,275 | 3,792 | +67% | 0 | 0 | — |
case-12 | pass→pass | 9,480 | 9,430 | -1% | 1 | 1 | 0% | 1,689 | 3,082 | +82% | 0 | 0 | — |
case-13 | pass→pass | 8,322 | 8,257 | -1% | 1 | 1 | 0% | 1,610 | 2,690 | +67% | 0 | 0 | — |
case-18 | pass→pass | 11,865 | 12,485 | +5% | 1 | 1 | 0% | 2,338 | 3,364 | +44% | 0 | 0 | — |
case-14 | pass→pass | 13,446 | 15,028 | +12% | 1 | 1 | 0% | 3,479 | 4,430 | +27% | 0 | 0 | — |
case-15 | pass→pass | 10,912 | 9,231 | -15% | 1 | 1 | 0% | 2,149 | 2,903 | +35% | 0 | 0 | — |
case-16 | pass→pass | 9,498 | 8,143 | -14% | 1 | 1 | 0% | 1,931 | 2,925 | +51% | 0 | 0 | — |
case-17 | pass→pass | 5,501 | 5,492 | -0% | 1 | 1 | 0% | 1,012 | 2,183 | +116% | 0 | 0 | — |
case-19 | pass→pass | 6,945 | 5,898 | -15% | 1 | 1 | 0% | 1,360 | 2,337 | +72% | 0 | 0 | — |
case-20 | pass→pass | 9,419 | 10,176 | +8% | 1 | 1 | 0% | 1,946 | 3,316 | +70% | 0 | 0 | — |
case-21 | pass→pass | 10,729 | 10,031 | -7% | 1 | 1 | 0% | 2,374 | 2,710 | +14% | 0 | 0 | — |
case-22 | pass→pass | 11,178 | 10,606 | -5% | 1 | 1 | 0% | 2,671 | 3,746 | +40% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.