Programmable MySQL CMS with native RBAC, Studio, AI/MCP and trusted extensions.
4.3K
A programmable MySQL CMS/backend with a focused React Studio, strong role-based access control, Files, extensions, AI/MCP integrations and a documented REST API.
Developed and maintained by Yunsoft Software.
Website: https://yunsoft.com
Building with YunCMS? Yunsoft can help with your project, integration or migration. If YunCMS helps you, give the repository a star or sponsor YunCMS.
YunCMS is currently in the
0.1.xpre-stable line. Use the managed backup/update flow and verify your own database, storage, proxy and authentication configuration before exposing a production installation.
Join the Yunsoft Community on Telegram → t.me/yunsoftofficial
Ask questions, discuss releases and share what you build with YunCMS. English and Türkçe are welcome. For reproducible bugs and feature requests, use GitHub Issues so reports stay searchable and actionable.
Model and organize content Create MySQL-backed collections, group the Content menu, drag to reorder and hide internal collections without changing their permissions. |
Manage files visually Upload, preview, search and manage local or S3-compatible assets through the same role-aware Studio. |
These screenshots illustrate the documented Studio workflows. Original capture and validation dates are recorded in the screenshot manifest. New users should follow the 15-minute Getting Started guide; administrators can jump directly to Using Studio.
| I want to… | Start here |
|---|---|
| Compare every installation method | Installation Options |
| Install YunCMS with Docker | Docker |
| Install YunCMS with npm and create my first collection | Getting Started |
| Understand Content, Files, Data Model and users | Using YunCMS Studio |
| Choose the Studio and AI language | Localization |
| Design fields and relations | Data Model Guide |
| Build a React support desk with roles, relations and AI | React Support Desk example |
| Configure roles and safe public access | Roles and Permissions |
| Connect a frontend or integration | REST API and Items Query Language |
| Automate summaries, classification or translation with AI | AI Automations |
| Connect events, webhooks and scheduled work visually | Flows |
| Deploy, back up and update a server | Deployment, Production Readiness and Upgrades |
*, relation.* and *.*;_and / _or;search, multi-field sort, limit, offset;aggregate and groupBy;YunCMS is available as the yunsoftofficial/yuncms Docker image and as the @yunsoft/yuncms npm package. Both distribution paths run the same CLI, API and Studio.
| Option | Best for | Requirements | Start here |
|---|---|---|---|
| Docker Compose | Fastest complete self-hosted stack | Docker with Compose | Docker guide |
npx | Evaluation without a persistent package install | Node.js 24, npm 11+, MySQL | Commands below |
| Persistent npm install | Long-lived Node deployments with managed updates | Node.js 24, npm 11+, MySQL | Setup and CLI |
| Source checkout | Contributors and local core development | Git, Node.js 24, npm 11+, MySQL | Installation Options |
Docker users only need Docker Engine with the Compose plugin (or Docker Desktop); the maintained stack includes MySQL 8.4 and the required Node.js runtime.
mkdir my-yuncms
cd my-yuncms
curl -fsSLO https://raw.githubusercontent.com/Yunsoft-Software/yuncms/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/Yunsoft-Software/yuncms/main/docker.env.example -o .env
Replace both example passwords in .env, then initialize and start the stack:
docker compose up -d mysql
docker compose run --rm yuncms init
docker compose up -d yuncms
During init, use mysql as the database host, yuncms as the database and user, and the password from .env; then create the first Administrator. Open http://localhost:3008 after docker compose ps reports YunCMS healthy.
The complete volume, configuration, backup and image-update workflow is in Docker.
Node.js 24 LTS
npm 11+
MySQL 8-compatible server
npxCreate an empty directory and run the published npm package directly with npx:
mkdir my-yuncms
cd my-yuncms
npx --yes @yunsoft/yuncms init
npx --yes @yunsoft/yuncms start
init interactively asks for the MySQL connection and first Administrator account, creates the project .env, verifies the database and applies the required migrations. The current directory becomes the YunCMS project directory, so .env, local Files and local extensions live there rather than inside the npm cache.
Default local URL:
http://localhost:3008
The same listener serves Studio and the API.
The direct npx flow above is enough to initialize and run YunCMS without cloning this repository. For a long-lived installation that should record YunCMS in its own package.json and use the managed yuncms update flow, install the package once in that project directory:
npm init -y
npm install --save-exact @yunsoft/yuncms
npx yuncms init
npx yuncms start
After a local install, npx yuncms ... uses the project dependency instead of downloading a temporary copy.
Contributors can run the workspace directly:
git clone https://github.com/Yunsoft-Software/yuncms.git
cd yuncms
npm ci
npm run init
npm start
Source installs are intended for development. Production operators should prefer a pinned Docker image or a versioned npm dependency. See Installation Options for the comparison, state layout and update path for each method.
For a consuming project that needs an unreleased fixed commit, see development package candidates.
Useful commands:
npx yuncms init
npx yuncms bootstrap
npx yuncms start
npx yuncms backup
npx yuncms restore /path/to/backup --yes
npx yuncms update --dry-run
npx yuncms update --to <version>
npx yuncms help
If the package is not installed locally, use the full remote form instead, for example:
npx --yes @yunsoft/yuncms init
npx --yes @yunsoft/yuncms start
For initialization, backup/restore and updates, read Setup and CLI.
For a complete first project—from installation through a collection, restricted role and API request—use Getting Started.
After starting YunCMS, open http://localhost:3008 and sign in with the Administrator created during initialization.
A normal first setup is:
The detailed interface walkthrough is in Using YunCMS Studio.
You can use Studio or the Schema REST API.
Create a collection:
curl 'http://localhost:3008/schema/collections' \
-X POST \
-H 'Authorization: Bearer ADMIN_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name":"Customer Requests",
"collection":"customer_requests",
"systemFields":[
"created_at",
"updated_at",
"created_by",
"updated_by"
]
}'
Add a field:
curl 'http://localhost:3008/schema/collections/customer_requests/fields' \
-X POST \
-H 'Authorization: Bearer ADMIN_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name":"Title",
"field":"title",
"type":"string",
"length":255,
"required":true
}'
Create data:
curl 'http://localhost:3008/items/customer_requests' \
-X POST \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"title":"New quote request"}'
Human-readable labels and stable API/database keys are separate. Changing the label later does not silently rename the REST collection/field key.
Read Data Model Guide for field types, defaults, system fields, singletons and all relation types.
Every project collection has the normal CRUD surface:
GET /items/:collection
GET /items/:collection/:id
POST /items/:collection
PATCH /items/:collection/:id
DELETE /items/:collection/:id
Specific fields:
GET /items/articles?fields=id,title,status
All readable scalar fields:
GET /items/articles?fields=*
A relation field:
GET /items/articles?fields=id,title,author_id.name
All readable fields inside a relation:
GET /items/articles?fields=id,title,author_id.*
All readable root fields and readable first-level relations:
GET /items/articles?fields=*.*
Nested relation paths are supported within documented depth/cost limits:
GET /items/articles?fields=id,author_id.company_id.country_id.name
curl --get 'http://localhost:3008/items/orders' \
-H 'Authorization: Bearer YOUR_TOKEN' \
--data-urlencode 'filter={"status":{"_in":["paid","processing"]},"total":{"_gte":1000}}'
Supported comparison/text/null operators include:
_eq _neq _lt _lte _gt _gte
_in _nin _null _nnull
_contains _starts_with _ends_with
Nested boolean logic uses _and and _or.
curl --get 'http://localhost:3008/items/customers' \
-H 'Authorization: Bearer YOUR_TOKEN' \
--data-urlencode 'search=acme' \
--data-urlencode 'sort=-created_at,name' \
--data-urlencode 'limit=25' \
--data-urlencode 'offset=0'
curl --get 'http://localhost:3008/items/orders' \
-H 'Authorization: Bearer YOUR_TOKEN' \
--data-urlencode 'aggregate={"count":"*","sum":"total","avg":"total"}' \
--data-urlencode 'groupBy=status'
Supported aggregate functions are count, countDistinct, sum, avg, min and max.
The complete grammar, exact limits, relation behavior and error cases are documented in Items API Query Language.
Access is deny-by-default. Project collection permissions can control:
read, create, update, delete;A caller's filter is combined with the permission row filter using AND; query parameters do not replace RBAC.
The Public role follows the same explicit grant model. You can intentionally expose a collection or a filtered subset of Files without making unrelated resources public.
Read Roles and Permissions.
YunCMS Files supports:
Example upload:
curl 'http://localhost:3008/files?storage=local' \
-X POST \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/octet-stream' \
-H 'X-Filename: product-photo.png' \
-H 'X-Mimetype: image/png' \
--data-binary '@./product-photo.png'
Read Files and Storage.
YunCMS supports:
Read Authentication, Public Registration and Configuration.
Trusted JavaScript extensions can add:
/extensions/:id HTTP endpoints;Scheduled jobs can run per process or in singleton mode using a MySQL advisory lock so only one replica performs the job.
Read Extensions.
The optional Studio AI assistant operates through the current user's normal YunCMS accountability. Data-changing tools require both Administrator-level feature enablement and the user's selected access mode; neither grants permissions the role does not already have.
Read AI Assistant.
For repeated tasks, define AI Automations once in Studio or through MCP. New records and selected input-field changes can produce summaries, classifications or translations in designated output fields, with normal user permissions and visible run history.

The optional MCP endpoint exposes bounded schema/data tools through the same service/RBAC layer. It is disabled and read-only by default; Administrators configure it under Settings → MCP Connection without editing .env or restarting YunCMS.
Read MCP.
Single-process installations can keep permission-cache and rate-limit state in memory. Multi-replica installations can select Redis independently for:
Example:
CACHE_STORE=redis
API_RATE_LIMIT_STORE=redis
AUTH_RATE_LIMIT_STORE=redis
REDIS_URL=redis://redis.internal:6379
REDIS_PREFIX=yuncms:production:
REDIS_REQUIRED=true
The full environment-variable reference is Configuration.
The complete user/operator/integrator index is docs/README.md.
For a production installation:
TRUST_PROXY_HOPS to the exact trusted proxy depth;.yuncms/ai-settings.key when AI provider credentials are configured;See Deployment and Production Readiness.
MIT.
YunCMS 0.1.46 — use yunsoftofficial/yuncms:0.1.46 for a pinned installation. Release notes.
Content type
Image
Digest
sha256:9fc3b028d…
Size
73.9 MB
Last updated
6 days ago
docker pull yunsoftofficial/yuncms