Agent skill
cloudinary
Cloudinary API for image/video management. Use when user mentions "Cloudinary", "upload image", "transform image", or media assets.
Install this agent skill to your Project
npx add-skill https://github.com/vm0-ai/vm0-skills/tree/main/cloudinary
SKILL.md
Cloudinary Media Hosting
Cloudinary provides image and video hosting with CDN delivery, automatic optimization, and on-the-fly transformations.
When to Use
- Upload images with automatic optimization
- Upload videos with CDN delivery
- Get CDN-delivered media URLs
- Apply transformations (resize, crop, format conversion)
- Concatenate/splice multiple videos
- Host media for production applications
Prerequisites
Set the following environment variables:
export CLOUDINARY_CLOUD_NAME=your_cloud_name
export CLOUDINARY_TOKEN=your_api_key
export CLOUDINARY_API_SECRET=your_api_secret
Get credentials from: https://console.cloudinary.com/settings/api-keys
How to Use
Method 1: Unsigned Upload (Simpler)
First, create an unsigned upload preset in Cloudinary Console: Settings > Upload > Upload presets > Add upload preset > Signing Mode: Unsigned
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/image/upload" -F "file=@/path/to/image.png" -F "upload_preset=your_preset_name"
Method 2: Signed Upload
Generate signature and upload:
# Generate timestamp
TIMESTAMP=$(date +%s)
# Generate signature (alphabetical order of params)
SIGNATURE=$(echo -n "timestamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
# Upload
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/image/upload" -F "file=@/path/to/image.png" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Upload from URL
TIMESTAMP=$(date +%s)
SIGNATURE=$(echo -n "timestamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/image/upload" -F "file=https://example.com/image.png" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Upload Video
TIMESTAMP=$(date +%s)
SIGNATURE=$(echo -n "timestamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/video/upload" -F "file=@/path/to/video.mp4" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Upload Video with Custom Public ID
TIMESTAMP=$(date +%s)
PUBLIC_ID="my-videos/clip1"
SIGNATURE=$(echo -n "public_id=$PUBLIC_ID×tamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/video/upload" -F "file=@/path/to/video.mp4" -F "public_id=$PUBLIC_ID" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Upload Video from URL
TIMESTAMP=$(date +%s)
PUBLIC_ID="my-videos/clip1"
SIGNATURE=$(echo -n "public_id=$PUBLIC_ID×tamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/video/upload" -F "file=https://example.com/video.mp4" -F "public_id=$PUBLIC_ID" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
With Custom Public ID
TIMESTAMP=$(date +%s)
PUBLIC_ID="my-folder/my-image"
SIGNATURE=$(echo -n "public_id=$PUBLIC_ID×tamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/image/upload" -F "file=@/path/to/image.png" -F "public_id=$PUBLIC_ID" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Response
{
"public_id": "sample",
"secure_url": "https://res.cloudinary.com/demo/image/upload/v1234567890/sample.png",
"url": "http://res.cloudinary.com/demo/image/upload/v1234567890/sample.png",
"format": "png",
"width": 800,
"height": 600
}
Key field: secure_url - Use this in Markdown: 
URL Transformations
Cloudinary URLs support on-the-fly transformations:
https://res.cloudinary.com/{cloud_name}/image/upload/{transformations}/{public_id}.{format}
Examples:
# Resize to 300x200
.../image/upload/w_300,h_200/sample.png
# Auto format and quality
.../image/upload/f_auto,q_auto/sample.png
# Crop to square
.../image/upload/w_200,h_200,c_fill/sample.png
# Combine transformations
.../image/upload/w_400,h_300,c_fill,f_auto,q_auto/sample.png
Video Concatenation (Splice)
Concatenate videos using URL transformations with l_video: (overlay) and fl_splice flag.
Basic Concatenation
Append clip2 to the end of clip1:
https://res.cloudinary.com/{cloud_name}/video/upload/l_video:clip2,fl_splice/fl_layer_apply/clip1.mp4
Concatenate Multiple Videos
Append clip2 and clip3 to clip1:
https://res.cloudinary.com/{cloud_name}/video/upload/l_video:clip2,fl_splice/fl_layer_apply/l_video:clip3,fl_splice/fl_layer_apply/clip1.mp4
With Uniform Size
Resize all videos to same dimensions:
https://res.cloudinary.com/{cloud_name}/video/upload/w_640,h_360,c_fill/l_video:clip2,fl_splice,w_640,h_360,c_fill/fl_layer_apply/clip1.mp4
With Fade Transition
Add fade out (-1000ms) on first video and fade in (1000ms) on second:
https://res.cloudinary.com/{cloud_name}/video/upload/w_640,h_360,c_fill,e_fade:-1000/l_video:clip2,fl_splice,e_fade:1000,w_640,h_360,c_fill/fl_layer_apply/clip1.mp4
Add Image as Intro (3 seconds)
Prepend an image as intro:
https://res.cloudinary.com/{cloud_name}/video/upload/l_intro_image,fl_splice,du_3/so_0,fl_layer_apply/clip1.mp4
Limitations
- URL length limit (~2000 chars) restricts number of videos
- First request triggers server-side processing (slow)
- For many videos (10+), consider using ffmpeg or dedicated video APIs
Delete Media
TIMESTAMP=$(date +%s)
PUBLIC_ID="<your-public-id>"
SIGNATURE=$(echo -n "public_id=$PUBLIC_ID×tamp=$TIMESTAMP$(printenv CLOUDINARY_API_SECRET)" | sha1sum | cut -d" " -f1)
# Delete image
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/image/destroy" -F "public_id=$PUBLIC_ID" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
# Delete video
curl -X POST "https://api.cloudinary.com/v1_1/<your-cloud-name>/video/destroy" -F "public_id=$PUBLIC_ID" -F "api_key=$(printenv CLOUDINARY_TOKEN)" -F "timestamp=$TIMESTAMP" -F "signature=$SIGNATURE"
Free Tier Limits
- 25 credits/month
- ~25,000 transformations or ~25GB storage/bandwidth
- Sufficient for personal projects
Guidelines
- Use unsigned presets for simpler uploads when security isn't critical
- Signature order: Parameters must be alphabetically sorted when generating signature
- Auto optimization: Add
f_auto,q_autoto URLs for automatic format/quality - Folders: Use
public_id="folder/subfolder/name"to organize media - Video concatenation: Keep URLs short; for 10+ videos use external tools
API Reference
- Image Upload: https://cloudinary.com/documentation/image_upload_api_reference
- Video Upload: https://cloudinary.com/documentation/video_upload_api_reference
- Video Concatenation: https://cloudinary.com/documentation/video_trimming_and_concatenating
- Console: https://console.cloudinary.com/
- Transformation Reference: https://cloudinary.com/documentation/transformation_reference
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
brave-search
Brave Search API for web search. Use when user says "search web", "Brave search", or asks to "find on web" without specifying Google.
supadata
Supadata API for YouTube/web data. Use when user mentions "Supadata", "YouTube data", "channel stats", or web scraping data.
roadmap-planning
Build and prioritize product roadmaps using scoring models like RICE, ICE, and value-effort matrices. Activate when creating a product roadmap, prioritizing features, sequencing initiatives, mapping dependencies, balancing team capacity, choosing between Now/Next/Later or quarterly planning, or communicating roadmap tradeoffs to executives and stakeholders.
qdrant
Qdrant API for vector search. Use when user mentions "Qdrant", "vector database", "semantic search", or embeddings storage.
calendly
Calendly scheduling API. Use when user mentions "Calendly", "calendly.com", "schedule a meeting", "booking link", "event types", or asks about interview scheduling.
stripe
Stripe API for payments. Use when user mentions "Stripe", "payment", "subscription", "billing", "invoice", or asks about payment processing.
Didn't find tool you were looking for?