nextjs-16-audit

zacharyr0th's avatarfrom zacharyr0th

Comprehensive file-by-file audit for Next.js 16, React 19, and Clarity architecture compliance. Checks caching, auth patterns, type safety, Server Components, and generates auto-fixes with exact code.

⭐1stars🔀0forks📁View on GitHub🕐Updated Nov 7, 2025

When & Why to Use This Skill

This Claude skill provides a comprehensive automated audit for Next.js 16 and React 19 applications, ensuring strict adherence to modern architectural standards. It evaluates codebases for type safety, optimized caching strategies, and secure authentication patterns, delivering a detailed compliance score and actionable auto-fix code snippets to enhance performance and maintainability.

Use Cases

  • Upgrading legacy Next.js projects to version 16 by identifying deprecated patterns like cacheWrap and suggesting 'use cache' implementations.
  • Enforcing architectural consistency by ensuring all domain types are centralized and Server Components utilize the Data Access Layer (DAL) for authentication.
  • Optimizing React 19 performance by detecting unnecessary useEffect hooks and recommending derived state or modern hook alternatives.
  • Automating security and accessibility checks to ensure Zod validation at API boundaries and semantic HTML compliance in UI components.
nameNext.js 16 Audit
descriptionComprehensive file-by-file audit for Next.js 16, React 19, and Clarity architecture compliance. Checks caching, auth patterns, type safety, Server Components, and generates auto-fixes with exact code.
version3.1.0

Next.js 16 Best Practices Audit

Overview

This skill performs a comprehensive, file-by-file analysis of TypeScript/TSX files to ensure strict compliance with:

  • Next.js 16 patterns (Cache Components, App Router, route handlers)
  • React 19 best practices (no unnecessary useEffect, derived state, Server Components)
  • Clarity architecture (DAL, type centralization, repository pattern)

When to Use This Skill

Primary Triggers:

  • "Audit this file" / "Review this component"
  • "Check for Next.js 16 compliance"
  • "Analyze for best practices"
  • User explicitly asks to audit with their skill

What Gets Audited:

  • ✅ Type centralization (all domain types in @/lib/types)
  • ✅ Caching patterns ('use cache' vs deprecated cacheWrap)
  • ✅ Auth patterns (DAL usage vs direct Supabase)
  • ✅ Server/Client Component patterns
  • ✅ Database patterns (repositories, Drizzle imports)
  • ✅ React 19 patterns (no unnecessary useEffect)
  • ✅ Security (input validation, XSS prevention)
  • ✅ Performance (next/image, bundle size)
  • ✅ Accessibility (semantic HTML, ARIA)

Execution Mode

When activated, perform the following analysis on the provided file:

Step 1: File Classification

Determine file type:

  • Server Component: app/**/page.tsx, layout.tsx (no "use client")
  • Client Component: Has "use client" directive
  • API Route: app/api/**/route.ts
  • Utility: lib/**/*.ts
  • Hook: hooks/**/*.ts or lib/hooks/**/*.ts
  • Component: components/**/*.tsx
  • Type Definition: lib/types/**/*.ts

Step 2: Core Analysis (14 Categories)

2.1 Type Safety

  • No any types (use unknown or proper types)
  • Canonical type imports from @/lib/types (NOT local definitions)
  • No type duplicates for: Transaction, Account, User, Connection, Asset
  • Proper Zod schemas at API boundaries
  • Array bounds checking

Critical Rule: Domain types MUST import from /Users/zach/Documents/clarity/lib/types

```ts // ❌ VIOLATION interface Transaction { id: string; amount: number; }

// ✅ CORRECT import type { Transaction } from '@/lib/types'; ```

2.2 Caching (Next.js 16)

  • No legacy cacheWrap usage
  • Cache Components with 'use cache' directive
  • Appropriate cacheLife duration ('minutes', 'hours', 'days')
  • Proper cacheTag for invalidation
  • No cookies(), headers(), searchParams in cached functions

```ts // ✅ CORRECT import { unstable_cacheLife as cacheLife, unstable_cacheTag as cacheTag } from 'next/cache';

async function getData(userId: string) { 'use cache' cacheLife('minutes') cacheTag(UserTags.data(userId)) return await db.query.data.findMany({ where: eq(data.userId, userId) }); }

// ❌ DEPRECATED import { cacheWrap } from '@/lib/cache'; const data = await cacheWrap('key', fetchData, 300); ```

2.3 Authentication

  • Server Components use DAL (verifySession, getUserId, getUser)
  • No direct supabase.auth.getUser() calls
  • Client Components use useAuthUser() or useAuth()
  • Proper redirects for unauthorized

