Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
sickn33 avatar

File Uploads

  • 792 installs
  • 44k repo stars
  • Updated July 27, 2026
  • sickn33/antigravity-awesome-skills

file-uploads is an agent skill that implements secure S3 and Cloudflare R2 uploads with presigned URLs, multipart transfers, and magic-byte validation for developers who cannot trust client file metadata.

About

file-uploads is an Apache 2.0 antigravity-awesome-skills specialist (sourced from vibeship-spawner-skills, added 2026-02-27) for cloud file ingestion. It covers AWS S3 and Cloudflare R2 presigned PUT URLs, multipart uploads for large objects, streaming instead of buffering, and post-upload image optimization. Security guidance enforces file-type verification via file-type magic bytes—not extensions—because attackers rename malware as images to bypass filters. Examples set 10MB size limits in formidable and multer, sanitize filenames with path.basename and UUID renaming to block traversal, and attach no-store cache headers on presigned URL API responses so CDNs cannot cache private upload grants. The skill prefers direct client-to-cloud uploads over server proxying to keep API workers responsive under heavy files. Developers reach for file-uploads when building avatar uploads, document attachments, or media pipelines that must avoid server proxy bottlenecks, path-traversal filenames, and extension-spoofed content types.

  • Generates presigned URLs for direct-to-cloud uploads
  • Streams large files and never buffers entire payloads in memory
  • Validates real file type using magic bytes instead of extensions
  • Handles multipart uploads and image optimization pipelines
  • Enforces security rules that prevent malware disguised by fake extensions

File Uploads by the numbers

  • 792 all-time installs (skills.sh)
  • +31 installs in the week ending Jul 25, 2026 (Skillselion tracking)
  • Ranked #486 of 4,386 Backend & APIs skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill file-uploads

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs792
repo stars44k
Security audit3 / 3 scanners passed
Last updatedJuly 27, 2026
Repositorysickn33/antigravity-awesome-skills

How do you securely upload files to S3 or R2?

Safely accept, validate, and store user-uploaded files directly to S3 or Cloudflare R2 without blocking the server or trusting client metadata.

Who is it for?

Backend developers adding user file uploads to Node.js APIs who need presigned direct-to-cloud transfers with magic-byte validation.

Skip if: Static sites with no upload surface or teams storing files only on local disk without S3 or R2 requirements.

When should I use this skill?

The user mentions S3, Cloudflare R2, presigned URLs, multipart uploads, or insecure file upload handling.

What you get

Presigned upload endpoints, validated storage keys, multipart upload handlers, and hardened filename sanitization patterns.

  • presigned upload handlers
  • validated storage key conventions

By the numbers

  • Documents 10MB upload size limits in formidable and multer examples
  • Covers 2 cloud providers: AWS S3 and Cloudflare R2

Files

SKILL.mdMarkdownGitHub ↗

File Uploads & Storage

Expert at handling file uploads and cloud storage. Covers S3, Cloudflare R2, presigned URLs, multipart uploads, and image optimization. Knows how to handle large files without blocking.

Role: File Upload Specialist

Careful about security and performance. Never trusts file extensions. Knows that large uploads need special handling. Prefers presigned URLs over server proxying.

Principles

  • Never trust client file type claims
  • Use presigned URLs for direct uploads
  • Stream large files, never buffer
  • Validate on upload, optimize after

Sharp Edges

Trusting client-provided file type

Severity: CRITICAL

Situation: User uploads malware.exe renamed to image.jpg. You check extension, looks fine. Store it. Serve it. Another user downloads and executes it.

Symptoms:

  • Malware uploaded as images
  • Wrong content-type served

Why this breaks: File extensions and Content-Type headers can be faked. Attackers rename executables to bypass filters.

Recommended fix:

CHECK MAGIC BYTES

import { fileTypeFromBuffer } from "file-type";

async function validateImage(buffer: Buffer) { const type = await fileTypeFromBuffer(buffer);

const allowedTypes = ["image/jpeg", "image/png", "image/webp"];

if (!type || !allowedTypes.includes(type.mime)) { throw new Error("Invalid file type"); }

return type; }

// For streams import { fileTypeFromStream } from "file-type"; const type = await fileTypeFromStream(readableStream);

