Powered by Cloudflare R2 — Zero egress fees

File uploads for
developers who
ship fast.

Drop-in file upload infrastructure backed by Cloudflare R2. Presigned URLs, multi-platform SDKs, a dashboard to manage everything. From zero to uploads in 5 minutes.

upload.ts
import { DevStorage } from "@devstorage/node"

const ds = new DevStorage({
  apiKey: process.env.DSK_API_KEY
});

const file = await ds.upload(buffer, {
  name: "photo.jpg",
  mimeType: "image/jpeg",
})

// That's it. On Cloudflare R2.
console.log(file.url)

Built for teams who use

VercelSupabaseRailwayRenderPlanetScaleNeon

Features

Everything you need.Nothing you don't.

A focused set of primitives for file uploads. No bloat, no surprises, no hidden costs.

Zero Egress Fees

Cloudflare R2 means $0 bandwidth costs. Serve files globally without watching the meter.

Presigned Uploads

Files upload directly to R2 via presigned URLs. Your server never sees a byte of file data.

Multi-Platform SDKs

Node.js, Next.js, React, React Native. One API, every platform your app runs on.

Dashboard

Manage projects, browse files, generate API keys, track usage — all from one place.

API Key Scoping

Scoped keys per project with upload, read, delete permissions. Revoke instantly.

Webhooks

Get notified on upload complete. HMAC-signed for security. Trigger post-processing pipelines.

How it works

Five lines of code.
Zero infrastructure.

Install the SDK, pass your API key, call upload. The SDK handles presigned URL generation, direct upload to R2, and confirmation — your server never touches the file bytes.

1

SDK requests a presigned URL from DevStorage API

2

File uploads directly to Cloudflare R2 (zero server bandwidth)

3

DevStorage verifies the upload and returns the file URL

server.ts
Node.js
import { DevStorage } from "@devstorage/node";

const ds = new DevStorage({
  apiKey: process.env.DSK_API_KEY,
});

// Upload a file — that's it
const file = await ds.upload(buffer, {
  name: "invoice.pdf",
  mimeType: "application/pdf",
  metadata: { orderId: "ord_123" }
});

console.log(file.url);  // presigned R2 URL
console.log(file.id);   // "fil_01HXYZ..."

Pricing

Simple, transparent pricing.

Start free. Upgrade when you need more. No surprises, no egress fees, ever.

Free

$0forever

For trying things out

  • 1 GB storage
  • 100 uploads / month
  • 1 project
  • 2 API keys
  • 50 MB max file
Get Started

Starter

$5/mo

For indie devs in production

  • 10 GB storage
  • 5,000 uploads / month
  • 3 projects
  • 10 API keys
  • 500 MB max file
  • Webhooks
  • $0.05/GB overage
Start Starter
Most Popular

Pro

$20/mo

For teams building products

  • 100 GB storage
  • Unlimited uploads
  • 10 projects
  • Unlimited API keys
  • 5 GB max file
  • Webhooks + HMAC
  • $0.05/GB overage
Start Pro

Scale

$50/mo

For high-volume apps

  • 500 GB storage
  • Unlimited uploads
  • Unlimited projects
  • Unlimited API keys
  • 50 GB max file
  • Priority support
  • $0.04/GB overage
Start Scale

FAQ

Common questions

How does the presigned URL upload work?

Your app calls our API to get a presigned URL, then uploads the file directly to Cloudflare R2. The file never passes through our servers or yours — zero bandwidth cost on both sides.

What happens if I exceed my storage limit?

On paid plans, you can keep uploading and we'll charge overage at $0.04-0.05/GB. On the free plan, uploads will be rejected until you delete files or upgrade.

Is my data safe?

Files are stored on Cloudflare R2 with 99.999999999% (11 nines) durability. All access is via presigned URLs that expire. R2 credentials never leave our API server.

Can I migrate from S3 or UploadThing?

Yes. R2 is S3-compatible, so you can use standard migration tools. We also provide import utilities to move file metadata into DevStorage.

Do you charge for downloads / egress?

No. Cloudflare R2 has zero egress fees. Downloads are free, forever. This is the main reason we chose R2 over S3.

Start uploading in 5 minutes.

Free plan includes 1 GB storage. No credit card required. Upgrade anytime.

npm install @devstorage/node