The Best Node.js CMS in the Universe

Say hello to a CMS framework for Node.js that supports in-context editing, schema-driven content types, flexible widgets, and much more.

100% JavaScript, 100% Open Source

 

ApostropheCMS is an open source project with a healthy and growing community behind it, thanks to widespread developer interest in Node.js and the rest of our technology stack, which also includes MongoDB and Nunjucks. We look forward to your participation in the community.

See for Yourself

Try a Live Demo
// my site configuration, app.js

var apos = require('apostrophe')({
  shortName: 'mySite',
  title: 'My Site',

  modules: {
    'apostrophe-templates': {},

    'my-article': {},
    'my-article-pages': {},
    'my-article-widgets': {},
    'my-article-cascade-widgets': {},

    'my-person': {},
    'my-person-pages': {},
    'my-person-widgets': {},
    'my-person-contact-widgets': {},

    'my-custom-marquee-widgets': {}
  }
});
// template

{% extends 'apostrophe-templates:layout.html' %}

{% block title %}{{ data.page.title }}{% endblock %}

{% block main %}
    <h1>{{ data.page.title }}</h1>
    <div class="content">

        {{ apos.area(data.page, 'content', { 
            widgets: {
                'apostrophe-rich-text' : {},
                'apostrophe-images' : {
                    aspectRatio: [4, 3]
                },
                'my-custom-marquee' : {}
            }
        }) }}

    </div>
{% endblock %}
// widget schema

module.exports = {
  label: 'My Custom Marquee',
  addFields: [
        {
          name: 'theme',
          label: 'Theme',
          type: 'select',
          choices: [
            { label: 'Light Gray', value: 'lightGray' },
            { label: 'Dark Blue', value: 'darkBlue' }
          ]
        },
        {
          name: 'image',
          label: 'Image',
          type: 'singleton',
          contextual: true,
          widgetType: 'apostrophe-images',
          options: {
            limit: 1,
            aspectRatio: [4, 3]
          }
        },
        {
          name: '_article',
          label: 'Article to Link',
          type: 'joinByOne',
          withType: 'my-article'
        },
        {
          name: 'caption',
          label: 'Caption',
          type: 'string'
        }
  ]
};

Rapid Development

 

Whether you're working with the page tree, creating unique content types with Apostrophe's "pieces," building and editing relationships between content types with Apostrophe's "join" feature or just creating custom widgets and templates for inclusion on your pages, you'll find that we've created a uniquely user- and developer-friendly experience without compromises.

 

Just by defining a simple schema, you can create both the "back end" and a rich user interface on the front end for editing custom content types like blog posts, events or products as well as editing content on the page.

Deploy With Confidence

 

Apostrophe is in use for many kinds of websites, from small nonprofits to Fortune 500 companies to colleges and research platforms. Since its inception, it has been iteratively built in the context of creating real websites. This has led to an ecosystem of modular functionality, allowing developers to solve problems precisely.

Apostrophe powers websites for:

Case Study

Workflow And Internationalization: A Partnership Story.

The web development team of a Fortune 500 firm had a decision to make. Charged with selecting the right CMS for an upcoming website, they reviewed their options and chose Apostrophe.

Backed by the Community

Apostrophe is an open source project with a healthy and growing community behind it, thanks to widespread developer interest in node.js and the rest of our technology stack, which also includes MongoDB and Nunjucks. We look forward to your contributions as well as your GitHub issues, Forum posts, and Stack Overflow questions.

Supported by P’unk Avenue

Full-service enterprise support for Apostrophe is provided right here at P'unk Avenue, the full-service design and development studio where Apostrophe was born.