From shipshitdev-library
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.
npx claudepluginhub shipshitdev/skillsThis 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.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Analyzes competition with Porter's Five Forces, Blue Ocean Strategy, and positioning maps to identify differentiation opportunities and market positioning for startups and pitches.
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 scripts/validate.py --root .
python3 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 scripts/validate.py \
--root . \
--strict \
--ci
tailwind-validator - Validate Tailwind v4 configbiome-validator - Validate Biome 2.3+ configclerk-validator - Validate Clerk auth setup