This portfolio is a site I designed, wrote, and built from the ground up in Astro. I wanted full control over the design instead of working around a rigid portfolio platform, and I wanted the copy, the layout, and the code to all be my own. The source is public on GitHub.
Goals
- Own the full design rather than fitting my work into a template
- Keep it fast and accessible without shipping unnecessary JavaScript
- Build SEO in from the start, the way I would for a client
Stack
The site is static, built with Astro, styled with Tailwind CSS v4, and written in TypeScript. Content lives in MDX collections validated with Zod, so a missing field fails the build instead of shipping a broken page. Animations run on GSAP with Lenis for smooth scrolling, and it deploys on Vercel. Almost nothing ships JavaScript by default; the interactive pieces load only when they’re needed and motion is allowed.
Highlights
An experience timeline that behaves like a deck of cards. Swipe it on a phone, click through it, or arrow-key it on desktop. It’s a custom card-stack component with depth and physics, and it doesn’t hijack the page scroll the way most carousels do.
SEO wired the way I’d wire a client’s. JSON-LD structured data (Person, Article, BlogPosting), a generated sitemap, canonical tags, and proper Open Graph and Twitter cards.
Accessible and fast. Semantic HTML, ARIA where it counts, full keyboard navigation, and reduced-motion support. Images are WebP, the hero is preloaded, and the theme switches without flashing the wrong colors.
I keep refining it over time. If you want the longer story, I wrote up why I built it with Astro.