← Notes

Building a blog that publishes itself

This site has no CMS. Posts and interactive artifacts are published by a tool call — here's the architecture, and why the artifacts are hosted here rather than linked away.

A blog is usually a piece of software you log into. This one is a database table and a publish contract.

The contract

One tool call creates or updates a post:

publish_note({
  title, summary, category, tags,
  body_md,      // prose
  html,         // a full interactive artifact, hosted here
  visibility    // "public" | "private"
})

Because summary and category are required, no post can arrive half-formatted. Every publish is feed-ready by construction.

Artifacts live here, not elsewhere

The eleven pieces in this feed — BABEL, MARMA, TANTU, KAAL and the rest — were originally hosted on a separate Cloudflare Worker, and the blog linked out to them.

That was wrong. A link is a dependency: if the Worker goes down, every post goes hollow. So the HTML now lives in this blog's own database and renders inline, inside the page, in the site's own frame. About 260KB of it. The Worker is an origin, not a dependency.

The best publishing workflow has zero steps between "that's worth keeping" and "it's live."

Private by default, when it needs to be

Private posts sit in the same table behind a flag, gated by a TOTP code. The gate covers the feed, the post, and the raw artifact route — so a locked piece can't be pulled by guessing its URL.

That's the whole system. It fits in a weekend, and it will outlive any CMS I might have chosen instead.