The blog has been running on Jekyll since around 2014, sitting on top of the Minimal Mistakes theme. It worked fine for a long time. Write a Markdown file, push to GitHub, done.

But after a while I stopped adding things. The old site felt like an information dump. Everything was sorted into columns and sidebars and taxonomies. It was functional but it wasn't fun. I wanted something more whimsical and creative, something that felt like a workshop or a sketchbook rather than a filing cabinet. Updating the theme was the precursor to actually posting again. Hopefully it works.

Why Astro

The main reason is that I've been using Astro at my day job at Chipkin and finding it genuinely useful. It made sense to bring it home.

Astro builds to plain static HTML by default. No JavaScript runtime, no client-side framework hydrating things in the browser. The pages load fast and work without JS. For a blog that's the right trade-off.

The component model is sensible too. Instead of Jekyll's Liquid templates and _includes/ folders full of .html snippets, you write .astro files that are a clean mix of HTML and TypeScript. The front matter is real code rather than YAML config talking to a template engine, so pulling in content, filtering it, and building pages is just JavaScript.

Getting off Ruby was also a relief. Every time I came back to the Jekyll site after a few months away I needed to untangle Gem version conflicts before I could do anything. With Astro the whole toolchain is Node.js and npm install just works.

The new theme

I used Claude Design to help design the new theme, which was a useful experiment in itself. The old site was recognizably a Minimal Mistakes site, which is fine, but it looked like every other blog on that theme. The new design uses a dark starfield header, a custom design token system, and a star motif that runs through the whole thing. It feels more like mine, more playful.

About page with the new design

Projects page

Blog page

What changed

Search that actually works. The old Lunr.js setup was wired up wrong and never filtered anything. The new site uses Pagefind, which runs at build time and indexes every page. The header search now goes to a real /search page with full-text results across posts and projects.

GitHub Actions deploy. Deployment runs through withastro/action on push to master. It installs dependencies, runs astro build, runs pagefind --site dist to build the search index, and ships the output to GitHub Pages.

The numbers

The old site: roughly 35,000 lines of Sass, 15,000 lines of JavaScript, a 328-line _config.yml, and around 170 Liquid template files.

The new site: a handful of .astro components, about 900 lines of custom CSS, TypeScript for content, and no runtime JavaScript except where actually needed.