I migrated a side project from Next.js Pages Router to the App Router. The biggest change was understanding where and how Server Components fit in.
What worked well
- Zero client JS for static content pages
- Streaming HTML feels instant
- Layouts are composable and persistent across navigation
What confused me
- “use client” boundaries are easy to overuse
- Caching semantics changed significantly
- Error handling with error.tsx took some getting used to
More notes after I’ve shipped it to production.