Jason Spidle

Principal product designer

What if the CMS was an agent?

They wanted a CMS for the landing page I built for their startup. I gave them repo access and a few Markdown files instead.

Post

Co-founder

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 one of them wanted to have to bug me every time they wanted to change one word in a headline or add a new FAQ question.

The landing page I had built was bare-bones. Just vanilla HTML, CSS, and JavaScript with a Stripe checkout flow. So every bit of text was hard-coded directly into those vanilla HTML files.

Given the ask, my first instinct was to research CMS options. I hadn’t built with a CMS in a while, so I had Claude Code search far and wide for something low-maintenance that would do the bare minimum of what they required.

I was starting to settle on CloudCannon as the best choice. It had a nice visual editor approach that connected easily to the site via GitHub. The page itself was the interface. So they’d just click on the text and be able to edit it in place. For the two of them, it would cost about $65 a month.

But it wasn’t foolproof, and it would require wiring up every heading, every paragraph, every asset that the founders might want to edit so that CloudCannon could hook into it. So any new pages would need the same routine and any section we missed would simply be locked.

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 encapsulated in this one-sentence message I sent to Claude Code.

Copy editing for site owners landing-page

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’s response was measured but skeptical. There certainly was value in being able to just type into a text field “change the hero headline to X.” And this approach would require little new infrastructure on the page itself.

Then it made the case for CloudCannon. It saw too many risks with the LLM-as-CMS approach. There’s nothing to stop an agent from outright ignoring a CLAUDE.md file. CloudCannon, on the other hand, could lock the fields that we wouldn’t want to edit.

That mattered because those HTML files I alluded to before held more than marketing copy. They contained the checkout code, including prices, deposit mechanics, shipping dates, and all manner of other strings that you wouldn’t want to change willy-nilly. The risk was that if one of the founders asked for something like a new FAQ question and the agent decided to tidy some surrounding content along the way, you could easily end up with prices changing or product claims contradicting each other.

Beyond the risks for the site, Claude also raised the personal risk to me. If anything went sideways, I would become the support desk.

I was undeterred. So Claude reluctantly suggested that I at least do a small pilot first. In implementing the pilot, Claude suggested that we leverage the tests that already existed to give the rules file some backbone. So on every PR, GitHub would now run those tests automatically and block any merge that had a failing test.

It took all of twenty minutes to build the pilot. It was ready for our first test.

Copy editing for site owners landing-page

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.

Add project documentation and CI workflow #132

The rules file was written so as to agree with the automated tests that would fire on opening a PR. CLAUDE.md kept the agent in its lane, changing only the words on the page and politely rejecting any requests to change prices or shipping terms.

On the off chance that the agent ignored those instructions and edited a protected string anyway, the tests would fail and GitHub wouldn’t let the change go live.

Then I wrote the founders a one-page guide for editing the site via Claude Code.

CLAUDE.md

  1. # Landing page
  2. Static marketing site with a Stripe checkout on Cloudflare Pages.
  3. Any merge to `main` goes straight to production.
  4. ## Copy edits
  5. 1. **Branch and PR, never `main`.**
  6. 2. **Text only.** Change words inside existing elements.
  7. Do not touch CSS, JavaScript, or the checkout.
  8. ## Checks
  9. CI runs `pnpm run lint` and `pnpm test` on every pull
  10. request. A failing check means the change touched a
  11. guarded string. Fix or revert; never work around it.
  12. ## Guarded strings: do not edit in a copy session
  13. If the owner asks to change one, explain that it is a
  14. developer task and stop. Do not attempt it.
  15. - **Prices**: $2,400 / $3,600 anywhere on the site
  16. - **Deposit**: $500
  17. - **Refund terms and the ship window**

owners-guide.md

  1. # Editing the Startup website
  2. You can change the words on the site yourselves, by
  3. describing the change to Claude in plain English.
  4. You never touch code.
  5. ## Making an edit
  6. 1. Start a session at **claude.ai/code** on `landing-page`.
  7. 2. Name the page and give the **exact wording** you want.
  8. 3. Claude opens a pull request. Open its link.
  9. 4. Wait for two green checkmarks:
  10. - **lint-and-test**: the safety robot approving your change
  11. - a **Preview URL** from Cloudflare Pages
  12. 5. Read your change on the preview. Never skip this.
  13. 6. Happy? Click **Merge pull request**.
  14. ## What needs Jason
  15. - Prices and the deposit
  16. - Refunds, and the shipping window

When I got back to the founders, I didn’t even mention CloudCannon as an option. I sent them the guide, explained the concept, and told them they could edit everything except those protected strings.

Co-founder

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.

owners-guide.mdMarkdown

Co-founder

oh nice. trying it now

Within a week, the designer made their first change. It was a simple update to the wording of a single headline.

Claude made the change, left everything around it alone, and opened a pull request.

Homepage headline copy landing-page

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.

Update feature tiles copy #139

GitHub ran the tests and they passed. The designer reviewed the preview link and visually confirmed it looked right. And then they clicked the merge 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 pilot became a fixture even before I got around to discussing it with them or reviewing the results with Claude.

At the end of September, the founders decided to make some substantial changes to the landing page. In one fell swoop, they removed the Stripe checkout flow and pricing information from every page on the site. Those numbers that I had worked so hard to protect were gone just like that.

Then, the designer started to change the rules themself. The CLAUDE.md file now announced who it was that the agent was working with. A few days later the word “radio” was banned from the site.

Update feature tiles copy #139

OpenMerged co-founder wants to mergemerged 1 commit into main from claude/homepage-headline-copy

co-founder commented

Swaps the tile 04 headline so the stronger sentence comes first.

✓ 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

Merged co-founder merged 1 commit into main · 20 files changed

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

co-founder committed on Oct 1 · Co-authored by Claude

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”.

It was around this time that I read a piece on No One’s Happy that was making the rounds. In it, the author discussed the myriad ways that AI could change the fundamentals of CMS architecture. Specifically, they pointed out that Git and CI workflows already do most of what companies pay a CMS for. It wouldn’t be long until someone built a “Content Client” that non-developers could use to manipulate their websites more easily. And what do you know, my clients had been using one such content client for months already.

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.