Why I Migrated My Portfolio to Next.js 15
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-intlfor EN/ID routes- Tailwind v4 with the old CSS variables preserved as theme tokens
What improved
- Typed data โ all Supabase rows are TypeScript-first
- Admin panel โ auth-gated writes via server actions
- i18n โ locale-prefixed routes done once, language toggles for free
- Fallbacks โ a
safeFetchwrapper 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.