The default answer for “we need a blog” is a hosted CMS. We did not take the default answer. GIBBER is an Astro site compiled to static HTML and served from Cloudflare’s edge network, with one dynamic route for email signup.

The reasoning

Speed is a ranking factor and a courtesy. A prerendered page has no database round trip, no template render, no cold start. It is a file. Serving a file from a hundred-odd edge locations is the fastest thing the web knows how to do.

A CMS is a dependency with opinions. Every hosted CMS eventually wants to own your URL structure, your markup, your image pipeline, and your migration path. We already learned that lesson elsewhere in the CURATIONS stack. Posts here are markdown files in the repository, which means they diff, they review, they roll back, and they will still open in ten years.

Machines need to read us. Discovery is a lane we sell. It would be strange to run a blog that AI crawlers struggle to parse. Static HTML with real structured data is the most legible thing you can hand a crawler.

The tradeoff we accepted

Publishing requires a deploy. There is no “log in and hit publish” button for someone outside the repository. For a desk this size that is a fair trade, because the deploy takes under a minute and the review step catches more than it costs. If the desk grows past the point where that friction hurts, the content layer is a schema, not a lock-in, and it can move.

The one thing we would not do again

An earlier version of the signup form called a third-party members API directly from the browser with an admin credential embedded in the bundle. That is not a subtle mistake. Any reader could open dev tools and read it.

The rule that replaced it: a browser never holds a credential that can write to a system of record. The form posts to our own endpoint, that endpoint runs on the Worker, and the key lives in Worker secrets where nobody can read it back out. It is one extra hop and it removes an entire category of incident.

What it costs

Effectively nothing. Static assets are served free of request charges on Workers, and the one dynamic route only runs when somebody types their email. The whole surface fits comfortably inside credits we already hold.

That is the boring, correct answer, which is usually the right one.