Skip to content
Back

How this site is built

· 6 min read

The short version: Next.js App Router on the frontend, deployed via AWS CDK to S3 + CloudFront, with a custom CI/CD pipeline that is completely unnecessary for a site this size.

That "completely unnecessary" is the point. I wanted to learn CDK properly, and the best way to learn an infrastructure-as-code tool is to use it for something you care about. A personal site is low stakes, visible, and long-lived — a perfect first real project.

Stack

  • Framework: Next.js 15 (App Router), TypeScript, statically exported
  • Styling: Tailwind, no component library and no webfont — the system font stack
  • Motion: Framer Motion for the entrance animations and the image carousel
  • Hosting: S3 + CloudFront, fronted by a Route 53 alias
  • Infra: AWS CDK, with a CodePipeline that builds from this repo on push to `main`
  • Analytics: CloudWatch RUM, with a light wrapper so components can declare events as data attributes

What I'd do differently

  • The CDK stack grew organically and could be consolidated. One day.
  • Every dependency I added "just to try it" eventually got pruned. Reaching for a library is the easy call; the site got better each time I took one back out.
  • I resisted adding MDX for a long time. Writing posts as TS strings works, but barely — the moment I want code blocks with syntax highlighting, I'll migrate.

If you want to poke around the source, the repo is linked from my GitHub.