From shipshitdev-frontend
Validates Next.js 16 configurations, detects deprecated patterns like middleware.ts and Pages Router, enforces proxy.ts, Turbopack, Cache Components, App Router, and TypeScript configs. Use before development or auditing projects.
npx claudepluginhub shipshitdev/libraryThis skill uses the workspace's default tool permissions.
Validates Next.js 16 configuration and prevents deprecated patterns. AI assistants often generate Next.js 14/15 patterns - this skill enforces Next.js 16.
Validates Next.js 16 configurations and detects deprecated patterns like middleware.ts, enforcing proxy.ts, Turbopack, Cache Components, and App Router best practices before development or project audits.
Upgrades Next.js projects to v16 with Turbopack, async Dynamic APIs, Biome, and React 19.2. Runs detection scripts, codemods, migration plans, and build benchmarks.
Provides Next.js 16 App Router production patterns for Server Components, Server Actions, Cache Components with 'use cache', caching APIs, Route Handlers, metadata, async params, proxy.ts migration, and React 19.2 features.
Share bugs, ideas, or general feedback.
Validates Next.js 16 configuration and prevents deprecated patterns. AI assistants often generate Next.js 14/15 patterns - this skill enforces Next.js 16.
python3 ~/.claude/skills/nextjs-validator/scripts/validate.py --root .
python3 ~/.claude/skills/nextjs-validator/scripts/validate.py --root . --strict
// GOOD: v16+
"next": "^16.0.0"
// BAD: v15 or earlier
"next": "^15.0.0"
GOOD - Next.js 16:
// proxy.ts (Node.js runtime - REQUIRED)
import { createProxy } from 'next/proxy';
export const proxy = createProxy();
BAD - Deprecated:
// middleware.ts (Edge runtime - DEPRECATED)
export function middleware() { }
GOOD:
app/
├── layout.tsx # Root layout
├── page.tsx # Home page
├── (routes)/ # Route groups
│ ├── dashboard/
│ │ └── page.tsx
│ └── settings/
│ └── page.tsx
└── api/ # API routes (optional)
BAD - Pages Router (deprecated):
pages/
├── _app.tsx
├── index.tsx
└── api/
use cacheGOOD - Next.js 16:
// app/dashboard/page.tsx
'use cache';
export default async function Dashboard() {
const data = await fetch('/api/data');
return <DashboardView data={data} />;
}
GOOD:
// app/actions.ts
'use server';
export async function createItem(formData: FormData) {
// Server-side logic
}
GOOD - Default in Next.js 16:
// next.config.ts (Turbopack is default, no config needed)
BAD - Disabling Turbopack:
// Don't disable unless absolutely necessary
experimental: {
turbo: false // BAD
}
GOOD - TypeScript config:
// next.config.ts
import type { NextConfig } from 'next';
const config: NextConfig = {
// ...
};
export default config;
BAD - JavaScript config:
// next.config.js - Prefer .ts
module.exports = { }
| Deprecated (v15-) | Replacement (v16+) |
|---|---|
middleware.ts | proxy.ts |
getServerSideProps | Server Components + use cache |
getStaticProps | Server Components + use cache |
getStaticPaths | generateStaticParams |
_app.tsx | app/layout.tsx |
_document.tsx | app/layout.tsx |
pages/ directory | app/ directory |
next/router | next/navigation |
useRouter() (pages) | useRouter() from next/navigation |
'use cache';
// Entire component cached
export default async function CachedPage() {
const data = await fetchData();
return <View data={data} />;
}
// next.config.ts
const config: NextConfig = {
experimental: {
ppr: true,
},
};
AI-assisted debugging with contextual insight:
// Enable in development
// Works with Claude Code and other MCP-compatible tools
app/
├── @modal/
│ └── login/
│ └── page.tsx
├── @sidebar/
│ └── default.tsx
└── layout.tsx
app/
├── feed/
│ └── page.tsx
├── photo/
│ └── [id]/
│ └── page.tsx
└── @modal/
└── (.)photo/
└── [id]/
└── page.tsx
=== Next.js 16 Validation Report ===
Package Version: next@16.1.0 ✓
File Structure:
✓ Using app/ directory (App Router)
✗ Found pages/ directory - migrate to App Router
✓ Found proxy.ts
✗ Found middleware.ts - migrate to proxy.ts
Patterns:
✓ Using Server Components
✗ Found getServerSideProps in 2 files
✓ Using next/navigation
Config:
✓ next.config.ts (TypeScript)
✓ Turbopack enabled (default)
Summary: 2 issues found
- Migrate pages/ to app/ directory
- Replace middleware.ts with proxy.ts
Before (v15):
// middleware.ts
import { NextResponse } from 'next/server';
export function middleware(request) {
// Edge runtime
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*'],
};
After (v16):
// proxy.ts
import { createProxy } from 'next/proxy';
export const proxy = createProxy({
// Node.js runtime
async handle(request) {
// Full Node.js APIs available
return request;
},
matcher: ['/dashboard/:path*'],
});
Before:
// pages/dashboard.tsx
export async function getServerSideProps() {
const data = await fetchData();
return { props: { data } };
}
export default function Dashboard({ data }) {
return <View data={data} />;
}
After:
// app/dashboard/page.tsx
export default async function Dashboard() {
const data = await fetchData();
return <View data={data} />;
}
# .github/workflows/validate.yml
- name: Validate Next.js 16
run: |
python3 ~/.claude/skills/nextjs-validator/scripts/validate.py \
--root . \
--strict \
--ci
tailwind-validator - Validate Tailwind v4 configbiome-validator - Validate Biome 2.3+ configclerk-validator - Validate Clerk auth setup