Where each part runs: Server Components meet a client-only library
Next.js App Router renders on the server by default. Framer Motion runs in the browser — it reads layout, measures elements, and drives requestAnimationFrame. So the boundary matters. A motion.div lives inside a file marked 'use client'; everything above it can stay a Server Component that streams static HTML.
The practical pattern is a thin client wrapper. Keep your page (app/page.tsx) as a Server Component for data fetching and SEO, then import a small 'use client' component that holds the motion elements and receives data as props. The server sends real markup, React hydrates, and Framer Motion takes over the animation on the client. This keeps the animated subtree small instead of turning a whole route into a client bundle, which would forfeit streaming and server data access.