Use when adding new error messages to React, or seeing "unknown error code" warnings.
npx skills add soilmass/vibe-coding-plugin --skill "nextjs-routing"
Install specific skill from multi-skill repository
# Description
>
# SKILL.md
name: nextjs-routing
description: >
Next.js 15 App Router routing β file conventions, async params/searchParams, parallel routes, intercepting routes, route groups, next/form
allowed-tools: Read, Grep, Glob
Next.js Routing
Purpose
Next.js 15 App Router file-based routing. Covers route conventions, async params,
parallel/intercepting routes, and route groups. The ONE skill for URL-to-component mapping.
When to Use
- Creating new pages or route segments
- Setting up layouts, loading, and error boundaries
- Using parallel routes or intercepting routes
- Accessing route params or search params
When NOT to Use
- Middleware-level redirects β
nextjs-middleware - API endpoints β
api-routes - Data fetching within routes β
nextjs-data
Pattern
File conventions
src/app/
βββ page.tsx # / route
βββ layout.tsx # Root layout (required)
βββ loading.tsx # Loading UI (Suspense boundary)
βββ error.tsx # Error boundary ("use client")
βββ not-found.tsx # 404 page
βββ dashboard/
β βββ page.tsx # /dashboard
β βββ layout.tsx # Dashboard layout
β βββ settings/
β βββ page.tsx # /dashboard/settings
βββ blog/
β βββ [slug]/
β βββ page.tsx # /blog/:slug (dynamic)
βββ shop/
β βββ [...slug]/
β βββ page.tsx # /shop/* (catch-all)
βββ (marketing)/ # Route group (no URL segment)
βββ layout.tsx
βββ about/page.tsx # /about
Async params (Next.js 15 β params is a Promise)
export default async function Page({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params; // Must await!
return <div>{slug}</div>;
}
Async searchParams
export default async function Page({
searchParams,
}: {
searchParams: Promise<{ q?: string }>;
}) {
const { q } = await searchParams; // Must await!
return <div>Search: {q}</div>;
}
Parallel routes
src/app/dashboard/
βββ layout.tsx # Renders {children}, {analytics}, {team}
βββ page.tsx # Default children
βββ @analytics/
β βββ page.tsx # analytics slot
βββ @team/
βββ page.tsx # team slot
Anti-pattern
// WRONG: destructuring params without awaiting
export default async function Page({
params: { slug },
}: {
params: { slug: string }; // Not a Promise β breaks in Next.js 15!
}) {
return <div>{slug}</div>;
}
In Next.js 15, params and searchParams are Promises. Destructuring
before awaiting causes runtime errors.
Common Mistakes
- Destructuring params/searchParams before awaiting β they're Promises
- Adding
"use client"to layout files β layouts should be Server Components - Forgetting
loading.tsxβ no Suspense boundary for slow pages - Not using route groups
()for shared layouts without URL segments - Missing
not-found.tsxβ default 404 is unstyled
Checklist
- [ ]
paramsandsearchParamsare awaited before use - [ ] Root
layout.tsxexists with<html>and<body> - [ ] Route groups used for organizational layout sharing
- [ ]
loading.tsxprovides Suspense boundaries - [ ] Dynamic routes use
[param]naming convention
Composes With
error-handlingβ error.tsx is a routing conventionreact-suspenseβ loading.tsx creates Suspense boundariesnextjs-middlewareβ middleware runs before route resolutioni18nβ locale-aware routing with[locale]segmentsstate-managementβ URL state syncs with route params via nuqs
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.