Build or update the BlueBubbles external channel plugin for Moltbot (extension package, REST...
npx skills add itechmeat/llm-code --skill "cloudflare-images"
Install specific skill from multi-skill repository
# Description
Store, transform, and deliver optimized images with Cloudflare Images. Covers image upload (API, Worker, Direct Creator Upload), variants, transformations (URL and Workers), bindings, Polish, signed URLs, formats (AVIF, WebP), R2 integration, watermarks. Keywords: Cloudflare Images, image transformations, variants, /cdn-cgi/image/, imagedelivery.net, Polish, AVIF, WebP, signed URLs, Direct Creator Upload, Images binding, R2, watermark.
# SKILL.md
name: cloudflare-images
description: "Store, transform, and deliver optimized images with Cloudflare Images. Covers image upload (API, Worker, Direct Creator Upload), variants, transformations (URL and Workers), bindings, Polish, signed URLs, formats (AVIF, WebP), R2 integration, watermarks. Keywords: Cloudflare Images, image transformations, variants, /cdn-cgi/image/, imagedelivery.net, Polish, AVIF, WebP, signed URLs, Direct Creator Upload, Images binding, R2, watermark."
Cloudflare Images
End-to-end image storage, transformation, and delivery solution on Cloudflare's global network.
Quick Navigation
- Upload methods β
references/upload.md - Transformations β
references/transformations.md - Variants β
references/variants.md - Workers binding β
references/binding.md - Polish β
references/polish.md - Signed URLs β
references/security.md - Pricing β
references/pricing.md
When to Use
- Storing and delivering optimized images at scale
- Transforming remote images on-the-fly
- Resizing, cropping, converting image formats
- Adding watermarks to images
- Serving responsive images with
srcset - Protecting images with signed URLs
- Optimizing images from R2 storage
Two Usage Modes
| Mode | Description | Billing |
|---|---|---|
| Storage in Images | Upload images to Cloudflare, serve via variants | Images Stored + Images Delivered |
| Transform remote | Optimize images from any origin (R2, S3, etc.) | Images Transformed (unique/30d) |
Quick Start
Upload an Image (API)
curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/images/v1 \
--header 'Authorization: Bearer <API_TOKEN>' \
--header 'Content-Type: multipart/form-data' \
--form file=@./image.jpg
Transform via URL
<img src="/cdn-cgi/image/width=400,quality=80,format=auto/uploads/hero.jpg" />
Transform via Workers
fetch(imageURL, {
cf: {
image: {
width: 800,
height: 600,
fit: "cover",
format: "auto",
},
},
});
URL Format
https://<ZONE>/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE>
<ZONE>β your Cloudflare domain/cdn-cgi/image/β fixed prefix for image transformations<OPTIONS>β comma-separated:width=400,quality=80,format=auto<SOURCE-IMAGE>β absolute path or full URL
Stored Images Delivery
https://imagedelivery.net/<ACCOUNT_HASH>/<IMAGE_ID>/<VARIANT_NAME>
Transformation Options
| Option | Description | Example |
|---|---|---|
width |
Max width in pixels | width=800 |
height |
Max height in pixels | height=600 |
fit |
Resize mode | fit=cover |
format |
Output format | format=auto |
quality |
JPEG/WebP/AVIF quality 1-100 | quality=85 |
gravity |
Crop focus point | gravity=face, gravity=auto |
blur |
Blur radius 1-250 | blur=50 |
sharpen |
Sharpening 0-10 | sharpen=1 |
rotate |
Rotation degrees | rotate=90 |
trim |
Remove pixels from edges | trim=20;30;20;0 |
Fit Modes
| Mode | Behavior |
|---|---|
scale-down |
Shrink only, never enlarge |
contain |
Fit within dimensions, preserve aspect ratio |
cover |
Fill dimensions, crop if needed |
crop |
Like cover but never enlarges |
pad |
Fit within, add background color |
Format Auto
format=auto serves WebP or AVIF based on browser support. Use with Accept header parsing in Workers.
Supported Formats
Input
- JPEG, PNG, GIF (animated), WebP (animated), SVG, HEIC
Output
- JPEG, PNG, GIF, WebP, AVIF, SVG (passthrough)
Note: HEIC must be served as AVIF/WebP/JPEG/PNG. SVG is not resized (inherently scalable).
Limits
| Constraint | Limit |
|---|---|
| Max image dimension | 12,000 pixels |
| Max image area | 100 megapixels |
| Max file size (transformations) | 70 MB |
| Max file size (storage) | 10 MB |
| GIF/WebP animation | 50 megapixels total |
| AVIF output hard limit | 1,200 px (1,600 explicit) |
| Variants per account | 100 |
Workers Integration
Images Binding Setup
# wrangler.toml
[images]
binding = "IMAGES"
Transform with Binding
const response = (await env.IMAGES.input(stream).transform({ width: 800 }).transform({ blur: 20 }).output({ format: "image/avif" })).response();
Draw Watermark
const watermark = await fetch("https://example.com/watermark.png");
const image = await fetch("https://example.com/photo.jpg");
const response = (
await env.IMAGES.input(image.body)
.draw(env.IMAGES.input(watermark.body).transform({ width: 100 }), { bottom: 10, right: 10, opacity: 0.75 })
.output({ format: "image/avif" })
).response();
Get Image Info
const info = await env.IMAGES.info(stream);
// { format, fileSize, width, height }
Recipes
Responsive Images with srcset
<img srcset="/cdn-cgi/image/width=320/photo.jpg 320w, /cdn-cgi/image/width=640/photo.jpg 640w, /cdn-cgi/image/width=1280/photo.jpg 1280w" sizes="(max-width: 640px) 100vw, 640px" src="/cdn-cgi/image/width=640/photo.jpg" alt="Responsive image" />
Face-Aware Cropping
fetch(imageURL, {
cf: {
image: {
width: 200,
height: 200,
fit: "cover",
gravity: "face",
zoom: 0.5, // 0 = more background, 1 = tight crop
},
},
});
Direct Creator Upload
# Get one-time upload URL
curl --request POST \
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v2/direct_upload \
--header "Authorization: Bearer <API_TOKEN>"
# Response: { "uploadURL": "https://upload.imagedelivery.net/..." }
Upload from Worker
const image = await fetch("https://example.com/image.png");
const bytes = await image.bytes();
const formData = new FormData();
formData.append("file", new File([bytes], "image.png"));
await fetch(`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/images/v1`, {
method: "POST",
headers: { Authorization: `Bearer ${TOKEN}` },
body: formData,
});
Critical Prohibitions
- NEVER set up Image Resizing Worker for entire zone (
/*) β blocks non-image requests - NEVER activate Polish and image transformations simultaneously β redundant compression
- NEVER use flexible variants with signed URL tokens β incompatible
- NEVER use custom ID paths with
requireSignedURLs=trueβ not supported - NEVER expect SVG resizing β SVGs are passed through as-is
- NEVER include resizing options in
cacheKeyβ fragments cache
Troubleshooting
No Cf-Resized Header
- Transformations not enabled on zone
- Another Worker intercepting request
- Using dashboard preview (doesn't simulate transforms)
Common Error Codes
| Code | Meaning |
|---|---|
| 9401 | Invalid transformation options |
| 9402 | Image too large |
| 9403 | Request loop detected |
| 9422 | Free tier limit exceeded (5,000/month) |
| 9520 | Unsupported format |
Related Skills
cloudflare-workers- For serverless computecloudflare-pages- For full-stack appscloudflare-r2- R2 object storage
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.