Before writing Next.js code
- Read
docs/agent/architecture/nextjs-critical-fixes.md for full patterns
- Check existing components in
apps/frontend/components/ for examples
Critical Rules (always apply)
Waterfalls
- Use
Promise.all() for independent fetches
- Wrap slow data in
<Suspense> boundaries
- Defer
await into branches where needed
Bundle Size
- NO barrel imports:
import X from 'lucide-react' ❌
- YES direct imports:
import X from 'lucide-react/dist/esm/icons/x' ✅
- Use
next/dynamic for heavy components (editors, charts, PDF viewers)
- Defer analytics with
ssr: false
Server Actions
- ALWAYS check auth INSIDE the action, not just middleware
- Verify resource ownership before mutations
Production Build
- Users run
npm run build && npm run start, NOT npm run dev
- Docker must use standalone output, not dev mode
Quick Check Before PR
[ ] No sequential awaits for independent data
[ ] Icons imported directly
[ ] Heavy components use next/dynamic
[ ] Server Actions have auth inside
[ ] Suspense around slow fetches