Skip to content
nextjs-app-router-expert logo

Next.js App Router Expert

nextjs-app-router-expert

Expert in Next.js 14/15 App Router architecture, React Server Components (RSC), Server Actions, and modern full-stack React development. Specializes in routing patterns, data fetching strategies,

SKILL.md

Full skill instructions

Next.js App Router Expert

Overview

Expert in Next.js 14/​15 App Router architecture, React Server Components (RSC), Server Actions, and modern full-stack React development. Specializes in routing patterns, data fetching strategies, caching, streaming, and deployment optimization.

When to Use

  • Starting a new Next.js project with App Router
  • Migrating from Pages Router to App Router
  • Implementing complex routing patterns (parallel, intercepting routes)
  • Optimizing data fetching with RSC and caching
  • Setting up Server Actions for mutations
  • Configuring middleware for auth/​redirects
  • Debugging hydration errors or RSC issues
  • Deploying to Vercel, Cloudflare, or self-hosted

Capabilities

Routing Architecture

  • File-based routing with app/ directory
  • Dynamic routes ([slug], [...catchAll], [[...optional]])
  • Route groups (group) for organization
  • Parallel routes @modal, @sidebar
  • Intercepting routes (.), (..), (..)(..)
  • Loading and error boundaries per route segment

React Server Components

  • Server vs Client component boundaries
  • 'use client' directive placement
  • Composition patterns (server wrapping client)
  • Streaming with Suspense boundaries
  • Progressive rendering strategies

Data Fetching

  • fetch() with automatic deduplication
  • Caching strategies (force-cache, no-store, revalidate)
  • generateStaticParams() for static generation
  • Incremental Static Regeneration (ISR)
  • On-demand revalidation with revalidatePath() / revalidateTag()

Server Actions

  • Form mutations with 'use server'
  • Optimistic updates with useOptimistic
  • Progressive enhancement (works without JS)
  • Error handling and validation
  • Redirect after mutation

Middleware & Edge

  • middleware.ts for auth, redirects, rewrites
  • Edge Runtime vs Node.js Runtime
  • Geolocation and conditional routing
  • A/​B testing and feature flags

Performance Optimization

  • Image optimization with next/​image
  • Font optimization with next/​font
  • Script loading strategies
  • Bundle analysis and code splitting
  • Partial prerendering (PPR)

Dependencies

Works well with:

  • react-performance-optimizer - React-specific performance patterns
  • vercel-deployment - Vercel deployment configuration
  • cloudflare-worker-dev - Edge deployment patterns
  • postgresql-optimization - Database queries for RSC

Examples

Basic Route Structure

app/
├── layout.tsx          # Root layout (required)
├── page.tsx            # Home page (/)
├── loading.tsx         # Loading UI
├── error.tsx           # Error boundary
├── not-found.tsx       # 404 page
├── blog/
│   ├── page.tsx        # /​blog
│   └── [slug]/
│       ├── page.tsx    # /​blog/:slug
│       └── loading.tsx # Per-route loading
└── (auth)/             # Route group (no URL impact)
    ├── login/
    │   └── page.tsx    # /​login
    └── register/
        └── page.tsx    # /​register

Server Component with Data Fetching

// app/​posts/​page.tsx
import { Suspense } from 'react';

async function getPosts() {
  const res = await fetch('https://api.example.com/​posts', {
    next: { revalidate: 3600 }, // ISR: revalidate every hour
  });
  return res.json();
}

export default async function PostsPage() {
  const posts = await getPosts();

  return (
    <main>
      <h1>Blog Posts</​h1>
      <Suspense fallback={<PostsSkeleton />}>
        <PostList posts={posts} />
      </​Suspense>
    </​main>
  );
}

Server Action Form

// app/​contact/​page.tsx
import { redirect } from 'next/​navigation';
import { revalidatePath } from 'next/​cache';

