The big question: is there a Node.js based CMS with capabilities similar to Drupal’s custom content types and views, which we could fit into our agency workflow.

What we’re looking for…

  • Easy Install Process: We want to be able to place files on the server, provide a database, and then have a working CMS where we can at least create pages and blog posts with a very minimal amount of configuration or coding work.
  • Configurable User Accounts and Permissions: We want to easily add users and assign an administrative super user or editor role to users. Customizing what editors can do is a bonus.
  • Configurable Custom Content Types: Define content types using a point and click interface. Drupal’s content types and WordPress’ PODS or Advanced Custom Fields.
  • Configurable Content Views: Ability to define and customize content listings and detail views. Drupal’s views is a model for this functionality.

By “configurable,” I mean that hopefully the CMS will offer a point and click interface. If it turns out not to have that, there’s some sort of concise and easy to understand config file or plug-in module system that will let us accomplish these tasks. Having to edit core files that are part of the project is considered to be non-configurable.

Our evaluation criteria here are simply easy of installation, and a functionality comparison with the LAMP stack based CMS systems we are currently using. Performance under heavy loads, long term maintenance, and other factors important in production were not evaluated. This is about finding systems easy enough to set up that our front end developers can handle simple projects, and robust enough that our back-end developers will be happy building more complex applications on this platform.

I’ve evaluated Keystone.js, Hatch.js, and Calipso.

Keystone.js – The best of the bunch. What’s offered is fairly bare bones, yet complete and polished. GitHub shows recent activity from a decent sized community of developers. Really nice admin interface and edit forms for content, and a nice Bootstrap based default theme. Especially nice was the image gallery system, with a very snazzy uploader that accepts dran-n-drop and does multiple images at a time.

INSTALLATION: difficulty: moderate, functionality: good – Required getting MongoDB up and running, and using a Yeoman generator to get the system and it’s dependencies install. A friendly prompt based command line start-up was welcoming and made the process easier, but I’d rather do initial configuration through the web rather than console based prompts. In the end, I got a site up and running very quickly, and was able to configure the important details with ease.

USER ACCOUNTS: difficulty: moderate, functionality: minimal – Adding users is pretty easy, but there doesn’t seem to be much of a built-in roles system. Just a check box labeled “Can access keystone”, which I take to mean this user is allowed access to all parts of the CMS admin features. Looks like additional permissions and user features can be coded within the user data model.

CONTENT TYPES: difficulty: moderate, functionality: good – Adding content types involves creating a module of Javascript code that defines a Keystone Model. A model can utilize one of many pre-defined field types, including check boxes, select boxes, rich text area  controls, and many more. Keystone’s “get started” guide is very helpful. After creating my single Keystone model file and restarting Keystone, I had a working admin page where I could add/edit/delete my custom content type. Not bad!

CONTENT VIEWS: difficulty: hard, functionality: good – This is a bit more involved. Coding in multiple places, setting up views, templates, and routes is required. Developers with some MVC experience will be at home, but front-end developers who just want to know where the template is will be lost. After about an hour minutes of trying to follow the basic blog example view that comes with Keystone I finally got my custom content type to display.

One saving grace is that just about any template engine is supported. By default, Keystone points you towards using Jade, but other Javascript like EJS template libraries are easy to substitute in.

Hatch.js – I find the licensing terms are a bit onerous. Either pay 1,000 GBP per month, or you have to release the full source code of your project. While we enthusiastically support and use free software, just about every project has some detail that we don’t particularly want to release to the public. Oh well, we’ll give this thing a try anyway.

INSTALLATION: difficulty: moderate – I had to install the Redis database to get started, since I didn’t have it already. After that, it was breeze with only couple npm command lines. The README.md README.md> on Github has everything you need. Once you get Redis going and the system started, there’s a nice web based config form that lets you enter your site name and other initial details.

USER ACCOUNTS: difficulty: easy, functinality: good
The Hatch user account system is pretty close to what we want. There are members and editors and an admin user. There isn’t a fine grained permission system for those groups that’s easily configurable, but the defaults seem workable.

CONTENT TYPES, CONTENT VIEWS: difficulty: very hard, functionality: ????
This is where things get sticky. There is not an admin interface for setting up anything custom content type or content view related. There is a module system for extending Hatch.js and adding features and content types, but developer documentation is scarce and the structure of the examples provided is complex. In the time I had available I was not able to investigate this fully.

Calipso – The Calipso website promises “Calipso is a simple content management system, built along similar themes to Drupal and WordPress”. That sounds like what we want! But, checking out their GitHub, the project doesn’t show much activity in the last year or so. I’ll give it a try anyway.

INSTALLATION: difficulty: very hard, funtionality: moderate – It took some fiddling around with npm to get it and it’s dependencies installed. I had to run the calipso install script multiple times, observe the “Cannot find module” errors, install the missing module, then try running again. Then, had to do the same thing with the “calipso server” process. Maybe I missed something, I am afterall new to the Node.js platform, or maybe it’s because I’m doing this locally on my OSX laptop. But, it took a long while to get all of the dependencies discovered and installed. Also, it was not encouraging that creating a new site used a special “calipso site” command line rather than some more widely accepted tool like Bower to deploy a site.

Once all of that was sorted out, navigating the web based setup was easy. After some initial pain, I was quickly on my way to my new Calipso site.

CONTENT TYPES: difficulty: easy (at least getting started), functionality: moderate (but incomplete) – It looks like they have the right idea. I see a content types control panel, with the ability to configure new content types with an easy web interface. Fields are configured using the “Calipso form language”, which there isn’t much help available to describe how that works. Following an example online and cut and pasting a Calipso form language code snippet, I quickly had a custom content type configured and was entering data and viewing detail pages for it.

CONTENT VIEWS: difficulty: easy (if it worked), functionalty: moderate (if it was done)
Content types have an online form where you can enter template code. EJS and Jade are options for what that template can be written in. Looks like it could be cool, and provide a nice way for front end devs to quickly style content. But, a message under the template entry field informs us that this feature “NOT YET IMPLEMENTED” for the list template. Bummer. I tried the content detail view template, but there’s not really any help for how to insert data fields in it, and I couldn’t really get it working right. Like lots of things in Calipso, the idea is there, it’s just not done.

Calipso looks like it could be awesome. I hope someone picks up active development on it again. It has the beginnings of everything I’d like to see in a Node.js content management system. If only it had an active community, configuring custom fields was a bit easier, and the incomplete features were finished up, this could have been the solution we wanted.

Conclusions: I had hoped to find a Node.js system that showed some promise of fitting into our workflow established with Drupal. Easy install, content types and content views that are accessible to front-end and back-end developers alike, and a user permissions system that our account teams can handle if needed. Unfortunately neither Hatch.js, Calipso, nor Keystone.js came anywhere near this ideal.

Keystone.js definitely was more extensible with a lot less investment in time than the other system. If I had to put my money on one of these systems it would be Keystone.js, based on it being the quickest to get going, the most robust, and having the most potential to build a good open source support community. Hatch.js had a gorgeous admin interface, but pushing it beyond the limits of a pages and posts type site looked to be a formidable challenge, and the licensing terms are likely to hamper the development of a large open source community around the platform. Calipso came the closest to what we are looking for in concept, but was too unfinished to put into production use.