Back to blog
guide · 8 min read

I Migrated My Portfolio From Next.js to Astro — Here's What Changed

E
Eastvale Team

Last month, I rebuilt my portfolio site from Next.js to Astro. Not because Next.js was bad — but because my portfolio is 95% static content, and I was shipping 200KB of JavaScript for what’s essentially a fancy résumé.

The Starting Point

  • Next.js 14 with App Router
  • Tailwind CSS
  • Framer Motion for animations
  • MDX for blog posts
  • Vercel deployment

The Migration

Step 1: Pages and Layouts

Astro’s file-based routing is nearly identical to Next.js. The main difference: .astro files use a frontmatter block for server-side logic.

---
const projects = await getCollection('projects');
---
<Layout title="Projects">
  {projects.map(p => <ProjectCard project={p} />)}
</Layout>

Step 2: Keeping React Where It Matters

My contact form and theme toggle stayed as React components. Everything else became Astro components — pure HTML templates with zero client-side JS.

Step 3: Content Collections

This was the biggest win. Moving from MDX with manual frontmatter parsing to Content Collections gave me type safety and build-time validation for free.

The Results

MetricNext.jsAstro
JS Bundle198KB14KB
Lighthouse Performance89100
Build Time45s12s
Time to Interactive2.1s0.4s

The site feels instant. And I didn’t lose any functionality.