Three Rebuilds of This Website

Web Astro Meta

I’ve rebuilt this website three times, on three different stacks. None of the rebuilds were because the old one stopped working. Each was because I’d outgrown the shape the previous tool wanted me to be, and rebuilding is maybe more fun than actually maintaining the site with fresh blogs.

Epoch One: An Academic Pages Template

The first version was Academic Pages, a Jekyll fork built for exactly this — a researcher with publications, talks and teaching to list. It ran on GitHub Pages, which meant the whole thing was free, version-controlled and deployed by git push. For myself at the time, free was a really important word.

It did the job for a year or two. I dropped my papers in, listed the courses I taught, added the side projects, and GitHub built and served it. The trouble with a template built for your exact use case is that it’s built for the average version of your use case. The moment I wanted to do something the template didn’t support — a custom layout, an interactive element, anything off the rails — I was fighting Liquid templates and a theme structure I hadn’t designed and didn’t fully understand. I was editing someone else’s site, not building my own. LLMs were helpful to a point, but there was no claude code.

Epoch Two: Next.js and Tailwind on Vercel

I rebuilt it in Next.js with Tailwind, starting from the excellent Tailwind Next.js starter blog, and deployed on Vercel. Tailwind enabled me to have these funky UI components that I always wanted. Styling in the markup, no context-switching to a separate stylesheet, no inventing class names for one-off layouts — it suited how I actually iterate, which is to say impatiently. React gave me components, which is the thing the Jekyll template never really let me have: my own building blocks, composed how I wanted. Vercel made deploys invisible; push to the branch, preview URL appears.

What I eventually pushed back on was the weight. A personal site is, in the end, mostly text. Shipping a full React runtime to render a blog post that has no interactivity is a lot of JavaScript for a page that could have been static HTML. Next.js is a fantastic tool for applications. My site is not an application. It is a bunch of text with a couple fun UI styling elements. I was digging around in stylesheets and trying to understand the behemouth of code that I was building on top of. This did not spark joy.

Epoch Three: Astro on Cloudflare

The current site is Astro, deployed on Cloudflare. Astro’s whole pitch is the thing I’d just spent a rewrite learning to want: ship zero JavaScript by default, render to static HTML, and only hydrate the specific components that genuinely need to be interactive (its “islands” model). The dotted background that grows little graphs when you hover, the theme toggle, the view counter — those are islands. Everything else is plain HTML and weighs nothing.

It also kept the parts of the previous site two I’d grown attached to. I have components, I have Tailwind, I still write posts in MDX — but a post is now content first and JavaScript only where I ask for it. Astro’s content collections give the blog a typed schema (title, date, tags, a canonical URL, flags for citations and code-block styling), so a malformed post fails at build time instead of looking wrong in production.

Moving to Cloudflare opened up the last gap. The site runs in server mode at the edge, with the static pages prerendered and a handful of real backend routes behind them. Page views and the email subscriber list live in a Cloudflare D1 (SQLite) database; new-post notifications go out through Resend. My old academic template could never have done that, and on Next.js I’d have reached for a heavier setup to get there. Here it’s a few small endpoints next to the content.

What the three rebuilds were actually about

Looking back, the stack was never really the point. Each rewrite was me wanting a little more control than the previous tool would hand over without a fight — first the freedom to design my own layouts, then the discipline to stop shipping code I didn’t need, then a real backend without a real backend’s overhead. It’s eaiser and easier to build a website these days because with LLMs being this good, you can just spin something up real quick even without any real knowledge.

A personal website is a wonderful excuse for this. The stakes are nil, the scope is yours alone, and the reward is just having a piece of you out on the internet. This isn’t just another collection of pages on a social media site, I own the content and the presentation. If I really wanted, I could host all of this on my own VPS or server. The whole discourse around the dead internet theory saddens me, and maybe it’s not realistic for everyone to have their own site, but you know, why not have a go?