{"id":47765,"library":"ghost-storage-cloudinary","title":"Ghost Storage Cloudinary","description":"Cloudinary storage adapter for Ghost blogs. v3.0.2 (stable) supports Ghost v5+ and Cloudinary Node.js SDK. Features dated subdirectories, tagging, and plugin support. Optionally uses CLOUDINARY_URL env var. Requires manual installation by copying to content/adapters/storage/.","status":"active","version":"3.0.2","language":"javascript","source_language":"en","source_url":"https://github.com/eexit/ghost-storage-cloudinary","tags":["javascript","cloudinary","ghost","ghost-blog","tryghost","ghost-adapter","blog","image-hosting","storage"],"install":[{"cmd":"npm install ghost-storage-cloudinary","lang":"bash","label":"npm"},{"cmd":"yarn add ghost-storage-cloudinary","lang":"bash","label":"yarn"},{"cmd":"pnpm add ghost-storage-cloudinary","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Runs as a Ghost storage adapter","package":"ghost","optional":false},{"reason":"Cloudinary Node.js SDK for API calls","package":"cloudinary","optional":false}],"imports":[{"note":"This adapter is loaded by Ghost using CommonJS require() at runtime. Do not import in application code.","wrong":"import CloudinaryAdapter from 'ghost-storage-cloudinary';","symbol":"CloudinaryAdapter","correct":"const CloudinaryAdapter = require('./path/to/ghost-storage-cloudinary');"},{"note":"The active adapter name must match the folder name: 'ghost-storage-cloudinary'.","wrong":"storage: { active: 'cloudinary' }","symbol":"Ghost Storage Config","correct":"storage: { active: 'ghost-storage-cloudinary', 'ghost-storage-cloudinary': { auth: {}, upload: {}, fetch: {} } }"},{"note":"CLI config uses the full adapter name.","wrong":"ghost config storage.active cloudinary","symbol":"Ghost CLI Config Command","correct":"ghost config storage.active ghost-storage-cloudinary"}],"quickstart":{"code":"// Step 1: Install and move to content/adapters/storage/ghost-storage-cloudinary\n// Step 2: Configure Ghost config.json\n{\n  \"storage\": {\n    \"active\": \"ghost-storage-cloudinary\",\n    \"ghost-storage-cloudinary\": {\n      \"auth\": {\n        \"cloud_name\": process.env.CLOUDINARY_CLOUD_NAME ?? '',\n        \"api_key\": process.env.CLOUDINARY_API_KEY ?? '',\n        \"api_secret\": process.env.CLOUDINARY_API_SECRET ?? ''\n      },\n      \"upload\": {\n        \"use_filename\": true,\n        \"unique_filename\": false,\n        \"overwrite\": false\n      },\n      \"fetch\": {\n        \"quality\": \"auto\"\n      }\n    }\n  },\n  \"imageOptimization\": false\n}","lang":"javascript","description":"Installation and configuration of Ghost to use Cloudinary storage adapter."},"warnings":[{"fix":"Add 'imageOptimization: false' to Ghost config.","message":"Must disable Ghost's built-in Image Optimisation in config.json or it will conflict with Cloudinary.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Ensure the folder name matches the npm package name.","message":"Adapter folder must be named 'ghost-storage-cloudinary' exactly when copied to content/adapters/storage/.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Use the full adapter name as the key under storage.\"","message":"Configuration key for adapter settings must be 'ghost-storage-cloudinary' (not 'cloudinary').","severity":"gotcha","affected_versions":">=1.0.0"}],"env_vars":null,"search_vec":"'adapt':6,48 'blog':9,44,49 'cloudinari':3,4,16,28,40 'content/adapters/storage':38 'copi':36 'date':20 'env':30 'featur':19 'ghost':1,8,13,41,43,47 'ghost-adapt':46 'ghost-blog':42 'host':52 'imag':51 'image-host':50 'instal':34 'javascript':39 'manual':33 'node.js':17 'option':26 'plugin':24 'requir':32 'sdk':18 'stabl':11 'storag':2,5,53 'subdirectori':21 'support':12,25 'tag':22 'tryghost':45 'url':29 'use':27 'v3.0.2':10 'v5':14 'var':31","created_at":"2026-06-07T16:53:11.885709+00:00","updated_at":"2026-06-07T16:53:11.885709+00:00","problems":[{"fix":"Run: mv node_modules/ghost-storage-cloudinary content/adapters/storage/ghost-storage-cloudinary","cause":"The adapter was not moved to the correct location.","error":"ENOENT: no such file or directory, open '.../content/adapters/storage/ghost-storage-cloudinary/index.js'"},{"fix":"Add 'storage.active': 'ghost-storage-cloudinary' to Ghost config.","cause":"Missing or invalid storage configuration in config.json.","error":"ConfigurationError: The 'storage' config must have an 'active' property."},{"fix":"Set auth config or CLOUDINARY_URL environment variable.","cause":"Missing Cloudinary authentication credentials.","error":"Error: Must supply cloud_name"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/eexit/ghost-storage-cloudinary","github":"https://github.com/eexit/ghost-storage-cloudinary","docs":null,"changelog":null,"pypi":null,"npm":"ghost-storage-cloudinary","openapi_spec":null,"status_page":null,"smithery":null,"categories":["storage"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-07","next_check":"2026-09-05","install_tag":null}}