Narrating your blog with Kokoro, a local and opensource text-to-speech model

Listen to this article instead ▶ 0:00 / 0:00 0.75× 1× 1.25× 1.5× 2× Your browser does not support the audio element Seven years ago I used Google’s text-to-speech API to create audio versions of my posts. There was a Python script that parsed the Markdown file, cleaned it up, chunked it to stay under Google’s 5000 byte limit, convert each chunk to an MP3, stitch them together, and finally embed the resulting file with a Hugo shortcode that is essentiall a fancy <audio> tag. It worked, it was free1, and I was pretty pleased with it. The little audio player has been sitting at the top of my posts ever since. ...

July 12, 2026 · 6 min · Bart de Goede

Client-side semantic search for your static site

Listen to this article instead ▶ 0:00 / 0:00 0.75× 1× 1.25× 1.5× 2× Your browser does not support the audio element Eight years ago I added client-side search to this blog with Lunr.js. It creates an inverted index at build time, ships it as JSON, and matches strings in your browser. No server-side engine required. It has worked fine ever since, in the sense that it finds a post if you type a word that is actually in it. ...

July 10, 2026 · 15 min · Bart de Goede

Migrating my hopelessly outdated Hugo blog with Claude Code

I haven’t really touched my blog since 2019. The theme was ancient, jQuery was everywhere, and I kept putting off the migration. Then I decided to let an LLM do it. Here’s what happened when Claude Code spent an evening trying to modernize my setup. Listen to this article instead ▶ 0:00 / 0:00 0.75× 1× 1.25× 1.5× 2× Your browser does not support the audio element The situation It’s October 2025, and my blog is running on a Hugo theme from 2018 (the inimitable hyde-x) that was last updated when people still thought cryptocurrency was going to revolutionize everything1. The site worked fine (Google Analytics tells me there were at least three people who stumbled on my posts every month), but every time I thought about writing something new, I’d open the repo and would immediately run head-first into approximately all of the tech debt. ...

October 26, 2025 · 7 min · Bart de Goede

Use Google Cloud Text-to-Speech to create an audio version of your blog posts

Audio is big. Like, really big, and growing fast, to the tune of “two-thirds of the population listens to online audio” and “weekly online listeners reporting an average nearly 17 hours of listening in the last week”1. These numbers include all kinds of audio, from online radio stations, audiobooks, streaming services and podcasts (hi Spotify!). It makes sense too. Consuming audio content is easier to consume and more engaging than written content while you’re on the go, exercising, commuting or doing household chores2. But what do you do if you’re like me and don’t have the time or recording equipment to ride this podcasting wave, and just write the occasional blog post? ...

October 29, 2019 · 10 min · Bart de Goede

Use Hugo Output Formats to generate Lunr index files for your static site search

I’ve been using Lunr.js to enable some basic site search on this blog. Lunr.js requires an index file that contains all the content you want to make available for search. In order to generate that file, I had a kind of hacky setup, depending on running a Grunt script on every deploy, which introduces a dependency on node, and nobody really wants any of that for just a static HTML website. ...

July 12, 2019 · 3 min · Bart de Goede

Free SSL on Github Pages with a custom domain: Part 2 - Let's Encrypt

GitHub Pages has just become even more awesome. Since yesterday1, GitHub Pages supports HTTPS for custom domains. And yes, it is still free! ...

May 2, 2018 · 4 min · Bart de Goede

Free SSL with a custom domain on GitHub Pages

GitHub Pages is pretty awesome. It lets you push a bunch of static HTML (and/or CSS and Javascript) to a GitHub repository, and they’ll host and serve it for you. For free! ...

March 28, 2018 · 6 min · Bart de Goede

Searching your Hugo site with Lunr

Like many software engineers, I figured I needed a blog of sorts, because it would give me a place for my own notes on “How To Do Things™”, let me have a URL to give people, and share my ramblings about Life, the Universe and Everything Else with whoever wants to read them. ...

March 4, 2018 · 10 min · Bart de Goede