Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add rules/netlify/context-and-tools/netlify-image-cdn-user-uploadsgit clone --depth 1 https://github.com/netlify/context-and-toolsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/netlify/context-and-tools/netlify-image-cdn-user-uploads)<a href="https://agentmods.dev/rules/netlify/context-and-tools/netlify-image-cdn-user-uploads"><img src="https://agentmods.dev/badge/rules/netlify/context-and-tools/netlify-image-cdn-user-uploads.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00016 | $0.01283 |
| Opus 5 | $0.00008 | $0.00642 |
| Sonnet 5 | $0.00003 | $0.00257 |
| Haiku 4.5 | $0.00002 | $0.00128 |
Grade A, and why
netlify-image-cdn-user-uploads scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 161 lines — stays where its author put it; the contents beside it link to each section on GitHub.
User-Uploaded Images Pipeline
Compose Netlify Functions (upload handler) + Netlify Blobs (storage) + Image CDN (serving/transforming) to build a complete user-uploaded image pipeline.
Architecture
- Upload — A Netlify Function receives multipart form data, validates, and stores in Blobs
- Storage — Netlify Blobs stores the binary image with metadata
- Serve — A Netlify Function retrieves the blob and serves it at
/uploads/:key - Transform — A redirect maps
/img/:keyto/.netlify/images?url=/uploads/:keyfor CDN optimization
Dependencies
npm install @netlify/blobs
Upload Handler
// netlify/functions/upload.ts
import type { Context, Config } from "@netlify/functions";
import { getStore } from "@netlify/blobs";
import { randomUUID } from "crypto";
const ALLOWED_TYPES = ["image/jpeg", "image/png", "image/gif", "image/webp"];
const MAX_SIZE = 4 * 1024 * 1024; // 4 MB
export default async (req: Request, context: Context) => {
if (req.method !== "POST") {
return new Response("Method not allowed", { status: 405 });
}
const formData = await req.formData();
const image = formData.get("image") as File;
if (!image) return Response.json({ error: "No image provided" }, { status: 400 });
if (!ALLOWED_TYPES.includes(image.type)) return Response.json({ error: "Invalid type" }, { status: 400 });
if (image.size > MAX_SIZE) return Response.json({ error: "File too large" }, { status: 400 });
const extension = image.name.split(".").pop() || "jpg";
const key = `${randomUUID()}.${extension}`;
const store = getStore({ name: "images", consistency: "strong" });
await store.set(key, image, {
metadata: {
contentType: image.type,
originalFilename: image.name,
uploadedAt: new Date().toISOString(),
},
});
return Response.json({ success: true, key, url: `/img/${key}` });
};
export const config: Config = { path: "/api/upload", method: "POST" };
Serve Handler
// netlify/functions/serve-image.ts
import type { Context, Config } from "@netlify/functions";
import { getStore } from "@netlify/blobs";
export default async (req: Request, context: Context) => {
const key = context.params.key;
const store = getStore({ name: "images", consistency: "strong" });
const result = await store.getWithMetadata(key, { type: "stream" });
if (!result) return new Response("Not found", { status: 404 });
return new Response(result.data, {
headers: {
"Content-Type": result.metadata?.contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
};
export const config: Config = { path: "/uploads/:key" };
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 161 lines · 16 tokens per session scan A 2c3df78a0565
netlify-image-cdn-user-uploads is a cursor rule published in the GitHub repository netlify/context-and-tools (36 stars, last pushed 2d ago), licensed MIT. It adds 16 tokens to every session and 1,283 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other cursor rules, from other repositories
aws-ecs
Definitive guidelines for building, deploying, and operating applications on AWS ECS, emphasizing immutable containers, secure secrets management, and robust operational patterns.
beanstalk-deploy
Robust deployment patterns for Elastic Beanstalk with GitHub Actions, Pulumi, and edge case handling.
netlify-tanstack-deploy
Netlify + TanStack Start — netlify.toml at repo root with [build] base; MISSION CRITICAL — dashboard Build settings (Base, Publish, Build command, Functions directory, etc.) must stay empty or deploys break.
aws-rds-best-practices
AWS RDS PostgreSQL best practices - database configuration, connection management, authentication, backup, and performance optimization standards.
angular-20
This rule provides comprehensive best practices and coding standards for Angular development, focusing on modern TypeScript, standalone components, signals, and performance optimizations.
dev-standard
Apache Superset development standards and guidelines for Cursor IDE.