{"id":28419199,"url":"https://github.com/strapi-community/cloudinary-media-library","last_synced_at":"2026-03-04T08:02:49.953Z","repository":{"id":294707523,"uuid":"979884201","full_name":"strapi-community/cloudinary-media-library","owner":"strapi-community","description":"Strapi Cloudinary Media Library Custom Field","archived":false,"fork":false,"pushed_at":"2025-08-26T09:55:39.000Z","size":11290,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-10-09T06:51:00.021Z","etag":null,"topics":["cloudinary","custom-field","media-library","strapi","strapi-plugin"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/strapi-community.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-08T08:12:23.000Z","updated_at":"2025-09-23T19:23:29.000Z","dependencies_parsed_at":"2025-07-18T17:09:20.094Z","dependency_job_id":"6237213f-7fd8-4e4a-866f-24a4478cf793","html_url":"https://github.com/strapi-community/cloudinary-media-library","commit_stats":null,"previous_names":["strapi-community/cloudinary-media-library"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/strapi-community/cloudinary-media-library","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strapi-community%2Fcloudinary-media-library","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strapi-community%2Fcloudinary-media-library/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strapi-community%2Fcloudinary-media-library/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strapi-community%2Fcloudinary-media-library/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/strapi-community","download_url":"https://codeload.github.com/strapi-community/cloudinary-media-library/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strapi-community%2Fcloudinary-media-library/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30075919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T08:01:56.766Z","status":"ssl_error","status_checked_at":"2026-03-04T08:00:42.919Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudinary","custom-field","media-library","strapi","strapi-plugin"],"created_at":"2025-06-04T16:10:39.950Z","updated_at":"2026-03-04T08:02:49.948Z","avatar_url":"https://github.com/strapi-community.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\" style=\"max-width: 10rem; margin: 0 auto\"\u003e\n  \u003cimg style=\"width: 150px; height: auto;\" src=\"https://www.sensinum.com/img/open-source/strapi-plugin-cloudinary-media-library/logo.png\" alt=\"Logo - Strapi cloudinary-media-library Plugin\" /\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eStrapi Cloudinary Media Library Plugin\u003c/h1\u003e\n  \u003cp\u003eStrapi Custom Field with Cloudinary Media Library feature\u003c/p\u003e\n  \u003ca href=\"https://www.npmjs.org/package/@strapi-community/cloudinary-media-library\"\u003e\n    \u003cimg alt=\"NPM version\" src=\"https://img.shields.io/npm/v/@strapi-community/cloudinary-media-library.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.org/package/@strapi-community/cloudinary-media-library\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dm/@strapi-community/cloudinary-media-library.svg\" alt=\"Monthly download on NPM\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/strapi-community/cloudinary-media-library\"\u003e\n    \u003cimg src=\"https://codecov.io/gh/strapi-community/cloudinary-media-library/branch/master/graph/badge.svg?token=p4KW9ytA6u\" alt=\"codecov.io\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n---\n\n\u003cdiv style=\"margin: 20px 0\" align=\"center\"\u003e\n  \u003cimg style=\"width: 100%; height: auto;\" src=\"https://www.sensinum.com/img/open-source/strapi-plugin-cloudinary-media-library/preview.png\" alt=\"UI preview\" /\u003e\n\u003c/div\u003e\n\nA Strapi plugin that adds a **custom field** for selecting Cloudinary media assets using Cloudinary's official Media Library widget.\n\n## 📋 Table of Contents\n\n- [✨ Features](#features)\n- [📋 Requirements](#requirements)\n- [📦 Installation](#installation)\n- [🔐 Getting Cloudinary Credentials](#getting-cloudinary-credentials)\n- [⚙️ Setting up Configuration File](#setting-up-configuration-file)\n- [🔒 Managing Permissions](#managing-permissions)\n- [👨‍💻 Development \u0026 Testing](#development--testing)\n- [🔗 Links](#links)\n- [💬 Community Support](#community-support)\n- [📄 License](#license)\n\n## ✨ Features\n\n- Seamlessly integrate Cloudinary Media Library into Strapi admin panel\n- Select and manage media assets directly from Cloudinary\n- Custom field for Cloudinary media assets\n- Support for images, videos and other media types\n- **Automatically includes Cloudinary media URLs and metadata in Strapi API responses** (when using the Cloudinary media field)\n\n## 📋 Requirements\n\n- Strapi v5.0.0 or later\n- Node.js 18+\n- Cloudinary Bucket\n\n## 📦 Installation\n\n```bash\nnpm install @strapi-community/cloudinary-media-library@latest\n# or\nyarn add @strapi-community/cloudinary-media-library@latest\n```\n\n## 🔐 Getting Cloudinary Credentials\n\nTo retrieve your Cloudinary credentials:\n\n- Go to https://cloudinary.com/console\n- Select **Settings** \u003e **API keys**\n- Copy your cloud name and API key.\n\nYou don’t need the API secret for this integration — only cloud name and API key.\n\n## ⚙️ Setting up Configuration File\n\nYour plugin settings should go in `config/plugins.ts`. Here’s an example:\n\n```ts\nexport default {\n  'cloudinary-media-library': {\n    enabled: true,\n    config: {\n      cloudName: 'your-cloud-name',\n      apiKey: 'your-api-key',\n      encryptionKey: '32 chars encryption key',\n    },\n  },\n};\n```\n\nAdditionaly you can set up `cloudName` and `apiKey` properties through Settings page in the Admin panel. Please note that this configuration will overwrite `config/plugin.ts`\n\n![Plugin Configuration](https://www.sensinum.com/img/open-source/strapi-plugin-cloudinary-media-library/cfg-plugin/1.png)\n\nThese options are passed directly to the Cloudinary Media Library widget.\n\n**IMPORTANT** You must set the `encryptionKey` property in the config file. This key is required for Strapi to encrypt credentials in the database. If you don’t provide `encryptionKey` as a 32-character string, the media library will not work.\n\n### Setting up `strapi::security` middlewares to avoid CSP blocking Cloudinary\n\nWhen using Cloudinary's Media Library Plugin, modern browsers enforce Content Security Policy (CSP) rules. These policies prevent scripts, images, frames, and other resources from loading if they originate from domains not explicitly allowed — which will cause the Cloudinary widget to break.\n\nTo fix this, you need to explicitly allow Cloudinary domains in Strapi's security middleware configuration.\n\nEdit `./config/middlewares.js`\n\n```ts\nexport default [\n  'strapi::logger',\n  'strapi::errors',\n  {\n    name: 'strapi::security',\n    config: {\n      contentSecurityPolicy: {\n        useDefaults: true,\n        directives: {\n          'connect-src': [\"'self'\", 'https:'],\n          'img-src': [\n            \"'self'\",\n            'data:',\n            'blob:',\n            'https://market-assets.strapi.io',\n            'https://console.cloudinary.com',\n            'https://res.cloudinary.com',\n          ],\n          'script-src': [\n            \"'self'\",\n            'example.com',\n            'https://media-library.cloudinary.com',\n            'https://upload-widget.cloudinary.com',\n            'https://console.cloudinary.com',\n          ],\n          'media-src': [\n            \"'self'\",\n            'data:',\n            'blob:',\n            'https://console.cloudinary.com',\n            'https://res.cloudinary.com',\n          ],\n          'frame-src': [\n            \"'self'\",\n            'https://media-library.cloudinary.com',\n            'https://upload-widget.cloudinary.com',\n            'https://console.cloudinary.com',\n          ],\n          upgradeInsecureRequests: null,\n        },\n      },\n    },\n  },\n  'strapi::cors',\n  'strapi::poweredBy',\n  'strapi::query',\n  'strapi::body',\n  'strapi::session',\n  'strapi::favicon',\n  'strapi::public',\n];\n```\n\n## 🔐 Managing Permissions\n\nThe **Cloudinary Media Library** plugin supports two types of role-based permissions to control access to its features:\n\n| Permission | Description                                                                                                                    |\n| ---------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| `Read`     | Allows the user to **view Cloudinary credentials** in the Settings page and **upload media** using the Cloudinary input field. |\n| `Settings` | Grants full access to **modify** Cloudinary configuration (cloud name and API key).                                            |\n\n### How to manage permissions\n\n1. Go to the **Strapi Admin Panel**.\n2. Navigate to **Settings → Administration Panel → Roles**.\n3. Select a role (e.g., `Authenticated` or `Super Admin`).\n4. Select the **Plugins** section.\n5. Find and expand **cloudinary-media-library**.\n6. Check the permissions you want to enable:\n   - `☑ Read`\n   - `☑ Settings`\n7. Save changes.\n\n## 👨‍💻 Development \u0026 Testing\n\n- Build: `yarn build`\n- Test backend: `yarn test:server`\n- Test frontend: `yarn test:ts:front`\n\n## 🔗 Links\n\n- [Strapi website](http://strapi.io/)\n- [Strapi community on Slack](http://slack.strapi.io)\n- [Strapi news on Twitter](https://twitter.com/strapijs)\n\n## 💬 Community support\n\n- [GitHub](https://github.com/strapi-community/cloudinary-media-library) (Bug reports, contributions)\n\nYou can also used official support platform of Strapi, and search `[VirtusLab]` prefixed people (maintainers)\n\n- [Discord](https://discord.strapi.io) (For live discussion with the Community and Strapi team)\n- [Community Forum](https://forum.strapi.io) (Questions and Discussions)\n\n## 📄 License\n\nSee the [MIT License](LICENSE) file for licensing information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrapi-community%2Fcloudinary-media-library","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstrapi-community%2Fcloudinary-media-library","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrapi-community%2Fcloudinary-media-library/lists"}