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
- Styling: Tailwind, a handful of shadcn primitives, Geist font
- 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: PostHog, with a light wrapper so components can fire events with typed attributes
What I'd do differently
- The CDK stack grew organically and could be consolidated. One day.
- 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.