async function submitContact(formData: FormData) {
  'use server';

  const email = formData.get('email') as string;
  const message = formData.get('message') as string;

  // Validate
  if (!email || !message) {
    throw new Error('Email and message required');
  }

  // Save to database
  await db.contacts.create({ email, message });

  // Revalidate and redirect
  revalidatePath('/​contact');
  redirect('/​contact/​success');
}

export default function ContactPage() {
  return (
    <form action={submitContact}>
      <input name="email" type="email" required />
      <textarea name="message" required />
      <button type="submit">Send</​button>
    </​form>
  );
}

Parallel Routes (Modal Pattern)

app/
├── layout.tsx
├── page.tsx
├── @modal/
│   ├── default.tsx     # Empty state when no modal
│   └── (.)photo/[id]/
│       └── page.tsx    # Intercept /​photo/[id] as modal
└── photo/[id]/
    └── page.tsx        # Full page when direct navigation
// app/​layout.tsx
export default function Layout({
  children,
  modal,
}: {
  children: React.ReactNode;
  modal: React.ReactNode;
}) {
  return (
    <>
      {children}
      {modal}
    </>
  );
}

Middleware for Auth

// middleware.ts
import { NextResponse } from 'next/​server';
import type { NextRequest } from 'next/​server';

export function middleware(request: NextRequest) {
  const token = request.cookies.get('auth-token');
  const isAuthPage = request.nextUrl.pathname.startsWith('/​login');
  const isProtectedPage = request.nextUrl.pathname.startsWith('/​dashboard');

  // Redirect authenticated users away from login
  if (isAuthPage && token) {
    return NextResponse.redirect(new URL('/​dashboard', request.url));
  }

  // Redirect unauthenticated users to login
  if (isProtectedPage && !token) {
    return NextResponse.redirect(new URL('/​login', request.url));
  }

  return NextResponse.next();
}

export const config = {
  matcher: ['/​dashboard/:path*', '/​login'],
};

Static Generation with Dynamic Params

// app/​blog/[slug]/​page.tsx
import { notFound } from 'next/​navigation';

export async function generateStaticParams() {
  const posts = await fetch('https://api.example.com/​posts').then(r => r.json());

  return posts.map((post: { slug: string }) => ({
    slug: post.slug,
  }));
}

export async function generateMetadata({ params }: { params: { slug: string } }) {
  const post = await getPost(params.slug);

  return {
    title: post?.title ?? 'Post Not Found',
    description: post?.excerpt,
  };
}

export default async function PostPage({ params }: { params: { slug: string } }) {
  const post = await getPost(params.slug);

  if (!post) {
    notFound();
  }

  return (
    <article>
      <h1>{post.title}</​h1>
      {/​* NOTE: Always sanitize HTML content with DOMPurify before rendering */​}
      <div>{post.content}</​div>
    </​article>
  );
}

Streaming with Suspense

// app/​dashboard/​page.tsx
import { Suspense } from 'react';

export default function DashboardPage() {
  return (
    <div className="grid grid-cols-2 gap-4">
      {/​* These load in parallel and stream in as ready */​}
      <Suspense fallback={<CardSkeleton />}>
        <RevenueCard />
      </​Suspense>
      <Suspense fallback={<CardSkeleton />}>
        <UsersCard />
      </​Suspense>
      <Suspense fallback={<TableSkeleton />}>
        <RecentOrders />
      </​Suspense>
    </​div>
  );
}

// Each component fetches its own data
async function RevenueCard() {
  const revenue = await getRevenue(); // Server-side fetch
  return <Card title="Revenue" value={revenue} />;
}

Best Practices

  1. Server Components by default - Only add 'use client' when needed for interactivity
  2. Colocate data fetching - Fetch data in the component that needs it
  3. Use Suspense boundaries - Wrap async components for streaming
  4. Leverage caching - Use revalidate and tags for efficient caching
  5. Progressive enhancement - Server Actions work without JavaScript
  6. Route groups for organization - Use (folder) to organize without affecting URLs
  7. Error boundaries per segment - Add error.tsx to critical routes
  8. Metadata API - Use generateMetadata for dynamic SEO
  9. Sanitize user content - Always use DOMPurify or similar when rendering HTML

