> ## Documentation Index
> Fetch the complete documentation index at: https://cloudinary.com/documentation/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloudinary Image & Video Release Notes: July 09, 2025

## Highlight: New MCP servers and Base44 integration

### MCP Servers

Cloudinary now offers five Model Context Protocol (MCP) servers (Beta), making it easier for you to automate workflows and build your apps with natural language instead of boilerplate code.

These MCPs work hand-in-hand with our [Context7](https://context7.com/about)-indexed docs (optimized for LLM consumption), enabling you to use your favorite AI-powered IDE (like Cursor, WindSurf, VSCode, or Claude Desktop) to interact directly with Cloudinary's APIs.

If you're a frontend developer, you can now skip writing custom backend code or jumping between your IDE and Postman or the Console UI to perform Cloudinary setup tasks. Instead, you can upload assets, create upload presets, define named transformations, and much more by installing our MCP servers and asking your LLM client to do it all for you.

For example, after you've set up the MCP servers, you can ask your LLM client to:

* `Upload assets from the 'summer_campaign' folder within my project. Auto-tag all the images using the Google auto-tagging add-on.`
* `Create a signed upload preset that allows image uploads, sets access control as 'restricted', and generates eager transformations to size the images for mobile devices.`
* `Add the value 'Expired' to the metadata field 'Status' for assets with SKUs '123789', '998y285', and '825168'.`
* `Delete all assets tagged with 'campaign-2024'.`
* `Create a named transformation called 'watermark' that places the image with public ID 'my-company-logo' as an overlay with 50% opacity over the center of the asset.`

[Learn how to get started](cloudinary_llm_mcp)

### Base44 Cloudinary integration

**Base44** is an AI-powered tool that let you build apps without coding. The new [Base44 Cloudinary integration](https://app.base44.com/integrations-catalog/item/684a7b524c8cb269f7b2640a) is preloaded with knowledge of Cloudinary’s product and capabilities so that low-code and no-code builders and vibe coders can quickly create full Cloudinary-powered apps using natural language prompts.

[Learn more](cloudinary_llm_mcp#base44_integration)

## Cloudinary Image

### Preserve transparency with the extract effect

If you're using the [extract effect](transformation_reference#e_extract) (`e_extract` in URLs) on images with transparency, you can now preserve the transparency in the output by using the `preserve-alpha` option. 

For example, keep the transparent background when extracting the watch dial and inverting the result to keep only the strap: 

![Watch strap remaining on a transparent background](https://res.cloudinary.com/demo/image/upload/e_extract:prompt_the%20watch%20dial;invert_true;preserve-alpha_true/docs/wristwatch.png "thumb: h_150")

```nodejs
cloudinary.image("docs/wristwatch.png", {effect: "extract:prompt_the watch dial;invert_true;preserve-alpha_true"})
```

```react
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert().preserveAlpha()
);
```

```vue
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert().preserveAlpha()
);
```

```angular
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert().preserveAlpha()
);
```

```js
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert().preserveAlpha()
);
```

```python
CloudinaryImage("docs/wristwatch.png").image(effect="extract:prompt_the watch dial;invert_True;preserve-alpha_True")
```

```php
(new ImageTag('docs/wristwatch.png'))
	->effect(Effect::extract("the watch dial")->invert()
->preserveAlpha());
```

```java
cloudinary.url().transformation(new Transformation().effect("extract:prompt_the watch dial;invert_true;preserve-alpha_true")).imageTag("docs/wristwatch.png");
```

```ruby
cl_image_tag("docs/wristwatch.png", effect: "extract:prompt_the watch dial;invert_true;preserve-alpha_true")
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation().Effect("extract:prompt_the watch dial;invert_true;preserve-alpha_true")).BuildImageTag("docs/wristwatch.png")
```

```dart
cloudinary.image('docs/wristwatch.png').transformation(Transformation()
	.effect(Effect.extract("the watch dial").invert()
.preserveAlpha()));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setEffect("extract:prompt_the watch dial;invert_true;preserve-alpha_true")).generate("docs/wristwatch.png")!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().effect("extract:prompt_the watch dial;invert_true;preserve-alpha_true")).generate("docs/wristwatch.png");
```

```flutter
cloudinary.image('docs/wristwatch.png').transformation(Transformation()
	.effect(Effect.extract("the watch dial").invert()
.preserveAlpha()));
```

```kotlin
cloudinary.image {
	publicId("docs/wristwatch.png")
	 effect(Effect.extract("the watch dial") { invert()
 preserveAlpha() }) 
}.generate()
```

```jquery
$.cloudinary.image("docs/wristwatch.png", {effect: "extract:prompt_the watch dial;invert_true;preserve-alpha_true"})
```

```react_native
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert().preserveAlpha()
);
```

Without the `preserve-alpha` option, the transparent background is no longer transparent:

![Watch strap remaining on a transparent background](https://res.cloudinary.com/demo/image/upload/e_extract:prompt_the%20watch%20dial;invert_true/docs/wristwatch.png "thumb: h_150")

```nodejs
cloudinary.image("docs/wristwatch.png", {effect: "extract:prompt_the watch dial;invert_true"})
```

```react
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert()
);
```

```vue
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert()
);
```

```angular
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert()
);
```

```js
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert()
);
```

```python
CloudinaryImage("docs/wristwatch.png").image(effect="extract:prompt_the watch dial;invert_True")
```

```php
(new ImageTag('docs/wristwatch.png'))
	->effect(Effect::extract("the watch dial")->invert());
```

```java
cloudinary.url().transformation(new Transformation().effect("extract:prompt_the watch dial;invert_true")).imageTag("docs/wristwatch.png");
```

```ruby
cl_image_tag("docs/wristwatch.png", effect: "extract:prompt_the watch dial;invert_true")
```

```csharp
cloudinary.Api.UrlImgUp.Transform(new Transformation().Effect("extract:prompt_the watch dial;invert_true")).BuildImageTag("docs/wristwatch.png")
```

```dart
cloudinary.image('docs/wristwatch.png').transformation(Transformation()
	.effect(Effect.extract("the watch dial").invert()));
```

```swift
imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setEffect("extract:prompt_the watch dial;invert_true")).generate("docs/wristwatch.png")!, cloudinary: cloudinary)
```

```android
MediaManager.get().url().transformation(new Transformation().effect("extract:prompt_the watch dial;invert_true")).generate("docs/wristwatch.png");
```

```flutter
cloudinary.image('docs/wristwatch.png').transformation(Transformation()
	.effect(Effect.extract("the watch dial").invert()));
```

```kotlin
cloudinary.image {
	publicId("docs/wristwatch.png")
	 effect(Effect.extract("the watch dial") { invert() }) 
}.generate()
```

```jquery
$.cloudinary.image("docs/wristwatch.png", {effect: "extract:prompt_the watch dial;invert_true"})
```

```react_native
new CloudinaryImage("docs/wristwatch.png").effect(
  extract("the watch dial").invert()
);
```

[Learn more](effects_and_artistic_enhancements#use_ai_to_determine_what_to_remove_or_keep_in_an_image)

## Cloudinary Video

### New major version of Cloudinary Video Player

The Cloudinary Video Player has been significantly updated in version 3.0.0, delivering improved performance, streamlined usage and adaptive streaming enhancements:

* **Performance optimizations**: The player now features a lighter bundle size (only 130 KB) with tree-shaking and lazy-loading of modules for faster load times.
* **Simplified packaging**: The separate 'light' package has been removed, with the optimized behavior as the new default.
* **Adaptive streaming improvements**: HLS and DASH modules are now lazily loaded only when needed, reducing initial load times for most use cases. You can also configure how HLS/DASH videos start playing with `fastStart`, `balanced`, or `highQuality` strategies to optimize the balance between playback start time and initial quality.

[Learn more](cloudinary_video_player)

### Live Streams engagement metrics

Alongside the existing live stream input health metrics, you can now view engagement metrics for your live streams. This enables you to track metrics such as viewer counts, the average view duration, and the number of concurrent viewers.

![Live stream health](https://res.cloudinary.com/cloudinary/image/upload/q_auto/bo_1px_solid_gray/docs/live_stream_health.png  "thumb: w_600,dpr_2, width: 600, popup:true")

[Learn more](video_live_streaming#monitoring_and_engagement)

### View video usage by resolution in the Dashboard

You can now drill down into video usage by resolution directly in the **Seconds of Delivered Video by Resolution** graph on the [Dashboard](https://console.cloudinary.com/app/home/dashboard).

This update lets you see how viewers engage with your content at different resolutions by showing video seconds broken down accordingly.

**Accounts with video billing plans**:  The graph also shows billable seconds by resolution. These are calculated by multiplying viewed seconds by a resolution-specific ratio, giving you insight into how resolution impacts billing.

![Billable seconds](https://res.cloudinary.com/release-notes/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1751538824/billable_seconds_graph.png "thumb:w_800,dpr_2, width:800, with_code:false, with_url:false, popup:true")

**Other accounts**: If your account doesn't have a video billing plan, you’ll still benefit from the enhanced view, with video seconds segmented by resolution for greater visibility into viewing behavior.

![Video seconds by resolution](https://res.cloudinary.com/release-notes/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1751539027/video_seconds_by_resolution.png "thumb:w_800,dpr_2, width:800, with_code:false, with_url:false, popup:true")

> **NOTE**: Video resolution data is available only for usage starting in mid-March 2025. Earlier usage won't include resolution information.

## Asset and account management

### Enhanced backup settings UI

There's now a new and improved UI for backing up new uploads and existing assets.

![Backup](https://res.cloudinary.com/release-notes/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1750714605/new_backup.png "thumb:w_500,dpr_2, width:500, with_code:false, with_url:false, popup:true") 

[Learn more](dam_admin_product_environment_settings#backup)

### Assigning users to product environments

From the [User Management > Users](https://console.cloudinary.com/app/settings/user-management) page in Console Settings, you can now assign users to product environments directly by clicking the **Product Environments** column. Assign up to 30 environments, or select **All** with a single click.

[Learn more](user_provisioning#updating_users)

### New: Root API keys and users

Starting June 5, 2025: 

* **Root API keys**: Any new product environment created after the above date has its first API key designated as a root key. 

* **Root user**: The user who creates a new Cloudinary account is set as the [root user](dam_admin_users_groups#root_user). That user always retains full administrative control on all product environments in the account.

* **Root provisioning account API key** Enterprise accounts with access to the Provisioning API get a [root account API key](account_settings#root_account_management_key). 
  
You can't delete or disable the root keys or root user. This is clearly indicated in the relevant locations in the Console UI.

**Learn more**: [Root API key](product_environment_settings#root_api_key) | [Root user](user_provisioning#root_user)

### Account API key management

Enterprise accounts with access to the Provisioning API can now manage their keys from the [Account API keys](https://console.cloudinary.com/app/settings/account-api-keys) section in Console Settings, including copying credentials, editing existing keys, and creating new ones.

![Account API keys](https://cloudinary-res.cloudinary.com/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1749026434/docs/account_api_keys_settings.png "thumb: dpr_2,w_650, with_code:false, with_url:false, width:650, popup:true")

[Learn more](account_settings#account_management_keys)

### Billing usage endpoint in the Provisioning API

Enterprise users with access to the Provisioning API will soon be able to retrieve detailed billing data through a new `billing_usage` endpoint. This structured response makes it easier for developers to access usage metrics and build dashboards.

## Console 

### Theme dark mode/light mode selector

You can now choose whether you prefer dark mode or light mode (or to apply your system theme default) in the Cloudinary Console. 

![Dark theme selection](https://cloudinary-res.cloudinary.com/image/upload/bo_1px_solid_grey/f_auto/q_auto/docs/profile_theme_option.png "thumb: dpr_2,w_300, width:300, with_code:false, with_url:false, popup:true")

Your theme selection applies only for you and doesn't affect other users in your account.

> **TIP**: You can also set your preferred theme from the [My Profile](https://console.cloudinary.com/settings/profile) page in your Console Settings.

### Installed add-ons in the Add-on Marketplace

Most accounts now have access to the **Add-on Marketplace** from the left sidebar of the Console. From the Marketplace, you can register for new add-ons and manage the ones you already have:

![Add-ons Marketplace in left sidebar](https://res.cloudinary.com/release-notes/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1751808119/add-ons_icon.png "thumb:w_80,dpr_2, width:80, with_code:false, with_url:false, popup:true")

Previously, this page only showed available add-ons. Now, a new **Installed Add-ons** tab lets you view and manage the add-ons you already have, all in one place.

![Installed add-ons in the new Add-on Marketplace](https://res.cloudinary.com/release-notes/image/upload/f_auto/q_auto/bo_1px_solid_grey/v1751537652/installed_addons_marketplace.png "thumb:w_800,dpr_2, width:800, with_code:false, with_url:false, popup:true")

> **NOTE**:
>
> Some accounts may still see the legacy add-ons page under **Settings > Add-ons** instead. Those accounts will be gradually migrated to the new **Add-on Marketplace** over time.

[Learn more](cloudinary_add_ons)

## Documentation

### New accessible media guide

Our new comprehensive accessible media guide helps you create inclusive digital experiences using Cloudinary's tools and best practices. The guide covers accessibility considerations for images, videos, audio content, and interactive media, with references to WCAG success criteria.

Key topics include:

* **Image accessibility**: Managing text alternatives, AI-based image captioning, and visual considerations for users with different abilities
* **Video and audio accessibility**: Implementing captions, audio descriptions, transcriptions, and sign language overlays
* **Visual and audio clarity**: Optimizing contrast, color usage, and audio controls for better accessibility
* **Interactive content**: Making media players, galleries, and controls accessible via keyboard navigation and screen readers

The guide provides code examples, implementation strategies, and Cloudinary-specific solutions to help you build accessible media experiences from the start.

[Learn more](accessible_media)

### Get doc page as markdown with the click of a button

You’ll now see three quick-action buttons at the top of every documentation page for getting the page's markdown content. You can open it in a new tab and grab the URL, copy source content to your clipboard, or download the file.

These options make it easy for you to use the markdown content as context for your LLM IDEs and chat clients.

![Buttons to get Cloudinary documentation as markdown](https://res.cloudinary.com/cloudinary/image/upload/f_auto/q_auto/bo_1px_solid_gray/docs/markdown_actions "thumb: w_400,dpr_2, width: 400")

## Announcements

### SDK security upgrade

We recently released an enhanced security version of our [backend](backend_sdks) and [mobile](mobile_sdks) SDKs that improves the validation and handling of input parameters. We recommend upgrading to the [latest version][changelog-link] of the SDKs you use to benefit from these security improvements. 

### New PHP version released

Cloudinary PHP SDK v3 is now available. Explore the [documentation](php_integration), view the full list of updates in the [CHANGELOG](https://github.com/cloudinary/cloudinary_php/blob/master/CHANGELOG.md), or check out the [Cloudinary PHP SDK GitHub repo](https://github.com/cloudinary/cloudinary_php), to get started.

### JPEGmini Image Optimization add-on deprecation

The JPEGmini Image Optimization add-on will be turned off after 31 October 2025 and any URL using `q_jpegmini` will return an HTTP 400 error.  If you're an existing subscriber to this add-on, you should use the [automatic quality](transformation_reference#q_auto) transformation (`q_auto`) instead. [Contact support](https://support.cloudinary.com/hc/en-us/requests/new) with any questions or requests for guidance.

