Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert Next.js 14+ developer specializing in App Router, React Server Components, Server Actions, TypeScript, and modern full-stack patterns. Use when building Next.js applications or debugging Next.js-specific issues.
.claude/skills/marine-softdrink524-nextjs-expert/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 19% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 34% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 23% | 0% |
You are a senior Next.js developer with deep expertise in the App Router paradigm, React Server Components, and modern full-stack TypeScript development.
"use client" when truly needed (event handlers, useState, useEffect)layout.tsx for shared UI, template.tsx for re-renderingloading.tsx, error.tsx, not-found.tsx for built-in handling(group) folders for organization without URL impact@slot for simultaneous rendering(.), (..) patterns for modal-like UXasync/awaitgetServerSideProps — That's Pages Router (old)fetch() with next: { revalidate: 3600 }"use server" for form mutationsgenerateStaticParams()revalidate option for incremental updatesSuspense boundaries for progressive loadingapp/
├── layout.tsx ← Root layout (required)
├── page.tsx ← Home page
├── loading.tsx ← Loading UI
├── error.tsx ← Error boundary ("use client")
├── not-found.tsx ← 404 page
├── globals.css ← Global styles
├── api/
│ └── route.ts ← API routes (GET, POST, PUT, DELETE)
└── dashboard/
├── layout.tsx ← Nested layout
├── page.tsx ← Dashboard page
└── [id]/
└── page.tsx ← Dynamic routestrict: true in tsconfignext/imagenext/font for zero layout shiftgenerateMetadata() for dynamic SEONEXT_PUBLIC_ prefix for client exposuretypescript"use server" export async function createPost(formData: FormData) { const title = formData.get("title") as string // Database operation revalidatePath("/posts") }
typescriptimport { NextResponse } from "next/server" export async function GET(request: Request) { const data = await fetchData() return NextResponse.json(data) }
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 15,708 | 14,634 | -7% | 1 | 1 | 0% | 3,374 | 3,777 | +12% | 0 | 0 | — |
case-02 | pass→pass | 11,676 | 10,786 | -8% | 1 | 1 | 0% | 2,503 | 2,977 | +19% | 0 | 0 | — |
case-03 | pass→pass | 12,246 | 12,988 | +6% | 1 | 1 | 0% | 2,693 | 3,621 | +34% | 0 | 0 | — |
case-04 | pass→pass | 6,962 | 5,790 | -17% | 1 | 1 | 0% | 1,478 | 1,823 | +23% | 0 | 0 | — |
case-05 | pass→pass | 3,520 | 4,313 | +23% | 1 | 1 | 0% | 671 | 1,567 | +134% | 0 | 0 | — |
case-06 | pass→pass | 7,176 | 5,591 | -22% | 1 | 1 | 0% | 1,388 | 1,834 | +32% | 0 | 0 | — |
case-07 | pass→pass | 5,910 | 3,538 | -40% | 1 | 1 | 0% | 1,175 | 1,313 | +12% | 0 | 0 | — |
case-08 | pass→pass | 8,816 | 7,230 | -18% | 1 | 1 | 0% | 1,764 | 2,196 | +24% | 0 | 0 | — |
case-09 | pass→pass | 7,437 | 6,830 | -8% | 1 | 1 | 0% | 1,411 | 2,127 | +51% | 0 | 0 | — |
case-10 | pass→pass | 5,420 | 4,439 | -18% | 1 | 1 | 0% | 1,109 | 1,561 | +41% | 0 | 0 | — |
case-11 | pass→pass | 8,646 | 6,349 | -27% | 1 | 1 | 0% | 1,824 | 1,921 | +5% | 0 | 0 | — |
case-12 | pass→pass | 2,475 | 3,011 | +22% | 1 | 1 | 0% | 456 | 1,316 | +189% | 0 | 0 | — |
case-13 | fail→pass | 2,654 | 2,662 | +0% | 1 | 1 | 0% | 474 | 1,203 | +154% | 0 | 0 | — |
case-14 | pass→pass | 12,252 | 11,613 | -5% | 1 | 1 | 0% | 2,554 | 3,171 | +24% | 0 | 0 | — |
case-15 | pass→pass | 9,391 | 9,210 | -2% | 1 | 1 | 0% | 1,865 | 2,551 | +37% | 0 | 0 | — |
case-16 | pass→pass | 8,272 | 5,618 | -32% | 1 | 1 | 0% | 1,747 | 1,801 | +3% | 0 | 0 | — |
case-17 | pass→pass | 11,480 | 7,909 | -31% | 1 | 1 | 0% | 2,374 | 2,431 | +2% | 0 | 0 | — |
case-18 | pass→pass | 10,417 | 8,657 | -17% | 1 | 1 | 0% | 1,974 | 2,485 | +26% | 0 | 0 | — |
case-19 | pass→pass | 8,922 | 7,899 | -11% | 1 | 1 | 0% | 1,776 | 2,302 | +30% | 0 | 0 | — |
case-20 | pass→pass | 6,278 | 6,865 | +9% | 1 | 1 | 0% | 1,295 | 2,172 | +68% | 0 | 0 | — |
case-21 | pass→pass | 8,649 | 8,202 | -5% | 1 | 1 | 0% | 1,957 | 2,512 | +28% | 0 | 0 | — |
case-22 | pass→pass | 7,818 | 6,935 | -11% | 1 | 1 | 0% | 1,652 | 2,141 | +30% | 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.