Boundaries should serve the product
Server Components are not a purity contest. They are a way to keep secrets and heavy data work off the browser when the framework supports it.
Our default split
- Server: data loading, SEO pages, permission-aware rendering of static structure
- Client: interactive widgets, charts that need browser APIs, optimistic UI
Push 'use client' to leaf components when possible so the rest of the tree stays lighter.
Mistakes that slow teams down
- Marking large layouts as client “just in case”
- Fetching the same data in three client effects
- Passing non-serializable props across the boundary and fighting the framework
When an SPA is still right
Heavy authenticated dashboards behind login can remain SPA-style React + API. We do not force RSC onto every codebase for fashion.
Rayaxis picks the rendering model that matches hosting, SEO needs, and who will maintain the app six months later.