Logo

The Stack Behind this Site

The portfolio site has gotten another pass.

Same reason as always: the site is never really “done,” it’s just at whatever version reflects where I am right now. Therefore, before I touch a single page of copy, I sit with the stack itself for a minute. What am I actually building this on, and why does it still make sense.

Here’s where it lands.

Astro, for the content

Astro is still the base. Pages load fast, markdown becomes a page with almost no setup, and SEO is handled by default instead of something I bolt on later. That matters more now than it did a year ago. The SEO experiment on this site is a live, ongoing thing, and a framework that fights you on crawlability isn’t one I want to be debugging mid-experiment.

The part that keeps me here, though, is framework compatibility. Astro doesn’t force an opinion on how the interactive pieces get built. I can drop in a React component, a Vue component, whatever the previous project happened to use, and it just renders. No rewrite, no adapter layer, no afternoon lost to making two systems talk to each other.

Tailwind, and the v4 exhale

Styling is Tailwind. It’s been that way for a while and nothing’s changed my mind on it — utility classes mean I’m not naming things (“is this .card-wrapper or .card-container”) and I’m not hunting through a separate CSS file to find where a style actually lives.

What’s new is v4. The old setup meant juggling a handful of plugins and a config file that grew heavier with every project. v4 collapses most of that into one plugin. Fewer moving parts, but the same utility-first approach that made me pick Tailwind in the first place. It’s a smaller thing than it sounds, but every project that starts faster is a project that gets shipped faster.

React, where it’s needed

React sits on top for the interactive pieces. Anything that needs state, a form, a toggle. Astro’s approach means React only loads where it’s actually used, so the rest of the site stays static and fast. I’m not shipping a React runtime to render a paragraph of text.

Git, GitHub, Cloudflare Pages

The rest is the part nobody thinks about until it breaks.

Git for version control, GitHub for the repo, and Cloudflare Pages picks it up from there. Push to a branch, it builds, it deploys, and I get a preview link before anything touches production. No server to manage, no deploy script to babysit. It’s the boring layer, and boring is exactly what I want out of infrastructure. The build finishes, the little green checkmark shows up, and that’s the whole ceremony.

Monitoring lives in the same place. If a build fails, I know within the minute, not when a visitor tells me the site’s down.

Why this combination, still

None of these pieces are new discoveries. What’s changed is how little friction there is between them. Astro doesn’t fight React, Tailwind doesn’t fight Astro, and Cloudflare doesn’t ask me to think about servers at all. The stack disappears into the background, which is the only real compliment you can give a stack — I get to spend the attention on the site itself, not on the scaffolding holding it up.

That’s the rebuild, at the tooling level.


Jetdomains is live at jetdomains.co.za — domain registration and hosting for South African businesses and founders.