Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.

Storyblok CLI

A simple CLI for scaffolding Storyblok projects and fieldtypes.

You found an issue?
Tell us about it - open an issue or look if it was already reported.

npm npm GitHub issues GitHub closed issues


Make sure you've node >= 9.11.0 installed.

$ npm i storyblok -g



Usage to kickstart a boilerplate, fieldtype or theme

$ storyblok select


Download your space's components schema as json. This command will download 2 files: 1 for the components and 1 for the presets.

$ storyblok pull-components --space <SPACE_ID>


  • space: your space id


Push your components file to your/another space

$ storyblok push-components <SOURCE> --space <SPACE_ID> --presets-source <PRESETS_SOURCE>


  • source: can be a URL or path to JSON file.

Using an URL

$ storyblok push-components --space 67819

Using a path to file

$ storyblok push-components ./components.json --space 67819


  • space: your space id
  • presets-source (optional): it can be a URL or path to JSON file with the presets


Using an URL for presets-source

$ storyblok push-components --presets-source https://url-to-your-presets-file.json --space 67819

Using a path to file

$ storyblok push-components ./components.json --presets-source ./presets.json --space 67819


Sync components, folder, roles, datasources or stories between spaces

$ storyblok sync --type <COMMAND> --source <SPACE_ID> --target <SPACE_ID>


  • type: describe the command type to execute. Can be: folders, components, stories, datasources or roles. It's possible pass multiple types separated by comma (,).
  • source: the source space to use to sync
  • target: the target space to use to sync


# Sync components from `00001` space to `00002` space
$ storyblok sync --type components --source 00001 --target 00002

# Sync components and stories from `00001` space to `00002` space
$ storyblok sync --type components,stories --source 00001 --target 00002


Create a space in Storyblok and select the boilerplate to use

$ storyblok quickstart


Logout from the Storyblok cli

$ storyblok logout


Login to the Storyblok cli

$ storyblok login


Create a migration file (with the name change_<COMPONENT>_<FIELD>.js) inside the migrations folder. Check Migrations section to more details

$ storyblok generate-migration --space <SPACE_ID> --component <COMPONENT_NAME> --field <FIELD>


  • space: space where the component is
  • component: component name. It needs to be a valid component
  • field: name of field


Execute a specific migration file. Check Migrations section to more details

$ storyblok run-migration --space <SPACE_ID> --component <COMPONENT_NAME> --field <FIELD> --dryrun

Optionally you can provide the publish parameter to publish content after saving. Example:

$ storyblok run-migration --publish published --space 1234 --component article --field image


  • space: the space you get from the space settings area
  • component: component name. It needs to be a valid component
  • field: name of field
  • dryrun: when passed as an argument, does not perform the migration
  • publish (optional): publish the content when update
    • all: publish all stories, even if they have not yet been published
    • published: only publish stories that already are published and don't have unpublished changes
    • published-with-changes: publish stories that are published and have unpublished changes
  • publish-languages (optional): publish specific languages. You can publish more than one language at a time by separating the languages by ,


The rollback-migration command gives the possibility to undo the changes made from the execution of the last run-migrations command.

$ storyblok rollback-migration --space 1234 --component Product --field title

Important: The rollback-migrations command will only work if there where changes done with run-migrations. Therefore running run-migrations command with the --dryrun flag will NOT create a rollback file.


  • space: the space you get from the space settings area
  • component: component name. It needs to be a valid component
  • field: name of field


List all spaces of the logged account

$ storyblok spaces


This command gives you the possibility to import flat content from .csv, .xml and .json files coming from other systems.

The attributes path and title are required.

$ storyblok import --file <FILE_NAME> --type <TYPE_OF_CONTENT> --folder <FOLDER_ID> --delimiter <DELIMITER_TO_CSV_FILES> --space <SPACE_ID>

A xml file needs to have following format:

<?xml version="1.0" encoding="UTF-8"?>
    <title>This is my title</title>
    <text>Lorem ipsum dolor sit amet</text>

