home / skills / busirocket / agents-skills / busirocket-nextjs
This skill helps you design thin, validated Next.js App Router route handlers with standardized JSON responses and proper status codes.
npx playbooks add skill busirocket/agents-skills --skill busirocket-nextjsReview the files below or copy the command above to add this skill to your agents.
---
name: busirocket-nextjs
description:
Next.js App Router route handler patterns. Use when creating or refactoring
route.ts files, implementing API endpoints, validating request inputs, and
returning standardized JSON responses with proper status codes.
metadata:
author: cristiandeluxe
version: "1.0.0"
---
# Next.js Route Handlers
Patterns for thin, maintainable route handlers in Next.js App Router.
## When to Use
Use this skill when:
- Creating or refactoring `app/api/**/route.ts` files
- Implementing API endpoints
- Validating request inputs
- Returning standardized JSON responses
- Deciding server vs client component boundaries
## Non-Negotiables (MUST)
- Route handlers must be **thin**: validate input, call a `services/` function,
return a response.
- **No business logic or IO** directly in the handler.
- **Never return unvalidated request input**.
- Use standard JSON response shapes: `{ data }` for success,
`{ error: { code, message } }` for errors.
- Use appropriate HTTP status codes (200, 201, 204, 400, 401, 403, 404, 409,
500).
## Server vs Client Components
- `app/**/page.tsx` and `app/**/layout.tsx` are **Server Components by
default**.
- Use **Client Components** only when you need: state/event handlers, effects,
browser-only APIs.
- `'use client'` creates a boundary; keep client islands small.
- Props from Server -> Client must be **serializable**.
## Rules
### Next.js App Router
- `nextjs-server-vs-client` - Server vs Client Components (defaults, when to use
client)
- `nextjs-serializable-props` - Props must be serializable from Server to Client
- `nextjs-protecting-server-code` - Protecting server-only code from client
imports
- `nextjs-special-file-exports` - Allowed extra exports for Next.js special
files
### Route Handlers
- `nextjs-route-placement` - Route handler placement and conflicts with pages
- `nextjs-thin-handler-rule` - Thin handler rule (STRICT)
- `nextjs-http-methods` - Supported HTTP methods
- `nextjs-caching-model` - Caching model for route handlers
- `nextjs-cache-components` - Cache Components note for route handlers
### API Response Shapes
- `nextjs-response-shapes` - Standard JSON response shapes (success/error)
- `nextjs-status-codes` - HTTP status codes to use
- `nextjs-response-rules` - Rules for API responses (validation, error handling)
### Validation
- `nextjs-validation-boundaries` - Where validation lives (route handlers,
services, utils)
- `nextjs-validation-patterns` - Validation patterns (unknown inputs, guards)
- `nextjs-validation-helpers` - Recommended validation helpers
- `nextjs-validation-rules` - Validation rules (no inline types/helpers)
## Related Skills
- `busirocket-react` - Component patterns and Server/Client boundaries
- `busirocket-validation` - Validation strategies (Zod schemas, guard helpers)
- `busirocket-core-conventions` - File structure and boundaries
## How to Use
Read individual rule files for detailed explanations and code examples:
```
rules/nextjs-thin-handler-rule.md
rules/nextjs-response-shapes.md
rules/nextjs-validation-boundaries.md
```
Each rule file contains:
- Brief explanation of why it matters
- Code examples (correct and incorrect patterns)
- Additional context and best practices
This skill provides patterns and rules for building thin, maintainable Next.js App Router route handlers (route.ts). It focuses on input validation, clear server/client boundaries, standardized JSON responses, and correct use of HTTP status codes. Use it to create or refactor API endpoints that delegate business logic to services.
The skill enforces a thin-handler approach: validate request data, call a service function, and return a standardized JSON response. It separates I/O and business logic out of the handler into services, uses validation helpers or schemas, and maps outcomes to proper HTTP status codes and response shapes. It also documents rules for server vs client components and serializable props.
Where should validation live?
Validation belongs at the handler boundary; use shared schemas or guard helpers and then pass validated data to services.
What response shape should I return on success?
Return a JSON object with a top-level data key, e.g. { data: ... }, and use error objects for failures.