How this site was made
Background
It had been five years since I last updated my portfolio and for good reason. The project wouldn’t even build locally anymore. Back then, Gatsby.js was the shiny new thing, and I’d made the mistake of chasing the latest trend. This time, I wasn’t going to repeat it.
The Goal
-
Low maintenance — Let’s be honest: I enjoy building new things, but maintaining them is a different story. Frontend tech moves fast. A project that builds fine today might be completely broken six months later.
-
Easy to migrate — I didn’t want to be locked into a specific framework or service. If something stops being supported, I need to be able to refactor and redeploy quickly.
The Architecture
1. Web Components
Instead of the standard “React-everything” approach, I chose Web Components — a native browser API. My components aren’t tied to any framework, which means I can drop them into any project without rewriting them.
2. Lit for Web Components
Lit is syntactic sugar for Web Components. It removes the boilerplate without the black magic you get from heavier frameworks. And even if Lit stops being maintained, converting back to vanilla Web Components wouldn’t be a major undertaking.
3. The “No-CMS” Content Strategy
The same logic applies to my content. I want to own it and be able to move it freely. So I skipped the Headless CMS and went local. JSON for structured data, Markdown for long-form writing.
4. Astro as the Backbone
I went back and forth on Astro (on the surface it seemed to work against my goals), since I don’t particularly care about SSR or SEO. But Astro turned out to be a great fit for wiring up Markdown and JSON files with minimal friction.
The key decision was making sure Astro played nicely with Web Components rather than fighting them. If I ever need to switch away from Astro, the loss is minimal: just the layout (plain HTML) and the data-fetching layer. The components themselves come along for free.
The Result
The site you’re reading right now is the outcome. It builds in seconds, deploys as static files, and has no runtime dependencies. Every goal from the list above is met:
- Low maintenance — There’s no CMS to update, no platform to babysit, and no framework-specific patterns that will rot over time. The content is just files on disk.
- Easy to migrate — The Web Components work anywhere. The Markdown and JSON content is completely portable. Switching the build tool would be a weekend project, not a rewrite.
More than anything, this is a site I’ll actually keep updating because the barrier to doing so is so low.