Building my personal site on Hono and Cloudflare Workers

·173 views·

I’ve wanted my own personal site for about as long as the web has been a thing, and I’ve never been able to make one stick. Trust me, I’ve tried.

The first attempt was a Geocities page with some animated dragonball GIFs and a guestbook nobody signed. After that came a Xanga, where I posted things I would now pay money to take down. WordPress came later, hosted on whatever shared hosting was cheap that year, broken half the time, abandoned the other half. There was a Posthaven (a deliberate attempt to outrun the death of Posterous). There was a Medium account, which I told myself was a personal site even though everyone knows it isn’t. Eventually I gave up and just posted on LinkedIn, which is where ideas go to be optimized for engagement and stripped of personality.

None of these were the thing I actually wanted. I wanted a place that was mine. A place I owned, that wouldn’t get acquired or pivoted or filled with newsletter popups, where my writing wouldn’t get processed by an algorithm before reaching anyone. While building this site, I tried to find my old Medium account to pull a few posts over. It took me over ten minutes to find it. My own writing, on a platform I used to log into every week. That’s the part that stings. Not that the platforms exist, but that they slowly take your work hostage and you barely notice it happening. Every iteration got me a little closer and then drifted off. Domains expired. Hosting bills came due. Themes broke. The activation energy of “build it again” was always higher than “just post on LinkedIn for now.”

Well, here’ I’m trying again. Last weekend I built samchan.ca in 72 hours and it’s my favourite version of my site so far. You’re reading this on it.

The stack

I knew what I wanted before I started, which is the part that took twenty years to arrive at:

  • Markdown files for posts. I want to own the words.
  • Server-rendered HTML. No client framework, no JavaScript runtime, no waiting for the page to “hydrate.”
  • Dark mode that doesn’t flash white on load.
  • Fast on mobile, fast on a flaky connection.
  • No comments, no analytics, no email capture, no “subscribe to my newsletter” modal.
  • Hosted somewhere I trust to still be there in a decade.

The framework choice was less obvious. The default move would have been Astro, which is good and is exactly what it was designed for. I picked Hono instead, which is a smaller, weirder, more bare-metal choice. Hono is normally used to build APIs. Almost nobody uses it for blogs. But I wanted to learn something. Astro would have given me a working blog in an afternoon and I wouldn’t have understood any of the layers underneath. Hono made me deal with routes, requests, server-rendered JSX, and how a Cloudflare Worker actually serves a page. Fair trade for the extra time.

Hosting was easy. Cloudflare Workers, free tier, custom domain. The latency is good, the platform is stable, and the bill is zero unless I get unreasonably popular. Content lives in Cloudflare KV, which is a key-value store that’s exactly the right amount of database for a site with a few dozen posts.

The whole thing is about a thousand lines of code, not counting the styles.

The 72 hours

I built this with Claude as a pair programmer. I’m not a developer. The honest version of how it went: I made decisions, Claude wrote code, I deployed, things broke, I described what was broken, things got fixed. Sometimes I asked for the wrong thing and we’d back up. Sometimes I’d realize a feature I thought I wanted was a feature I actually didn’t want.

Most of the work wasn’t writing code. It was deciding things. Should the dark mode pre-paint script live inline or in an external file? Inline, so it runs before the page renders and you don’t see a flash of white. Comments? No. RSS feed? Not yet, maybe later. Plex Sans, Inter, or something quirkier? Plex, because IBM has good taste. Each of these is a small decision that adds up to the texture of the site.

Near the end I realized the entrypoint had grown to 929 lines doing too many things at once. I spent a chunk of the last evening splitting it into nine smaller files. The site is identical to what it was before, but I’ll be glad I did it the next time I want to change something.

The open source side quest

Here’s where it got interesting. Toward the end I went looking on GitHub for other personal blogs built on Hono, partly out of curiosity, partly hoping to find a community to lurk in. Nothing. There are plenty of generic Hono+Cloudflare starter templates, but they’re all for APIs. The closest thing to a personal-blog template was a thin wrapper around dev.to’s API.

This struck me as a missed opportunity. Hono is good. Cloudflare Workers are good. A personal blog is exactly what both are well-suited for. The reason nobody had published a template was probably that the Astro people had already won the personal-blog category and the Hono people were busy building APIs. But that didn’t mean it was useless. It just meant nobody had bothered.

So I extracted the architecture from samchan.ca, stripped out my content, replaced my posts with placeholders, wrote a README that walks through deploying it, and put it on GitHub. MIT licensed, fork freely. It’s hono-minimalistic-personal-blog. The name is descriptive at the cost of being ugly, which I think is the right trade for a fork-it-and-go template.

Slop?

Full disclosure: this post was also written with Claude. Most of the structure and a lot of the wording is mine, but I’m not going to pretend I sat down and typed it from scratch.

So is all of this slop? The site, the template, the post you’re reading right now? Maybe. The code is conventional Hono+Cloudflare patterns. The design borrows liberally from sites I admire. The post itself was drafted by an AI that’s read every blog ever written. None of it is novel.

But the site exists. It works. It’s mine in the ways that matter to me. After twenty years of failed personal sites I have one I actually like, and the activation energy for the post after this one is a lot lower than it has ever been before. That counts for something to me.

Whether it counts for enough (enough to publish, enough to open-source, enough to take seriously) is a question I’ll let you answer for yourself. If you found my journey at all interesting, maybe it wasn’t slop. If you didn’t, fair. There’s a back button.

Either way, I’m enjoying writing here for now. Feeling cute. Might delete later.