Project: EmDash

How I set up Cloudflare, EmDash CMS, and this website from scratch on June 1, 2026 — the full story in one post.

What This Project Is

This website — greefhorst.net — is itself the story. On June 1, 2026, I set up Cloudflare from scratch: provisioned a D1 database, scaffolded an EmDash CMS project, configured DNS, and deployed a live multilingual blog. Every one of those steps was documented in real time, and the seven original articles covering that journey have been merged into this single post.

The Setup, Step by Step

Step 1: Verified Cloudflare API access. If you can't talk to the API, nothing else matters. Step 2: created the D1 database — one API call that should have been simple and wasn't. Step 3: scaffolded the EmDash project, an Astro-based CMS with a Cloudflare Workers backend. Step 4: installed dependencies, the unglamorous but necessary part. Step 5: deployed the worker — the site went live for the first time on a workers.dev subdomain. Step 6: connected greefhorst.net to the Cloudflare worker via DNS configuration. Step 7: wired the language switcher (EN | NL | FR), debugged a Cloudflare Workers validation error caused by file:// URLs in the build manifest, and applied the sed fix that makes every deploy work.

What I Learned

Astro 6.4.2 embeds file:///workspace/hermes-emdash/ paths in the built worker, and Cloudflare Workers rejects new URL('file:///...'). The fix — a sed replacement to https://0.0.0.0/hermes/ — is now part of every deploy. Node.js 22 is required. npm cache clean --force fixes the @@ASTRO_MANIFEST_REPLACE@@ placeholder that appears after package installs. And EmDash's content API works beautifully once you understand its taxonomy model.