Skip to content
KeystoneJS LogoKeystoneJS
👋🏻 We're working on the next generation of KeystoneJS! If you're using the @keystone-next packages, click here to learn more

Creating a new project

In this guide we will learn how to manually create and run a new Keystone project.

Database preparation

Before running a Keystone application you need to ensure you have a database set up. This tutorial requires you to have a MongoDB database setup. Follow the database setup instructions here to ensure your database is ready to go.


First things first. Create a directory for your project and initialise it:

mkdir new-project
cd new-project
yarn init

Let's start with the minimal setup. We will need two packages here: @keystonejs/keystone, which is the core of Keystone, and @keystonejs/adapter-mongoose, which allows our app to connect to MongoDB:

yarn add @keystonejs/keystone @keystonejs/adapter-mongoose

First steps

After installation we can start coding. The main entry point of a Keystone app is the index.js file in the root folder. Create it and add the following:

const { Keystone } = require('@keystonejs/keystone');
const { MongooseAdapter } = require('@keystonejs/adapter-mongoose');

const keystone = new Keystone({
  adapter: new MongooseAdapter({ mongoUri: 'mongodb://localhost/keystone' }),

You can specify any suitable name for your project. Note that we created an instance of the Mongoose adapter and passed it to Keystone's constructor.

Now we can export our Keystone instance and make it available to run. Add the following to the end of index.js:

module.exports = {

Although our app doesn't do much yet, it is able to start and connect to a database.

GraphQL setup

As in the previous step, install the necessary package.

yarn add @keystonejs/app-graphql

Import it in index.js:

const { GraphQLApp } = require('@keystonejs/app-graphql');

And add a new array export named apps with a new instance of GraphQLApp, like so:

module.exports = {
  apps: [new GraphQLApp()],

Adding a list

In order to be able to start an app we need to add at least one List. A List is a model that is compatible with Keystone's Admin UI.

Lists are composed of fields. To add fields to a list, we must install the @keystonejs/fields package:

yarn add @keystonejs/fields

In this example the field type Text is used, which must be required in index.js:

const { Text } = require('@keystonejs/fields');

Create your first list in index.js by adding the following before the module export and after instantiating Keystone:

keystone.createList('Todo', {
  fields: {
    name: { type: Text },

This code snippet creates a List named Todo. The second argument is a config object. For now it has only one key (fields) which is used to define the schema for the newly created model.

In our example, the Todo list has a single field called name of type Text.

Starting the application

Add the following to package.json:

"scripts": {
  "start:dev": "keystone"

Now ensure that mongod is running and execute the start script:

yarn start:dev

You should see something like this:

✔ Keystone instance is ready 🚀
🔗 GraphQL Playground:   http://localhost:3000/admin/graphiql
🔗 GraphQL API:          http://localhost:3000/admin/api

Now it's time to check those routes in browser to ensure that everything works as expected.


Congratulations, you have just set up your very first Keystone application; including a GraphQL API and a GraphQL Playground which you start interacting with.

In future tutorials we will show you how to execute queries and mutations with this API, and launch a browser based Admin UI to explore and interact with your data.

On this page

Edit on GitHub