Designing a Next.js Application That Stays Boring
A practical approach to keeping a modern Next.js application understandable as it grows.
Let the framework do its job
A framework becomes useful when we allow its primitives to solve common problems instead of immediately replacing them with additional abstractions.
page.tsxtsx
export default async function Page() {
const data = await getData();
return <Article data={data} />;
}- Keep server data on the server.
- Use client components only where interaction requires them.
- Keep data access outside presentation components.
| Simple | Overbuilt |
|---|---|
| Server Component | Client fetch layer |
| Server Action | Unnecessary API endpoint |
// RECENT ARTICLES
01
What Actually Happens When You Visit a Website12 Sept 2026
→02Server Components Changed How I Think About React10 Sept 2026
→03Designing a Clean Data Boundary in Next.js08 Sept 2026
→04Why I Stopped Putting Database Queries in Components06 Sept 2026
→05Designing a Structured Portfolio Content Model05 Sept 2026
→06What I Actually Learned Building This Portfolio05 Sept 2026
→

OPEN
Thoughts on the article.
The Server Component versus unnecessary client fetch layer comparison was a good practical example.
The idea of letting the framework do its job is underrated. Adding another abstraction is not automatically an improvement.
Keeping data access outside presentation components has made several of my projects much easier to maintain.