Project
Hedge: A Headless CMS That Never Leaves Cloudflare's Edge
I already run every domain I own through Cloudflare DNS, mostly out of convenience — one dashboard, one account, one less thing to think about. What changed a few weeks ago was poking at Cloudflare's recent product releases and their pricing and realizing that convenience could go further. With D1, R2, and Workers all sitting under the same account, keeping the entire content layer there stopped looking like a shortcut and started looking like the correct architecture.
That's Hedge — Headless + Edge. Source is on GitHub.
No origin, on purpose
One Worker serves the admin UI, the management API, and a cached read-only delivery API. That's the whole claim: content management that runs entirely on the edge, with nothing behind it to cold-start, patch, or pay for while it sits idle. D1 (SQLite, via Drizzle) holds the data, R2 holds the media, Hono and Zod run the API, and the admin is React 19 on Vite and Tailwind. Bun runs the whole toolchain.
Headless means embeddable anywhere
The delivery API is plain REST, cached at the edge, and it does not care what reads it. That's what "headless" is supposed to mean and often doesn't: Astro is what I've pointed at it — this site is the proof, more on that below — but nothing about the API assumes Astro, or a framework at all. Drop it behind Next.js, a static generator, a mobile app, or a script that just wants the latest three posts as JSON; the delivery endpoint doesn't know or care, it just serves published content, scoped by a key.
One deployment, many sites
The feature I'd undersell if I wasn't careful: a single Hedge deployment isn't one site, it's a tenant boundary you draw yourself. One deployment holds many sites, and each is its own namespace — collections, entries, media, API keys, members, all separate. Imagine running three or four separate editorials off one instance, each with its own content model, its own delivery key, its own audience. Or the shape closer to how I actually think about my own properties: one marketing website, one documentation set, one white-paper archive, all provisioned once and managed from the same admin.
That's the part that actually changes how I'll run things. It's not four CMS installs, four bills, four sets of credentials, four things that can silently go stale. It's one deployment, one place to check for updates, one auth system — and as many sites hanging off it as I have things worth publishing. No crumb trail of half-remembered free-tier accounts scattered across services just to keep a handful of properties online.
The part I didn't expect to want
Hedge ships an MCP server — 48 tools over OAuth 2.1, scoped in read/write pairs across collections, entries, media, newsletters, sites, users, and keys. An assistant can draft a post, but it can also define the collection that post lives in, caption the media it references, and write the newsletter that announces it — bounded by the scopes you grant and by your actual role, whichever is narrower. Given how much of my own workflow already runs through MCP skills, having the CMS itself speak the protocol natively, rather than me wrapping a REST client around it, is the detail I'm most glad I didn't skip.
Running it on itself
baita.uk / cms.bihaviour.com, the one serving the article you're reading right now, runs on Hedge, Astro on the delivery end. Dogfooding it from day one was the point, not an afterthought.
Where it actually is
Worth saying plainly: it's an early scaffold. The foundation works end to end — sites, auth, collections, entries, media, the delivery API, the MCP surface — but the feature set is still being deepened, not finished. I'd rather ship that status honestly than oversell a one-star repo.
So what
The interesting question isn't whether another headless CMS exists. It's whether "headless," "edge," and "multi-site" together remove a whole category of decisions most CMS choices still force on you — where each property is hosted, how many dashboards you're juggling, what happens on the first request after idle. Early, but so far: yes. And the fact that this sentence reached you through it is the only proof I trust right now.




