CRA to Next.js Migration Guide Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration. When to Apply Reference these guidelines when: - Migrating an existing CRA application to Next.js - Converting React Router routes to file-based routing - Adopting Server Components in a client-heavy app - Moving from client-side rendering to…

: '\u003crootDir>/$1',\n },\n}\n\nmodule.exports = createJestConfig(customJestConfig)\n```\n\n```js\n// jest.setup.js\nimport '@testing-library/jest-dom'\n```\n\n```json\n// package.json\n{\n \"scripts\": {\n \"test\": \"jest\",\n \"test:watch\": \"jest --watch\"\n }\n}\n```\n\n**TypeScript support:**\n\n```js\n// jest.config.js\nconst customJestConfig = {\n setupFilesAfterEnv: ['\u003crootDir>/jest.setup.js'],\n testEnvironment: 'jest-environment-jsdom',\n moduleNameMapper: {\n '^@/(.*)

CRA to Next.js Migration Guide Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration. When to Apply Reference these guidelines when: - Migrating an existing CRA application to Next.js - Converting React Router routes to file-based routing - Adopting Server Components in a client-heavy app - Moving from client-side rendering to…

: '\u003crootDir>/$1',\n },\n transform: {\n '^.+\\\\.(ts|tsx)

CRA to Next.js Migration Guide Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration. When to Apply Reference these guidelines when: - Migrating an existing CRA application to Next.js - Converting React Router routes to file-based routing - Adopting Server Components in a client-heavy app - Moving from client-side rendering to…

: ['ts-jest', { tsconfig: 'tsconfig.jest.json' }],\n },\n}\n```\n\n```json\n// tsconfig.jest.json\n{\n \"extends\": \"./tsconfig.json\",\n \"compilerOptions\": {\n \"jsx\": \"react-jsx\"\n }\n}\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1510,"content_sha256":"b033a7d398d2b636b01642f6238a1dd1624c3ba6bb0635899ca32a36468fbee8"},{"filename":"rules/testing-mocking.md","content":"---\ntitle: Mock Next.js Modules\nimpact: MEDIUM\nimpactDescription: Common Next.js mocks\ntags: testing, mocking, jest\n---\n\n## Mock Next.js Modules\n\nCommon patterns for mocking Next.js specific modules in tests.\n\n**Mock next/navigation:**\n\n```tsx\n// __mocks__/next/navigation.ts\nexport const useRouter = jest.fn(() => ({\n push: jest.fn(),\n replace: jest.fn(),\n back: jest.fn(),\n forward: jest.fn(),\n refresh: jest.fn(),\n prefetch: jest.fn(),\n}))\n\nexport const usePathname = jest.fn(() => '/')\nexport const useSearchParams = jest.fn(() => new URLSearchParams())\nexport const useParams = jest.fn(() => ({}))\nexport const redirect = jest.fn()\nexport const notFound = jest.fn()\n```\n\n**Mock next/image:**\n\n```tsx\n// __mocks__/next/image.tsx\nconst MockImage = ({ src, alt, ...props }: any) => {\n return \u003cimg src={src} alt={alt} {...props} />\n}\n\nexport default MockImage\n```\n\n**Mock next/headers:**\n\n```tsx\n// __mocks__/next/headers.ts\nexport const cookies = jest.fn(() => ({\n get: jest.fn(),\n set: jest.fn(),\n delete: jest.fn(),\n}))\n\nexport const headers = jest.fn(() => new Headers())\n```\n\n**Mock next/link:**\n\n```tsx\n// __mocks__/next/link.tsx\nconst MockLink = ({ children, href, ...props }: any) => {\n return \u003ca href={href} {...props}>{children}\u003c/a>\n}\n\nexport default MockLink\n```\n\n**Using mocks in tests:**\n\n```tsx\n// components/Nav.test.tsx\njest.mock('next/navigation')\njest.mock('next/image')\njest.mock('next/link')\n\nimport { useRouter } from 'next/navigation'\n\nbeforeEach(() => {\n ;(useRouter as jest.Mock).mockReturnValue({\n push: jest.fn(),\n pathname: '/home',\n })\n})\n\ntest('navigation works', () => {\n // Test with mocked router\n})\n```\n\n**Setup file for global mocks:**\n\n```js\n// jest.setup.js\njest.mock('next/navigation')\njest.mock('next/image')\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1772,"content_sha256":"7dd7ec915ac4c70c4922f2b1d54fcd8a835459b8a5ecff9444afc683329e2af9"},{"filename":"rules/testing-react-testing-library.md","content":"---\ntitle: RTL Works the Same\nimpact: LOW\nimpactDescription: Minimal changes needed\ntags: testing, rtl, react-testing-library\n---\n\n## RTL Works the Same\n\nReact Testing Library works the same way in Next.js for Client Components.\n\n**CRA Pattern (before):**\n\n```tsx\n// src/components/Button.test.tsx\nimport { render, screen, fireEvent } from '@testing-library/react'\nimport { Button } from './Button'\n\ntest('renders button and handles click', () => {\n const handleClick = jest.fn()\n render(\u003cButton onClick={handleClick}>Click me\u003c/Button>)\n\n const button = screen.getByRole('button', { name: /click me/i })\n expect(button).toBeInTheDocument()\n\n fireEvent.click(button)\n expect(handleClick).toHaveBeenCalledTimes(1)\n})\n```\n\n**Next.js Pattern (after):**\n\n```tsx\n// components/Button.test.tsx\nimport { render, screen, fireEvent } from '@testing-library/react'\nimport { Button } from './Button'\n\ntest('renders button and handles click', () => {\n const handleClick = jest.fn()\n render(\u003cButton onClick={handleClick}>Click me\u003c/Button>)\n\n const button = screen.getByRole('button', { name: /click me/i })\n expect(button).toBeInTheDocument()\n\n fireEvent.click(button)\n expect(handleClick).toHaveBeenCalledTimes(1)\n})\n```\n\n**Testing components with next/navigation:**\n\n```tsx\n// components/NavButton.test.tsx\nimport { render, screen } from '@testing-library/react'\nimport userEvent from '@testing-library/user-event'\nimport { NavButton } from './NavButton'\n\n// Mock next/navigation\njest.mock('next/navigation', () => ({\n useRouter() {\n return {\n push: jest.fn(),\n replace: jest.fn(),\n back: jest.fn(),\n }\n },\n usePathname() {\n return '/'\n },\n}))\n\ntest('navigates on click', async () => {\n const { useRouter } = require('next/navigation')\n render(\u003cNavButton href=\"/about\">About\u003c/NavButton>)\n\n await userEvent.click(screen.getByRole('button'))\n expect(useRouter().push).toHaveBeenCalledWith('/about')\n})\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1936,"content_sha256":"9f2c238ca5c86c94ddca23c1b7c44a79f99f479702ea8c78487aaf1c44da7065"},{"filename":"rules/testing-server-components.md","content":"---\ntitle: Test Server Components\nimpact: HIGH\nimpactDescription: New testing patterns for RSC\ntags: testing, server-components, rsc\n---\n\n## Test Server Components\n\nServer Components require different testing approaches since they're async and run on the server.\n\n**Server Component:**\n\n```tsx\n// app/users/page.tsx\nexport default async function UsersPage() {\n const users = await fetchUsers()\n return (\n \u003cul>\n {users.map(user => (\n \u003cli key={user.id}>{user.name}\u003c/li>\n ))}\n \u003c/ul>\n )\n}\n```\n\n**Testing approach 1: Test as async function**\n\n```tsx\n// app/users/page.test.tsx\nimport UsersPage from './page'\n\n// Mock the fetch function\njest.mock('./api', () => ({\n fetchUsers: jest.fn(() => Promise.resolve([\n { id: 1, name: 'John' },\n { id: 2, name: 'Jane' },\n ])),\n}))\n\ntest('renders users', async () => {\n // Server components are async functions\n const result = await UsersPage()\n\n // Result is JSX, can check structure\n expect(result.type).toBe('ul')\n expect(result.props.children).toHaveLength(2)\n})\n```\n\n**Testing approach 2: Render to string**\n\n```tsx\nimport { renderToString } from 'react-dom/server'\nimport UsersPage from './page'\n\ntest('renders users to HTML', async () => {\n const Component = await UsersPage()\n const html = renderToString(Component)\n\n expect(html).toContain('John')\n expect(html).toContain('Jane')\n})\n```\n\n**Testing approach 3: Use experimental RSC testing (Next.js)**\n\n```tsx\n// Using @testing-library/react with experimental support\nimport { render, screen } from '@testing-library/react'\n\n// This requires experimental setup\ntest('renders users', async () => {\n render(await UsersPage())\n expect(screen.getByText('John')).toBeInTheDocument()\n})\n```\n\n**Best practice: Extract logic for easier testing**\n\n```tsx\n// lib/users.ts - Pure functions, easy to test\nexport async function getUsers() {\n const users = await fetchUsers()\n return users.filter(u => u.active)\n}\n\n// lib/users.test.ts\ntest('filters active users', async () => {\n const users = await getUsers()\n expect(users.every(u => u.active)).toBe(true)\n})\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2092,"content_sha256":"dc23e443ce30dd84e7ef610f68c303a5a434edb811f32c1d32c28697a7c5935e"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"CRA to Next.js Migration Guide","type":"text"}]},{"type":"paragraph","content":[{"text":"Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Apply","type":"text"}]},{"type":"paragraph","content":[{"text":"Reference these guidelines when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Migrating an existing CRA application to Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Converting React Router routes to file-based routing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Adopting Server Components in a client-heavy app","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Moving from client-side rendering to SSR/SSG","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Updating environment variables for Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optimizing images and fonts with Next.js built-ins","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Version Policy","type":"text"}]},{"type":"paragraph","content":[{"text":"Use Next.js 16.x or later. Do NOT use Next.js 14.x or 15.x.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Before starting migration, check the current latest version:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"npm info next version","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the latest version in your package.json with a caret for minor/patch updates. The minimum supported version for this migration guide is ","type":"text"},{"text":"^16.0.0","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Rule Categories by Priority","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Priority","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Category","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Impact","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Prefix","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rules","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Project Setup","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CRITICAL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"setup-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Dependencies","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CRITICAL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deps-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Routing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CRITICAL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"routing-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"17","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Data Fetching","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CRITICAL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"data-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"11","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Components","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HIGH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"components-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Environment Variables","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HIGH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"env-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"7","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Styling","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HIGH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"styling-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"12","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"8","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Public Assets","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"assets-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Images","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"images-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"8","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fonts","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"fonts-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"11","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SEO & Metadata","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"seo-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"12","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API Routes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"api-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"13","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"State Management","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"state-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"8","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"14","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Integrations","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MEDIUM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"integrations-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Testing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"LOW","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"testing-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"16","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build & Deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"LOW","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"build-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"7","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"17","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Common Gotchas","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HIGH","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gotchas-","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"24","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Project Setup (CRITICAL)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-initial-structure","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert CRA folder structure to Next.js App Router","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-package-json","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Update dependencies and scripts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-next-config","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Create and configure next.config.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-typescript","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Migrate TypeScript configuration","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-eslint","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Update ESLint for Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"setup-gitignore","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Update .gitignore for Next.js","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Dependencies (CRITICAL)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"deps-react19-compatibility","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Upgrade dependencies for React 19 compatibility","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Routing (CRITICAL)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-basic-pages","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert components to file-based routes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-dynamic-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use [param] syntax for dynamic segments","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-catch-all-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use [...slug] for catch-all routes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-optional-catch-all","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use ","type":"text"},{"type":"wikilink","attrs":{"alias":null,"embed":false,"target":"...slug","blockId":null,"heading":null}},{"text":" for optional catch-all","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-route-groups","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use (group) folders for organization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-parallel-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use @slot for parallel routes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-intercepting-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use (..) for intercepting routes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-link-component","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Replace react-router Link with next/link","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-programmatic-navigation","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Replace useNavigate with useRouter","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-use-params","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Replace useParams with Next.js params","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-use-search-params","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Replace useSearchParams properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-nested-layouts","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert nested routes to layouts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-loading-states","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add loading.tsx for suspense","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-error-boundaries","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add error.tsx for error handling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-not-found","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add not-found.tsx for 404 pages","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-hash-based","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle hash-based routing for client-only apps","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"routing-protected-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Implement protected route patterns","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Data Fetching (CRITICAL)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-useeffect-to-rsc","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert useEffect fetches to Server Components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-useeffect-to-ssr","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert useEffect to getServerSideProps","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-useeffect-to-ssg","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Convert useEffect to getStaticProps","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-client-fetch","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Keep client fetches with proper patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-server-actions","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use Server Actions for mutations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-revalidation","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure data revalidation strategies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-streaming","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use Suspense for streaming data","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-parallel-fetching","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Fetch data in parallel on server","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-sequential-fetching","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle sequential data dependencies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-caching","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure fetch caching behavior","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"data-client-library-init","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Initialize client-only libraries in useEffect","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. Components (HIGH)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-use-client","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add 'use client' directive for client components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-server-default","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand server components are default","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-boundary-placement","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Place client boundaries strategically","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-composition","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use composition to minimize client JS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-interleaving","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Interleave server and client components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-props-serialization","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Ensure props are serializable","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-children-pattern","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Pass server components as children","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-context-providers","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle Context providers properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"components-third-party","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Wrap third-party client components","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"6. Environment Variables (HIGH)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-prefix-change","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Change REACT","type":"text"},{"text":"APP","type":"text","marks":[{"type":"em"}]},{"text":" to NEXT","type":"text"},{"text":"PUBLIC","type":"text","marks":[{"type":"em"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-server-only","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use non-prefixed vars for server-only","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-runtime-config","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use runtime configuration when needed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-local-files","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand .env file loading order","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-build-time","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand build-time vs runtime env vars","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"env-validation","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Validate required environment variables","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"7. Styling (HIGH)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-global-css","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Move global CSS to app/layout.tsx","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-css-modules","type":"text","marks":[{"type":"code_inline"}]},{"text":" - CSS Modules work with minor changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-sass","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Sass support","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-tailwind","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Tailwind CSS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-css-in-js","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle CSS-in-JS libraries","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-styled-components","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure styled-components for SSR","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-emotion","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Emotion for SSR","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-component-styles","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Import component styles properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-postcss","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure PostCSS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-scss-global-syntax","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use :global only in CSS Modules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-css-import-order","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Control CSS import order in layouts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"styling-dark-mode-hydration","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle dark mode without hydration mismatch","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"8. Public Assets (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets-public-folder","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Public folder works the same way","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets-static-imports","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use static imports for assets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets-absolute-urls","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Reference assets without public prefix","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets-favicon","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Place favicon in app directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets-manifest","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure web app manifest","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"9. Images (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-next-image","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Replace img with next/image","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-required-dimensions","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Provide width and height","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-fill-prop","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use fill for responsive images","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-priority","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use priority for LCP images","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-placeholder","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure blur placeholders","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-remote-patterns","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure remote image domains","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-loader","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure custom image loaders","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"images-optimization","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand automatic optimization","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"10. Fonts (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-next-font","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use next/font for optimization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-google-fonts","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Load Google Fonts properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-local-fonts","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Load local font files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-variable-fonts","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure variable fonts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-font-display","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure font-display strategy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fonts-preload","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand automatic font preloading","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"11. SEO & Metadata (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-metadata-api","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use Metadata API instead of react-helmet","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-dynamic-metadata","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Generate dynamic metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-opengraph","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Open Graph metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-twitter-cards","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Twitter Card metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-json-ld","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add structured data (JSON-LD)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-canonical","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Set canonical URLs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-robots","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure robots meta tags","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-sitemap","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Generate sitemap.xml","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"seo-head-component","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Migrate from next/head to Metadata","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"12. API Routes (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-route-handlers","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Create Route Handlers in app/api","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-http-methods","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Export named functions for HTTP methods","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-request-body","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Parse request body properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-query-params","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Access query parameters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-headers-cookies","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Access headers and cookies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-response-types","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Return proper response types","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-middleware","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Implement middleware patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-cors","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure CORS properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"api-rate-limiting","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Implement rate limiting","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"13. State Management (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-context-client","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Context requires 'use client'","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-zustand","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Zustand works with hydration care","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-redux","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Redux with Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-jotai","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Jotai properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-recoil","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Recoil properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-url-state","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use URL for shareable state","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-server-state","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Minimize client state with RSC","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"state-persistence","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle state persistence","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"14. Integrations (MEDIUM)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"integrations-sentry","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Migrate Sentry error monitoring","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"15. Testing (LOW)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-jest-config","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Update Jest configuration","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-react-testing-library","type":"text","marks":[{"type":"code_inline"}]},{"text":" - RTL works the same","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-server-components","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Test Server Components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-client-components","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Test Client Components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-async-components","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Test async components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-mocking","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Mock Next.js modules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-e2e-cypress","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Cypress for Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-e2e-playwright","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Playwright for Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing-api-routes","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Test API Route Handlers","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"16. Build & Deployment (LOW)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-scripts","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Update build scripts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-output","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand build output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-standalone","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure standalone output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-static-export","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure static export","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-bundle-analysis","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Analyze bundle size","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-vercel","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Deploy to Vercel","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build-docker","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure Docker deployment","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"17. Common Gotchas (HIGH)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-window-undefined","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle window/document in SSR","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-hydration-mismatch","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Fix hydration mismatches","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-use-effect-timing","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Understand useEffect in Next.js","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-router-ready","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Check router.isReady for query params","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-dynamic-imports","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Use next/dynamic properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-api-routes-edge","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Edge vs Node.js runtime","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-middleware","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Middleware runs on edge","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-static-generation","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Static vs dynamic rendering","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-redirect","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle redirects properly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-headers","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Set response headers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-cookies","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle cookies in RSC","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-turbopack","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle Turbopack compatibility issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-empty-modules","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Fix empty module exports for isolatedModules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-nullish-coalescing","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Fix nullish coalescing runtime errors","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-react19-class-components","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Fix React 19 class component this binding","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-react19-ref-prop","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle React 19 ref prop changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-websocket-optional-deps","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Handle WebSocket native dependency bundling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-auth-race-conditions","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Guard against auth/API race conditions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-auth-state-gating","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Wait for auth state before checking roles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-configuration-idempotency","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Ensure configuration idempotency with useRef","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-hydration-nested-interactive","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Avoid nested interactive elements","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-router-push-timing","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Never call router.push during render","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-infinite-rerender","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Prevent infinite re-render loops","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"gotchas-provider-hierarchy","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Configure provider hierarchy correctly","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Pre-Migration Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"Before starting migration, scan the codebase for patterns that need special handling:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Check for WebSocket libraries (needs webpack fallback config)\ngrep -E \"(socket\\.io|\\\"ws\\\")\" package.json\n\n# Check for SCSS :export syntax (may need --webpack flag)\ngrep -r \":export\" --include=\"*.scss\" src/\n\n# Check for SVG ReactComponent imports (needs SVGR config)\ngrep -r \"ReactComponent\" --include=\"*.ts\" --include=\"*.tsx\" src/\n\n# List all REACT_APP_ environment variables\ngrep -roh \"REACT_APP_[A-Z_]*\" --include=\"*.ts\" --include=\"*.tsx\" --include=\"*.js\" --include=\"*.jsx\" src/ | sort -u\n\n# Check for Redux extraReducers using object notation (must convert to builder pattern for RTK v2)\ngrep -r \"extraReducers:\" --include=\"*.js\" --include=\"*.jsx\" --include=\"*.ts\" --include=\"*.tsx\" src/\n\n# Check for /app/ paths that need updating if using (app) route group\ngrep -rE \"(href|to|push|replace|redirect).*['\\\"]\\/app\\/\" --include=\"*.js\" --include=\"*.jsx\" --include=\"*.ts\" --include=\"*.tsx\" src/","type":"text"}]},{"type":"paragraph","content":[{"text":"Scan Results to Rule Mapping:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Scan Result","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rules to Read","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"socket.io or ws in package.json","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gotchas-websocket-optional-deps","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"setup-next-config","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":":export","type":"text","marks":[{"type":"code_inline"}]},{"text":" in SCSS files","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"gotchas-turbopack","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ReactComponent","type":"text","marks":[{"type":"code_inline"}]},{"text":" SVG imports","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"assets-static-imports","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"REACT_APP_","type":"text","marks":[{"type":"code_inline"}]},{"text":" variables found","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"env-prefix-change","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"extraReducers:","type":"text","marks":[{"type":"code_inline"}]},{"text":" found","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"state-redux","type":"text","marks":[{"type":"code_inline"}]},{"text":" (RTK v2 builder callback required)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/app/","type":"text","marks":[{"type":"code_inline"}]},{"text":" paths in navigation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"routing-route-groups","type":"text","marks":[{"type":"code_inline"}]},{"text":" (update paths for route groups)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to Use","type":"text"}]},{"type":"paragraph","content":[{"text":"Read individual rule files for detailed explanations and code examples:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"rules/setup-initial-structure.md\nrules/routing-basic-pages.md\nrules/data-useeffect-to-rsc.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Each rule file contains:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Brief explanation of the migration step","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CRA \"before\" code example","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Next.js \"after\" code example","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Additional context and gotchas","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Migration Order","type":"text"}]},{"type":"paragraph","content":[{"text":"For best results, migrate in this order:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Setup","type":"text","marks":[{"type":"strong"}]},{"text":" - Initialize Next.js project structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Routing","type":"text","marks":[{"type":"strong"}]},{"text":" - Convert React Router to file-based routing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Environment Variables","type":"text","marks":[{"type":"strong"}]},{"text":" - Update env var prefixes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Components","type":"text","marks":[{"type":"strong"}]},{"text":" - Add 'use client' directives where needed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Data Fetching","type":"text","marks":[{"type":"strong"}]},{"text":" - Convert useEffect to server patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Styling","type":"text","marks":[{"type":"strong"}]},{"text":" - Move global CSS, configure CSS-in-JS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Images & Fonts","type":"text","marks":[{"type":"strong"}]},{"text":" - Adopt Next.js optimizations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SEO","type":"text","marks":[{"type":"strong"}]},{"text":" - Migrate to Metadata API","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"API Routes","type":"text","marks":[{"type":"strong"}]},{"text":" - Create Route Handlers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Testing","type":"text","marks":[{"type":"strong"}]},{"text":" - Update test configuration","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-Migration Verification Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"After migration, verify the application works correctly:","type":"text"}]},{"type":"paragraph","content":[{"text":"Core Functionality:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"npm run dev","type":"text","marks":[{"type":"code_inline"}]},{"text":" starts Next.js dev server without errors","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"npm run build","type":"text","marks":[{"type":"code_inline"}]},{"text":" completes successfully","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"npm start","type":"text","marks":[{"type":"code_inline"}]},{"text":" runs the production build","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Main application renders correctly","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All routes are accessible","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Client-Side Features:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"localStorage/sessionStorage persistence works","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Dark mode or theme toggles work and persist","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Client-side interactivity (forms, buttons, modals) works","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Browser back/forward navigation works correctly","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Routing (if applicable):","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Hash-based routing works (e.g., ","type":"text"},{"text":"#room=abc,key=xyz","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Query parameters are read correctly","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Dynamic routes render with correct params","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"404 pages show for invalid routes","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Real-Time Features (if applicable):","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"WebSocket connections establish successfully","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Real-time collaboration or updates work","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Reconnection after disconnect works","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Integrations (if applicable):","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Error monitoring (Sentry) captures errors","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Analytics tracking fires correctly","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Third-party auth (OAuth, Firebase) works","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"File uploads work","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"PWA (if applicable):","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Service worker registers (production build)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"App is installable","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Offline functionality works as expected","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Performance:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"No hydration mismatch warnings in console","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Images load and are optimized","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Fonts load without FOUT/FOIT issues","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"No unexpected console errors or warnings","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"cra-to-next-migration","author":"@skillopedia","source":{"stars":11,"repo_name":"migration-skills","origin_url":"https://github.com/vercel-labs/migration-skills/blob/HEAD/cra-to-next-migration/SKILL.md","repo_owner":"vercel-labs","body_sha256":"3f16bc0616f27f3706fb5496ce94e91424e283001767b8315b36ffd2db06c264","cluster_key":"c3f05db44fa8b1b7841334462e789c1707944d05fb1fe9d0a25acf7b431dd0b6","clean_bundle":{"format":"clean-skill-bundle-v1","source":"vercel-labs/migration-skills/cra-to-next-migration/SKILL.md","attachments":[{"id":"89042703-4ec0-5da1-a5bf-b557335b2a8c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/89042703-4ec0-5da1-a5bf-b557335b2a8c/attachment.md","path":"rules/api-cors.md","size":2156,"sha256":"92797d7302b9693337b9b4a3477d04bc24df702fc6d541498121631f99510d5e","contentType":"text/markdown; charset=utf-8"},{"id":"abbf4f8a-43a7-5a71-81a2-fe5ccccb889a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/abbf4f8a-43a7-5a71-81a2-fe5ccccb889a/attachment.md","path":"rules/api-headers-cookies.md","size":2079,"sha256":"dc1ff418ef0ad67d58a432ce5cb53f3b8d0da955f4d44b37e9c49020ab09bffa","contentType":"text/markdown; charset=utf-8"},{"id":"2834712e-1095-59d4-969b-8a937770846c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2834712e-1095-59d4-969b-8a937770846c/attachment.md","path":"rules/api-http-methods.md","size":1877,"sha256":"f66f186964b037882900b8ae49f754be80f20e86033579a6d339f89ed0b72b37","contentType":"text/markdown; charset=utf-8"},{"id":"5eb0ccc6-7329-5e68-b1ef-c37e0d23feed","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5eb0ccc6-7329-5e68-b1ef-c37e0d23feed/attachment.md","path":"rules/api-middleware.md","size":1923,"sha256":"40b30cc4d9f716e7eecb108d23c43945ee083e60db329d9059f6b3cc92d29a79","contentType":"text/markdown; charset=utf-8"},{"id":"51486f07-42ec-5f81-aac7-8fc1c4acf6e9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/51486f07-42ec-5f81-aac7-8fc1c4acf6e9/attachment.md","path":"rules/api-query-params.md","size":2008,"sha256":"ac887df6614b999a05b5b32b50e289ffed5780a94a0360bb104265e7cc03ed85","contentType":"text/markdown; charset=utf-8"},{"id":"845a87ce-3c01-5ab6-b84f-90f58096a559","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/845a87ce-3c01-5ab6-b84f-90f58096a559/attachment.md","path":"rules/api-rate-limiting.md","size":2351,"sha256":"7a381cf8b1e01d3e05759da86ff0bb2ef88f9730660345a1224c00e7ce669305","contentType":"text/markdown; charset=utf-8"},{"id":"ff5324e0-e82b-5093-a5cd-d405950aeb5a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ff5324e0-e82b-5093-a5cd-d405950aeb5a/attachment.md","path":"rules/api-request-body.md","size":1700,"sha256":"011058d2430c740501f9a2844280d80c87761c9ac6e028a34ceff533ad6c3abe","contentType":"text/markdown; charset=utf-8"},{"id":"715f4690-a9d7-59ee-b340-5337e8c291ea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/715f4690-a9d7-59ee-b340-5337e8c291ea/attachment.md","path":"rules/api-response-types.md","size":1655,"sha256":"b79adbfdd2ff492367ed65361ec627353164c38cebb0c03f41ffec869f3f7041","contentType":"text/markdown; charset=utf-8"},{"id":"067db298-1c8a-519e-9db3-effd7dda712b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/067db298-1c8a-519e-9db3-effd7dda712b/attachment.md","path":"rules/api-route-handlers.md","size":1698,"sha256":"3fade88fe30ff6e735cd79c04c8b04ba53a609fcd82cc65c9603177260898762","contentType":"text/markdown; charset=utf-8"},{"id":"97de3872-4748-597f-8cdc-d6763223821a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/97de3872-4748-597f-8cdc-d6763223821a/attachment.md","path":"rules/assets-absolute-urls.md","size":1311,"sha256":"059477c5f626e384ada72d9a3a9e9e2794366c5188691ce715f17be8b3d1837d","contentType":"text/markdown; charset=utf-8"},{"id":"8b726810-dba2-5022-afb8-1f6fdc577a99","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8b726810-dba2-5022-afb8-1f6fdc577a99/attachment.md","path":"rules/assets-favicon.md","size":1596,"sha256":"27bcd9419bbeb7d20d5b4b65667b885893de002c84ef7f469666e53cfe57958b","contentType":"text/markdown; charset=utf-8"},{"id":"a46ec030-7107-5ccd-a31c-050d49f38c46","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a46ec030-7107-5ccd-a31c-050d49f38c46/attachment.md","path":"rules/assets-manifest.md","size":3418,"sha256":"8e7eccbcbdbeec9fb2fc6595c44a827c135c917208f2737a4b515c2342a426a3","contentType":"text/markdown; charset=utf-8"},{"id":"16e929d4-007b-5341-8c9d-3d7e4c33a0d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/16e929d4-007b-5341-8c9d-3d7e4c33a0d8/attachment.md","path":"rules/assets-public-folder.md","size":1296,"sha256":"ebb219673298db19952b6edc269092a7c9a574bf34c1b5e54c6e96c372a411fe","contentType":"text/markdown; charset=utf-8"},{"id":"f7a93893-9010-5553-ac1b-086e3031471d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f7a93893-9010-5553-ac1b-086e3031471d/attachment.md","path":"rules/assets-static-imports.md","size":4464,"sha256":"c12cdb376a495cb72fb00101d356bd2cb72e0191efc1dec436056a40d15fd721","contentType":"text/markdown; charset=utf-8"},{"id":"0bdbaced-320d-539a-b8ba-865c78b3d8ca","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0bdbaced-320d-539a-b8ba-865c78b3d8ca/attachment.md","path":"rules/build-bundle-analysis.md","size":1636,"sha256":"656df153bc364d30f3113a255a79879c570d52dc56f6da41cb6cf38d828cd4df","contentType":"text/markdown; charset=utf-8"},{"id":"448bbe45-72e9-52b4-9993-d16de6e25f71","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/448bbe45-72e9-52b4-9993-d16de6e25f71/attachment.md","path":"rules/build-docker.md","size":1748,"sha256":"8f57a4af49db2e6206f8f847fd32799c64997f7e4a9bf31016c9565b8ba1f096","contentType":"text/markdown; charset=utf-8"},{"id":"2bac947d-a9ce-5483-bcc0-638ebd6db213","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2bac947d-a9ce-5483-bcc0-638ebd6db213/attachment.md","path":"rules/build-output.md","size":1773,"sha256":"7266c7282e4f821185241f7792e0ecfe34a164bc53f2c73a01aa0f4c02f000cb","contentType":"text/markdown; charset=utf-8"},{"id":"a429ae06-5259-5ac4-9b81-063ce27c0a89","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a429ae06-5259-5ac4-9b81-063ce27c0a89/attachment.md","path":"rules/build-scripts.md","size":3226,"sha256":"938e2f61ac3fbfff0a14b14aa94a2993299b9bd72d6ce3db22e379b2ecdba535","contentType":"text/markdown; charset=utf-8"},{"id":"3bb0c832-5f6f-5fdd-a5b2-134b6a430817","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3bb0c832-5f6f-5fdd-a5b2-134b6a430817/attachment.md","path":"rules/build-standalone.md","size":1550,"sha256":"ffeceac16207e0ae610fc9c4332dd14b4a666f1e0dd25e95209ef1f3a3d9d3fb","contentType":"text/markdown; charset=utf-8"},{"id":"c886395d-d86d-514d-9e41-f5fb4631e78f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c886395d-d86d-514d-9e41-f5fb4631e78f/attachment.md","path":"rules/build-static-export.md","size":1641,"sha256":"eb930ff16a94580d7b19cad4e565bc2c985707fcdd38bfdc6b8a1d25c8fe2f5a","contentType":"text/markdown; charset=utf-8"},{"id":"fb353e13-47a7-5b12-b3f3-03a9b5db7a90","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fb353e13-47a7-5b12-b3f3-03a9b5db7a90/attachment.md","path":"rules/build-vercel.md","size":1491,"sha256":"892e8b85ac28a8672ccf50cb6f0dd49fe6f87d4a1f22547d1d7ee83ebf7c8875","contentType":"text/markdown; charset=utf-8"},{"id":"10edd893-18ef-5192-bf1c-07d96a81a5ae","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/10edd893-18ef-5192-bf1c-07d96a81a5ae/attachment.md","path":"rules/components-boundary-placement.md","size":2263,"sha256":"9b2b2baaeb65e445c6ab81c81d0733919c32c786571fd95b0d06dc25c0f49f87","contentType":"text/markdown; charset=utf-8"},{"id":"63e07284-7bf7-52d9-86eb-ec3b9e2ac588","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/63e07284-7bf7-52d9-86eb-ec3b9e2ac588/attachment.md","path":"rules/components-children-pattern.md","size":2097,"sha256":"bbc7d307bc84edaa904fd93673b073ed94bd6ee9e8e9537f229018dbefdedab0","contentType":"text/markdown; charset=utf-8"},{"id":"2c9cf443-dc7c-5c91-937c-fa04ce1245e8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2c9cf443-dc7c-5c91-937c-fa04ce1245e8/attachment.md","path":"rules/components-composition.md","size":2187,"sha256":"ae3277223d2bebf6842cefa34ca98576e2f56f55cc16b33b3661ef1a4835a2ed","contentType":"text/markdown; charset=utf-8"},{"id":"1bf9f1ed-afce-5f42-8b0b-b3f1f081d54f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1bf9f1ed-afce-5f42-8b0b-b3f1f081d54f/attachment.md","path":"rules/components-context-providers.md","size":2253,"sha256":"b248a35bf98ea98018ed3319542d4bcfc665baf19bdf4049ad0a99332cafa6c8","contentType":"text/markdown; charset=utf-8"},{"id":"285979e5-3314-51d7-ac02-085287e61c3a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/285979e5-3314-51d7-ac02-085287e61c3a/attachment.md","path":"rules/components-interleaving.md","size":2156,"sha256":"8886574d22ecf41d0a586d478e7a25a956a95cc6af71c02f50b329cbaeccbe89","contentType":"text/markdown; charset=utf-8"},{"id":"14aeb1a0-9d77-5a3b-9a8c-cb480d824cef","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/14aeb1a0-9d77-5a3b-9a8c-cb480d824cef/attachment.md","path":"rules/components-props-serialization.md","size":2072,"sha256":"8bab025c85df61a7b7e400284b24a7acc01af5eb78b721e727bf9f8b257485d7","contentType":"text/markdown; charset=utf-8"},{"id":"174cdb50-3c8a-5364-9080-5a5f5b722757","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/174cdb50-3c8a-5364-9080-5a5f5b722757/attachment.md","path":"rules/components-server-default.md","size":1738,"sha256":"ef085c9e017c50d704f57bc1c886723cbfd1d8b3ef6bb2a79e07c6ea7a3c1c69","contentType":"text/markdown; charset=utf-8"},{"id":"e7946462-3971-55a3-b301-76f9d7f29031","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e7946462-3971-55a3-b301-76f9d7f29031/attachment.md","path":"rules/components-third-party.md","size":4578,"sha256":"eb6559d4fcac83ec2186584f0062bdb4ca716e239e25d7f5bac34c19390cd709","contentType":"text/markdown; charset=utf-8"},{"id":"e6c88caf-1bed-5080-b883-88efd740ba9e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e6c88caf-1bed-5080-b883-88efd740ba9e/attachment.md","path":"rules/components-use-client.md","size":1789,"sha256":"111be0b9acdd5aa8ffdf7bdf881aee1006ae5f0c127c0382c2acdd145d6bfa6a","contentType":"text/markdown; charset=utf-8"},{"id":"6c59446e-6481-5d87-b9cc-4185e3b3060d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6c59446e-6481-5d87-b9cc-4185e3b3060d/attachment.md","path":"rules/data-caching.md","size":1812,"sha256":"be8eae33409287b2990c24096591a9663a4e8fcc954cf147f824c09599c87747","contentType":"text/markdown; charset=utf-8"},{"id":"f0e6ecc4-c851-5618-821b-52c26943c231","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f0e6ecc4-c851-5618-821b-52c26943c231/attachment.md","path":"rules/data-client-fetch.md","size":2067,"sha256":"085a71ab75157e89402534c42fc165fc5648327563ab2532d92d1e379bcd25d0","contentType":"text/markdown; charset=utf-8"},{"id":"b977c477-a22a-5133-a4ab-30f2fbe34f90","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b977c477-a22a-5133-a4ab-30f2fbe34f90/attachment.md","path":"rules/data-client-library-init.md","size":4434,"sha256":"002a842bbcb96353c801becfe1340bd1c8f14b07003919603aaa659f10693ac1","contentType":"text/markdown; charset=utf-8"},{"id":"02960009-ed2e-5c9b-a3d6-970417c6aba2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/02960009-ed2e-5c9b-a3d6-970417c6aba2/attachment.md","path":"rules/data-parallel-fetching.md","size":2058,"sha256":"02b53768064f5574e6e31cbc96fa9793e322f29dee455f83248cb890392a30bd","contentType":"text/markdown; charset=utf-8"},{"id":"03408534-7049-5007-8d44-a66229cd764b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/03408534-7049-5007-8d44-a66229cd764b/attachment.md","path":"rules/data-revalidation.md","size":2433,"sha256":"5bac09538016395641868f33fc7f527f6cff116965319c147e6979e96c27ed9b","contentType":"text/markdown; charset=utf-8"},{"id":"85e7eecd-8275-5504-b58e-f35598ae2a93","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/85e7eecd-8275-5504-b58e-f35598ae2a93/attachment.md","path":"rules/data-sequential-fetching.md","size":2097,"sha256":"7bf75a8f36438dc9e88fbe7514753181afce8adbf9f29e87854c88b5c8262664","contentType":"text/markdown; charset=utf-8"},{"id":"c941b9c1-b54c-5be3-ad6a-8a5ee060005d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c941b9c1-b54c-5be3-ad6a-8a5ee060005d/attachment.md","path":"rules/data-server-actions.md","size":2291,"sha256":"65c433f63c1dbd178fb6e5d5e222f15b2a2ae3a462f2ee66fa6bb838f2e62623","contentType":"text/markdown; charset=utf-8"},{"id":"67f83040-1b6b-5d46-b8bd-c5e9cbc0329f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/67f83040-1b6b-5d46-b8bd-c5e9cbc0329f/attachment.md","path":"rules/data-streaming.md","size":2160,"sha256":"78c19561b8625c7e83768b4770e627b6d6e177524db62ae7eede98dd8cd38725","contentType":"text/markdown; charset=utf-8"},{"id":"db9df6c3-520c-5ec3-bd6c-439cecbffe57","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/db9df6c3-520c-5ec3-bd6c-439cecbffe57/attachment.md","path":"rules/data-useeffect-to-rsc.md","size":1984,"sha256":"562f8c701e08a0af075e783514d50e498e31804c9c4e0f7b9d34ce4ae1a30c55","contentType":"text/markdown; charset=utf-8"},{"id":"2b99ed3c-76ff-5710-a59b-c0c8b18bcb1b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2b99ed3c-76ff-5710-a59b-c0c8b18bcb1b/attachment.md","path":"rules/data-useeffect-to-ssg.md","size":2004,"sha256":"2a28593de9d8860aaa7de66ce398e5f13a655dcf9d7c726691e5c4c1e87fe03d","contentType":"text/markdown; charset=utf-8"},{"id":"9b9141e0-5cbf-5189-8590-a7808593d51b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9b9141e0-5cbf-5189-8590-a7808593d51b/attachment.md","path":"rules/data-useeffect-to-ssr.md","size":1940,"sha256":"59f95aefe8f3e63e8b507345e4d0c08b4fb8f5ea8bf2b346d5898c97cf10470a","contentType":"text/markdown; charset=utf-8"},{"id":"537218bb-08fe-5ca7-ad94-5863dfac54a3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/537218bb-08fe-5ca7-ad94-5863dfac54a3/attachment.md","path":"rules/deps-react19-compatibility.md","size":1633,"sha256":"67f99dee2b643f6b58254a90a8bd1abbecd6c4d6764a9a51da0736c51a2028db","contentType":"text/markdown; charset=utf-8"},{"id":"be035d33-09bb-5544-a381-7db6a9e6e448","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/be035d33-09bb-5544-a381-7db6a9e6e448/attachment.md","path":"rules/env-build-time.md","size":2121,"sha256":"8e0420ead90d9321ee10120de08d4713f3445a78604f623110c271ec9bd533c4","contentType":"text/markdown; charset=utf-8"},{"id":"3ebe0502-03b4-5362-990c-8f0366e99de4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3ebe0502-03b4-5362-990c-8f0366e99de4/attachment.md","path":"rules/env-local-files.md","size":1537,"sha256":"b63cce95daf0b91f5b67f724e83d404287df53cb4f18758c981e6c838729e468","contentType":"text/markdown; charset=utf-8"},{"id":"31b86dee-9544-5f1c-b630-b099542c2600","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/31b86dee-9544-5f1c-b630-b099542c2600/attachment.md","path":"rules/env-prefix-change.md","size":2648,"sha256":"39cf325a60d7b0ce6bcb564623b3848e105c561646868e38ffcbe334de0c356d","contentType":"text/markdown; charset=utf-8"},{"id":"50da1023-3eba-5db1-a1e1-b20f0d396b5c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/50da1023-3eba-5db1-a1e1-b20f0d396b5c/attachment.md","path":"rules/env-runtime-config.md","size":1684,"sha256":"ffbdbe312f68273a65931a8aeb167f7f05ebe3a10e367efc914ee503330e0030","contentType":"text/markdown; charset=utf-8"},{"id":"66507cdc-b110-5ed0-83bd-83082e0123c6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/66507cdc-b110-5ed0-83bd-83082e0123c6/attachment.md","path":"rules/env-server-only.md","size":1688,"sha256":"56cb5e9942a7e0aaff7d56cee0aa3c1d18299244a5caef0118b6743e0d2a34b9","contentType":"text/markdown; charset=utf-8"},{"id":"37e7a5f9-09c5-58c0-9b1c-d9f8ab9d6eda","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/37e7a5f9-09c5-58c0-9b1c-d9f8ab9d6eda/attachment.md","path":"rules/env-validation.md","size":2095,"sha256":"9c356dda0d16d654a32c16cfeec033c86ce08cc59b5ce483d354d080a0f88186","contentType":"text/markdown; charset=utf-8"},{"id":"ffc91487-9d1b-540f-b74b-9cfd9a05468e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ffc91487-9d1b-540f-b74b-9cfd9a05468e/attachment.md","path":"rules/fonts-font-display.md","size":1621,"sha256":"a05bbfd1842e543318ec2bcc6a0e2f8919267fcdf6e583d53763e064285865f6","contentType":"text/markdown; charset=utf-8"},{"id":"aa888493-044c-5435-bf3f-76c3cbd58b6a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/aa888493-044c-5435-bf3f-76c3cbd58b6a/attachment.md","path":"rules/fonts-google-fonts.md","size":1769,"sha256":"cb9ac7c0d1ab552727325afdb71a242805f6db0d23a929d9990a5a227ed1aaaa","contentType":"text/markdown; charset=utf-8"},{"id":"8bb9ebdf-76f6-5bfe-9450-6594a398e47a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8bb9ebdf-76f6-5bfe-9450-6594a398e47a/attachment.md","path":"rules/fonts-local-fonts.md","size":1775,"sha256":"c742d1cf515ad544c31e956786782dbbd8a9c350229be8ebacac843a87b673a7","contentType":"text/markdown; charset=utf-8"},{"id":"2f39fb35-1183-5b9e-8632-c63bf177d2fc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2f39fb35-1183-5b9e-8632-c63bf177d2fc/attachment.md","path":"rules/fonts-next-font.md","size":2197,"sha256":"2e9425202e2f30b2c5a96ee5f4406d4419960638c57c5da37ce5e927d66ef21f","contentType":"text/markdown; charset=utf-8"},{"id":"02f1c96d-aeba-5658-bbb2-02e161e69077","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/02f1c96d-aeba-5658-bbb2-02e161e69077/attachment.md","path":"rules/fonts-preload.md","size":1662,"sha256":"35cf1919335c3efe6f3991c26d9a73bd10243593bf4bb288f43f57f3cf25ea9a","contentType":"text/markdown; charset=utf-8"},{"id":"4a2d589e-02b0-56e5-9a7f-95c2ad6d74d1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4a2d589e-02b0-56e5-9a7f-95c2ad6d74d1/attachment.md","path":"rules/fonts-variable-fonts.md","size":1543,"sha256":"9218a61f72c8799484334ef0f55d5a94856090da3ec2daf9c5861065a0e56256","contentType":"text/markdown; charset=utf-8"},{"id":"bf4a978c-5534-5c8b-88a2-d538e58731b7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bf4a978c-5534-5c8b-88a2-d538e58731b7/attachment.md","path":"rules/gotchas-api-routes-edge.md","size":1866,"sha256":"8a36a91771713ef81f2553c066dc6295bf26a255789e527ffcced1ffc3284533","contentType":"text/markdown; charset=utf-8"},{"id":"8bf08156-381c-55d7-93ae-a4545fa6cbad","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8bf08156-381c-55d7-93ae-a4545fa6cbad/attachment.md","path":"rules/gotchas-auth-race-conditions.md","size":4145,"sha256":"7942582ab163c4ddc554d8c42ff871f9201c1da9367a951639d07a3d17750201","contentType":"text/markdown; charset=utf-8"},{"id":"75a8cb22-d054-52a2-9280-a26e9fff26f8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/75a8cb22-d054-52a2-9280-a26e9fff26f8/attachment.md","path":"rules/gotchas-auth-state-gating.md","size":3215,"sha256":"bd9c81d8c88beec8406eddd457bbd9ae13c123808797e47ddbd02de2ff1d1937","contentType":"text/markdown; charset=utf-8"},{"id":"b2c6b140-21a7-5b65-9b42-7751876ccd39","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b2c6b140-21a7-5b65-9b42-7751876ccd39/attachment.md","path":"rules/gotchas-configuration-idempotency.md","size":3100,"sha256":"9e0d35b5790c2fccd8ab22b356a069d4e35d46c833a7aae72d6b9cbc1ba7349f","contentType":"text/markdown; charset=utf-8"},{"id":"db32c650-56e7-53d6-9b94-4e6d7fa70610","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/db32c650-56e7-53d6-9b94-4e6d7fa70610/attachment.md","path":"rules/gotchas-cookies.md","size":2247,"sha256":"23b76e2bc56edbc3639aca2220fee1654e1ccc17e815e025218a87673920b710","contentType":"text/markdown; charset=utf-8"},{"id":"2645836e-83e7-5ad1-8f0d-da38e8ef61a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2645836e-83e7-5ad1-8f0d-da38e8ef61a4/attachment.md","path":"rules/gotchas-dynamic-imports.md","size":1898,"sha256":"095a5b7bfded4a5e0e9512e2ff011fdd222ba32e038f85aa0bfbe4afdb5ad134","contentType":"text/markdown; charset=utf-8"},{"id":"ae93fe2e-6f51-51b4-a178-ed6aa13d89ad","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ae93fe2e-6f51-51b4-a178-ed6aa13d89ad/attachment.md","path":"rules/gotchas-empty-modules.md","size":1714,"sha256":"db497ae15a7ee3d54d262d770e3e4e1f77f2ff294dd4de33613adec6efc339aa","contentType":"text/markdown; charset=utf-8"},{"id":"06be762e-e0be-5953-8fc7-0ad17ad972c4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/06be762e-e0be-5953-8fc7-0ad17ad972c4/attachment.md","path":"rules/gotchas-headers.md","size":3284,"sha256":"3a2097019fe38f6db0c4051389cfcbcc5a5f35d5acfe4baab1c08298cf277e5a","contentType":"text/markdown; charset=utf-8"},{"id":"d495fc8c-b8f7-59f6-aff5-3a89608bdf28","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d495fc8c-b8f7-59f6-aff5-3a89608bdf28/attachment.md","path":"rules/gotchas-hydration-mismatch.md","size":2502,"sha256":"b9e7699ebd18500eb6fb6746ffa3364225dbf997641461d8682d445c9c11e6ef","contentType":"text/markdown; charset=utf-8"},{"id":"e72409bb-e787-51e3-a9e9-726665e69dc3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e72409bb-e787-51e3-a9e9-726665e69dc3/attachment.md","path":"rules/gotchas-hydration-nested-interactive.md","size":3114,"sha256":"eddd38bc3aa30bfcded41dd9a179ff5d25265975428d092b1474c7f1ac0e45d2","contentType":"text/markdown; charset=utf-8"},{"id":"74a605a0-f150-5b8b-a12d-f12581f81d66","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/74a605a0-f150-5b8b-a12d-f12581f81d66/attachment.md","path":"rules/gotchas-infinite-rerender.md","size":3966,"sha256":"2c063d18ef70f3b5d618d040a1c47c84c5d6ed4c3e963571f5e2ef1182450e4b","contentType":"text/markdown; charset=utf-8"},{"id":"77a1e30c-8fe0-57ac-babc-d2505d6fe31f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/77a1e30c-8fe0-57ac-babc-d2505d6fe31f/attachment.md","path":"rules/gotchas-middleware.md","size":2191,"sha256":"275f375f22dd2b22706d2fefaa343e42b6ec649eace1568dc6a743abe381d4f1","contentType":"text/markdown; charset=utf-8"},{"id":"84a6fae5-9a01-5acb-b994-2bdefaa255c1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/84a6fae5-9a01-5acb-b994-2bdefaa255c1/attachment.md","path":"rules/gotchas-nullish-coalescing.md","size":4058,"sha256":"1e0ef1319be1c5e90890d4c99b46a4f359011a789c90ed21e5fad8f5db50c40f","contentType":"text/markdown; charset=utf-8"},{"id":"2058bc6a-303c-5655-96dc-7e5f8716efdb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2058bc6a-303c-5655-96dc-7e5f8716efdb/attachment.md","path":"rules/gotchas-provider-hierarchy.md","size":4871,"sha256":"b3a02fed492626c0994dcba23144c0c5835c8061656be164b7c67d6fda45e627","contentType":"text/markdown; charset=utf-8"},{"id":"17798d45-dda8-50ea-83f9-8f7bb50be49c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/17798d45-dda8-50ea-83f9-8f7bb50be49c/attachment.md","path":"rules/gotchas-react19-class-components.md","size":5250,"sha256":"6fad0aea830fea1f1028898003ff5800baebd1595946a0d0cec26535841507d9","contentType":"text/markdown; charset=utf-8"},{"id":"0daca52c-d303-51d1-80ff-8ee67b87af39","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0daca52c-d303-51d1-80ff-8ee67b87af39/attachment.md","path":"rules/gotchas-react19-ref-prop.md","size":5523,"sha256":"50c92e7d08c6fd00eaf6cc9dbdb73be45742955cb89a2fa9c01f858a530e2561","contentType":"text/markdown; charset=utf-8"},{"id":"8c43c736-98cc-58ad-b230-ff7215c41656","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8c43c736-98cc-58ad-b230-ff7215c41656/attachment.md","path":"rules/gotchas-redirect.md","size":2166,"sha256":"c68e2157940c4f8ef62c5e5e914f6cde2ce44db3ae7e4a90bbb7b9782f1dbb63","contentType":"text/markdown; charset=utf-8"},{"id":"6bdda675-af53-5b5c-abbf-85a879a14a02","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6bdda675-af53-5b5c-abbf-85a879a14a02/attachment.md","path":"rules/gotchas-router-push-timing.md","size":3479,"sha256":"8b1937b2666d29b81d36863677e76a4c5c4a26119e71fabfc44ecd4386d0097a","contentType":"text/markdown; charset=utf-8"},{"id":"2dded531-7715-58d5-9e3d-d5c7279542b5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2dded531-7715-58d5-9e3d-d5c7279542b5/attachment.md","path":"rules/gotchas-router-ready.md","size":1814,"sha256":"8e531f064c69207835f4d9ddbd285a413e66b1228e2707e70923c3b783cada9e","contentType":"text/markdown; charset=utf-8"},{"id":"334f6cdb-fd7e-5889-a33b-eb8d467b9bb8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/334f6cdb-fd7e-5889-a33b-eb8d467b9bb8/attachment.md","path":"rules/gotchas-static-generation.md","size":2188,"sha256":"40d9923a11b3c83abdcdcc27a0cfca73bbe55330e1c81dcf1811f937071861d4","contentType":"text/markdown; charset=utf-8"},{"id":"e9141134-68b6-5fec-9503-493d79e4dbf2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e9141134-68b6-5fec-9503-493d79e4dbf2/attachment.md","path":"rules/gotchas-turbopack.md","size":5182,"sha256":"54e706707d27f788d84a7b384c2b24a81a2cf52b557f89415ed62cf182348cbb","contentType":"text/markdown; charset=utf-8"},{"id":"4f12e693-b833-5fdd-8398-e65db40e83c1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4f12e693-b833-5fdd-8398-e65db40e83c1/attachment.md","path":"rules/gotchas-use-effect-timing.md","size":1959,"sha256":"eea9e9b2beb283790de2aded17e3ca11641473fe6b47d9228b00493bd0bbd8e5","contentType":"text/markdown; charset=utf-8"},{"id":"02338687-d646-51ac-9b75-5d32b4960327","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/02338687-d646-51ac-9b75-5d32b4960327/attachment.md","path":"rules/gotchas-websocket-optional-deps.md","size":2309,"sha256":"7c9b6a75b0757798646c3d44bc323a3b5fcb2bf2668ee695cd82b089b523644b","contentType":"text/markdown; charset=utf-8"},{"id":"4be95ecd-7420-598b-bed5-d1f1762608fd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4be95ecd-7420-598b-bed5-d1f1762608fd/attachment.md","path":"rules/gotchas-window-undefined.md","size":1927,"sha256":"60c6741a447a0c1b9d0a10dac473e971dcfb68e1ab22d4de4f0006c74e56666f","contentType":"text/markdown; charset=utf-8"},{"id":"2f5dbe0a-26e7-59f0-84f2-58295dc63e82","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2f5dbe0a-26e7-59f0-84f2-58295dc63e82/attachment.md","path":"rules/images-fill-prop.md","size":1621,"sha256":"abae1a2d9f656c571b258b84cee1c5af90178a2c3e42e48967dfe1e82a45c8ba","contentType":"text/markdown; charset=utf-8"},{"id":"d183d0ba-00fa-5ae5-8708-139500b7c7df","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d183d0ba-00fa-5ae5-8708-139500b7c7df/attachment.md","path":"rules/images-loader.md","size":1612,"sha256":"5e07c014af39173727100b2f129b124c6d2ca36b9fc0983d27836d480a896b3c","contentType":"text/markdown; charset=utf-8"},{"id":"f7a477f9-3a25-52bb-af18-930b6198a593","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f7a477f9-3a25-52bb-af18-930b6198a593/attachment.md","path":"rules/images-next-image.md","size":2422,"sha256":"47daa3d599808520b850f9a3caf025aa9935b5cbdbc3718ae20803ca96eb3e22","contentType":"text/markdown; charset=utf-8"},{"id":"1eaff905-b47d-509e-bac4-336b49ba616e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1eaff905-b47d-509e-bac4-336b49ba616e/attachment.md","path":"rules/images-optimization.md","size":1891,"sha256":"53434b14fa2bf5aec7418f317b28f82815423d0dc6ba4807deabbb06c225874d","contentType":"text/markdown; charset=utf-8"},{"id":"aa02f55e-8ad4-5388-b7d6-092e605d76f7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/aa02f55e-8ad4-5388-b7d6-092e605d76f7/attachment.md","path":"rules/images-placeholder.md","size":1710,"sha256":"49f1b89cf6edfc812d056e6454f2947e1e736307b2ff37c8748cc54b63879208","contentType":"text/markdown; charset=utf-8"},{"id":"13c90f1e-ea6d-564b-be60-27ef81926f6d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/13c90f1e-ea6d-564b-be60-27ef81926f6d/attachment.md","path":"rules/images-priority.md","size":1668,"sha256":"d40f8d8f4efc99791bf00b0aa880a0a0e2dad3c13d5c3e49c184ad441e564112","contentType":"text/markdown; charset=utf-8"},{"id":"0ec6c085-d590-59b0-bb57-8a5c1baa7a1a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0ec6c085-d590-59b0-bb57-8a5c1baa7a1a/attachment.md","path":"rules/images-remote-patterns.md","size":2290,"sha256":"55a2c7d05b705fdb282b6d2868d899a29a521a7a81e6005239d631160e31ecee","contentType":"text/markdown; charset=utf-8"},{"id":"4a41a5a6-8ba5-56ce-bc92-6e655834eb97","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4a41a5a6-8ba5-56ce-bc92-6e655834eb97/attachment.md","path":"rules/images-required-dimensions.md","size":2206,"sha256":"60b809dacd94a9c090735fddee485c35cf69734fbd55fce9b499b6bb9c078e7f","contentType":"text/markdown; charset=utf-8"},{"id":"936bf64f-a56a-54ae-a82c-c0ace79a66a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/936bf64f-a56a-54ae-a82c-c0ace79a66a4/attachment.md","path":"rules/integrations-sentry.md","size":3437,"sha256":"271fb408cef82ae579eb0ca8e9fc45336ed4865166d69e10e8d6b63e4958629d","contentType":"text/markdown; charset=utf-8"},{"id":"949f46e6-c5f4-56b9-92d7-19e2dcf3bb8d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/949f46e6-c5f4-56b9-92d7-19e2dcf3bb8d/attachment.md","path":"rules/routing-basic-pages.md","size":1562,"sha256":"4072127e9c9c3891be21ade400e398cca09331dccecea0a560f1df5b17cd39c2","contentType":"text/markdown; charset=utf-8"},{"id":"fd22b80c-1a4d-59c1-9e33-1d7f41717b7a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fd22b80c-1a4d-59c1-9e33-1d7f41717b7a/attachment.md","path":"rules/routing-catch-all-routes.md","size":1314,"sha256":"c47146a1d908f2f21e9441f34897973fa2a0f578674c7befa1c76021fbac6358","contentType":"text/markdown; charset=utf-8"},{"id":"61840a78-ba8a-5479-9ae7-dfc9476b867a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/61840a78-ba8a-5479-9ae7-dfc9476b867a/attachment.md","path":"rules/routing-dynamic-routes.md","size":1864,"sha256":"53c924cfe63408fbd7c7edebaa00861a4ec412143691c2c30ef1e68e51338ea7","contentType":"text/markdown; charset=utf-8"},{"id":"7f840e40-541e-5305-8fce-cc01801de26c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7f840e40-541e-5305-8fce-cc01801de26c/attachment.md","path":"rules/routing-error-boundaries.md","size":2718,"sha256":"ffe8a2116af4b05f885c3e888b95b7aadbe7687f2aa61eee2c687f3b852814b0","contentType":"text/markdown; charset=utf-8"},{"id":"8d93d5e7-2c89-51b7-bfaf-bbf5f528798d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8d93d5e7-2c89-51b7-bfaf-bbf5f528798d/attachment.md","path":"rules/routing-hash-based.md","size":4591,"sha256":"2c922aa555421ed6a44a4ec8c0945eeffc01838cd8bce2ac8be8facd38da6995","contentType":"text/markdown; charset=utf-8"},{"id":"d90c94c9-6f3c-5edc-a98a-e9d6aef9d96a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d90c94c9-6f3c-5edc-a98a-e9d6aef9d96a/attachment.md","path":"rules/routing-intercepting-routes.md","size":1991,"sha256":"9dcf71bd9fdb8d95a87fbbe9b108e1682a6883558ae78171acea147dce3d7b13","contentType":"text/markdown; charset=utf-8"},{"id":"c79c9e7d-dea9-55ec-8d5d-cc5936c2bcce","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c79c9e7d-dea9-55ec-8d5d-cc5936c2bcce/attachment.md","path":"rules/routing-link-component.md","size":2452,"sha256":"325f6e8c4bb8bdafd68c3678efa74787da556f86f0002a1b4709bf90a5d600dc","contentType":"text/markdown; charset=utf-8"},{"id":"59782654-c660-5d61-9111-250b18ed43c9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/59782654-c660-5d61-9111-250b18ed43c9/attachment.md","path":"rules/routing-loading-states.md","size":2675,"sha256":"b371fd7433278efd00013354a27d199f81ccb86d647408a62be5ac75a89baff4","contentType":"text/markdown; charset=utf-8"},{"id":"8114dd72-e67c-56ab-92bb-308dde08dd42","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8114dd72-e67c-56ab-92bb-308dde08dd42/attachment.md","path":"rules/routing-nested-layouts.md","size":1997,"sha256":"5e3b553bc60f901a34ec5c8fe63ce1cc8f9c7d0cba7d328abdb23298587bd820","contentType":"text/markdown; charset=utf-8"},{"id":"ccaa8cbb-7fec-52c2-bffd-2623559a49d2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ccaa8cbb-7fec-52c2-bffd-2623559a49d2/attachment.md","path":"rules/routing-not-found.md","size":2209,"sha256":"5ce91ab35bab761501e726fe38b607d0e3abe7bb8c54a539980be9f508842928","contentType":"text/markdown; charset=utf-8"},{"id":"3de09c83-f33c-51d9-8dd8-fb36b078a87d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3de09c83-f33c-51d9-8dd8-fb36b078a87d/attachment.md","path":"rules/routing-optional-catch-all.md","size":1433,"sha256":"68486bed90832d761de6668548a507b1191bd8e329bcbf098eb53efc0cd1476f","contentType":"text/markdown; charset=utf-8"},{"id":"92f0d714-fe6f-53d3-8d5b-ae8845011f73","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/92f0d714-fe6f-53d3-8d5b-ae8845011f73/attachment.md","path":"rules/routing-parallel-routes.md","size":1618,"sha256":"8203c80b63f11318f0d607cc80110f9b051c4dde74dc820eb03dfced4be4f671","contentType":"text/markdown; charset=utf-8"},{"id":"67df602a-b87a-5eca-9937-d569b0e8517c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/67df602a-b87a-5eca-9937-d569b0e8517c/attachment.md","path":"rules/routing-programmatic-navigation.md","size":2672,"sha256":"a7ff30b34459b47ff1a9f63e28bdf254cec789e520e6b98e9e6fad581d737974","contentType":"text/markdown; charset=utf-8"},{"id":"5796d3e0-71df-5c03-951a-f0335a7df7df","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5796d3e0-71df-5c03-951a-f0335a7df7df/attachment.md","path":"rules/routing-protected-routes.md","size":4812,"sha256":"77a9ca5540c8c192417853e9f39c51bfc5308228b2d0ce0de0473ee0cdbad1bb","contentType":"text/markdown; charset=utf-8"},{"id":"a4ffb1a2-5240-5c66-baf8-c6b9494fd024","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a4ffb1a2-5240-5c66-baf8-c6b9494fd024/attachment.md","path":"rules/routing-route-groups.md","size":3922,"sha256":"fedfb2fe683999649e96334e9dcec4ad5add60973a4a8dd8826bf51b4a2f4334","contentType":"text/markdown; charset=utf-8"},{"id":"859dd1b3-e428-574a-bb13-6f4134beb9e6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/859dd1b3-e428-574a-bb13-6f4134beb9e6/attachment.md","path":"rules/routing-use-params.md","size":1518,"sha256":"508122a6b129b52b5beecdaea3a20ee20c286d5db9cf1e548f0ea4a39fa78df8","contentType":"text/markdown; charset=utf-8"},{"id":"f020925d-1446-5568-9a55-96eefb328d48","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f020925d-1446-5568-9a55-96eefb328d48/attachment.md","path":"rules/routing-use-search-params.md","size":2094,"sha256":"04c921c792a11208e2d6253e63827cf8154f18420991267a1c8f92748c9c3f71","contentType":"text/markdown; charset=utf-8"},{"id":"81730842-51d9-50df-aadc-4c49f087b6cb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/81730842-51d9-50df-aadc-4c49f087b6cb/attachment.md","path":"rules/seo-canonical.md","size":1494,"sha256":"87c9fe8ecfd2395cd0595f0725fdc9644e2fc88fe130625307d8c5f37746732f","contentType":"text/markdown; charset=utf-8"},{"id":"0875d654-312d-5c2b-8f52-bc15e8498841","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0875d654-312d-5c2b-8f52-bc15e8498841/attachment.md","path":"rules/seo-dynamic-metadata.md","size":1888,"sha256":"cceaadde10de2f21d29a6662a439b9fb61030d39296d9fa4b14fc7752554b371","contentType":"text/markdown; charset=utf-8"},{"id":"4cdabff3-3ecd-59cf-b701-1e58dab709f5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4cdabff3-3ecd-59cf-b701-1e58dab709f5/attachment.md","path":"rules/seo-head-component.md","size":1851,"sha256":"438c73cf1ac345a00c3534683d109b3214b19c963f4af911af4925076ab99afd","contentType":"text/markdown; charset=utf-8"},{"id":"833f3066-f0de-574e-945c-f52ee0b9eac2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/833f3066-f0de-574e-945c-f52ee0b9eac2/attachment.md","path":"rules/seo-json-ld.md","size":2089,"sha256":"494434e0621869de4364226805d61a448bc47365e0b23b7ecef8a18e69553ca2","contentType":"text/markdown; charset=utf-8"},{"id":"684be4d8-6d07-55c9-a498-b745e8860766","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/684be4d8-6d07-55c9-a498-b745e8860766/attachment.md","path":"rules/seo-metadata-api.md","size":1689,"sha256":"460346d8637a6293a6c4c1fffad13f67cb1de8c855a9cf8d0416ef30407c8530","contentType":"text/markdown; charset=utf-8"},{"id":"99418779-f1d1-5ba8-b4a4-0c6b9981d35f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/99418779-f1d1-5ba8-b4a4-0c6b9981d35f/attachment.md","path":"rules/seo-opengraph.md","size":2018,"sha256":"827f147226c863fcafa974e62e511401c9dd253e62740e5d065a1ac882a0af8d","contentType":"text/markdown; charset=utf-8"},{"id":"e93b1e0d-7c55-5c7b-8c4d-6d2747836485","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e93b1e0d-7c55-5c7b-8c4d-6d2747836485/attachment.md","path":"rules/seo-robots.md","size":1630,"sha256":"29a1dd5be91f9110ceb79454d205281bbec1e417cee672267a906197cc290d53","contentType":"text/markdown; charset=utf-8"},{"id":"0b471c74-96a6-5074-a0f2-251accada7ba","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0b471c74-96a6-5074-a0f2-251accada7ba/attachment.md","path":"rules/seo-sitemap.md","size":2306,"sha256":"785ce972f9f928878b778fab45570c8f26b223e186ce33096d72d1f303d3e628","contentType":"text/markdown; charset=utf-8"},{"id":"44ca8ff7-7903-5c89-8657-90a5bf8151e3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/44ca8ff7-7903-5c89-8657-90a5bf8151e3/attachment.md","path":"rules/seo-twitter-cards.md","size":1694,"sha256":"cbc7b87b3e9e9baed32a63f7794a635dfc8c93874a7f3c32a80c793a4aa965fc","contentType":"text/markdown; charset=utf-8"},{"id":"7efcaa65-d957-5f11-8335-8b33821dacec","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7efcaa65-d957-5f11-8335-8b33821dacec/attachment.md","path":"rules/setup-eslint.md","size":996,"sha256":"5dd384d48546249d607f00ff6d13ead97ef926c340104a08c432b9da27c8e2da","contentType":"text/markdown; charset=utf-8"},{"id":"2e28896e-104e-5a1b-a9c3-d32ad0a58a32","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2e28896e-104e-5a1b-a9c3-d32ad0a58a32/attachment.md","path":"rules/setup-gitignore.md","size":916,"sha256":"b8cb9afa08e0cd423cb3c70809a48f0cfa6a46d9f40f230f02e4c46bd0780255","contentType":"text/markdown; charset=utf-8"},{"id":"154da1bb-2be1-5c9c-87e3-c99533939e03","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/154da1bb-2be1-5c9c-87e3-c99533939e03/attachment.md","path":"rules/setup-initial-structure.md","size":1623,"sha256":"71d77538b5aa7fc534b4a7b0c33094c4f18fbd6039f86c5a84cac6d0b8ff8ee6","contentType":"text/markdown; charset=utf-8"},{"id":"15072f38-0096-5cb8-9ba6-14029d4ebb9c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/15072f38-0096-5cb8-9ba6-14029d4ebb9c/attachment.md","path":"rules/setup-next-config.md","size":5020,"sha256":"218b8998ab4c41fc2b6d3bf1b19b03f1dc7f70c8a24ab3a56738949b372f2169","contentType":"text/markdown; charset=utf-8"},{"id":"9c3bfc45-6ba4-5927-8227-ec6332e01512","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9c3bfc45-6ba4-5927-8227-ec6332e01512/attachment.md","path":"rules/setup-package-json.md","size":1440,"sha256":"67f60da17898c197105eee758568ec8c25a42e4a9fbed7ff75542cd40474fdf6","contentType":"text/markdown; charset=utf-8"},{"id":"53f01577-b5e0-5d48-85d6-0ef63d6b84b7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/53f01577-b5e0-5d48-85d6-0ef63d6b84b7/attachment.md","path":"rules/setup-typescript.md","size":2800,"sha256":"bf39ddabe5e8ab52ff55ff710f2540e6855818efa410c8d25f65dee10852ab51","contentType":"text/markdown; charset=utf-8"},{"id":"cf06503b-9659-52d9-a6a8-6c3bc2c929e6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cf06503b-9659-52d9-a6a8-6c3bc2c929e6/attachment.md","path":"rules/state-context-client.md","size":2160,"sha256":"4052840ecf9c28e149f1c5ff76cde0cdb86d0ed6ba468aed628d818e5332e3ac","contentType":"text/markdown; charset=utf-8"},{"id":"0475740e-7009-550c-8cef-47f2bafad59e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0475740e-7009-550c-8cef-47f2bafad59e/attachment.md","path":"rules/state-jotai.md","size":2047,"sha256":"2f8da82284965a8e1c5fbf8d451cddbcc95dd8484e1484ad6a72b78759b8fbee","contentType":"text/markdown; charset=utf-8"},{"id":"c50c173d-14bc-5ff8-aebf-d4d0f1b32b70","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c50c173d-14bc-5ff8-aebf-d4d0f1b32b70/attachment.md","path":"rules/state-persistence.md","size":2445,"sha256":"c0b3d76afa7f387d2b808fa8f46e799f05f00d486700ec9e91e71032dfbce783","contentType":"text/markdown; charset=utf-8"},{"id":"2786bce5-b267-5a85-8104-a6986a5d2a1e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2786bce5-b267-5a85-8104-a6986a5d2a1e/attachment.md","path":"rules/state-recoil.md","size":1809,"sha256":"93e4c0c672e3e6f867f756777be4f76f2cd42b98fefd71ff83a9979121ee9992","contentType":"text/markdown; charset=utf-8"},{"id":"1eccb741-eca9-552f-a091-5948c02740f0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1eccb741-eca9-552f-a091-5948c02740f0/attachment.md","path":"rules/state-redux.md","size":3366,"sha256":"fc8e1c267796fc77d2130eb58414c02ea17a61abddbe7e067e1b6b62121a8d25","contentType":"text/markdown; charset=utf-8"},{"id":"299e88bc-34e2-521e-879f-ca45b95ac14f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/299e88bc-34e2-521e-879f-ca45b95ac14f/attachment.md","path":"rules/state-server-state.md","size":2250,"sha256":"a1741d781c8ff368ef97fa7c2081c0fce16bbc0ec353c3ac294cc36f06f7c89a","contentType":"text/markdown; charset=utf-8"},{"id":"a787a68d-6090-5d4f-9ab8-196ca39ca4e1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a787a68d-6090-5d4f-9ab8-196ca39ca4e1/attachment.md","path":"rules/state-url-state.md","size":2184,"sha256":"91ee58aeb3775ecd5e17a6d5e9b1104e34e778a4b01270b4e4562d70c64287f1","contentType":"text/markdown; charset=utf-8"},{"id":"3c260723-aae0-55a5-8c9e-54449d4e5733","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3c260723-aae0-55a5-8c9e-54449d4e5733/attachment.md","path":"rules/state-zustand.md","size":2124,"sha256":"fd25a667ec945f400ca32b65e05f4cd0b2bf80866607f187dc1ab913e3953fff","contentType":"text/markdown; charset=utf-8"},{"id":"7a8782d1-5c23-59f8-bd14-23b669602b2a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7a8782d1-5c23-59f8-bd14-23b669602b2a/attachment.md","path":"rules/styling-component-styles.md","size":1434,"sha256":"3e90b22f42c96edf0b1555bab1eaa036c81f9a6a31dd52cc0d915f67ff04b04b","contentType":"text/markdown; charset=utf-8"},{"id":"0a3c05a1-1b81-549e-bfa5-d8fd2ec2d115","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0a3c05a1-1b81-549e-bfa5-d8fd2ec2d115/attachment.md","path":"rules/styling-css-import-order.md","size":3386,"sha256":"8a28ce9e073e02767ab35e098e2c58efea6a6675a9591a01e3c5a67c777d4b9c","contentType":"text/markdown; charset=utf-8"},{"id":"06265bd1-7def-5784-800c-47c0185a8c87","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/06265bd1-7def-5784-800c-47c0185a8c87/attachment.md","path":"rules/styling-css-in-js.md","size":1566,"sha256":"6479284e5407f87a54b70cc2918cdd08e9a8816586f90f3db8101d47457e9f1d","contentType":"text/markdown; charset=utf-8"},{"id":"b7b964a6-5f77-5aed-8a5a-22a06bfdf5db","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b7b964a6-5f77-5aed-8a5a-22a06bfdf5db/attachment.md","path":"rules/styling-css-modules.md","size":1671,"sha256":"47d0294fd63f32c89148710b3a5d923e483bff9c2d48678d975f5ac07fe02c7e","contentType":"text/markdown; charset=utf-8"},{"id":"e317a10b-156e-5fed-a2ff-b36ff9ba6c03","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e317a10b-156e-5fed-a2ff-b36ff9ba6c03/attachment.md","path":"rules/styling-dark-mode-hydration.md","size":4514,"sha256":"9ebe7f259154ac87b9ed84ec3cbb6c21a20d70d19755635ee46952462e4c1db7","contentType":"text/markdown; charset=utf-8"},{"id":"1982d662-d3a0-5a81-b341-af77e684f193","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1982d662-d3a0-5a81-b341-af77e684f193/attachment.md","path":"rules/styling-emotion.md","size":2166,"sha256":"dcd028d1c58b5ae2723cf49dad1e32bfce4bbb19e52abed5b6444d438e2429c2","contentType":"text/markdown; charset=utf-8"},{"id":"5ee3f031-3054-508d-84fc-0e5edda3b38c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5ee3f031-3054-508d-84fc-0e5edda3b38c/attachment.md","path":"rules/styling-global-css.md","size":1522,"sha256":"6abdfca0ae18de9896016c6b84f7cfe9bf93e7d0a0aecb330a9e2354e091bd10","contentType":"text/markdown; charset=utf-8"},{"id":"92eae857-ebd8-5cc2-8424-ae1e1ab647fe","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/92eae857-ebd8-5cc2-8424-ae1e1ab647fe/attachment.md","path":"rules/styling-postcss.md","size":1359,"sha256":"14f88fc4863efb97b8d891fec05037ee913844a20974e8e79ac2a0a2c32ae1f7","contentType":"text/markdown; charset=utf-8"},{"id":"75dcfa0c-fcef-5835-8527-7918c38e255e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/75dcfa0c-fcef-5835-8527-7918c38e255e/attachment.md","path":"rules/styling-sass.md","size":1348,"sha256":"4948f0375fdcf6e4eb6a1e05b423ea0b4d557c5973e217fc46eefb07262e2173","contentType":"text/markdown; charset=utf-8"},{"id":"ead6d875-5296-5179-9310-afc8a063bb7e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ead6d875-5296-5179-9310-afc8a063bb7e/attachment.md","path":"rules/styling-scss-global-syntax.md","size":2608,"sha256":"d6242d5dacb1e3aa82d4d09f3a40f8ea38af733bbea46148a87c1a02f755797a","contentType":"text/markdown; charset=utf-8"},{"id":"7bd9c654-b5e2-523a-af65-42f1c1a58c2b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7bd9c654-b5e2-523a-af65-42f1c1a58c2b/attachment.md","path":"rules/styling-styled-components.md","size":2124,"sha256":"b41a8a4a8e6338def83e5b6db936dcba4c06509536fee83f3a88ed0c99766c11","contentType":"text/markdown; charset=utf-8"},{"id":"0ade4a45-c79b-56d3-a634-9db7bfee676c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0ade4a45-c79b-56d3-a634-9db7bfee676c/attachment.md","path":"rules/styling-tailwind.md","size":1429,"sha256":"392a20b5741c32ff780f84fd2170e172a483bd9f7000787d9f447c1ae0bb7bd0","contentType":"text/markdown; charset=utf-8"},{"id":"3a68b209-f454-556d-a099-810dd340be65","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3a68b209-f454-556d-a099-810dd340be65/attachment.md","path":"rules/testing-api-routes.md","size":2200,"sha256":"d4956990849bf2c7f98000e582103b7857864658e71754a4dafbb61402ae8fc7","contentType":"text/markdown; charset=utf-8"},{"id":"00451ec2-85be-5a4e-9aa2-03117bc72e47","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/00451ec2-85be-5a4e-9aa2-03117bc72e47/attachment.md","path":"rules/testing-async-components.md","size":2092,"sha256":"9e0aeecdc1361c481300d555aead9f73d07d0896adc284ff3652168c1edaea65","contentType":"text/markdown; charset=utf-8"},{"id":"ffa26973-d83e-54aa-97dd-168f578dc022","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ffa26973-d83e-54aa-97dd-168f578dc022/attachment.md","path":"rules/testing-client-components.md","size":1905,"sha256":"081a71f7cc98c9beabebcbac2434dc8fef1b2e96bd3fccf47d409077866b844d","contentType":"text/markdown; charset=utf-8"},{"id":"42377d6d-8700-594b-a611-ecdc5d4620e2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/42377d6d-8700-594b-a611-ecdc5d4620e2/attachment.md","path":"rules/testing-e2e-cypress.md","size":2108,"sha256":"d865e3560b2be6903f2e0d2dd18abef98d49f6cd7dfc4ace165c631e7a7a55f0","contentType":"text/markdown; charset=utf-8"},{"id":"40b5e2ab-6f9b-5d2a-89f5-01ef4e67f097","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/40b5e2ab-6f9b-5d2a-89f5-01ef4e67f097/attachment.md","path":"rules/testing-e2e-playwright.md","size":2371,"sha256":"2b74ee8f13d4435b42cce9f44813850eff7695dc178eb52f5f5493dd537db416","contentType":"text/markdown; charset=utf-8"},{"id":"ab0b55c5-1c26-5b1e-901f-97b86e8212cd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ab0b55c5-1c26-5b1e-901f-97b86e8212cd/attachment.md","path":"rules/testing-jest-config.md","size":1510,"sha256":"b033a7d398d2b636b01642f6238a1dd1624c3ba6bb0635899ca32a36468fbee8","contentType":"text/markdown; charset=utf-8"},{"id":"9c319097-e3d3-5ecd-94a7-5a340d4c58c3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9c319097-e3d3-5ecd-94a7-5a340d4c58c3/attachment.md","path":"rules/testing-mocking.md","size":1772,"sha256":"7dd7ec915ac4c70c4922f2b1d54fcd8a835459b8a5ecff9444afc683329e2af9","contentType":"text/markdown; charset=utf-8"},{"id":"5b07ed79-42c6-583f-96d7-8a64d5846283","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5b07ed79-42c6-583f-96d7-8a64d5846283/attachment.md","path":"rules/testing-react-testing-library.md","size":1936,"sha256":"9f2c238ca5c86c94ddca23c1b7c44a79f99f479702ea8c78487aaf1c44da7065","contentType":"text/markdown; charset=utf-8"},{"id":"18fc1174-8a28-56a4-9a9f-62fc0b09efb6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/18fc1174-8a28-56a4-9a9f-62fc0b09efb6/attachment.md","path":"rules/testing-server-components.md","size":2092,"sha256":"dc23e443ce30dd84e7ef610f68c303a5a434edb811f32c1d32c28697a7c5935e","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"dd005baf96fe3f1090ddada47013d1c896019d46389ebb1707a9c6e22f36a593","attachment_count":148,"text_attachments":148,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"cra-to-next-migration/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"web-development","metadata":{"author":"community","version":"1.0.0"},"import_tag":"clean-skills-v1","description":"Comprehensive guide for migrating Create React App (CRA) projects to Next.js. Use when migrating a CRA app, converting React Router to file-based routing, or adopting Next.js patterns like Server Components, App Router, or image optimization."}},"renderedAt":1782989378442}

CRA to Next.js Migration Guide Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration. When to Apply Reference these guidelines when: - Migrating an existing CRA application to Next.js - Converting React Router routes to file-based routing - Adopting Server Components in a client-heavy app - Moving from client-side rendering to…