RSCs changed how we think about rendering. Here is what I learned after shipping three production apps with the new paradigm.

The boundary is the whole design

Most of the work in a server-component app is deciding where server rendering stops and interactivity begins. Get that line right and data fetching stays simple; get it wrong and state ends up threaded through places it does not belong.

The pattern that holds up: fetch on the server, pass plain data down, and keep client components focused on interaction. A page becomes a thin data layer wrapping a presentational tree.

// Note

Anything crossing into a client component has to be serialisable. Functions, class instances, and dates-as-objects will stop the build.

What actually got easier

Loading states largely disappear for initial render, and the client bundle shrinks because data-fetching code never ships. The trade is a mental model that takes a few projects to internalise.