← Return to Dashboard
Architecture4 min readMay 10, 2026

Building Better Fullstack Applications

How I approach building scalable dashboards using Next.js, balancing server and client components to keep performance and maintainability in check.

When I build dashboards and data-heavy applications, I always start with a simple question: what actually needs to be interactive? With modern Next.js and the App Router, we have the luxury of rendering most of our UI on the server. This is a game-changer for performance because it means we're sending far less JavaScript down to the user's browser.

However, it's easy to accidentally throw a "use client" directive at the very top of your component tree just to make a dropdown work, effectively opting out of all those server-side benefits. In real-world projects, I've found that the best approach is to push client boundaries as far down the tree as possible. I keep my layouts, data fetching wrappers, and static shells as Server Components, and only make the specific interactive pieces—like charts, command menus, or complex forms—Client Components.

This isn't just about chasing a high Lighthouse score; it's about real user experience. When you're dealing with users on slower mobile networks or older devices, a bloated JavaScript bundle translates directly to a frustrating, sluggish interface. By intentionally deciding where interactivity lives, I can build applications that feel instant and remain easy to maintain as they grow.

SYSTEM: CHECKING