The third iteration of my personal portfolio — a bilingual (EN/ID) Next.js 15 site with shadcn/ui and Tailwind v4, driven entirely by a headless Payload CMS.

Personal Website v3 is the latest rebuild of my portfolio, using Next.js 15 (App Router) with React 19 and TypeScript. The UI is built on shadcn/ui and Radix primitives, styled with Tailwind CSS v4, with light/dark theming via next-themes and animations powered by Motion (Framer Motion).
The site is fully bilingual with next-intl using an always-on locale prefix (/en, /id) — every route lives under /[locale] and UI strings are stored per-language. Localized content itself comes from the CMS, which returns the active locale and falls back to English.
All content — projects, posts, experiences, testimonials, and the about section — is sourced from a headless Payload CMS through a single typed data layer (lib/cms.ts) using Next.js ISR (revalidate 60). Infinite scroll and the contact form run through server actions, and SEO is handled with JSON-LD helpers.
It's deployed on Vercel as one of four independent apps in a portfolio monorepo, sharing the same CMS as the other frontend versions.