finds.dev← search

// the find

keystonejs/keystone

★ 9,931 · TypeScript · MIT · updated Jul 2026

The superpowered headless CMS for Node.js — built with GraphQL and React

Keystone is a Node.js backend framework that generates a GraphQL API and admin UI from a TypeScript schema definition. You describe your data model with fields and access rules, and it handles the Prisma migrations, resolvers, and admin interface. It's aimed at developers who want a content backend without writing all that plumbing themselves.

The schema-as-code approach is genuinely well executed — access control, hooks, and field types are all defined in one place in TypeScript with real type safety. The admin UI is customizable enough to be actually usable rather than a demo prop, and custom field views let you replace the default inputs when needed. Hooks (beforeOperation, afterOperation, resolveInput) give you lifecycle control without subclassing anything. The document field with its structured rich-text editor is better than most CMS text solutions — it stores a typed document tree rather than raw HTML.

GraphQL-only is a real constraint — there's no REST layer, so if your client team isn't on board with GraphQL you're either wrapping it yourself or picking something else. The Prisma migration workflow underneath is inherited wholesale, and Prisma migrations bite when you need complex schema changes or team members who don't know the Prisma mental model. The Keystone 5 to Keystone 6 rewrite was a breaking change that stranded a lot of projects, and the track record of major rewrites makes you think twice before building on it. Scaling story is essentially absent — no built-in cache invalidation, no CDN hooks, no webhooks out of the box; at any real traffic volume you're bolting all of that on yourself through the hook system.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →