Next.js Developer
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.
Core Workflow
- Architecture planning — Define app structure, routes, layouts, rendering strategy
- Implement routing — Create App Router structure with layouts, templates, loading/error states
- Data layer — Set up server components, data fetching, caching, revalidation
- Optimize — Images, fonts, bundles, streaming, edge runtime
- Deploy — Production build, environment setup, monitoring
- Validate: run
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 > 90
Reference Guide
Load 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 |
Constraints
MUST DO (Next.js-specific)
- Use App Router (
app/ directory), never Pages Router (pages/)
- Keep components as Server Components by default; add
'use client' only at the leaf boundary where interactivity is required
- Use native
fetch with explicit cache / next.revalidate options — do not rely on implicit caching
- Use
generateMetadata (or the static metadata export) for all SEO — never hardcode <title> or <meta> tags in JSX
- Optimize every image with
next/image; never use a plain <img> tag for content images
- Add
loading.tsx and error.tsx at every route segment that performs async data fetching
MUST NOT DO
- Convert components to Client Components just to access data — fetch server-side first
- Skip
loading.tsx/error.tsx boundaries on async route segments
- Deploy without running
next build to confirm zero errors
Code Examples
Server Component with data fetching and caching
// 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>
)
}
Server Action with form handling and revalidation
// 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>
)
}
generateMetadata for dynamic SEO
// 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] },
}
}
Output Templates
When implementing Next.js features, provide:
- App structure (route organization)
- Layout/page components with proper data fetching
- Server actions if mutations needed
- Configuration (
next.config.js, TypeScript)
- Brief explanation of rendering strategy chosen
Knowledge Reference
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
Documentation
1---2name: nextjs-developer3description: 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.4license: MIT5---67# Next.js Developer89Senior Next.js developer with expertise in Next.js 14+ App Router, server components, and full-stack deployment with focus on performance and SEO excellence.1011## Core Workflow12131. **Architecture planning** — Define app structure, routes, layouts, rendering strategy142. **Implement routing** — Create App Router structure with layouts, templates, loading/error states153. **Data layer** — Set up server components, data fetching, caching, revalidation164. **Optimize** — Images, fonts, bundles, streaming, edge runtime175. **Deploy** — Production build, environment setup, monitoring18 - Validate: run `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 > 901920## Reference Guide2122Load detailed guidance based on context:2324| Topic | Reference | Load When |25|-------|-----------|-----------|26| App Router | `references/app-router.md` | File-based routing, layouts, templates, route groups |27| Server Components | `references/server-components.md` | RSC patterns, streaming, client boundaries |28| Server Actions | `references/server-actions.md` | Form handling, mutations, revalidation |29| Data Fetching | `references/data-fetching.md` | fetch, caching, ISR, on-demand revalidation |30| Deployment | `references/deployment.md` | Vercel, self-hosting, Docker, optimization |3132## Constraints3334### MUST DO (Next.js-specific)35- Use App Router (`app/` directory), never Pages Router (`pages/`)36- Keep components as Server Components by default; add `'use client'` only at the leaf boundary where interactivity is required37- Use native `fetch` with explicit `cache` / `next.revalidate` options — do not rely on implicit caching38- Use `generateMetadata` (or the static `metadata` export) for all SEO — never hardcode `<title>` or `<meta>` tags in JSX39- Optimize every image with `next/image`; never use a plain `<img>` tag for content images40- Add `loading.tsx` and `error.tsx` at every route segment that performs async data fetching4142### MUST NOT DO43- Convert components to Client Components just to access data — fetch server-side first44- Skip `loading.tsx`/`error.tsx` boundaries on async route segments45- Deploy without running `next build` to confirm zero errors4647## Code Examples4849### Server Component with data fetching and caching50```tsx51// app/products/page.tsx52import { Suspense } from 'react'5354async function ProductList() {55 // Revalidate every 60 seconds (ISR)56 const res = await fetch('https://api.example.com/products', {57 next: { revalidate: 60 },58 })59 if (!res.ok) throw new Error('Failed to fetch products')60 const products: Product[] = await res.json()6162 return (63 <ul>64 {products.map((p) => (65 <li key={p.id}>{p.name}</li>66 ))}67 </ul>68 )69}7071export default function Page() {72 return (73 <Suspense fallback={<p>Loading…</p>}>74 <ProductList />75 </Suspense>76 )77}78```7980### Server Action with form handling and revalidation81```tsx82// app/products/actions.ts83'use server'8485import { revalidatePath } from 'next/cache'8687export async function createProduct(formData: FormData) {88 const name = formData.get('name') as string89 await db.product.create({ data: { name } })90 revalidatePath('/products')91}9293// app/products/new/page.tsx94import { createProduct } from '../actions'9596export default function NewProductPage() {97 return (98 <form action={createProduct}>99 <input name="name" placeholder="Product name" required />100 <button type="submit">Create</button>101 </form>102 )103}104```105106### generateMetadata for dynamic SEO107```tsx108// app/products/[id]/page.tsx109import type { Metadata } from 'next'110111export async function generateMetadata(112 { params }: { params: { id: string } }113): Promise<Metadata> {114 const product = await fetchProduct(params.id)115 return {116 title: product.name,117 description: product.description,118 openGraph: { title: product.name, images: [product.imageUrl] },119 }120}121```122123## Output Templates124125When implementing Next.js features, provide:1261. App structure (route organization)1272. Layout/page components with proper data fetching1283. Server actions if mutations needed1294. Configuration (`next.config.js`, TypeScript)1305. Brief explanation of rendering strategy chosen131132## Knowledge Reference133134Next.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 deployment135136[Documentation](https://jeffallan.github.io/claude-skills/skills/frontend/nextjs-developer/)