Solución:
No estoy familiarizado con KeystoneJS pero por su apariencia son muy similares. Parece que Strapi tiene una API más extensible, pero en general es el mismo concepto. He usado Strapi para varios proyectos y es rápido trabajar con él, puede tener Strapi en Heroku con un esquema completamente construido en menos de una hora.
Una cosa entre los dos es el soporte GraphQL, Strapi está haciendo un esfuerzo significativo para involucrarse en el mundo GraphQL, creo que para mantenerse al día con Tipe.io.
Configurar GQL + Strapi + Nuxt / Next es maravilloso para crear una aplicación SSR.
He disfrutado trabajando con KeystoneJS v5 durante más de un año en varios proyectos. Tenía la misma pregunta que tú y elegí Keystone sobre Strapi (incluso cuando las estrellas de git y la comunidad eran más altas) porque estaba buscando un generador de backend simple basado en archivos.
Esta línea lo expresa: schema => ({AdminUI, GraphQLApi})
.
Necesitaba definir rápidamente (y luego modificar fácilmente) la Arquitectura de Información de mi backend, y verla reflejada automáticamente en un CMS y la API.
(Strapi users, correct me if I'm wrong)
Vi que Strapi se enfocaba más en construir una forma de arrastrar y soltar (sin código) para construir este backend. No pude encontrar una forma sencilla de usar Strapi con archivos y obtener el CMS y la API que estaba buscando. Me pareció que fue creado para personas que querían un backend, pero no querían escribir código.
Prefiero usar mis funciones de editor de código (buscar / reemplazar, multicursor) para definir y modificar mi esquema que los componentes de arrastrar y soltar en el navegador. También use proyectos anteriores como mi código basado para construir nuevos.
Mis proyectos keystone obtienen una estructura de archivos realmente simple donde la mayoría sale de la caja y hacer mutaciones personalizadas, componentes AdminUI, ganchos y siembra de datos fue realmente simple.
Aquí hay un ejemplo:
├── index.js // imports entities, hooks, initial-data, submodules
├── initial-data.js // imports seed/index.js and orchestastes how to create data
├── entities // for each entity (list): field types, access control, hooks, adminUI configs
│ ├── index.js
│ ├── Users.js
│ ├── Books.js
│ ├── Loans.js
│ ├── Authors.js
│ ├── ...
│ └── Categories.js
├── extendGraphqlSchema // pretty easy to add new custom Graphql types, mutations and queries
│ ├── index.js
│ ├── types
│ ├── queries
│ └── mutations
├── hooks
│ ├── index.js
│ ├── user_beforeUpdate.js
│ ├── book_validateInput.js
│ ├── ...
│ └── loan_afterDelete.js
├── keystone-media-server // submodule I use on many Keystone projects
│ ├── adapters
│ ├── fields
│ ├── lists
│ ├── resolvers
│ └── seed
└── seed // list of functions to create a complete data example to test
├── index.js
├── createUsers.js
├── createBooks.js
├── createLoans.js
├── createAuthors.js
└── createCategories.js
En el momento de escribir este artículo (casi un par de años después de la publicación de esta pregunta), Keystone 5 está orientado en torno a graphql, por lo que ya no es un diferenciador principal entre los dos. Keystone 4 todavía se mantiene como un marco REST-first.
Strapi es ahora GQL-first y tiene una comunidad más grande.