Overview
UploadThing is a file upload service built for full-stack TypeScript developers who find raw S3 uploads (presigned URLs, CORS, bucket policies) tedious. You define a file router on your server that lists allowed file types and sizes and runs your own auth check in middleware; the client then uploads directly to UploadThing, which calls your onUploadComplete handler when it finishes.
There are first-party adapters for Next.js, Astro, SvelteKit, Nuxt, SolidStart, Express, Fastify, H3 and any Fetch-API runtime, and ready-made UploadButton and UploadDropzone components for React, Vue, Svelte and Solid. A dashboard shows and manages uploaded files.
Pricing is by storage only. The free plan gives 2 GB shared across all your apps. $10 a month buys 100 GB, and the usage-based plan starts at $25 for 250 GB with $0.08 per GB beyond that. Uploads and downloads are unlimited on every plan, and paid plans add region choice and private files.
The trade-off is lock-in: it is not an S3-compatible bucket, so you use UploadThing's SDK and URLs. At larger volumes, $0.08/GB is several times the price of raw object storage, so it fits when developer time matters more than storage cost.
Pricing and plans
Free tier
2 GB of storage shared across apps, unlimited uploads and downloads, 7-day audit log
At the limit Not stated The vendor does not say what happens at the limit, or we have not found it yet.
| Plan | Price | What you get |
|---|---|---|
| 2GB App | $0/mo | 2 GB storage shared between all apps; 7-day audit log retention |
| 100GB App | $10/mo | 100 GB storage; 30-day audit log; regions; private files |
| Usage Based | From $25/mo | 250 GB included, then $0.08/GB; regions; private files |
What it does
- Type-safe file routes
- Define allowed types, sizes and auth middleware on your server; the client components infer them.
- Drop-in components
- UploadButton and UploadDropzone for React, Vue, Svelte and Solid.
- Framework adapters
- Next.js, Astro, SvelteKit, Nuxt, SolidStart, Express, Fastify, H3 and Fetch API.
- Server callbacks
- onUploadComplete webhooks run your code after each upload, with metadata from middleware.
- Private files and regions
- Paid plans add private files and a choice of storage region.
Strengths and limitations
Strengths
- Uploads working in minutes in TypeScript frameworks
- Your auth runs on your server before any upload
- Unlimited uploads and downloads on all plans
- Free 2 GB plan for side projects
Limitations
- Not S3-compatible; you depend on UploadThing's SDK and URLs
- Storage beyond 250 GB costs $0.08/GB, well above raw object storage
- Callbacks need your app reachable from the internet (tunnels needed for local production builds, bypass for protected Vercel previews)
- Regions and private files are paid features
Who it suits
Good for
- Next.js and other TypeScript apps adding user uploads
- Side projects needing uploads without S3 setup
- Small teams valuing speed over storage cost
Look elsewhere if
- Large media libraries where per-GB price matters
- Non-TypeScript backends or tools that expect an S3 API
Alternatives to UploadThing
| Tool | From | Free option | Stages |
|---|---|---|---|
| Hetzner Object Storage EU object storage | €6.49/mo | ||
| Akamai Object Storage (Linode) Bundled object storage | $5/mo | ||
| DigitalOcean Spaces Bundled object storage with CDN | $5/mo | ||
| Supabase Managed Postgres backend platform | $25/mo | Free tier | |
| ImageKit Image and video CDN with media library | $89/mo | Free tier | |
| Backblaze B2 Cloud Storage Low-cost object storage | Usage-based | Free tier |
Questions
Is UploadThing free?
Yes, for up to 2 GB of storage shared across apps, with unlimited uploads and downloads.
How much does UploadThing cost?
$10 a month for 100 GB, or $25 a month for 250 GB plus $0.08 per extra GB on the usage-based plan.
Does UploadThing charge for bandwidth?
The pricing page lists unlimited uploads and downloads on every plan; only storage is billed.
Is UploadThing S3 compatible?
No. It uses its own SDK, components and file URLs rather than an S3 API.
Sources read for this page