Common Pitfalls

  • Hydration mismatches - Server/​client rendering differences (dates, random values)
  • Over-using 'use client' - Pushing client boundary too high in the tree
  • Waterfall fetching - Not parallelizing independent data fetches
  • Missing loading states - Forgetting loading.tsx or Suspense boundaries
  • Stale data - Not invalidating cache after mutations
  • Large client bundles - Importing server-only code in client components
  • XSS vulnerabilities - Rendering unsanitized HTML from user input

More skills from curiositech

cost-accrual-tracker logo
curiositech/some_claude_skills

cost-accrual-tracker

Track real-time API cost accrual during LLM execution. Activate on 'cost tracking', 'token usage', 'API costs', 'budget monitoring', 'usage metrics'. NOT for cost estimation, pricing tiers,

242 0
View
openapi-spec-writer logo
curiositech/some_claude_skills

openapi-spec-writer

Expert in writing OpenAPI 3.0/3.1 specifications for REST APIs. Specializes in schema design, documentation best practices, API-first development, and tooling integration. Generates comprehensive

242 0
View
websocket-streaming logo
curiositech/some_claude_skills

websocket-streaming

Implements real-time bidirectional communication between DAG execution engines and visualization dashboards via WebSocket. Covers connection management, typed event protocols, reconnection

242 0
View
windows-3-1-web-designer logo
curiositech/some_claude_skills

windows-3-1-web-designer

Modern web applications with authentic Windows 3.1 aesthetic. Solid navy title bars, Program Manager navigation, beveled borders, single window controls. Extrapolates Win31 to AI chatbots (Cue

242 0
View
drone-cv-expert logo
curiositech/some_claude_skills

drone-cv-expert

Expert in drone systems, computer vision, and autonomous navigation. Specializes in flight control, SLAM, object detection, sensor fusion, and path planning. Activate on "drone", "UAV", "SLAM",

242 0
View
logging-observability logo
curiositech/some_claude_skills

logging-observability

Structured logging, distributed tracing, and metrics for production applications. [What: OpenTelemetry setup, log level strategy, correlation IDs, SLI/SLO alerting thresholds, Grafana dashboard

242 0
View
form-validation-architect logo
curiositech/some_claude_skills

form-validation-architect

End-to-end form handling with react-hook-form, Zod schemas, validation patterns, error messaging, field arrays, and multi-step wizards. Use for complex forms, validation architecture, autosave,

242 0
View
code-review-checklist logo
curiositech/some_claude_skills

code-review-checklist

Generate context-aware code review checklists from PR diffs — tailored to language, codebase patterns, and team standards. Identifies what reviewers should focus on. NOT for automated code

242 0
View
recursive-synthesis logo
curiositech/some_claude_skills

recursive-synthesis

Orchestrate multi-agent collaborative document synthesis through 6 phases - Divergence, Synthesis, Commentary, Consolidation, Reality Check, Final Merge. Produces authoritative founding documents

242 0
View
sobriety-tools-guardian logo
curiositech/some_claude_skills

sobriety-tools-guardian

Performance optimization and continuous improvement for sobriety.tools recovery app. Use for load time optimization, offline capability, crisis detection, performance monitoring, automated

242 0
View
skill-coach logo
curiositech/some_claude_skills

skill-coach

Guides creation of high-quality Agent Skills with domain expertise, anti-pattern detection, and progressive disclosure best practices. Use when creating skills, reviewing existing skills, or when users mention improving skill quality, encoding expertise, or avoiding common AI tooling mistakes. Ac...

242 0
View
postgresql-optimization logo
curiositech/some_claude_skills

postgresql-optimization

Expert in PostgreSQL performance tuning, query optimization, and database administration. Specializes in EXPLAIN analysis, indexing strategies, connection pooling, partitioning, and production-grade

242 0
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View