The Fergy Stack

Linux at the desk, adventures on the table.

React Server Components Are Really About Boundary Design

Server and Client connection

Tuesday, 4:57 p.m. The deploy is green. The route loads fast. Then somebody clicks a filter, a modal opens, and suddenly your “simple” page is juggling server data, client state, loading spinners, and one component tree that feels like it was assembled during a hostage negotiation.

My take: React Server Components are not mainly a rendering feature. They are a boundary design problem. The hard part is not learning what runs on the server versus the client. The hard part is deciding where the line goes so the app stays understandable six months later.

That is where teams get in trouble. They think they are drawing clean boundaries. What they actually create is a hybrid app where data ownership is fuzzy, interactivity leaks upward, and one use client pulls half the neighborhood into the browser.

Here’s the shift: a boundary is not just technical placement. It is a statement about responsibility.

If a component owns data fetching, secrets, or access control, that is a server responsibility. If it owns clicks, local state, browser APIs, or immediate user feedback, that is a client responsibility. Trouble starts when one component tries to do both.

The part that bites later is not “too much server” or “too much client.” It is bad seams.

A bad seam looks like this: the page fetches data on the server, passes too much of it into a client wrapper, and now that wrapper becomes the place where filtering, formatting, optimistic updates, and presentation all get mixed together. It works. Until it doesn’t. Then every change requires touching both sides of the boundary, which is how a one-hour feature becomes a three-day “small refactor.”

That is Starscream architecture: ambitious, loud, and unstable under pressure.

A better seam is boring on purpose:

The point is not that FilterPanel is client-side. The point is that its boundary is narrow and obvious. The server gets the data. The client handles interaction. Nobody is pretending one component should be both Duke and Cobra Commander.

That is the calmer option. Small client islands. Server-first data ownership. Clear reasons for crossing the line.

If you try this next week, ask three questions before adding use client:

  1. Does this need a click handler or browser API?
  2. Does this component need secret or trusted server-only logic?
  3. If this changes next month, will I need to edit both sides of the boundary?

That last question is the giveaway. The uncomfortable part is that most “modern React architecture” problems are not framework problems. They are ownership problems wearing framework clothes.

Tradeoffs still exist. Highly interactive tools, rich editors, dashboards, and drag-and-drop flows may deserve more client territory. That is fine. The mistake is not using the client. The mistake is using it without a deliberate seam.

Lion-O had Sight Beyond Sight. You need boundary beyond boundary: not just what can run where, but what should live where so the system stays calm under change.

That is the real promise of Server Components. Not fewer renders. Not trendier architecture. Better lines of responsibility.

References

Send me your stack, team size, what feels confusing in your component boundaries, and your timeline.

Want to talk this through?

If you’re dealing with messy React boundaries, TypeScript drift, or a deployment pipeline that hates you back, let’s chat.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *