Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manage images and videos with Cloudinary. Use when a user asks to optimize images, add image transformations, implement responsive images, upload media, or serve optimized assets from a CDN.
.claude/skills/terminalskills-cloudinary/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-12 | ✓→✓ | = Same ✓ | 3% | 0% |
| case-04 | ✓→✓ | = Same ✓ | -38% | 0% |
Cloudinary is a media management platform — upload, transform, optimize, and deliver images/videos via CDN. On-the-fly transformations (resize, crop, format conversion, AI-based cropping) via URL parameters.
typescript// lib/cloudinary.ts — Upload and transform import { v2 as cloudinary } from 'cloudinary' cloudinary.config({ cloud_name: process.env.CLOUDINARY_CLOUD_NAME, api_key: process.env.CLOUDINARY_API_KEY, api_secret: process.env.CLOUDINARY_API_SECRET, }) // Upload image const result = await cloudinary.uploader.upload(filePath, { folder: 'products', transformation: [ { width: 1200, height: 1200, crop: 'limit' }, // max dimensions { quality: 'auto', fetch_format: 'auto' }, // auto-optimize ], }) // result.secure_url → https://res.cloudinary.com/myapp/image/upload/v1234/products/abc.jpg
typescript// Generate optimized URLs without re-uploading function getImageUrl(publicId: string, options: { width: number; height: number }) { return cloudinary.url(publicId, { width: options.width, height: options.height, crop: 'fill', gravity: 'auto', // AI-based smart crop quality: 'auto', // auto quality fetch_format: 'auto', // WebP/AVIF based on browser dpr: 'auto', // device pixel ratio }) } // Responsive srcset function getSrcSet(publicId: string) { return [320, 640, 960, 1280, 1920] .map(w => `${getImageUrl(publicId, { width: w, height: Math.round(w * 0.75) })} ${w}w`) .join(', ') }
tsx// next.config.js module.exports = { images: { loader: 'cloudinary', path: 'https://res.cloudinary.com/myapp/image/upload/', }, } // Or use next-cloudinary import { CldImage } from 'next-cloudinary' <CldImage src="products/sneakers" width={800} height={600} crop="fill" gravity="auto" alt="Product image" sizes="(max-width: 768px) 100vw, 50vw" />
quality: 'auto' and fetch_format: 'auto' — Cloudinary picks the best format/quality.gravity: 'auto' uses AI to detect the subject and crop intelligently.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,581 | 9,042 | -45% | 1 | 1 | 0% | 3,814 | 2,711 | -29% | 0 | 0 | — |
case-02 | fail→fail | 9,432 | 7,290 | -23% | 1 | 1 | 0% | 1,943 | 2,355 | +21% | 0 | 0 | — |
case-03 | fail→pass | 8,954 | 4,480 | -50% | 1 | 1 | 0% | 1,911 | 1,690 | -12% | 0 | 0 | — |
case-12 | pass→pass | 6,891 | 10,120 | +47% | 1 | 1 | 0% | 1,202 | 1,238 | +3% | 0 | 0 | — |
case-04 | pass→pass | 14,815 | 3,892 | -74% | 1 | 1 | 0% | 2,281 | 1,423 | -38% | 0 | 0 | — |
case-05 | pass→pass | 9,142 | 7,431 | -19% | 1 | 1 | 0% | 1,741 | 2,229 | +28% | 0 | 0 | — |
case-06 | fail→fail | 10,920 | 8,946 | -18% | 1 | 1 | 0% | 2,328 | 2,565 | +10% | 0 | 0 | — |
case-07 | pass→pass | 16,109 | 12,981 | -19% | 1 | 1 | 0% | 2,610 | 3,225 | +24% | 0 | 0 | — |
case-08 | fail→fail | 16,100 | 14,520 | -10% | 1 | 1 | 0% | 2,683 | 3,440 | +28% | 0 | 0 | — |
case-09 | pass→pass | 9,171 | 3,705 | -60% | 1 | 1 | 0% | 1,589 | 1,499 | -6% | 0 | 0 | — |
case-10 | pass→pass | 9,632 | 5,617 | -42% | 1 | 1 | 0% | 1,906 | 1,836 | -4% | 0 | 0 | — |
case-11 | fail→pass | 7,797 | 3,420 | -56% | 1 | 1 | 0% | 1,571 | 1,557 | -1% | 0 | 0 | — |
case-13 | fail→fail | 9,314 | 5,744 | -38% | 1 | 1 | 0% | 1,749 | 1,822 | +4% | 0 | 0 | — |
case-14 | pass→pass | 14,369 | 12,459 | -13% | 1 | 1 | 0% | 2,248 | 2,664 | +19% | 0 | 0 | — |
case-15 | pass→pass | 8,889 | 7,375 | -17% | 1 | 1 | 0% | 1,474 | 1,990 | +35% | 0 | 0 | — |
case-16 | pass→pass | 4,129 | 2,738 | -34% | 1 | 1 | 0% | 658 | 1,266 | +92% | 0 | 0 | — |
case-17 | pass→pass | 7,373 | 2,584 | -65% | 1 | 1 | 0% | 1,231 | 1,234 | +0% | 0 | 0 | — |
case-18 | pass→pass | 8,678 | 4,074 | -53% | 1 | 1 | 0% | 1,349 | 1,407 | +4% | 0 | 0 | — |
case-19 | pass→pass | 6,092 | 3,713 | -39% | 1 | 1 | 0% | 1,115 | 1,428 | +28% | 0 | 0 | — |
case-20 | pass→pass | 10,880 | 8,759 | -19% | 1 | 1 | 0% | 2,193 | 2,708 | +23% | 0 | 0 | — |
case-21 | pass→pass | 7,642 | 4,699 | -39% | 1 | 1 | 0% | 1,278 | 1,497 | +17% | 0 | 0 | — |
case-22 | pass→pass | 6,398 | 4,673 | -27% | 1 | 1 | 0% | 1,244 | 1,496 | +20% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.