KeystoneJS

cmsdeveloper tools

TypeScript-first Node.js CMS and application framework with a code-defined schema, auto-generated GraphQL API, and a polished admin UI. Built for developers who want a programmable content backend without writing CRUD from scratch

#cms#nodejs#typescript#graphql#headless#self-hosted

Quick Start

npm create keystone-app@latest my-project && cd my-project && npm run dev

Overview

KeystoneJS is a TypeScript-first CMS framework for Node.js. You define your content schema in code — TypeScript files that describe your data types, their fields, their relationships, and their access control rules. Keystone takes that schema and generates a GraphQL API and a working admin UI. The result is a content backend where the data model is a first-class part of your codebase rather than a configuration file in a database.

The schema-in-code approach is the defining characteristic. Adding a new content type means writing a TypeScript list definition, committing it, and restarting the server. The API updates automatically. Every schema change is tracked in git, can be reviewed in a pull request, and benefits from TypeScript’s type checking. For development teams who treat infrastructure as code, this is a natural fit.

The document field is worth calling out specifically. Rather than storing rich text as raw HTML, Keystone’s document field uses a structured format based on Slate.js. The editor is block-based and extensible — you define which block types are available, what inline elements are permitted, and how relationships to other content types are embedded. The output is portable JSON that any frontend can render.

The GraphQL API includes filtering, sorting, and pagination on every list, and nested queries traverse relationships across content types in a single request. For frontends built on Next.js, Remix, or any React-based framework, this gives a typed data layer that integrates naturally with modern data-fetching patterns.

KeystoneJS suits teams who want a programmable content backend without building one from scratch. It is not the right choice for non-technical content managers who need to modify the schema, or for teams that need a REST API without additional work.

KeystoneJS: Pros & Cons

Pros (The Wins)Cons (The Friction)
Schema in TypeScript:
Version-controlled, type-safe,
refactorable with IDE.
Developer only:
Schema changes require
code edits and restarts.
Auto GraphQL API:
Filtering, sorting, pagination
generated from schema.
GraphQL first:
REST support requires
custom work.
Rich document field:
Structured JSON storage;
extensible block editor.
PostgreSQL required:
SQLite dev only; no
MySQL support.
9.9k stars:
Actively maintained by
Thinkmill; regular releases.
GraphQL learning curve:
Steeper than Strapi for
teams new to GraphQL.

Use Cases

Specific ways to use KeystoneJS for your workflow.

01
Build a content backend for a Next.js or Remix application where the schema lives in code and the GraphQL API is generated automatically
02
Create an admin panel for a custom application without writing CRUD routes — define the data model in TypeScript and get a working UI
03
Manage structured content with rich document fields, relationships, and access control from a polished admin interface
04
Prototype a new product backend quickly using Keystone's schema primitives before deciding on a full architecture

Deployment Strategy

Recommended ways to host KeystoneJS in your own environment.

docker
self-hosted