A csv file needs to have following format. The first row is used to identify the attribute names:

this-is-my-title;This is my title;"Lorem ipsum dolor sit amet";;press

A json file need to have following format:

    "path": "this-is-my-title",
    "title": "This is my title",
    "text": "Lorem ipsum dolor sit amet",
    "image": "",
    "category": "press"


  • file: name of the file
  • type: name of the content type you want to use for the import
  • space: id of your space
  • delimiter (optional): delimiter of the .cvs files, only necessary if you are uploading a csv file (Default value is ; )
  • folder (optional): id of the folder where you want to store the content in Storyblok


For global help

$ storyblok --help

For command help

$ storyblok sync --help


For view the CLI version

$ storyblok -V # or --version

Content migrations

Content migrations are a convenient way to change fields of your content.

To execute a migration you first need to create a migration file. This file is a pure Javascript function where the content of a specific content type or compontent gets passed through.

1. Creating a migration file

To create a migration file, you need to execute the generate-migration command:

# creating a migration file to product component to update the price
$ storyblok generate-migration --space 00000 --component product --field price

When you run this command a file called change_product_price.js will be created inside a folder called migrations.

The created file will have the following content:

// here, 'subtitle' is the name of the field defined when you execute the generate command
module.exports = function (block) {
  // Example to change a string to boolean
  // block.subtitle = !!(block.subtitle)

  // Example to transfer content from other field
  // block.subtitle = block.other_field

In the migration function you can manipulate the block variable to add or modify existing fields of the component.

2. Running the migration file

To run the migration function you need to execute the run-migration command. Pass the --dryrun option to not execute the updates and only show the changes in the terminal:

$ storyblok run-migration --space 00000 --component product --field price --dryrun

After checking the output of the dryrun you can execute the updates:

# you can use the --dryrun option to not execute the updates
$ storyblok run-migration --space 00000 --component product --field price

3. Publishing the content

You can execute the migration and, when update the content, publish it using the --publish and --publish-languages options. When you use the publish option, you need to specific one of these following options: 'all', 'published' or 'published-with-changes':

$ storyblok run-migration --space 00000 --component product --field price --publish all

You can specify the languages to update using --publish-languages=<LANGUAGE> or update all languages using --publish-languages=ALL_LANGUAGES:

# to update only one language
$ storyblok run-migration --space 00000 --component product --field price --publish all --publish-languages=de

# to update more than one language
$ storyblok run-migration --space 00000 --component product --field price --publish all --publish-languages=de,pt

4. Rollback migrations

Whenever you run a run-migrations command a json file containing all the content before the change takes place will be generated. Important, this just doesn't apply if you add the --dryrun flag.

Remembering that, the content that will be saved is always related to the last run-migrations command, that is, if you run the run-migrations command twice changing the same component, the content will only be saved before the last update.


1. Change an image field

Let's create an example to update all occurrences of the image field in product component. In the example we replace the url from // to //

First, you need to create the migration function:

$ storyblok generate-migration --space 00000 --component product --field image

Then let's update the default image field:

module.exports = function (block) {
  block.image = block.image.replace('', '')

Now you can execute the migration file:

$ storyblok run-migration --space 00000 --component product --field image --dryrun

2. Transform a Markdown field into a Richtext field

To transform a markdown or html field into a richtext field you first need to install a converter library.

$ npm install storyblok-markdown-richtext -g

Now check the path to the global node modules folder

$ npm root -g

Generate the migration with storyblok generate-migration --space 00000 --component blog --field intro and apply the transformation:

var richtextConverter = require('/usr/local/lib/node_modules/storyblok-markdown-richtext')

module.exports = function (block) {
  if (typeof block.intro == 'string') {
    block.intro = richtextConverter.markdownToRichtext(block.intro)

You're looking for a headstart?

Check out our guides for client side apps (VueJS, Angular, React, ...), static site (Jekyll, NuxtJs, ...), dynamic site examples (Node, PHP, Python, Laravel, ...) on our Getting Started page.