agentsclimarketplace

Vercel blob

Skill VRIL-LABS/skill-jam/skills/ai-ml/claude-skills-main/claude-skills-main/plugins/vercel-blob/skills/vercel-blob

Vercel Blob object storage with CDN for Next.js. Use for file uploads (images, PDFs, videos), presigned URLs, user-generated content, file management, or encountering BLOB_READ_WRITE_TOKEN errors, file size limits, client upload token errors.From its SKILL.md

Install
npx -y skills add VRIL-LABS/skill-jam --skill vercel-blob

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

6.3 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it

Vercel Blob (Object Storage)

Status: Production Ready Last Updated: 2025-12-14 Dependencies: None Latest Versions: @vercel/[email protected]


Quick Start (3 Minutes)

1. Create & Configure

# In Vercel dashboard: Storage → Create Database → Blob
vercel env pull .env.local

Creates: BLOB_READ_WRITE_TOKEN

2. Install

bun add @vercel/blob

3. Upload File (Server Action)

'use server';

import { put } from '@vercel/blob';

export async function uploadFile(formData: FormData) {
  const file = formData.get('file') as File;

  const blob = await put(file.name, file, {
    access: 'public',
    contentType: file.type
  });

  return blob.url;
}

4. Basic Operations

import { put, del, list } from '@vercel/blob';

// Upload
const blob = await put('path/file.jpg', file, { access: 'public' });

// Delete
await del(blob.url);

// List with pagination
const { blobs, cursor } = await list({ prefix: 'uploads/', limit: 100 });

Critical Rules

Always Do

RuleWhy
Use client upload tokens for client-side uploadsNever expose BLOB_READ_WRITE_TOKEN to client
Set contentType explicitlyCorrect browser handling for PDFs, videos
Use access: 'public' for CDN cachingPrivate files bypass CDN
Validate file type and size before uploadPrevent invalid uploads
Use pathname organizationavatars/, uploads/, documents/
Delete old files when replacingManage storage costs

Never Do

RuleWhy
Expose BLOB_READ_WRITE_TOKEN to clientSecurity vulnerability
Upload files >500MB without multipartUse createMultipartUpload API
Use generic filenamesUse ${Date.now()}-${name} or addRandomSuffix: true
Skip file validationAlways validate type/size
Store sensitive data unencryptedEncrypt before upload
Forget to handle paginationlist() returns max 1000 files

Known Issues Prevention

This skill prevents 10 documented issues:

#ErrorQuick Fix
1BLOB_READ_WRITE_TOKEN not definedRun vercel env pull .env.local
2Client token exposedUse handleUpload() for client uploads
3File size exceeded (500MB)Use multipart upload API
4Wrong content-typeSet contentType: file.type
5No CDN cachingUse access: 'public'
6Missing files in listUse cursor pagination
7Delete fails silentlyUse exact URL from put()
8Upload timeoutUse client-side upload for large files
9Filename collisionsAdd timestamp or addRandomSuffix: true
10State not updatedUse onUploadCompleted callback

See: references/known-issues.md for complete solutions with code examples.


Common Patterns Summary

PatternUse CaseKey API
Avatar UploadUser profile imagesput, del
Protected UploadPrivate documentsput with access: 'private'
Image GalleryList & paginatelist with cursor
Client UploadLarge files, progressupload, handleUpload
Multipart UploadFiles >500MBcreateMultipartUpload, uploadPart
Batch OperationsMultiple filesPromise.all, del([...])
Image ProcessingOptimize before uploadsharp + put

See: references/common-patterns.md for complete implementations.


Client-Side Upload (Essential Pattern)

Server Action (Token Generation):

'use server';

import { handleUpload, type HandleUploadBody } from '@vercel/blob/client';

export async function generateUploadToken(body: HandleUploadBody) {
  return await handleUpload({
    body,
    request: new Request('https://dummy'),
    onBeforeGenerateToken: async (pathname) => ({
      allowedContentTypes: ['image/jpeg', 'image/png', 'image/webp'],
      maximumSizeInBytes: 5 * 1024 * 1024
    }),
    onUploadCompleted: async ({ blob }) => {
      // Save to database
      await db.insert(uploads).values({ url: blob.url, pathname: blob.pathname });
    }
  });
}

Client Component:

'use client';

import { upload } from '@vercel/blob/client';

const blob = await upload(file.name, file, {
  access: 'public',
  handleUploadUrl: '/api/upload'
});

Configuration

.env.local

# Created by: vercel env pull .env.local
BLOB_READ_WRITE_TOKEN="vercel_blob_rw_xxxxx"

.gitignore

.env.local
.env*.local

When to Load References

ReferenceLoad When...
references/known-issues.mdDebugging upload errors, token issues, or CDN caching problems
references/common-patterns.mdImplementing avatar uploads, galleries, client uploads, or multipart uploads

Dependencies

{
  "dependencies": {
    "@vercel/blob": "^2.0.0"
  }
}

Free Tier Limits: 100GB bandwidth/month, 500MB max file size


Official Documentation


Troubleshooting

ProblemSolution
BLOB_READ_WRITE_TOKEN not definedRun vercel env pull .env.local
File size exceeded (>500MB)Use multipart upload API
Client upload failsUse handleUpload() server-side
Files not deletingUse exact URL from put() response

Token Savings: ~60% (patterns extracted to references) Error Prevention: 100% (all 10 documented issues) Ready for production!

What ships with it: 8 files

48.5 KB alongside SKILL.md, 1 of them executable

references/

scripts/

Keep looking

Skills are one crate of 326,790. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.