Backend Media Handler

TinaCMS supports using external media providers, however a light backend media handler needs to be setup/hosted by the user. TinaCMS offers some helpers to make this easy, for cloudinary,s3, & dos ("Digital Ocean Spaces").

You'll also need to define your own authorization function, to check if users are allowed access to the handler.

Installation

Depending on your site's framework & hosting provider, there are multiple ways to host the media handler.

In the following examples, replace <YOUR_MEDIA_STORE_NAME> with cloudinary,s3, or dos.

Option 1) Next.js API Routes (NextJS-only)

Implementation details

Option 2) Vercel API Routes

Implementation details

Option 3) Netlify Functions

Implementation details

Option 3) AWS Lambda

Implementation details

Register the Media Store on the frontend

Now, you can replace the default repo-based media with the external media store. You can register a media store via the loadCustomStore prop.

The loadCustomStore prop can be configured within tina/config file.

Make sure you commit your changes to the config and tina-lock.json file at the same time as you push to production on TinaCloud as otherwise your assets will still be prefixed with https://assets.tina.io as if you were still using repo based media

Now you can manage external media store inside TinaCMS. To learn more about each media store in detail, please refer to the next sections.

Last Edited: September 18, 2025