Skip to content
Vincent's Notes
Go back

Goodbye Hugo: I Rebuilt My Blog with Astro Overnight

by Vincent YangMade with AI

This blog ran on Hugo with the PaperMod theme for four or five years. On June 15 I threw the whole thing away and rewrote it in Astro.

The interesting part isn’t the framework choice. It’s how the rewrite happened: I typed /goal in Claude Code, described what I wanted, and went to bed. The next morning, a working Astro site was sitting in a new repository. The migration commit tells the story in one line: 184 files changed, 95,175 insertions — every published post carried over, every URL intact, every comment thread still attached.

Why leave Hugo at all

Hugo itself was never the problem — it’s fast and it’s stable. The problem was living on top of PaperMod. Updates slowed to a crawl, known bugs sat unfixed for months, and every release I did pull was a small gamble on what my overridden partials would collide with. And fixing things myself meant fighting Hugo’s template DSL — which isn’t really Go, even if you write Go: logic lives inside markup, there’s no component model, composition happens through partials and dict gymnastics, and when something breaks the error points into the theme’s internals instead of your code. Over the years my workarounds accumulated as a pile of overridden partials I was afraid to touch.

The honest reason I stayed so long: a full rewrite was a multi-weekend project, and the blog worked. That math changed.

The overnight migration

I started from AstroPaper (v6 at the time, since upgraded to Astro 7) rather than a blank page — a solid, minimal base to mutate. The overnight /goal run handled the tedious parts that used to make these projects die in a branch:

I reviewed the result over coffee and filed nitpicks. That was the migration.

Astro 7 is quietly very fast

I started on Astro 6 and upgraded to 7 mid-rewrite — a single commit. It’s worth a section, because the toolchain got noticeably better underneath me:

Deployment matches the pace. The repo pushes to GitHub, and Cloudflare Workers picks up every commit, builds it with bun, and has it live on the edge about a minute later. My publishing flow is literally /ship — Claude writes the conventional commit, pushes, and by the time I’ve switched tabs to check, the deploy is usually already green. The old Hugo site deployed fast too, to be fair; the difference is that now everything else is this fast.

Three weeks of taste, one sentence at a time

The real payoff came after. The git log since June 15 is ~50 small commits, and almost every one of them was a sentence to Claude rather than an evening of my own:

Typography took four iterations to get right — and that’s the point: iterating was cheap. System fonts first, then Berkeley Mono as the Latin face, then Space Grotesk for everything, and finally where it landed today: Inter for body text, Space Grotesk for headings, Berkeley Mono for code — with CJK always falling through to system fonts so Chinese readers never download a webfont.

The palette went through the same loop. I started with AstroPaper’s colors, tried a blue/teal pair that never felt right, studied a design I admire, and ended with warm stone neutrals and pure ink accents — black on paper in light mode, white on warm black in dark. No borrowed blues.

Code blocks became macOS windows via a custom Shiki transformer — traffic-light dots, the filename in the title bar, click a line to copy that line, click the header to copy the block.

Posts got infrastructure Hugo never had:

The flights page became a real data product. It started as a static table; now a pipeline in the repo computes my actual flown distances from ADS-B position data — 107 of my 113 flights show genuine track miles instead of great-circle estimates, each labeled with its data source, with rankings and an AI-written analysis of my flying habits.

Even the chores automate themselves: a GitHub Action refreshes my U.S. visa wait-times post from travel.state.gov every three hours. It has made more commits than I have.

The comments are mine, all the way down

My comment system is now entirely my own implementation. The backend is Cloudflare Workers + D1 with Telegram moderation — I wrote about building it in March. During this rewrite the frontend became a native Astro component in my own codebase: no embedded widget, no iframe, no third-party JavaScript. The git log shows what that ownership buys — four styling passes on reply indentation and the input area until it felt right, each a ten-minute conversation instead of a fork of someone else’s plugin.

The point

None of the individual features here are remarkable. What’s remarkable is the cost curve. A bespoke blog used to be a tax paid in weekends; now the expensive part is knowing what you want. I spent three weeks deciding — fonts, colors, how a code block should feel — and almost no time implementing. The implementation happened while I slept, or while I was doing something else, one sentence at a time.

Hugo is still a great tool, and I’d still recommend it to anyone who wants a blog that just works. But if you’ve been putting off the rewrite that makes the site truly yours — the excuse is gone.


Goodbye Hugo: I Rebuilt My Blog with Astro Overnight
Published at
July 7, 2026
ShareShare this post on WhatsappShare this post on FacebookShare this post on XShare this post on TelegramShare this post on PinterestShare this post via email

Previous Post
Your Flight Almost Never Flies the Great Circle
Next Post
Give Your Camera Real GPS: A No-Internet Hardware Fix with furble

Comments 0

Finished reading? Why not leave a word.