Why I Migrated My Portfolio to Next.js 15

Published August 1, 2026

The old site

My portfolio started as a single-page vanilla site: one big index.html, a CSS file full of custom properties, and a handful of inline scripts. It worked, but every change was a full-file edit and translations lived in the markup.

The move to Next.js

The rewrite went to Next.js 15 with the App Router:

  • Server components for every section (hero, projects, experience)
  • Server actions for admin CRUD
  • next-intl for EN/ID routes
  • Tailwind v4 with the old CSS variables preserved as theme tokens

What improved

  1. Typed data โ€” all Supabase rows are TypeScript-first
  2. Admin panel โ€” auth-gated writes via server actions
  3. i18n โ€” locale-prefixed routes done once, language toggles for free
  4. Fallbacks โ€” a safeFetch wrapper keeps the site rendering even if Supabase is unreachable

Takeaways

Migrating felt slow for a week and fast after that. Most time went into types and the data layer โ€” the UI itself moved over almost unchanged.