```ts // ✅ CORRECT (Server Component) import { getUserId } from '@/lib/data/dal'; const userId = await getUserId();

// ❌ WRONG import { createClient } from '@/lib/db/supabase/server'; const { data: { user } } = await supabase.auth.getUser(); ```

2.4 Server/Client Components

  • Server Components are async for data fetching
  • No "use client" unless necessary (hooks/events/browser APIs)
  • Client Components minimal and focused
  • No hooks in Server Components

2.5 Database Patterns

  • Drizzle operators from drizzle-orm (NOT @/lib/db)
  • Repositories preferred over queries module
  • Balance helpers for encryption/decryption
  • Parameterized queries (no SQL injection)

```ts // ✅ CORRECT import { eq, and } from 'drizzle-orm';

// ❌ WRONG import { eq, and } from '@/lib/db'; ```

2.6 React 19 Patterns

  • No unnecessary useEffect (derive state, use event handlers, or keys)
  • State derived when possible
  • Event handlers for side effects
  • Modern hooks (use(), useSyncExternalStore())

2.7 API Routes

  • Proper route handler syntax (export async function GET/POST)
  • Cacheable logic in 'use cache' helper functions
  • Input validation with Zod
  • Structured logging with Pino

2.8 Security

  • User input validated with Zod
  • HTML sanitized with isomorphic-dompurify
  • No XSS vulnerabilities
  • Environment variables used correctly

2.9 Performance

  • next/image instead of <img>
  • Heavy components dynamically imported
  • Proper image optimization

2.10 Accessibility

  • Semantic HTML elements
  • <button> not <div onClick>
  • Form labels with htmlFor
  • ARIA attributes when needed
  • Keyboard navigation support

Step 3: Generate Findings Report

For the audited file, provide:

```markdown

File: [file-path]

Type: [Server Component / Client Component / API Route / etc.] Compliance Score: [0-100]/100

✅ Strengths

  • List what the file does well

🚨 Critical Issues (Must Fix)

  1. Line X: [Issue description]
    • Current: `[code snippet]`
    • Fix: `[corrected code]`
    • Impact: [why this matters]

⚠️ Warnings (Should Fix)

  1. Line Y: [Issue description]
    • Suggestion: [how to improve]

ℹ️ Suggestions (Consider)

  1. [Optional improvements]

🔧 Auto-Fix Instructions

[Exact Edit tool commands to fix all issues] ```

Step 4: Score Calculation

Scoring Rubric:

  • Critical (30%): Security, auth, type safety violations
  • High (25%): Wrong patterns, deprecated code, database issues
  • Medium (25%): Performance, accessibility, missing optimizations
  • Low (20%): Code quality, structure, documentation

Grade Scale:

  • 95-100: Excellent ⭐⭐⭐⭐⭐
  • 85-94: Good ⭐⭐⭐⭐
  • 75-84: Acceptable ⭐⭐⭐
  • 65-74: Needs Work ⚠️
  • <65: Critical Issues 🚨

Resources

See the skill directory for detailed references:

  • SKILL.md - Complete audit methodology (all 14 categories explained)
  • CHECKLIST.md - Comprehensive checklist by file type
  • USAGE.md - Usage examples and common patterns
  • quick-reference.md - Quick lookup for common violations

Key Architecture Rules

Type Centralization (CRITICAL)

Canonical Location: /Users/zach/Documents/clarity/lib/types

ALL domain types MUST be defined in @/lib/types ONLY:

  • Transaction, Account, User, Connection, Asset, Portfolio, Holding, Institution

Allowed Exceptions (must be documented):

  1. Presentation layer types (UI-specific fields)
  2. Utility-specific minimal interfaces (e.g., Dateable)
  3. Type re-exports

Import Restrictions

  • @vercel/kv → Use @/lib/utils/kv wrapper
  • Drizzle operators → Import from drizzle-orm (not @/lib/db)
  • Types → Import from @/lib/types (canonical source)

Caching Migration

  • cacheWrap is DEPRECATED → Use 'use cache' directive
  • All route handlers should extract cacheable logic to helper functions

Auth Patterns

  • Server Components → Use DAL (getUserId, getUser, verifySession)
  • Client Components → Use useAuthUser() hook
  • API Routes → Use getUserId() from DAL

Output Format

Always provide:

  1. File classification and context
  2. Compliance score (0-100)
  3. Categorized findings (Critical, Warning, Suggestion)
  4. Exact code snippets with line numbers
  5. Auto-fix instructions using Edit tool
  6. Score improvement path (current → target)

Success Criteria

File passes audit if:

  • ✅ Zero critical errors
  • ✅ < 3 warnings per file
  • ✅ Compliance score > 85/100
  • ✅ No deprecated patterns
  • ✅ Type safety maintained