Replacing a CMS with a folder of rules
Why I skipped CloudCannon on a startup’s landing page and gave the founders a coding agent and a few strict rules instead.
Post
Late June
Co-founder
hey any update on the shipping page?
Jason
almost done, sending you a preview this afternoon
Co-founder
how’s the checkout fix coming along?
Jason
merged this morning, it’s live
Early July
Co-founder
Hey dude, can we talk about site copy and how [we] might be able to edit it/
Jason
I’ll see what I can do and get back to you.
That message came in early July from one of the co-founders at a hardware startup I had built a landing page for.
One co-founder was a designer and the other was the CEO. Neither of them wanted to ask me every time a headline or an FAQ answer needed a tweak.
The site was plain HTML with a Stripe checkout flow for taking orders, and every word on every page was hard-coded directly into the HTML files.
My first instinct was to look for a traditional CMS. I opened Claude Code, pointed it at the repository, and asked for the simplest way to let two non-technical co-founders edit the words on the site without rebuilding the whole thing.
In response, Claude provided thousands of words on competing products before settling on CloudCannon as the best choice. CloudCannon is a visual editor that sits on top of a GitHub repository. The founders would open the real page, click a sentence, and retype it. For two people, it would cost about $65 a month.
The catch was the wiring. Every heading and paragraph the founders might want to change needed a tag, and anything untagged stayed locked. An agent could tag the whole site in an afternoon, but every new section after that would still need someone to tag it before the founders could touch it.
I gave the plan some thought. It would work, but a CMS didn’t seem like what the founders actually needed, and it didn’t feel right. Then I had a bit of a eureka moment and replied with one sentence.
Research and recommend a single drop-in solution that lets two non-technical site owners edit the copy on this site themselves, without re-architecting the existing build. Scope is plain-string replacement only: the owners change the words on the page, nothing else.
The stack is known from the repo README. Confirm the facts the recommendation hinges on before committing to anything.
I’ll start by verifying the load-bearing facts in the repo before researching a recommendation.
Recommendation: CloudCannon, used purely as a git-backed visual editor on top of the existing repo
CloudCannon connects to a GitHub repo and gives editors a click-the-text-on-the-page Visual Editor. Every save is a git commit, so your existing GitHub to Cloudflare Pages pipeline stays exactly as it is.
Tag the editable strings. Each owner-editable element gets three attributes:
<h1 data-editable="source"
data-path="/index.html"
data-key="hero-heading">
Hardware that stays on your desk
</h1>
Repeat across every page. Tag tight leaf elements, not whole sections, so each region is one string.
Cost: about $45–55 a month per site, plus about $10 a month per additional editor seat.
what about giving them repo access, writing a really solid CLAUDE.md file and telling them to make edits with their claude?
Claude took the idea seriously. It agreed that typing “change the hero headline to X” into Claude Code in a browser was a marginally better interface than clicking a sentence and retyping it. It correctly pointed out that it needed no new services or setup.
Then it explained why it would still pick CloudCannon. CloudCannon’s tags make it impossible to edit anything outside them. A CLAUDE.md file is a page of instructions the agent reads before it starts work, and nothing stops the agent from ignoring it.
That mattered because those HTML files I alluded to before held more than marketing copy. They held the checkout code, including prices, deposit mechanics, shipping dates, and all manner of other strings that you wouldn’t want to change willy-nilly. If a co-founder asked for a friendlier FAQ answer and the agent “helpfully” tidied a price nearby, a customer could see one number and get charged another.
Claude had one more warning. If anything went sideways, I would become the support desk.
I already had tests that checked the prices on the pages against the checkout code, but they only ran when I remembered to run them on my laptop. So Claude suggested a pilot. GitHub would run those tests on every change, nothing could go live while a test was failing, and one co-founder would try five real edits before we paid for anything.
I told it to build the pilot, and twenty minutes later it was ready for review.
what about giving them repo access, writing a really solid CLAUDE.md file and telling them to make edits with their claude?
It’s more viable than it would have been two years ago, and it’s the cheapest option on the table.
What it gets right. Zero new services, zero wiring, zero monthly fee. The owners don’t even need to find the string. “Change the hero headline to X” is arguably a better interface than click-and-retype.
Unconstrained edit surface. CloudCannon’s tagged regions make it mechanically impossible to edit anything but the tagged text. CLAUDE.md is a strongly-worded suggestion.
An agent editing a 78 KB HTML file will occasionally reword an adjacent sentence, “helpfully” fix something nearby, or touch a guarded string despite instructions. With write access, the blast radius includes the Stripe checkout functions.
When it goes sideways, you’re the support desk. CloudCannon’s failure mode is “the save button didn’t work.” This approach’s failure mode is a confused owner, a half-merged PR, or a subtly reworded paragraph nobody notices for a week, and untangling it lands on you.
Bottom line: I’d still pick CloudCannon. But your idea costs nothing to pilot. Harden the repo first (branch protection, CI on pull requests, a scoped CLAUDE.md), give one owner access, and watch five real edits.
please do that
Done. The rules and the checks workflow are on a branch, and CI starts green.
The rules file and the tests backed each other up. CLAUDE.md kept the agent in its lane, changing only the words on the page and politely turning down requests to change prices or shipping terms.
And if the agent ever ignored those instructions and touched a protected number anyway, the tests would fail and GitHub wouldn’t let the change go live.
I never mentioned CloudCannon to the co-founders. I wrote them a one-page guide instead, and in it I gave the test check a friendlier name.
CLAUDE.md
- # Landing page
- Static marketing site with a Stripe checkout on Cloudflare Pages.
- Any merge to `main` goes straight to production.
- ## Copy edits
- 1. **Branch and PR, never `main`.**
- 2. **Text only.** Change words inside existing elements.
- Do not touch CSS, JavaScript, or the checkout.
- ## Checks
- CI runs `pnpm run lint` and `pnpm test` on every pull
- request. A failing check means the change touched a
- guarded string. Fix or revert; never work around it.
- ## Guarded strings: do not edit in a copy session
- If the owner asks to change one, explain that it is a
- developer task and stop. Do not attempt it.
- - **Prices**: $2,400 / $3,600 anywhere on the site
- - **Deposit**: $500
- - **Refund terms and the ship window**
owners-guide.md
- # Editing the Startup website
- You can change the words on the site yourselves, by
- describing the change to Claude in plain English.
- You never touch code.
- ## Making an edit
- 1. Start a session at **claude.ai/code** on `landing-page`.
- 2. Name the page and give the **exact wording** you want.
- 3. Claude opens a pull request. Open its link.
- 4. Wait for two green checkmarks:
- - **lint-and-test**: the safety robot approving your change
- - a **Preview URL** from Cloudflare Pages
- 5. Read your change on the preview. Never skip this.
- 6. Happy? Click **Merge pull request**.
- ## What needs Jason
- - Prices and the deposit
- - Refunds, and the shipping window
I shared it with the founders, along with a short note. Everything except the numbers was theirs to change.
Jason
merged this morning, it’s live
Early July
Co-founder
Hey dude, can we talk about site copy and how [we] might be able to edit it/
Jason
I’ll see what I can do and get back to you.
Jason
Yeah! Good timing actually, I just set this up. You and the CEO can both edit the site copy yourselves through Claude, in plain English. Claude makes the change on a draft copy of the site, you check a preview link, and one button puts it live.
Prices, the deposit and the shipping terms are tied to the checkout, so those still go through me. Everything else is all yours.
Co-founder
oh nice. trying it now
Four days after the pilot, the designer co-founder opened a session of their own. Their first request was to swap the two halves of a feature headline so the stronger half came first.
Claude made the change, left everything around it alone, and opened a pull request.
On the homepage, in feature tile 04, swap the two sentences in the headline so the second one comes first. Don’t change anything else.
Swapped them. Nothing else in the tile changed.
- <h3>Set it up in an afternoon. Keep it for years.</h3>+ <h3>Keep it for years. Set it up in an afternoon.</h3>
The checks run on the pull request. Open the Cloudflare preview link there to see it on the page before you merge.
The safety robot passed the change, the preview looked right, and the designer pressed the green button. Three more changes went live the same afternoon.
Over the next two months, the designer merged more than a dozen pull requests without once asking me for help. The five-edit pilot was over before we ever got around to discussing it.
At the end of September, the founders decided to stop selling online. The designer took the checkout and every price off the site in a single change. The numbers that were supposed to go through me left without me.
In October, the designer started writing rules too. The top of CLAUDE.md now told the agent who it was working with, and a few days later the word “radio” was banned from the site.
Update feature tiles copy #139
✓ All checks have passed
✓ lint-and-test Successful in 41s
✓ Cloudflare Pages Preview deployed
✓ This branch has no conflicts with the base branch
Merge pull requestMerging…
Merged Pull request successfully merged and closed
13 Closed author: co-founder
- Retire online checkout and public pricing#230 merged Sep 29
- Align footer tagline across all pages with the homepage#188 merged Sep 9
- Fix footer z-index to appear above main content#186 merged Sep 8
- Add Security section with data protection features#179 merged Aug 14
- Update copy: Startup OS and storage for the Pro model#164 merged Jul 31
- Add the Startup System section to the homepage#162 merged Jul 31
- Update Clustering section to mention Startup Link#146 merged Jul 15
- Ensure footer copy updates are deployed to production#145 merged Jul 15
- Consolidate reservation accordion sections into single panel#144 merged Jul 15
- Update footer messaging and copyright formatting#142 merged Jul 10
- Update FAQ link color to use brand variable#141 merged Jul 10
- Update FAQ content and messaging for security#140 merged Jul 10
- Update feature tiles copy#139 merged Jul 10
Retire online checkout and public pricing #230
site/index.njk
- <p class="model__price">$2,400</p>+ <p class="model__price">Pricing by quote</p>- <a class="button" href="/product/#order">Order</a>+ <a class="button" href="/contact/">Contact us</a>
test/no-public-pricing.test.mjs new file
+ test('no hardware price appears on any page', () => {+ for (const page of builtPages()) {+ assert.doesNotMatch(page.html, PRICE_PATTERN);
✓ All checks have passed
docs: add working rules to CLAUDE.md
CLAUDE.md
+ ## Who you’re working with++ The user is a cofounder and designer, not a developer,+ and is new to Claude Code. Explain everything in plain+ English, one step at a time, with no jargon. ⋯+ - Never use the word “radio” or “radios” anywhere on+ the site. People think of a car radio. Say “wireless”.
Around then, an essay on No One’s Happy about how AI may impact CMS architecture made the rounds. It argued that Git and automated checks already do most of what companies pay a CMS for, and it predicted that someone would eventually build a friendly “Content Client” so non-developers could use them. By then the designer had been using one for months. It was a chat box.
Claude had warned me that I would become the support desk. I never got a single support request. In October the founders and I parted ways. I guess my agent-based CMS worked too well. I’m just glad I didn’t have to add a single data-editable attribute to the code.
co-founder commented
Swaps the tile 04 headline so the stronger sentence comes first.