Set up
Runs on your computer. Pick your agent and operating system.
Before you start
- Node.js 20 or newer
{
"mcpServers": {
"maritonx-easy-cms": {
"command": "npx",
"args": [
"-y",
"@easy-cms/plugin-mcp"
]
}
}
}same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12
Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs
README
synced Oct 14, 2026Easy CMS
The embedded, code-first headless CMS for Nuxt and Next.js.
A headless CMS that lives inside your Nuxt or Next.js app: the content model is TypeScript in your repository, the admin and APIs come with it, and there is no extra server to run.
Website · Documentation · เอกสารภาษาไทย · Getting started · Examples · Sponsor
Why Easy CMS
- Runs inside your app. A Nuxt module or Next.js route handlers add the admin at
/adminand the API at/api/cms. One deployment, one database (yours, with prefixed tables). - Code-first and typed. Collections, fields and access rules are TypeScript. The Local API infers document types from the config, so queries are typed without a build step.
- Any frontend, too. Using Vite, React, Vue, a mobile app or a static site? Run the same CMS as a standalone server and use its REST API.
- An admin editors like, in English and Thai: drafts, version history, live preview, scheduled publishing, blocks, translations, a media library and a light and dark theme.
- Secure by default: self-reviewed against OWASP ASVS level 1.
Common passwords are refused, cookies are
__Host-and HSTS is on in production, unreadable documents answer 404, and the audit log is signed against tampering. - Official plugins for SEO, forms, redirects, nested pages, a shop, GraphQL, several sites in one CMS (multi-tenant) and AI assistants (MCP).
[!NOTE] Easy CMS 1.0 is out (2026-10-17), the first version meant for production use. From 1.0, breaking changes come only in a major release, with an upgrade guide; renamed APIs keep working until the next major, with a warning. Versions and deprecations says what is covered (the shop, GraphQL and MCP plugins are still experimental). Upgrading from 0.x: From 0.x to 1.0.
Quick start
To try it without installing anything, use the Deploy buttons above: a blog with its admin on Vercel or Netlify, with a database and file storage made for you (one-click deploy).
In a Nuxt 4 or Next.js 15+ project:
npm create easy-cms@latest # or: pnpm create easy-cms · yarn create easy-cms · bun create easy-cms
npm run dev # then open http://localhost:3000/admin
create-easy-cms installs the packages with your package manager, writes easy-cms.config.ts
with a sample collection and a secret in .env, and wires up the framework. Describe your
content in the config:
// easy-cms.config.ts
import { defineConfig } from '@easy-cms/core'
import { sqlite } from '@easy-cms/db-sqlite'
export default defineConfig({
secret: process.env.EASY_CMS_SECRET!,
db: sqlite({ url: 'file:./cms.db' }),
collections: [
{
slug: 'posts',
drafts: true,
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'slug', type: 'slug', from: 'title' },
{ name: 'body', type: 'richText' },
],
},
],
})
Then read it in your pages, fully typed:
// Nuxt: server/api/posts.get.ts
export default defineEventHandler(async () => {
const cms = await useEasyCMS()
return cms.find('posts', { sort: '-createdAt', limit: 10 })
})
Next.js uses getEasyCMS(config) in Server Components; any other client uses REST at
/api/cms/posts.
No Nuxt or Next.js? Run the same command in an empty directory to get a standalone server:
npm create easy-cms@latest my-cms
cd my-cms && npm run dev # http://localhost:4000/admin
Features
Content modeling
- 15 field types: text, rich text (Tiptap), number, date, select, relationship, upload, array, group, blocks, JSON and more, with validation and per-field access
- Uploads with several files and drag-to-order (galleries), limited to the file types you allow: images, PDF, Word, Excel, PowerPoint, OpenDocument, CSV, audio, video and zip, detected from their contents
- Collections and globals, drafts and publishing, hooks
- Localization: one value per language, translation status in the lists
- Version history with restore, and drafts kept apart from the published version
Admin
- A menu with groups that fold, badges for what needs attention, and a command palette (⌘K) that finds documents and runs actions
- Lists with search, filters, columns, bulk actions and tree views; edit forms with tabs, sections, rows, fields shown on conditions, and a side panel
- Live preview of unsaved changes on your real pages
- Scheduled publish and unpublish
- A media library with folders (and who may use each), many files uploaded at once with their progress, icons by file type, a grid view, and previews: images, audio and video players, PDFs, text and CSV
- A dashboard that tells admins what needs attention: failed webhooks, stuck emails, late scheduled publishing
- Roles from the admin: tick what each role may do per collection, page and field, or on its own documents only, no code
- An audit log of who changed which fields, sign-ins and admin actions, signed against tampering
- English and Thai interface, light and dark themes, works on phones
APIs
- Typed Local API (fields that plugins add included), REST API with
wherequeries, a GraphQL API (plugin), and generated types for frontends in other repositories - Users and roles, function-based access rules per collection, document and field; forgotten passwords and invitations by email; single sign-on with Google, Microsoft, GitHub or any OpenID Connect provider
- Site members (customers, subscribers) who sign up on your site, kept out of the admin
- API keys with per-collection permissions, signed webhooks with retries, email with retries
Data and operations
- SQLite (libSQL) or Postgres (postgres.js or PGlite) through Drizzle
- Schema push in development, reviewed migration files in production
- Uploads on disk, S3, Cloudflare R2, MinIO, Vercel Blob or Netlify Blobs, also from links (the server downloads them)
- One-click deploy to Vercel or Netlify, with a database and file storage
- Database backups on a schedule or by hand from the admin, downloadable, optionally encrypted (AES-256-GCM)
easy-cmsCLI: migrations, backups, copying between databases, scheduled jobs- Upgrades tested in CI: databases made by older releases migrate to the current one
SEO and AI
- Meta fields with a search preview, sitemaps, robots.txt, hreflang and JSON-LD
llms.txt, Markdown versions of pages and AI crawler rules- An MCP server so AI assistants can read and draft content with a limited API key
Official plugins
| Plugin | What it adds | Guide |
|---|---|---|
@easy-cms/plugin-seo | Meta fields, search preview, sitemap, robots.txt, structured data, llms.txt | SEO |
@easy-cms/plugin-form-builder | Forms built in the admin, submissions with an overview and a dashboard panel, email notifications, spam protection, <easy-form> | Forms |
@easy-cms/plugin-redirects | Redirects managed in the admin, automatic redirects when a page moves | Redirects |
@easy-cms/plugin-nested-docs | Pages inside pages: parents, full paths, breadcrumbs, a tree in the admin | Nested pages |
@easy-cms/plugin-graphql (experimental) | GraphQL API: queries and mutations for every collection and global, with your access rules | GraphQL |
@easy-cms/plugin-mcp (experimental) | Model Context Protocol server for AI assistants | MCP |
@easy-cms/plugin-multi-tenant | Several sites or clients in one CMS: content, members, roles and settings per tenant, a tenant switcher | Multi-tenant |
@easy-cms/plugin-ecommerce (experimental) | A shop: products and variants, prices in several currencies, carts, checkout with Stripe or bank transfer (unpaid orders expire and return their stock), orders, stock, customer accounts, React and Vue hooks | Shop |
Experimental plugins share the version number but may still change in a minor release, even after 1.0, until they are declared stable.
Plugins are functions over your config: write your own with fields, endpoints, admin components,
admin pages, dashboard panels and CLI commands. See
Plugins. Packages can also add field types, such as color from @easy-cms/fields: see
Custom field types.
Packages
| Package | |
|---|---|
@easy-cms/core | Config, Local API, REST handler, auth, access control, hooks, localization, versions, webhooks |
@easy-cms/nuxt | Nuxt 4 module: REST API, admin, typed useEasyCMS() |
@easy-cms/next | Next.js adapter: route handlers, typed getEasyCMS() |
easy-cms | CLI: migrations, types, users, backups, standalone serve |
create-easy-cms | Adds Easy CMS to a project, or creates a standalone server |
@easy-cms/db-sqlite | SQLite / libSQL database adapter |
@easy-cms/db-postgres | Postgres adapter (postgres.js or PGlite) |
@easy-cms/storage-s3 | Uploads on S3, Cloudflare R2 or MinIO |
@easy-cms/storage-vercel-blob | Uploads on Vercel Blob |
@easy-cms/storage-netlify-blobs | Uploads on Netlify Blobs |
@easy-cms/email-smtp | Email over SMTP |
@easy-cms/auth-oauth | Single sign-on: Google, Microsoft, GitHub, OpenID Connect |
@easy-cms/richtext | Rich text to safe HTML or Markdown |
@easy-cms/fields | More field types: color, with a picker and swatches |
@easy-cms/admin | The admin UI (installed by the adapters) |
@easy-cms/drizzle | Shared database layer (installed by the database adapters) |
Examples
| Example | |
|---|---|
examples/nuxt-blog | Nuxt 4 blog on SQLite, with every official plugin |
examples/next-blog | Next.js 16 blog on Postgres (PGlite locally) |
examples/standalone | Standalone server with a plain HTML frontend on another origin |
examples/shop | Next.js 16 shop: products, cart, checkout (bank transfer, or Stripe), customer accounts |
examples/multi-tenant | Two brands in one CMS, each with its own content, media and members |
Requirements
- Node.js 22.12 or later (22.19 or later with Nuxt)
- Nuxt 4, Next.js 15 or later (App Router), or no framework (standalone)
- SQLite or Postgres
- npm, pnpm, Yarn (node-modules) or Bun to install
Contributing
Issues and pull requests are welcome. CONTRIBUTING.md explains how to build, test and propose changes; docs/DESIGN.md and the architecture decisions explain why things are the way they are.
Please report security issues privately, as described in SECURITY.md.
Sponsors
Easy CMS is built in spare time. If it saves you or your team time, consider sponsoring its development: sponsorship pays for the work toward 1.0, docs (in English and Thai) and faster fixes. Sponsors at $5 a month or more are listed here, and company sponsors also get their logo on the website.
Founding sponsors
The first 10 sponsors, at any tier, are listed here permanently, even if they stop sponsoring later. Spots left: 10 of 10.