Back to Writing

Why I Rebuilt My Portfolio on the Next.js App Router

Next.jsReactFrontend

This site itself is the case study. Here's what moving to the App Router actually changed in practice, beyond the folder rename.

Server Components by default

The Projects section fetches from the GitHub API directly in a server component — no useEffect, no loading spinner, no client-side waterfall. The HTML that reaches the browser already has the data in it.

export async function Projects() {
    const projects = await getRepos();
    // render directly — no client fetch needed
}

Colocation over central folders

Route-specific pieces like HeroSection and Skills live inside app/(home)/components/, next to the page that uses them, while genuinely shared pieces (Navbar, Footer, the Timeline primitive) stay in the top-level components/ folder. The App Router's file conventions make that split obvious instead of arbitrary.

The tradeoff

Not everything is free. Anything interactive — the mobile nav toggle, the skills filter, the contact form — still needs "use client", and drawing that boundary correctly takes more intention than the old all-client model. Worth it for a mostly-static, content-first site like this one.