Kinto Admin Development


  • Development environment for Kinto Admin

  • Connect to a local Remote Settings server

  • Contribute patches


This guide assumes you have already installed and set up the following:

Kinto Admin

This part is very classic. We recommend using NVM in order to have recent versions of Node and NPM.

git clone

cd kinto-admin/

npm install
npm start

The UI should be accessible at

Initialization script

Since the container is not configured with a real database by default, the content is flushed on each restart.

This means you will have to populate data regularly.

We’ll create a small bash script with the following commands:

set -e
set -o pipefail


In the prerequisite tutorial, an admin user was created, as well as the basic buckets. Let’s add that to our script:

curl -X PUT --fail --verbose ${SERVER}/accounts/admin \
     -d '{"data": {"password": "s3cr3t"}}' \
     -H 'Content-Type:application/json'


curl -X PUT --fail --verbose ${SERVER}/buckets/main-workspace \
     -d '{"permissions": {"collection:create": ["system.Authenticated"], "group:create": ["system.Authenticated"]}}' \
     -H 'Content-Type:application/json' \
     -u $BASIC_AUTH

curl -X PUT --fail --verbose ${SERVER}/buckets/main-preview \
     -d '{"permissions": {"read": ["system.Everyone"]}}' \
     -H 'Content-Type:application/json' \
     -u $BASIC_AUTH

curl -X PUT --fail --verbose ${SERVER}/buckets/main \
     -d '{"permissions": {"read": ["system.Everyone"]}}' \
     -H 'Content-Type:application/json' \
     -u $BASIC_AUTH

In order to play with multi-signoff, we’ll create an editor and a reviewer accounts, put these lines in the script.

curl -X PUT --fail --verbose ${SERVER}/accounts/editor \
     -d '{"data": {"password": "3d1t0r"}}' \
     -H 'Content-Type:application/json'

curl -X PUT --fail --verbose ${SERVER}/accounts/reviewer \
     -d '{"data": {"password": "r3v13w3r"}}' \
     -H 'Content-Type:application/json'

Now create a collection, with a dedicated reviewer group:

curl -X PUT --fail --verbose ${SERVER}/buckets/main-workspace/collections/password-recipes \
     -H 'Content-Type:application/json' \
     -u editor:3d1t0r

curl -X PATCH --fail --verbose $SERVER/buckets/main-workspace/groups/password-recipes-reviewers \
     -H 'Content-Type:application/json-patch+json' \
     -d '[{ "op": "add", "path": "/data/members/0", "value": "account:reviewer" }]' \
     -u $BASIC_AUTH

And at last, create some records, request review and approve changes.

for i in `seq 1 10`; do
    curl -X POST --fail --verbose ${SERVER}/buckets/main-workspace/collections/password-recipes/records \
         -H 'Content-Type:application/json' \
         -d "{\"data\": {\"property\": $i}}" \
         -u editor:3d1t0r

curl -X PATCH --fail --verbose ${SERVER}/buckets/main-workspace/collections/password-recipes \
        -H 'Content-Type:application/json' \
        -d '{"data": {"status": "to-review"}}' \
        -u editor:3d1t0r

curl -X PATCH --fail --verbose ${SERVER}/buckets/main-workspace/collections/password-recipes \
     -H 'Content-Type:application/json' \
     -d '{"data": {"status": "to-sign"}}' \
     -u reviewer:r3v13w3r

echo ""
echo "Done."

With the service running locally, populating it should now just consist in running:


Connect Admin UI

On, when specifying in the Server URL, the option to login with Kinto Account should be shown.

Using Container Tabs in Firefox, you can have one tab logged as editor with password 3d1t0r and another one with reviewer and r3v13w3r.

Submit Patches

Development happens on Github.

The process for a patch to reach Remote Settings is the following:

  • Get the patch merged on Kinto/kinto-admin

  • Create a new release version of kinto-admin on Github (kinto-admin releases)

  • Upgrade the kinto-admin release in Kinto (example kinto PR)

  • Release a new version of Kinto (kinto instructions)

  • Upgrade Kinto in Remote Settings (example remote-settings PR)

  • Release a new version of Remote Settings

  • DEV and STAGE are deployed automatically when a new tag is published

  • Initiate deployment in PROD (See Releasing section in README)