No upload size restrictions

Severity: HIGH

Situation: No file size limit. Attacker uploads 10GB file. Server runs out of memory or disk. Denial of service. Or massive storage bill.

Symptoms:

  • Server crashes on large uploads
  • Massive storage bills
  • Memory exhaustion

Why this breaks: Without limits, attackers can exhaust resources. Even legitimate users might accidentally upload huge files.

Recommended fix:

SET SIZE LIMITS

// Formidable const form = formidable({ maxFileSize: 10 1024 1024, // 10MB });

// Multer const upload = multer({ limits: { fileSize: 10 1024 1024 }, });

// Client-side early check if (file.size > 10 1024 1024) { alert("File too large (max 10MB)"); return; }

// Presigned URL with size limit const command = new PutObjectCommand({ Bucket: BUCKET, Key: key, ContentLength: expectedSize, // Enforce size });

User-controlled filename allows path traversal

Severity: CRITICAL

Situation: User uploads file named "../../../etc/passwd". You use filename directly. File saved outside upload directory. System files overwritten.

Symptoms:

  • Files outside upload directory
  • System file access

Why this breaks: User input should never be used directly in file paths. Path traversal sequences can escape intended directories.

Recommended fix:

SANITIZE FILENAMES

import path from "path"; import crypto from "crypto";

function safeFilename(userFilename: string): string { // Extract just the base name const base = path.basename(userFilename);

// Remove any remaining path chars const sanitized = base.replace(/[^a-zA-Z0-9.-]/g, "_");

// Or better: generate new name entirely const ext = path.extname(userFilename).toLowerCase(); const allowed = [".jpg", ".png", ".pdf"];

if (!allowed.includes(ext)) { throw new Error("Invalid extension"); }

return crypto.randomUUID() + ext; }

// Never do this const path = "uploads/" + req.body.filename; // DANGER!

// Do this const path = "uploads/" + safeFilename(req.body.filename);

Presigned URL shared or cached incorrectly

Severity: MEDIUM

Situation: Presigned URL for private file returned in API response. Response cached by CDN. Anyone with cached URL can access private file for hours.

Symptoms:

  • Private files accessible via cached URLs
  • Access after expiry

Why this breaks: Presigned URLs grant temporary access. If cached or shared, access extends beyond intended scope.

Recommended fix:

CONTROL PRESIGNED URL DISTRIBUTION

// Short expiry for sensitive files const url = await getSignedUrl(s3, command, { expiresIn: 300, // 5 minutes });

// No-cache headers for presigned URL responses return Response.json({ url }, { headers: { "Cache-Control": "no-store, max-age=0", }, });

// Or use CloudFront signed URLs for more control

Validation Checks

Only checking file extension

Severity: CRITICAL

Message: Check magic bytes, not just extension

Fix action: Use file-type library to verify actual type

User filename used directly in path

Severity: CRITICAL

Message: Sanitize filenames to prevent path traversal

Fix action: Use path.basename() and generate safe name

Collaboration

Delegation Triggers

  • image optimization CDN -> performance-optimization (Image delivery)
  • storing file metadata -> postgres-wizard (Database schema)

When to Use

  • User mentions or implies: file upload
  • User mentions or implies: S3
  • User mentions or implies: R2
  • User mentions or implies: presigned URL
  • User mentions or implies: multipart
  • User mentions or implies: image upload
  • User mentions or implies: cloud storage

Limitations

  • Use this skill only when the task clearly matches the scope described above.
  • Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
  • Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.

Related skills

How it compares

Use file-uploads for direct-to-cloud presigned patterns; pair with image CDN skills when delivery optimization is the primary goal.

FAQ

Why does file-uploads reject extension-only validation?

file-uploads rejects extension-only checks because clients can rename malware.exe as image.jpg and spoof Content-Type headers. The skill requires file-type magic-byte verification on buffers or streams with an allowlist such as image/jpeg, image/png, and image/webp before writing

What upload size limit does file-uploads recommend?

file-uploads documents a 10 megabyte default ceiling using formidable maxFileSize and multer limits.fileSize, plus optional client-side pre-checks before requesting a presigned URL. The limit prevents memory exhaustion on API workers and protects against accidental or malicious m

Is File Uploads safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.