.cursorrules (deprecated)
rules/nextjs-app-router/.cursorrules.cursorrules
Quality
81/100
Scores the file, not the repository.Length
910 words
22 headings · 4 code blocksRepository
16
— · pushed 109 days agoLast changed
2 days ago
First indexed 2 days ago.1# Next.js 14+ App Router — Cursor Rules2# Comprehensive rules for Next.js applications using the App Router34## Project Context5You are working on a Next.js 14+ application using the App Router (app/ directory).6The project leverages React Server Components by default, with Client Components used7selectively. Server Actions handle mutations. The codebase follows Next.js conventions8for file-based routing, layouts, and data fetching.910## Tech Stack11- Next.js 14+ with App Router12- React 18+ (Server Components by default)13- TypeScript (strict mode)14- Tailwind CSS for styling15- Prisma or Drizzle for database ORM16- NextAuth.js / Auth.js for authentication17- Vercel for deployment (or self-hosted)1819## Coding Style2021### Naming Conventions22- Route files: `page.tsx`, `layout.tsx`, `loading.tsx`, `error.tsx`, `not-found.tsx`23- Server Actions: `actions.ts` in the route segment or `src/actions/`24- API Routes: `route.ts` in `app/api/` segments25- Components: PascalCase files matching component name26- Utilities: camelCase in `src/lib/`2728### File Structure29```30app/31 (marketing)/ # Route groups for layout segmentation32 page.tsx33 layout.tsx34 (dashboard)/35 layout.tsx36 settings/37 page.tsx38 api/39 webhooks/40 route.ts41src/42 components/43 ui/ # Shared UI primitives44 forms/ # Form components45 lib/46 db.ts # Database client47 auth.ts # Auth configuration48 utils.ts # Utility functions49 actions/ # Server Actions50 types/ # Shared TypeScript types51```5253## Server vs Client Components5455### Server Components (default — no directive needed)56- Data fetching directly in the component (async/await)57- Access to backend resources (database, file system, env secrets)58- Large dependencies that should stay on the server59- Static content that doesn't need interactivity60- Components that pass data down to Client Components6162### Client Components (add `'use client'` directive)63- Interactive UI (onClick, onChange, onSubmit handlers)64- Browser APIs (localStorage, window, navigator)65- React hooks (useState, useEffect, useContext, useReducer)66- Third-party libraries that use browser APIs67- Components that depend on user interaction state6869### Rules70- Default to Server Components. Only add `'use client'` when you need interactivity.71- Push `'use client'` boundary as far down the tree as possible.72- Never import a Server Component into a Client Component — pass as children instead.73- Never use `'use server'` inside a Client Component file.74- Keep client bundles small — extract static parts into Server Components.7576## Data Fetching7778### Server Components79```tsx80// Fetch data directly — no useEffect needed81async function ProductPage({ params }: { params: { id: string } }) {82 const product = await db.product.findUnique({ where: { id: params.id } });83 if (!product) notFound();84 return <ProductDetail product={product} />;85}86```8788### Caching and Revalidation89- Use `fetch()` with `next: { revalidate: 3600 }` for time-based revalidation90- Use `revalidatePath()` or `revalidateTag()` in Server Actions for on-demand revalidation91- Mark dynamic pages with `export const dynamic = 'force-dynamic'` when needed92- Use `unstable_cache()` for non-fetch data sources (database queries)93- Understand the caching layers: Request Memoization → Data Cache → Full Route Cache9495### Server Actions96```tsx97'use server'9899import { revalidatePath } from 'next/cache';100import { redirect } from 'next/navigation';101import { z } from 'zod';102103const CreatePostSchema = z.object({104 title: z.string().min(1).max(200),105 content: z.string().min(1),106});107108export async function createPost(formData: FormData) {109 const validated = CreatePostSchema.safeParse({110 title: formData.get('title'),111 content: formData.get('content'),112 });113114 if (!validated.success) {115 return { error: validated.error.flatten().fieldErrors };116 }117118 await db.post.create({ data: validated.data });119 revalidatePath('/posts');120 redirect('/posts');121}122```123124## Error Handling125- Use `error.tsx` boundary files for route segment error handling126- Use `not-found.tsx` for 404 states triggered by `notFound()`127- Use `loading.tsx` for streaming/Suspense loading states128- Validate all Server Action inputs with Zod or similar129- Return structured error objects from Server Actions, don't throw130- Use `global-error.tsx` in app root for root layout errors131- Log server errors to an error tracking service (Sentry, etc.)132133## Route Configuration134- `generateStaticParams()` for static generation of dynamic routes135- `generateMetadata()` for dynamic SEO metadata per route136- Route groups `(groupName)` for layout organization without affecting URL137- Parallel routes `@slotName` for simultaneous rendering138- Intercepting routes `(.)` `(..)` for modal patterns139140## Metadata and SEO141```tsx142export async function generateMetadata({ params }): Promise<Metadata> {143 const product = await getProduct(params.id);144 return {145 title: product.name,146 description: product.description,147 openGraph: { images: [product.image] },148 };149}150```151152## Middleware153- Use `middleware.ts` at project root for auth checks, redirects, headers154- Keep middleware lightweight — it runs on every matching request155- Use `matcher` config to limit which routes trigger middleware156157## Testing158- Use `@testing-library/react` for component tests159- Test Server Components by testing their rendered output160- Test Server Actions as regular async functions161- Use Playwright or Cypress for E2E testing of full page flows162- Mock database calls in tests, not fetch calls163164## Performance Guidelines165- Use `next/image` for all images (automatic optimization)166- Use `next/font` for font loading (no layout shift)167- Use `next/link` for client-side navigation (prefetching)168- Implement streaming with `loading.tsx` and `<Suspense>`169- Use `dynamic()` imports for heavy client components170- Prefer Server Components to reduce client JavaScript171- Set appropriate `revalidate` values — don't over-fetch172173## Common Pitfalls174- Importing server-only code in Client Components (use `server-only` package)175- Passing non-serializable props from Server to Client Components176- Over-using `'use client'` — pushing it to the root layout177- Not handling the `loading` and `error` states for each route segment178- Forgetting to revalidate after mutations in Server Actions179- Using `router.push()` in Server Actions instead of `redirect()`180- Accessing `cookies()` or `headers()` in cached/static routes without declaring dynamic181- Nesting `<Suspense>` boundaries inefficiently causing waterfall loading182
Also in survivorforge/cursor-rules
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| survivorforge/cursor-rulesrules/ai-ml-python/.cursorrules · 16 | .cursorrules | teststylearchdeployment+2 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-design-rest/.cursorrules · 16 | .cursorrules | lint-formatstylesecurityapi+3 | 69/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-microservices/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 92/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/aws-serverless/.cursorrules · 16 | .cursorrules | teststylearchtypes+6 | 73/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/chrome-extension/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+4 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/clean-code/.cursorrules · 16 | .cursorrules | styledo-notagent-behaviourdocs | 57/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/database-sql/.cursorrules · 16 | .cursorrules | styletypessecuritydatabase+3 | 65/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-docker/.cursorrules · 16 | .cursorrules | setupbuildteststyle+4 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-infrastructure/.cursorrules · 16 | .cursorrules | buildteststylesecurity+3 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/django-rest/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/docker-devops/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 85/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/flutter-dart/.cursorrules · 16 | .cursorrules | teststylearchtypes+5 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/fullstack-nextjs-prisma/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 96/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-gin/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-production/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+3 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/golang-api/.cursorrules · 16 | .cursorrules | buildteststylearch+6 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/langchain-ai/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+4 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mcp-server/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+7 | 68/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mern-stack/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mobile-react-native/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 89/100 | 2 days ago |
Diff against rules/ai-ml-python/.cursorrules Diff against rules/api-design-rest/.cursorrules Diff against rules/api-microservices/.cursorrules Diff against rules/aws-serverless/.cursorrules Diff against rules/chrome-extension/.cursorrules Diff against rules/clean-code/.cursorrules Diff against rules/database-sql/.cursorrules Diff against rules/devops-docker/.cursorrules Diff against rules/devops-infrastructure/.cursorrules Diff against rules/django-rest/.cursorrules Diff against rules/docker-devops/.cursorrules Diff against rules/flutter-dart/.cursorrules Diff against rules/fullstack-nextjs-prisma/.cursorrules Diff against rules/go-gin/.cursorrules Diff against rules/go-production/.cursorrules Diff against rules/golang-api/.cursorrules Diff against rules/langchain-ai/.cursorrules Diff against rules/mcp-server/.cursorrules Diff against rules/mern-stack/.cursorrules Diff against rules/mobile-react-native/.cursorrules
