Skip to content
KeystoneJS LogoKeystoneJS
👋🏻 Keystone 5 has officially moved to maintenance only. For the latest release of Keystone please visit the Keystone website.


This is the last active development release of this package as Keystone 5 is now in a 6 to 12 month active maintenance phase. For more information please read our Keystone 5 and beyond post.

The CloudinaryImage field extends the File field and allows uploading images to Cloudinary. It also exposes additional GraphQL functionality for querying your uploaded images.


This field must be used with the CoundinaryAdapter file adapter:

const { Keystone } = require('@keystonejs/keystone');
const { CloudinaryAdapter } = require('@keystonejs/file-adapters');
const { CloudinaryImage } = require('@keystonejs/fields-cloudinary-image');

const keystone = new Keystone({...});

const fileAdapter = new CloudinaryAdapter({
  cloudName: process.env.CLOUDINARY_CLOUD_NAME,
  apiKey: process.env.CLOUDINARY_KEY,
  apiSecret: process.env.CLOUDINARY_SECRET,
  folder: 'my-keystone-app',

keystone.createList('Image', {
  fields: {
    image: { type: CloudinaryImage, adapter: fileAdapter },


Since this field extends the File field, it accepts all the same config options.


Will add the following to the GraphQL schema:

Mirrors the formatting options [Cloudinary provides](
All options are strings as they ultimately end up in a URL.
input CloudinaryImageFormat {
  Rewrites the filename to be this pretty string. Do not include \`/\` or \`.\`
  prettyName: String
  width: String
  height: String
  crop: String
  aspect_ratio: String
  gravity: String
  zoom: String
  x: String
  y: String
  format: String
  fetch_format: String
  quality: String
  radius: String
  angle: String
  effect: String
  opacity: String
  border: String
  background: String
  overlay: String
  underlay: String
  default_image: String
  delay: String
  color: String
  color_space: String
  dpr: String
  page: String
  density: String
  flags: String
  transformation: String

type CloudinaryImage_File {
  id: ID
  path: String
  filename: String
  originalFilename: String
  mimetype: String
  encoding: String
  publicUrl: String
  publicUrlTransformed(transformation: CloudinaryImageFormat): String

CloudinaryImage fields will have type CloudinaryImage_File in the schema. For example, to query an entry in our Image list, one could do:

query getFirstCloudinaryImage {
  allImages(first: 1) {
    image {
      publicUrlTransformed(transformation: { width: "120", crop: "limit" })

Cloudinary image block

The CloudinaryImage field also exposes a block that can be used in the Content field.


const { Content } = require('@keystonejs/fields-content');

keystone.createList('Post', {
  fields: {
    body: {
      type: Content,
      blocks: [Content.blocks.heading, [CloudinaryImage.blocks.image, { adapter }]],

On this page

  • Usage
  • Config
  • GraphQL
  • Cloudinary image block
  • Usage
Edit on GitHub