✨ Highlights
- Iron Man / HUD design system — cyan glow, scanlines, HUD frames, reactor motifs, and animated accents across every section.
- Bilingual EN / KO — full next-intl i18n with path-prefixed routing (/ English, /ko/… Korean). UI, sections, and all 45 blog posts are translated; Korean copy uses concise 개조식 phrasing.
- MDX blog — migrated from the legacy site, with card (bento) / list view toggle, teaser thumbnails, categories, always-visible heading anchors, and per-post OG images.
- Redesigned sections — Hangul jamo-by-jamo typewriter in About, mission-log Projects, reactor-cluster Skills, bento Portfolio, infinite-scroll Experience, and a HUD globe on Contact.
- Reworked Now page and an updated projects/experience/skills set.
- SEO-first — per-route metadata, sitemap.xml, robots.txt, OpenGraph images, and locale alternates.
🧱 Stack modernization
- Migrated to TypeScript (strict) and Next.js 15 App Router with React Server Components.
- Tailwind theme tokens via tw-colors; next-themes light/dark.
- Vitest + Testing Library test suite (108 tests).
- Contact form via EmailJS, sourced entirely from env (NEXT_PUBLIC_*).
- Still a GitHub template — clone, set env, deploy.
- Full rewrite from the 1.x JavaScript site — not an in-place upgrade.
- Routing moved under app/[locale]/; all links are locale-aware.
- Requires Node 24.x and environment variables for EmailJS + CP handles (see .env.example / README).
🐛 Fixes since 1.x
- Contact form: read NEXT_PUBLIC_* via static references so keys inline into the client bundle (dynamic process.env[name] never inlined → form reported "not configured").
- next-intl ENVIRONMENT_FALLBACK at build: pass an explicit timeZone to NextIntlClientProvider and call setRequestLocale in every generateMetadata.
- Security: patched dependency advisories — next-mdx-remote 5→6, vitest 2→3.2.7, vite 6.4.3, esbuild, postcss.
- Light-mode contrast: fixed invisible text from the tw-colors base ↔ Tailwind text-base collision.
- Portfolio overlay: legible title/description on light thumbnails.
- Dev crash ("Maximum call stack"): removed unused Material Tailwind.
- Blog hydration mismatch: rehype-unwrap-images.
- Pinned Node engine to 24.x for reproducible builds.
Full Changelog: v1.0.1...v2.0.0