Headless GraphQL CMS
Tags: graphql, cms, opensource, help
Published: 2019-04-07 19:25:36

---
title: Headless GraphQL CMS
published: true
description: I'm looking for headless CMS exposing GraphQL or OpenAPI endpoint. Help!
tags: [graphql, cms, opensource, help]
cover_image: https://thepracticaldev.s3.amazonaws.com/i/r7jx8byhg6l4vkaiozvw.jpg
---

## What I'm looking for?

**CMS** - admin section of a website to edit the content (CRUD operations). This task was solved so many times, I don't want to do it again, I want to use something existing, something that works out of the box.

**Headless** CMS - means that CMS doesn't provide frontend section of the website it only provides the backend for editing. For example, Wordpress is **not** headless by default, it generates also the website.

**GraphQL** has many aspects, but I'm interested in it as API specification. It is possible to generate type signatures from GraphQL specification or generate validators (like io-ts) so it creates "end-to-end type checking" experience. From this point of view, OpenAPI as specification would also work.

**Open source** - I would like to be able to deploy it myself, for example, to use it in intranet application.

**Relational database** support - I would like to be able to backup my content or use it in a different application. A relational database is a well-understood abstraction. It is easy to backup, replicate, inspect with SQL client, visualize with [superset](https://github.com/apache/incubator-superset), build ER diagram for it. For example, [ponzu](https://github.com/ponzu-cms/ponzu) (awesome project) but it uses its own internal database, which stops me from using it.

**S3** for assets (optional) - it would be nice if CMS could upload assets to S3 bucket (or similar service) so I wouldn't need to worry about storing files, backups, and migration. 

Not a priority for me (but maybe a priority for others):

**Access control** - I don't need granular permissions.

**High load** support or rate limiting - API will be used to generate static website so I don't care about the high load.

**Mutations** - I don't need to write or modify data through API.

## Options

**CMS which were built with this use case in mind** and provide all feature out of the box, for example, strapi, prime, etc.

**Headless CMS without GraphQL** + some proxy to convert API to GraphQL, for example, Ghost + Gatsby's Ghost plugin.

**Headless CMS without GraphQL** + Postgraphile or Hasura.

**Framework to generate headless CMS** + Postgraphile or Hasura, for example, Rails frameworks.

## What I found

I did a small research and found some options but will be grateful for additional hints. I used docker-compose for my experiments. All intermediate results documented in [the repo](https://github.com/stereobooster/postgresql-experiment).

### Strapi

Website: https://strapi.io/
Technology: ECMAScript, MongoDB or MySQL or MariaDB or PostgreSQL

One which actually works (I had problems starting some other projects). I had only one question: why does it need to restart after every change in schema or plugin installation, it feels they doing some hacks there.

### Prime

Website: https://docs.primecms.app/
Technology: TypeScript, PostgreSQL

Looks cool, but I wasn't able to start it. The project is young - there is only one core maintainer. The author doing cool things, but documentation is still lagging behind and first-time user experience could be better.

### Cockpit

Website: https://getcockpit.com/
Technology: PHP, ECMAScript, SQLite or MongoDB, Apache

It seems it is not actively maintained. I wasn't able to figure out how to install GraphQL plugin.

### WordPress as headless CMS

Website: https://wordpress.org/
Technology: PHP, ECMAScript, MySQL

[People from postlight have extended article about this option](https://github.com/postlight/headless-wp-starter). I don't like this solution - WordPress wasn't built for this use case. It is possible to add 2-3 plugins to make it work, but it feels hackish and UX is clumsy.

### Ghost as CMS

Website: https://ghost.org/
Technology: ECMAScript, MySQL

Doesn't provide GraphQL, but it is possible to use [Gatsby development server as GraphQL proxy](https://github.com/TryGhost/gatsby-starter-ghost). Doesn't support the custom types of content.

### Directus as CMS

Website: https://directus.io/
Technology: PHP, ECMAScript, Vue, MySQL

Doesn't provide GraphQL API.

### Rails-based admin section

Technology: Ruby on Rails, relational database

There a lot of solutions for the automatic or semiautomatic generation of CMS for Rails, for example:

- [administrate](https://github.com/thoughtbot/administrate)
- [godmin](https://github.com/varvet/godmin)
- [activeadmin](https://github.com/activeadmin/activeadmin)
- [rails_admin](https://github.com/sferik/rails_admin)
- [trestle](https://github.com/TrestleAdmin/trestle)

But not so good with GraphQL API generation (at least I don't know about it). So the trick is to use Rails for CMS and use something else for GraphQL API, for example, postgraphile.   

### Postgraphile (PostgreSQL-based API)

Website: https://www.graphile.org/postgraphile/

> PostGraphile automatically detects tables, columns, indexes, relationships, views, types, functions, comments, and more — providing a GraphQL server that is highly intelligent about your data, and that automatically updates itself without restarting when you modify your database

Can be used together with any CMS which works with PostgreSQL. I also tried to use it with [react-admin](https://github.com/marmelab/react-admin), but this attempt failed.

[Tried to use CockroachDB instead of PostgreSQL, but no luck](https://github.com/stereobooster/cockroachdb-experiment).

### Hasura (PostgreSQL-based API)

Website: https://hasura.io/

> Instant Real-time GraphQL on Postgres

Looks impressive. Has built-in CMS (I guess quite primitive, but this is better than nothing). 

Can be used together with any CMS which works with PostgreSQL.

## Help

What do I miss? Are there good CMSes with GraphQL or OpenAPI support that I'm not aware of? Are there good API providers for databases? 


> Photo by Mika on Unsplash