Vibeleaderboard
Index / tool

UploadThing

uploadthing.com
Visit uploadthing.com
Category
Developer Tools
Rank

Previous survey · No. 908 ·

Pricing
Paid
Type
TOOL
Use case
Data Processing
Interfaces
API
Builder
pingdotgg
Latest release
uploadthing@7.7.4
Date

About

File uploads for TypeScript apps. Simple file upload API and components for Next.js and TypeScript apps. Only charges for storage used, not seats or bandwidth.

What it does

This is a file-transfer toolkit split into a framework-agnostic core and a family of client packages, one each for React, Vue, Svelte, Solid, and React Native. On the server you define upload routes with a builder pattern; a companion class handles uploading, deleting, renaming, and listing files against a hosted storage backend. Each client package turns those route definitions into typed hooks and ready-made upload buttons and drop zones, so the same server contract drives whichever front-end framework a project uses.

Why it's ranked here

Five separate framework client packages share one server contract instead of forking logic per framework, a numeric guardrail caps upload concurrency at 25, and the license is permissive MIT. The core SDK also runs its HTTP layer through a structured effect-based runtime instead of ad hoc promises, which is unusual rigor for a file-upload library and signals a team optimizing for correctness over quick hacks.

What's good

The upload API enforces a hard concurrency ceiling instead of leaving it unbounded, catching a caller mistake before it becomes a production incident. Framework support is not an afterthought bolted onto a React-first core: Vue, Svelte, Solid, and React Native each get first-class packages that generate their own typed hooks and components rather than wrapping a shared UI layer. The library also ships its own trimmed, edge-runtime-safe copy of MIME-type lookup tables rather than depending on a package built around Node's file-system module, so upload validation keeps working in serverless and edge functions.

Tradeoffs

Depending on effect-based reactive programming for the server SDK's internals raises the learning curve for contributors and for anyone debugging past the public API, since errors and control flow route through a functional effect runtime rather than plain async and await. One helper for fetching file URLs is already marked deprecated in favor of a different documented approach, a sign the API surface is still settling. The documentation site itself is built on a separately licensed commercial template, a detail worth knowing before forking it wholesale.

How to use it well

This fits teams already building on Next.js, Solid, Vue, Svelte, or Expo who want file uploads handled server-side without hand-rolling storage plumbing for each framework. Define routes once on the server, then pull in only the client package matching the front end in use. It is not the right layer for teams needing full control over storage internals or already committed to a different effect-based runtime, since the SDK's internals are opinionated about how HTTP and errors are handled underneath the public methods.

Technical notes+

The repo is a pnpm/turborepo monorepo (pnpm-workspace.yaml, turbo.json) with engine constraints declared in package.json, where packages/uploadthing/src/server.ts exposes createUploadthing and createRouteHandler built on the effect-ts library, and packages/uploadthing/src/sdk/index.ts implements the UTApi class (uploadFiles, uploadFilesFromUrl, deleteFiles, getFileUrls, listFiles, renameFiles) with response schemas validated via effect/Schema and a guardServerOnly() call that prevents client-side execution; uploadFiles and uploadFilesFromUrl throw a BAD_REQUEST UploadThingError when concurrency falls outside 1-25. Framework bindings live in separate packages: packages/react/src/index.ts, packages/vue/src/index.ts, packages/svelte/src/app.html (the SvelteKit app shell), packages/solid/src/index.tsx, and packages/expo/src/index.ts (React Native, wrapping @uploadthing/react/native and checking a peer-dependency version match), all drawing shared types and utilities from packages/shared/src/index.ts. packages/mime-types/src/index.ts is a hand-ported, trimmed copy of the mime-types package rewritten to avoid Node's path module for edge-runtime compatibility. LICENSE is MIT (Ping Labs), while docs/README.md notes the documentation site itself is built on the commercially licensed 'Protocol' Tailwind UI template, a separate license from the SDK code. README.md lists additional example directories and packages beyond the files fetched here.

Observed

License
MIT.
Language
TypeScript across the server SDK and all framework client packages.
Packaging
pnpm workspace monorepo built with Turborepo, with per-package engine constraints declared in the root manifest.
Interfaces
a server-side SDK class exposing upload, delete, list, and rename operations over HTTP, paired with framework-specific client packages (React, Vue, Svelte, Solid, Expo/React Native) that generate typed hooks and pre-built upload components.
Platform support
Next.js (App Router and Pages Router), SvelteKit, SolidStart, Vue, and Expo/React Native are represented as first-class packages or examples in the repository.
Structural observation
the server SDK enforces a fixed concurrency range (1 to 25) on batch upload and download-then-upload calls, rejecting values outside it with a typed error.
Structural observation
ships a hand-trimmed, edge-runtime-compatible reimplementation of MIME-type lookup tables rather than depending on a Node path-module-based package.
Structural observation
the documentation site's source template carries a separate commercial license distinct from the MIT license covering the SDK code.

Read from README.md, package.json, packages/uploadthing/src/server.ts, packages/uploadthing/src/sdk/index.ts, packages/react/src/index.ts, packages/shared/src/index.ts, packages/vue/src/index.ts, packages/svelte/src/app.html, packages/solid/src/index.tsx, packages/expo/src/index.ts, pnpm-workspace.yaml, turbo.json, LICENSE, docs/README.md, packages/mime-types/src/index.ts.

Tags

Storage & FilesPing Labs

Tech Stack

Node.js

Media

UploadThing

Comments (0)

No comments yet

Editorially curated, with community endorsements as a secondary signal. Corrections welcome.