A portfolio that’s just a collection of links isn’t useful to anyone. I wanted one where each project has its own page with context - why I built it, what decisions I made, what I’d do differently. So I built this site from scratch and write the project pages in MDX.

Features
- Projects and blog posts authored in MDX, rendered at build time
- Dynamically generated OG images for each project
- SEO-optimised with proper metadata
- Dark mode
- PostHog analytics to see which projects people actually read
- RRWeb session recording to understand how people navigate
Key decisions
- Astro over Next.js for a content site — Astro ships zero JavaScript by default; a portfolio with MDX content doesn’t need client-side hydration and shouldn’t pay the bundle cost for it
- PostHog and RRWeb together — analytics shows which projects get read; session recording shows where people drop off and why; the combination makes changes testable rather than speculative
- Dynamic OG images at build time — each project page gets a unique social image without manual work when content is added or updated
Built with
- Astro
- tailwindcss
- PostHog - analytics
- Deployed on Vercel