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.