Skip to content

PutPut vs the Alternatives

Developers waste hours evaluating file upload services. We did the work for you. Each comparison breaks down pricing, setup time, lock-in, and what actually matters when you just need to upload a file and get a URL.

PutPut vs Vercel Blob

Both PutPut and Vercel Blob use Cloudflare R2 for storage. The difference: Vercel adds platform lock-in and a $0.15/GB egress markup. PutPut gives you the same storage without the Vercel tax.

FeaturePutPutVercel Blob
Platform requirement Any platform Vercel only
Egress fees $0 $0.15/GB after 1 GB/mo
Storage pricing Free (10 GB) $0.03/GB after 250 MB
Max file size100 MB (free tier)500 MB (Pro)
Framework lock-in None (plain HTTP) Next.js / Vercel Functions
Signup required No Yes (Vercel account)
AI-friendly docs docs.putput.io No
Guest tokens (no auth) Yes No
Direct-to-storage uploads Yes (R2 presigned) Yes (client uploads)
Self-hostable Yes (Cloudflare) No

Code comparison

PutPut
// Works anywhere — no platform lock-in
const tok = await fetch('/api/v1/auth/guest',
  { method: 'POST' }).then(r => r.json());

const pre = await fetch('/api/v1/upload/presign',
  { method: 'POST',
    headers: { Authorization: `Bearer ${tok.token}` },
    body: JSON.stringify({ filename: 'photo.jpg',
      content_type: 'image/jpeg' }) }
).then(r => r.json());

await fetch(pre.upload_url,
  { method: 'PUT', body: file });

const result = await fetch('/api/v1/upload/confirm',
  { method: 'POST',
    headers: { Authorization: `Bearer ${tok.token}` },
    body: JSON.stringify({ upload_id: pre.upload_id }) }
).then(r => r.json());
Vercel Blob
// Requires Vercel deployment + @vercel/blob
// 1. Server action (Next.js only)
'use server';
import { put } from '@vercel/blob';

export async function upload(
  formData: FormData
) {
  const file = formData.get('file') as File;
  const blob = await put(
    file.name,
    file,
    { access: 'public' }
  );
  // blob.url — served via Vercel's CDN
  // egress: $0.15/GB after 1 GB/mo free
  return blob;
}

// 2. Client component
'use client';
async function handleUpload(file: File) {
  const form = new FormData();
  form.append('file', file);
  const blob = await upload(form);
}

Frequently asked questions

Does Vercel Blob work outside Vercel?

No. The @vercel/blob SDK requires Vercel serverless functions and a BLOB_READ_WRITE_TOKEN tied to your Vercel project. You cannot use it on AWS, Cloudflare, or a VPS. PutPut works anywhere you can make an HTTP request.

Why does Vercel charge for egress?

Vercel Blob stores files on Cloudflare R2 (which has zero egress fees) but routes reads through Vercel's edge network, adding a $0.15/GB markup. PutPut serves files directly from R2, so egress is always $0.

Can I migrate from Vercel Blob to PutPut?

Yes. Download your files from Vercel Blob, then re-upload them to PutPut using the presigned upload API. No SDK swap needed — PutPut is plain HTTP.

How does PutPut pricing compare at scale?

At 100 GB of monthly downloads, Vercel Blob costs ~$14.85 in egress alone. PutPut egress is $0. Both use R2 for storage, so the underlying cost is the same — Vercel just adds a markup.

Get started for free

No signup required. No credit card.

v0.4.77