Better Upload: MIT-licensed React library for direct-to-S3 file uploads with minimal setup, presigned URLs, and drag-and-drop UI components.
What it does
Better Upload is a MIT-licensed React library (1,263 GitHub stars, 67 releases, latest server@3.0.19 as of May 2025) for direct-to-S3 file uploads with minimal setup. It provides a useUploadFiles hook, a drag-and-drop UploadDropzone component, and a server-side route handler, all wired to any S3-com
Most file-upload solutions proxy bytes through your server, which adds latency and, more importantly, doubles your egress bill: data travels server-to-S3 instead of browser-to-S3 directly. Better Upload eliminates that hop by generating presigned URLs server-side and having the browser upload straight to your S3 bucket, so you pay only for what your users actually send to storage.
Better Upload ships two coordinating packages: @better-upload/client (the React hook and components) and @better-upload/server (the route handler). The client calls your server route, the server validates the request with Zod and issues a presigned URL, then the client uploads the file directly to S3. No file bytes hit your API server.
You define an upload route on the server using the Better Upload handler, specifying accepted file types, size limits, and max file counts. The client calls useUploadFiles({ route: 'images' }) and passes the returned control to UploadDropzone. Validation via Zod runs before any presigned URL is issued, so bad requests are rejected before storage is touched.
The split package design carries a non-obvious advantage: because @better-upload/server is independent of @better-upload/client, you can swap the server handler for a different runtime (such as an Edge function) without touching your client bundle or component tree at all. Per the README, the library reaches into @aws-sdk/s3-request-presigner and @aws-sdk/client-s3 as peer dependencies, keeping your own AWS SDK version in control rather than pinning it inside the library.
Better Upload is React-only. Non-React frameworks (Vue, Svelte, vanilla JS) are out of scope per the docs. And because uploads bypass your server, server-side post-processing (virus scanning, image transcoding) requires a separate S3 event trigger or a Lambda, not an inline middleware step.
If you are building a React app that needs file uploads and you already have (or are willing to add) an S3-compatible bucket, Better Upload is the fastest path from zero to a working drag-and-drop uploader with direct storage writes. Start at the quickstart guide or install via npm: npm i @better-upload/client @better-upload/server.
Features
Field notes
Reviewed Jun 26, 2026
Best for
Builder outcomes
Watch out
Tested with
Better Upload is a MIT-licensed React library that adds direct-to-S3 file uploads to any React-based app with minimal setup. It provides a useUploadFiles hook, an UploadDropzone drag-and-drop component, and a server-side route handler that generates presigned URLs so file bytes never pass through your API server. The project has 1,263 GitHub stars, 67 releases, and its latest server release (v3.0.19) shipped in May 2025.
Better Upload is ready to use after running `npm i @better-upload/client @better-upload/server` alongside its peer dependency `@aws-sdk/client-s3`. On the server, you define an upload route with the Better Upload handler; on the client, you call `useUploadFiles({ route: 'your-route' })` and pass the returned `control` to `UploadDropzone`. The library works with Next.js, TanStack Start, and any other React-based framework, per the official quickstart at better-upload.com/docs/quickstart.
Better Upload is fully free and open-source under the MIT License. There is no hosted service, no usage tier, and no fees of any kind, you bring your own S3-compatible storage bucket and pay only your cloud provider for storage. Per the README, 'You are free to do whatever you want with it.'
Better Upload is best for React apps that need drag-and-drop file uploads directly to an S3 bucket, especially when egress cost or upload latency is a concern. Because files travel browser-to-S3 rather than browser-to-server-to-S3, you avoid the double-egress problem of server-proxied patterns. It is also a strong fit for teams using shadcn/ui, since the UI components are designed for copy-paste integration.
Better Upload gives you the same direct-to-S3 architecture as a hand-rolled AWS SDK approach, but eliminates all the wiring: Zod validation before presigned URL issuance, a structured server route API, and a drop-in React hook and Dropzone component. Rolling your own with UploadThing or the raw AWS SDK means writing that validation and client-server coordination from scratch; Better Upload collapses it to a few lines of config. The tradeoff is that you stay within Better Upload's React and S3 constraints rather than owning every layer.
Better Upload is React-only, so Vue, Svelte, and vanilla JS frontends are not supported. Because uploads bypass your server, any post-upload processing (virus scanning, image transcoding) must be triggered separately via S3 events or a Lambda rather than as inline middleware. The library also requires you to supply and configure your own S3-compatible bucket; it does not provide managed storage.
Open-source file-format loaders for geospatial, tabular, and 3D data, with worker-thread and streaming support for big-data JS apps.
Best for Apps handling multiple geospatial or 3D formats (shapefiles, glTF, Arrow, CSVs, point clouds) through one unified APIOpen-source brand SVG icon library with 6,149+ typed, tree-shakeable icons for developers and designers.
Best for Apps that display third-party brand logos and want a single versioned npm dependencyAuto-generated, pixel-perfect skeleton screens for React, Vue, Svelte, Angular, and React Native, no manual placeholders needed.
Best for Teams tired of skeleton screens drifting out of sync after UI changesFree repo scanner that checks GitHub and Bitbucket projects for malware, credential stealers, and crypto scams before you run their code.
Best for Developers vetting unfamiliar GitHub or Bitbucket repos before cloning or running them locallyFree, MIT-licensed React loading animation registry for shadcn-style projects, copy-paste spinners, skeletons, and motion primitives.
Best for Teams building React and Tailwind CSS products that already use shadcn/ui and need consistent pending states fastOpen-source React loading animation library with 55+ dot-matrix loaders for shadcn/Tailwind projects, install in one command.
Best for React and Tailwind CSS teams who want polished, on-brand loading animations without building from scratch