Pluma

Headless CMS for agencies and engineers

Build it once.
Your clients change it by asking.

A headless CMS on a plain JSON API, for any language or framework. Your clients edit the content from ChatGPT, Claude or Cursor, inside the roles and permissions you set.

Invite-only while we're early.

ChatGPT Pluma connected
Add our June workshop to Events, with this photo.workshop.jpg

Used Pluma · read the content model · create_entry · upload_asset

Done. “June workshop”, June 12 at 10:00, with your photo, is saved as a draft. Nothing else was touched. Preview: staging.example.com/events/june-workshop. Publish it?

Yes, publish it.

✓ Published. Your host got the deploy hook and is rebuilding the site.

Works with

  • ChatGPT
  • Claude
  • Cursor
  • Netlify
  • Vercel
  • Cloudflare
  • Astro
  • Next.js
  • Nuxt
  • Svelte
  • Rails

Stop being the bottleneck for “can you change this word?”

After launch, every small change comes back to you as a ticket. With Pluma the person who knows the answer makes the change, and you still decide what they can touch.

You build it

Any language, any framework, on a plain JSON API. Your own agent migrates the current site from a single invite link.

Your client asks

They connect ChatGPT, Claude or Cursor once and ask for changes in plain words. No CMS to learn.

You stay in control

Users, roles and permissions per content type or page. Drafts, staging and full history for every change.

How it works

Five steps per client, once. After that, your client just asks.

  1. 01 Create a site per client One Pluma site for each website you run.
  2. 02 Let your agent migrate it One invite link. Your agent reads the docs and the current site, proposes the model and imports everything as drafts.
  3. 03 Point the site at Pluma Read content by API in your framework. A deploy hook rebuilds on publish; a staging hook shows drafts. NetlifyVercelCloudflare
  4. 04 Invite your client Give them the content; keep the model, keys and deploys for your team.
  5. 05 Connect the assistant One click from ChatGPT, Claude, Cursor or anything that speaks MCP. ChatGPTClaudeCursor

For content editors

They ask the way they'd ask you, without the ticket. Or they open a dashboard made for exactly their content.

  • “Add a Pricing page with our three plans.” A new page from sections the site already knows how to draw.

  • “Mark these five items as sold out.” All five change in one step, or none do.

  • “Swap the photo on the workshop event.” Every page that uses it updates.

  • “Undo the last change to the pricing page.” Every save is a version; go back to any of them.

ChatGPTPluma connected
Our Contact page should say we close at 6 on Fridays now.

Used Pluma · update_entry

Updated the opening hours on the Contact page: Friday 9:00 to 18:00. It's a draft; nothing else changed. Preview: staging.example.com/contact. Publish it?

Message ChatGPT↑
✳ ClaudePluma · connected
Our Contact page should say we close at 6 on Fridays now.
▸ pluma · update_entry

Updated the opening hours on the Contact page: Friday 9:00 to 18:00. It's a draft; nothing else changed. You can check it at staging.example.com/contact. Should I publish it?

Reply to Claude… ↑
Cursor · AgentMCP: pluma
Our Contact page should say we close at 6 on Fridays now.
✓ Called MCP tool update_entry · pluma

Updated the opening hours on the Contact page: Friday 9:00 to 18:00. It's a draft; nothing else changed. Preview: staging.example.com/contact. Want me to publish it?

Plan, search, build anything…

Illustration, not a live chat. Works with any assistant that speaks MCP.

Safe by design

Your client's assistant can move fast because Pluma won't let it move too far. You decide how far.

Users and permissions

Unlimited users and five roles. Limit anyone to certain content types or single pages: marketing edits the blog, a store manager edits their own location page. Their assistant gets the same limits.

Everything starts as a draft

Your site only shows what's published.

Seen before it's live

Staging shows drafts on the real site, on any host.

Every change is kept

Full version history, with who and when. Restore any version in one step.

Asked, not assumed

Pluma tells assistants to ask before touching anything the client didn't mention, and before publishing.

For engineers

Any framework. Content by API. Nothing to install on your site.

An MCP tool for every API route

Whatever you can do over the API, an assistant can do over MCP.

Staging on any host

Preview hooks rebuild the staging site as drafts are saved, batched every 30 s. Entries come with live and staging URLs.

Batch operations

Up to 100 changes in one call, all or nothing, with dry runs.

Composable pages

Define the sections your site can draw once; new pages are then assembled by chat.

Errors that say how to fix them

Every error has a fix and a doc link.

Your content is yours

Full JSON export, any time, and an OpenAPI 3.1 contract.

For agents

If you're an AI agent reading this: Pluma was built for you. Everything a person can do, you can do, and every answer tells you what to do next.

  • Start from one link. An invite link answers in markdown with the exact steps. Then read /llms.txt and your site's own llms.txt.

  • MCP or REST. 35 MCP tools with OAuth, or the same JSON API with an OpenAPI 3.1 contract.

  • Errors you can act on. Every error has a fix and a doc_url, and names the field, and in a batch, the operation.

  • Clear limits. You can do what your person's role allows. Drafts first; ask before publishing what the owner didn't mention.

Where an agent starts
$ curl https://pluma.so/join/<invite>
# You're invited to connect "Acme" to Pluma
## What you'll be able to do · 1. Redeem the link …
422 · an error that says how to fix it
{ "error": {
  "code": "validation_failed",
  "fix": "details.fields says which field and why. Fix it and try again; with dry_run=true you can test without saving.",
  "details": { "fields": { "slug": ["is required to publish"] } }
} }

What an agent did with one link

In our tests, on real sites, with nothing but the invite link.

A 97-page website

It read the site, proposed 5 content types, and imported 73 entries and 66 images. The site built from Pluma was byte-identical to the original on all 97 pages. Later, from a one-line request, another agent added a whole new page in a single batch.

A small business site

It moved the products, news, pages and business details into Pluma in 34 API calls with zero errors, set up staging, and left a new product as a draft with its staging link.

Questions

Can my client break the site?

Their assistant can only do what their role allows. Make them an editor and they change content; the model, keys and deploys stay with your team. Everything starts as a draft, with full history.

Does the AI write the content?

No. It does what it's asked: adds, edits, moves, imports. If they ask it to draft text, it's still a draft until someone publishes.

Can it publish without approval?

Everything starts as a draft, and assistants are told to publish only after a person has reviewed. Roles decide who can publish at all.

Which assistants work?

ChatGPT, Claude, Cursor, Claude Code, or anything that speaks MCP. Each person connects once, with one click.

Which languages and frameworks?

Any. It's a JSON API over HTTPS: JavaScript, Python, Ruby, PHP or Go, with Astro, Next, Rails, plain HTML or a mobile app.

What does “headless” mean?

Pluma stores and serves the content; your site draws it. Your design stays exactly as it is.

The site already exists. Do we start over?

No. Give your agent the invite link and it imports what's there, as drafts for you to review.

Can we leave?

Yes. Export everything as JSON, any time.

Do clients need to learn a CMS?

No. They ask their assistant. If they prefer clicking, the dashboard shows only their content, with forms that match it.

How much does it cost?

Pricing isn't public yet. We plan a 14-day free trial when signup opens.

Build it once. Stop taking the tickets.

Invite-only while we're early. Tell us about your agency and the sites you run.