Skip to content

A CMS your repository owns.

Declare your content's shape in files, keep the content in SQLite, and ship the whole site from one machine.

schema/collections/posts.yml
views/posts/index.yml
schema: 1
title: Posts
route: /blog/{slug}
dated: true
blueprints: [post]
template: posts/show
search: site

Getting started

Nibble is a content management system you run as your own application. These pages cover installing it, writing in it, building a theme for it, and working on it.

Installing

What your machine needs, what the installer asks, and what to do when it finishes.

Content written as files

Turn a folder of Markdown into a collection, the way these pages work.

Schema

Collections, taxonomies, blueprints and the files that declare them.

Views and queries

How a template gets its data, and how a page is rendered.

Editing content

Entries, assets, publishing, forms and SEO in the control panel.

Working on Nibble

Architecture, tests, releases and the invariants that hold.

Quick start

Nibble is installed by cloning it: the repository is the application, and upgrades arrive as releases you merge into your own copy. Plan about ten minutes, most of it spent downloading dependencies.

Installing it

The installer asks a handful of questions, writes your answers into .nibble/install.yml, and leaves you with a site you can run.

./install.sh my-site
cd my-site
bin/dev

Open http://localhost:3100 for the site and http://localhost:3100/admin for the control panel.

Warning

Nibble expects a deploy step. If you were hoping to upload files to shared hosting and run everything from a browser, this is not the CMS for you.

Declaring your first collection

A collection is a file. This one says that posts exist, that they live at /blog/{slug}, and which blueprint gives them their fields.

# schema/collections/posts.yml
schema: 1
title: Posts
route: /blog/{slug}
dated: true
blueprints: [post]
template: posts/show
search: site
sort: published_at:desc

Run bin/rails nibble:check after editing anything under schema/. It tells you what is wrong before the control panel does.

Note

Change a file and the control panel changes with it. There is no migration to write and no button to press: the schema is the source of truth.

Basic usage

Writing the content

Most content belongs in the control panel, where whoever is closest to it can write without asking a developer. Some content does not — documentation, a changelog, reference pages that change in the same pull request as the code they describe. For those, a folder of Markdown can be the collection. These pages are exactly that.

Rendering a page

A view gets its data from a file beside it, then renders it as a Vue component with server-side rendering, so visitors get HTML immediately.

# views/posts/index.yml
params: [page]
posts:
  from: entries:posts
  paginate: { per_page: 12 }

Deploying it

One machine, one SQLite file. Kamal takes the container up, bin/rails nibble:content:markdown runs at start-up so merged pages publish themselves, and a backup is a copy of a file.

Getting help

Reading further

Every section of these pages explains why before how, with complete examples rather than fragments. If you are setting a site up, start with Installing. If you are building a theme, start with Schema.

Reporting something

An issue that says what you expected and what happened is worth more than a patch that guesses. The repository is where that conversation happens.