This is my first post. It was supposed to be my second.
My very first post should have been the “About” page. It’s the standard, simple, “Hello, this is who I am” page that every blog is supposed to have.
But I deleted it. I killed it before this blog ever saw the light of day.
This isn’t a great start, but it was a necessary one.
This Was Supposed to Be Easy
My goal was simple: set up a personal blog using the “golden stack” of modern static sites: Hugo (as the engine), the hugo-paper theme (for the clean look), Git, and Cloudflare Pages (for fast, free, global hosting).
And to be honest, it worked. Mostly.
Except for one, single, impossibly stubborn page.
The Ghost in the Machine
After I pushed my code, a bizarre problem appeared. My homepage loaded perfectly. The /posts/ list page loaded perfectly. They had the correct styles (CSS) and the correct English site title (“Frank’s Blog”).
But the /about/ page was a ghost.
It rendered as raw, unstyled HTML. Worse, every single link on that one page (the CSS file, the link back to the homepage, the footer links) was broken, pointing to an impossible address: http://localhost:1313/.
To make it even weirder, the footer—which was supposed to pull my site’s English title—instead showed an old, non-existent Chinese title: “Frank 的博客”.
My site was having a split-personality crisis. The homepage knew it was an English site deployed to production, while the About page thought it was a Chinese site running on a local test server.
The Debugging Rabbit Hole
So began an epic debugging saga. An AI assistant and I went down every conceivable rabbit hole to fix this. We tried:
- Fixing the Config File? We triple-checked
hugo.toml. We fixed deprecated keys (paginate), corrected TOML syntax, and scoured the file for invisible whitespace characters. The problem remained. - A “Ghost” Config? We hypothesized a “ghost” multilingual file (
languages.toml) left over from the theme’s example site was forcing the build into a broken state. We hunted it down and deleted the entireconfigdirectory. The problem remained. - Build Environment Mismatch? The most maddening clue was that
hugo server -Don my local Mac worked perfectly. The About page was beautiful. This suggested a conflict with Cloudflare’s build environment. So, we set theHUGO_VERSIONenvironment variable in Cloudflare to match my exact local version. The problem remained. - A Build Command Override? We thought maybe Cloudflare was ignoring the
baseURLin the config. So we manually forced it in the build command:hugo --baseURL https://frankblogs.com/. The problem remained. - A File Structure Problem? Our final theory. Maybe the theme’s “single page” template was buggy, but its “list page” template (used by the working homepage) was fine. We changed the file structure from
content/about.mdtocontent/about/_index.mdto “trick” Hugo into using the working template. And still, it failed.
The Verdict
After trying every logical configuration fix, the conclusion was inescapable.
The problem wasn’t my config. It wasn’t Cloudflare. It was a deep, unfixable bug in the hugo-paper theme itself—a flaw in its single-page template that, for some reason, fails catastrophically only when built on the Cloudflare Pages environment, defaulting all its paths to localhost. It was invisible locally, but fatal in production.
So I had a choice: spend the next week learning the Go Template language to debug a third-party theme I didn’t write… or just delete the broken feature.
I chose deletion.
This blog is going to be a record of building things that work. The first lesson is knowing when to cut your losses and pick the pragmatic path.
So, hello, world. There is no “About” page here. There is only this “Posts” page.
Because I know for a fact: this part works.