React Server Components shift the default: components render on the server and ship zero JS unless they need interactivity. For content-heavy apps, that's a meaningful drop in bundle size and a faster first paint.
The mental model that works for us: server by default, client at the leaves. Fetch data in server components close to where it's used; push state and effects down into small client components marked explicitly. Most of the tree never needs to hydrate.
The sharp edges are real. You can't pass functions across the server/client boundary, context lives only on the client, and it's easy to accidentally pull a server module into a client bundle. Lint rules and a clear folder convention save a lot of head-scratching.
Used deliberately, RSC isn't a rewrite of how you think about React — it's a way to delete client JavaScript you never needed. Start with the static parts, measure the bundle, and expand from there.