The first version was a markdown-only static SvelteKit site: copy under content/, prerendered HTML, no database.
Member magazines needed gated full text and PDFs, so Access landed as an overlay: public teasers, Cloudflare Access for the rest, files on R2.
Editors then needed to change pages without a deploy, so CMS added D1 working copies, a frozen live_json snapshot for the public site, R2 media, and /admin behind Access.
Those three are now one modular blueprint. New sites declare TEMPLATE_BASE = "static" and ADDONS of "", "access", "cms", or "access,cms". Markdown remains the seed: Admin Reset still copies content/ into D1.