Skip to content

Boring CMS

A headless CMS that is one Node process and one SQLite file. AI agents can write to it.

Free, MIT licensed, no runtime dependencies. It runs this website, and now you can run it too.

Fast on the cheapest box you can rent

Measured on one pinned CPU core with a 768 MB Node heap, simulating a 5 to 10 USD VPS. A real shared core is slower, so read these as upper bounds.

Read one entry
0.23 ms
3,800 reads/s
Create one entry
0.66 ms
1,333 writes/s
Batch create
23k
entries per second
Peak memory
127 MB
zero errors in the run

Source: Boring CMS v0.21.0 benchmark suite, node 24.13, 1 vCPU, 2026-09-20. Full method in BENCHMARK.md.

What it looks like

All demo data, from a made-up Northwind Blog. Click a screenshot to enlarge it.

Boring CMS entries list for a Northwind Blog project, with published and draft posts and a field list underneathViewBoring CMS entry editor with a markdown body, publish controls, the live API response and a revision historyViewBoring CMS schema builder listing typed fields such as text, markdown, image, relation, date, boolean and counterViewBoring CMS API keys page with read and write scopes, an MCP toggle per key, REST and MCP addresses and rate limitsViewBoring CMS media library showing six uploaded images with file size and how many entries use each oneViewBoring CMS API explorer listing content, counters, schema, transfer and media endpoints generated from the OpenAPI specView
Boring CMS entries list for a Northwind Blog project, with published and draft posts and a field list underneath
Swipe to browse

Start it with one command

Then open localhost:3000/setup to create your admin.

$
npx boring-cms

What you get

  • One process, one SQLite file per project

    No database server, no queue, no build step. One deploy serves many projects, each with its own database, API keys, and content model. Back up by copying a file.

  • MCP server per project

    Claude, Cursor, and any MCP client can list, create, update, and publish entries with a scoped key. Every agent edit is a normal revision you can revert.

  • Content API that stays cheap

    REST with Bearer keys and ETag caching, so unchanged reads are a 304. Scheduled publishing, webhooks, and a per-project OpenAPI spec you can import into Postman.

  • Editing that respects your content

    Collections with custom fields, draft and publish, and field-level revisions with atomic revert. Text, markdown, number, boolean, date, json, image, relation, and counter fields.

  • Auth without a plugin

    Passkeys (WebAuthn), Google OAuth, and email plus password. Read and write scope API keys, per-key rate limits, and MCP access as a switch per key.

  • Your data is never trapped

    Full JSON and CSV export and import with a dry-run preview. Media on local disk or any S3 compatible store such as R2 or MinIO. MIT licensed.

Your agent can publish for you

Every project is an MCP server. The API keys page in the admin shows a ready-to-paste config like this one. Read keys can list and fetch entries. Write keys cover the full lifecycle: create, update, publish, unpublish, delete.

Every tool is also plain REST at POST /api/v1/<project>/call/<tool>, for scripts and CI that do not speak JSON-RPC.

mcp.jsonCopy
{
  "mcpServers": {
    "my-site": {
      "type": "http",
      "url": "https://cms.example.com/mcp/my-site",
      "headers": { "Authorization": "Bearer yn_..." }
    }
  }
}

We run our own site on it

The Tech Basket moved off WordPress to a static Astro site in September 2026. Every article, author, and category on this page's site lives in a Boring CMS project, and each build pulls it over the content API. Boring CMS exists because we needed it, not because a market report said so.

Running in one minute

  1. Start it. Data lives in ~/.boring-cms and a SECRET_KEY is generated for you.
  2. Create the admin. Finish the setup page, then add a project and your first collection.
  3. Read it. Create an API key and call /api/v1/<project>/<collection>, or hand the MCP config to your agent.

Questions

What is Boring CMS?
Boring CMS is an open source headless CMS that runs as a single Node process with SQLite. You define collections and fields, edit content in an admin UI, and read it over a REST API or an MCP server. It has zero runtime dependencies.
Is Boring CMS free?
Yes. It is MIT licensed and free to self-host. Install it from npm with npx boring-cms, or clone the GitHub repository.
What do I need to run it?
A recent Node.js version. It uses the built-in node:sqlite module, so there is no database to install. A small VPS with 1 GB of RAM is enough. Behind a reverse proxy, set TRUST_PROXY=1.
How do AI agents use it?
Each project exposes an MCP endpoint at /mcp/. Create an API key, paste the ready-made config into your MCP client, and the agent can read or write entries within the key scope. Writes are normal revisions, so you can revert any of them.
Who uses it?
The Tech Basket runs this website on it. The articles you read here are served from a Boring CMS project through its content API.

Try it, then tell us what breaks

Issues and stars on GitHub help other people find it.