Skip to content
'; user_status_content.firstChild.appendChild(avatarContainer); } else { // Placeholder for LoggedOutUserMenu let loggedOutContainer = document.createElement('div'); // if LoggedOutUserMenu fallback let userBtn = document.createElement('button'); userBtn.style.width = "33px"; userBtn.style.height = "33px"; userBtn.style.display = "flex"; userBtn.style.alignItems = "center"; userBtn.style.justifyContent = "center"; userBtn.style.color = "var(--ds-gray-900)"; userBtn.style.border = "1px solid var(--ds-gray-300)"; userBtn.style.borderRadius = "100%"; userBtn.style.cursor = "pointer"; userBtn.style.background = "transparent"; userBtn.style.padding = "0"; // user icon ( from geist) let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('data-testid', 'geist-icon'); svg.setAttribute('height', '16'); svg.setAttribute('stroke-linejoin', 'round'); svg.setAttribute('style', 'color:currentColor'); svg.setAttribute('viewBox', '0 0 16 16'); svg.setAttribute('width', '16'); let path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute('fill-rule', 'evenodd'); path.setAttribute('clip-rule', 'evenodd'); path.setAttribute('d', 'M7.75 0C5.95507 0 4.5 1.45507 4.5 3.25V3.75C4.5 5.54493 5.95507 7 7.75 7H8.25C10.0449 7 11.5 5.54493 11.5 3.75V3.25C11.5 1.45507 10.0449 0 8.25 0H7.75ZM6 3.25C6 2.2835 6.7835 1.5 7.75 1.5H8.25C9.2165 1.5 10 2.2835 10 3.25V3.75C10 4.7165 9.2165 5.5 8.25 5.5H7.75C6.7835 5.5 6 4.7165 6 3.75V3.25ZM2.5 14.5V13.1709C3.31958 11.5377 4.99308 10.5 6.82945 10.5H9.17055C11.0069 10.5 12.6804 11.5377 13.5 13.1709V14.5H2.5ZM6.82945 9C4.35483 9 2.10604 10.4388 1.06903 12.6857L1 12.8353V13V15.25V16H1.75H14.25H15V15.25V13V12.8353L14.931 12.6857C13.894 10.4388 11.6452 9 9.17055 9H6.82945Z'); path.setAttribute('fill', 'currentColor'); svg.appendChild(path); userBtn.appendChild(svg); loggedOutContainer.appendChild(userBtn); loggedOutContainer.style.display = 'flex'; loggedOutContainer.style.gap = '8px'; loggedOutContainer.style.alignItems = 'center'; user_status_content.firstChild.appendChild(loggedOutContainer); } })();
Menu

Managing Vercel Blob storage from the CLI

Last updated February 26, 2026

Use this guide to manage Vercel Blob storage from the CLI. You'll create a store, upload and organize files, and handle cleanup.

This guide requires a linked Vercel project. Run vercel link in your project directory if you haven't already.

Use this block when you already know what you're doing and want the full command sequence. Use the steps below for context and checks.

terminal
# 1. Create a blob store
vercel blob create-store my-blob-store
 
# 2. Upload files
vercel blob put ./assets/logo.png --pathname images/logo.png
vercel blob put ./data/config.json --content-type application/json
 
# 3. List blobs
vercel blob list --prefix images/ --limit 20
 
# 4. Copy a blob
vercel blob copy images/logo.png images/logo-backup.png
 
# 5. Delete a blob
vercel blob del images/old-logo.png
 
# 6. Inspect a store
vercel blob get-store <store-id>

Create a new blob store for your project:

terminal
vercel blob create-store my-blob-store

To specify a region for the store:

terminal
vercel blob create-store my-blob-store --region iad1

Upload a file to a specific path in your blob store:

terminal
vercel blob put ./assets/logo.png --pathname images/logo.png

The CLI infers the content type from the file extension. To set it explicitly:

terminal
vercel blob put ./data/config.json --content-type application/json

To control cache behavior:

terminal
vercel blob put ./assets/hero.jpg --pathname images/hero.jpg --cache-control-max-age 86400

If a file already exists at the target pathname, use --allow-overwrite to replace it:

terminal
vercel blob put ./assets/logo-v2.png --pathname images/logo.png --allow-overwrite

To add a random suffix to the filename (useful for avoiding collisions with user uploads):

terminal
vercel blob put ./uploads/photo.jpg --add-random-suffix

List all blobs in your store:

terminal
vercel blob list

Filter by prefix to browse a specific directory:

terminal
vercel blob list --prefix images/ --limit 20

For paginated results, use the cursor from the previous response:

terminal
vercel blob list --prefix images/ --limit 10 --cursor <cursor-value>

Copy a blob to a new location within the same store:

terminal
vercel blob copy images/logo.png images/logo-backup.png

This creates a new blob at the destination path without modifying the original.

Remove a blob you no longer need:

terminal
vercel blob del images/old-logo.png

To inspect a store's details:

terminal
vercel blob get-store <store-id>

To remove a store entirely:

terminal
vercel blob delete-store <store-id>

Was this helpful?

supported.