{"id":15064516,"url":"https://github.com/ainsleydev/strapi-provider-upload-vercel","last_synced_at":"2025-08-10T06:09:20.665Z","repository":{"id":197818712,"uuid":"699508659","full_name":"ainsleydev/strapi-provider-upload-vercel","owner":"ainsleydev","description":"A provider for Strapi that uploads media to Vercel's Blob store.","archived":false,"fork":false,"pushed_at":"2024-03-21T19:49:32.000Z","size":303,"stargazers_count":3,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-22T14:20:51.402Z","etag":null,"topics":["cms","strapi","typescript","uploader","vercel"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/strapi-provider-upload-vercel","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/ainsleydev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/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},"funding":{"github":["ainsleyclark"]}},"created_at":"2023-10-02T19:17:10.000Z","updated_at":"2025-03-01T21:38:30.000Z","dependencies_parsed_at":"2024-09-25T03:26:03.062Z","dependency_job_id":"76107416-f92c-460b-9095-5a52dc188804","html_url":"https://github.com/ainsleydev/strapi-provider-upload-vercel","commit_stats":null,"previous_names":["ainsleydev/strapi-provider-upload-vercel"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ainsleydev/strapi-provider-upload-vercel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fstrapi-provider-upload-vercel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fstrapi-provider-upload-vercel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fstrapi-provider-upload-vercel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fstrapi-provider-upload-vercel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ainsleydev","download_url":"https://codeload.github.com/ainsleydev/strapi-provider-upload-vercel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fstrapi-provider-upload-vercel/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269683189,"owners_count":24458628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-10T02:00:08.965Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["cms","strapi","typescript","uploader","vercel"],"created_at":"2024-09-25T00:19:46.327Z","updated_at":"2025-08-10T06:09:20.642Z","avatar_url":"https://github.com/ainsleydev.png","language":"TypeScript","funding_links":["https://github.com/sponsors/ainsleyclark"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./res/symbol.png\" height=\"86\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://ainsley.dev\"\u003e\n        \u003ch3 align=\"center\"\u003eainsley.dev\u003c/h3\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![npm](https://img.shields.io/npm/v/strapi-provider-upload-vercel.svg?style=flat-shiny\u0026logo=npm\u0026color=white)](https://www.npmjs.com/package/strapi-provider-upload-vercel)\n![Made with TypeScript](https://img.shields.io/badge/Made%20with-TypeScript-blue.svg?style=flat\u0026logo=typescript)\n[![Lint](https://github.com/ainsleydev/audits.com/actions/workflows/lint.yaml/badge.svg?branch=main\u0026query=main)](https://github.com/ainsleydev/audits.com/actions/workflows/lint.yaml?query=main)\n[![ainsley.dev](https://img.shields.io/badge/-ainsley.dev-black?style=flat\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH5wEYDzUGL1b35AAABA1JREFUWMPtlttvFVUUxn977ZnZu+W0tLalqRovBAUvQag0xNQbpSIosSSIJC198YknJfHJxDf9A/DBJ0x8MbFACjVqvCASq6FYFLFBvJAaAomkFCmhHGpLO+PDzOmZzpn2nKP4pCs5ycmevb7vW99as/fA//FfD1XO5p1nzuA3NWJHx5T8cVkRBPHHQfRjd0tzyZhOOQIy27bAxET9zCuvvhY0r2kC/OiRABeAN4BL/4oDr9+3lGszPs7UVNfUE23v3Nj5koszR/8N4EXg3XJckFIFuCLUuU7GWNNtTg25cu4syJx0F+gGMuU4UJKAt1Yux1UKV6TVat1qs+OYwQESMwDQCjwKsOv4iZsnwGihwbiuEek2WjJGhMrvv0UujYKa08VFkQvuTXNgz6oVeCIo1CqrZYMRwTiaytERKn44kRQAsAFYDbBrsLgLRQU0GI919TXKiHQaUQ1GBCuCCQKqjg/MqInrM4lZrgc6A1CljHhRAZ4Ip65m77FaOmbJdehC5vzZr1RAf/T6x6NDwb3/uAVfP74GnwCjZasRuXuWXASj9XQme+3t6erqPcB0IvUuYCsUH8YFBRhRNBqvyYpsn0MeOnG6wvc/9x33MPBjSvp24Na/7cDP7Y/gKIURecZoeTBObkSwWg7UNjaOeFfGLgK9KRAPAM8Wc2FeAUaEWtddbEV2WBFtREXkCqvlghE5yOQkvucBHAR+T0BooAtYXLYDI5sewxWFJ/Kk1bI2UTlW5DMFp03+JPwJ+DQFai2wbiEXUgVUas0trmuslm4jUmGi/tuwDVmrpafBuNPVrs7N/wzQA2QTUJbwYLIlOxB0tOGJ4IhqsSJts+T54Rv0lBz1RFh9ZJA385fOAHAshaMNaAF4OcWFQgeUwhMlrlJdnqjaOLkR8Y2WvbWec9VIQeo4sJf8FZ2LmmgWJO1cmm8I7wc2a6XwosGL+v+rFfnYUYplh47Obo5dvZ8Av6TgbSZ8KxYWEGxZn/u7Dbg9t8HNnwF9S2qqzqVUn4vzQF/K+m3AC1A4jGlId0QC8l0BXKVGrahe//okNR99WZAUc6EXuJiC+zxw57wOxKp/DliRAvCFKDUkxS+YIeBwyvryCHuOC0kH6oBOCj/V/gTeA6aK0oefZj3ARGJdRdh1BQ7Eqm8HHk4B/Q7oB1B9acWFEWtDf5STjGbgqbgLcQcqCQ8NL5EUAPuBsRKqz8UVYB+F97QXcSyatSXoWJ8zvB04AFQlkoaBp4HhhaqPR1TdUsLjeVni8TjhVX0odCAkd4AdKeQAHxIwXEb1Odt+Az5IeVQVcTmhgDBWAhtTNl8G9qGAwKfU2N3SnJvi/RFGMjYCD8UFdACNKRsHgZMA6v0j5ZpAlPtNyvqSiJO/AKik60y0ALlUAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIzLTAxLTI0VDE1OjUzOjA2KzAwOjAwm5vntAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMy0wMS0yNFQxNTo1MzowNiswMDowMOrGXwgAAABXelRYdFJhdyBwcm9maWxlIHR5cGUgaXB0YwAAeJzj8gwIcVYoKMpPy8xJ5VIAAyMLLmMLEyMTS5MUAxMgRIA0w2QDI7NUIMvY1MjEzMQcxAfLgEigSi4A6hcRdPJCNZUAAAAASUVORK5CYII=)](https://ainsley.dev)\n[![Twitter Handle](https://img.shields.io/twitter/follow/ainsleydev)](https://twitter.com/ainsleydev)\n\n\u003c/div\u003e\n\n## Strapi Vercel Blob Provider\n\nA provider for Strapi that uploads media to Vercel's Blob store.\n\n## Install\n\n`npm install strapi-provider-upload-vercel`\n\n## Configuration\n\nThe plugin settings mimic the SDK parameters defined in\ntheir [documentation](https://vercel.com/docs/storage/vercel-blob/using-blob-sdk)\n\n-   `token` A string specifying the token to use when making requests. It defaults to `process.env.BLOB_READ_WRITE_TOKEN`\n    when deployed on Vercel as explained in Read-write token. You can also pass a client token created with\n    the `generateClientTokenFromReadWriteToken` method\n-   `addRandomSuffix` A boolean specifying whether to add a random suffix to the pathname. It defaults to `true`.\n-   `cacheControlMaxAge` A number in seconds to configure the edge and browser cache. Defaults to one year. See the\n    caching documentation for more details.\n\n### Provider Configuration\n\n`./config/plugins.js` or `./config/plugins.ts` for TypeScript projects:\n\n```typescript\nmodule.exports = ({ env }) =\u003e ({\n    upload: {\n        config: {\n            provider: 'strapi-provider-upload-vercel',\n            providerOptions: {\n                token: env('VERCEL_BLOB_TOKEN'),\n                addRandomSuffix: true,\n                cacheControlMaxAge: 31536000, // Year in seconds\n            },\n        },\n    },\n});\n```\n\n## Security Middleware Configuration\n\nDue to the default settings in the Strapi Security Middleware you will need to modify the `contentSecurityPolicy`\nsettings to properly see thumbnail previews in the Media Library. You should replace `strapi::security` string with the\nobject below instead as explained in the middleware configuration documentation.\n\n```typescript\nexport default [\n    // ...\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://yourbucketname.public.blob.vercel-storage.com',\n                    ],\n                    'media-src': [\n                        \"'self'\",\n                        'data:',\n                        'blob:',\n                        'https://yourbucketname.public.blob.vercel-storage.com',\n                    ],\n                    upgradeInsecureRequests: null,\n                },\n            },\n        },\n    },\n];\n```\n\n## Open Source\n\n[ainsley.dev](https://ainsley.dev) permits the use of any code found within the repository for use with external\nprojects.\n\n## Trademark\n\nainsley.dev and the ainsley.dev logo are either registered trademarks or trademarks of ainsley.dev LTD in the United\nKingdom and/or other countries. All other trademarks are the property of their respective owners.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainsleydev%2Fstrapi-provider-upload-vercel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fainsleydev%2Fstrapi-provider-upload-vercel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainsleydev%2Fstrapi-provider-upload-vercel/lists"}