uppy is a free, open source file management & sync project written in TypeScript and released under MIT. It has 30,984 GitHub stars, 2,103 forks and 186 open issues, and was last pushed 9 hours ago. On this registry it ranks #8 of 20 tracked projects in File Management & Sync, with 5 head-to-head comparisons available.

What is uppy?

Uppy is an MIT-licensed, TypeScript-built, modular JavaScript file uploader for web browsers that drops into any web application, aimed at developers who would rather wire up plugins than build file uploading from scratch.

What it is

Uppy is an open source file uploader that lives in the JavaScript/npm ecosystem, published under the @uppy/* package namespace and maintained by the team at Transloadit, with documentation and a live demo hosted at uppy.io. It is written in TypeScript under the MIT license, and its architecture is plugin-based: application code imports @uppy/core and then attaches the pieces it needs, such as @uppy/dashboard, @uppy/remote-sources, @uppy/image-editor, @uppy/webcam, or @uppy/tus. The repository carries 30,984 stars, 2,103 forks, and 186 open issues, with the last push dated 2026-09-18.

The concrete problem it solves is the file uploader that every web application otherwise has to write and maintain by hand. Uppy replaces that bespoke front-end upload code with a set of composable components that handle fetching files from local disk, remote URLs, Google Drive, Dropbox, Box, or a webcam; previewing and editing metadata before submission; and uploading to a destination with optional encoding. Where a project needs large uploads that survive a dropped connection, it replaces hand-rolled retry logic with the open tus resumable upload standard. Where a project would rather not run its own encoding pipeline, it integrates with Transloadit for encoding, conversion, and delivery — while still working with a self-run Apache, Nginx, Node, or FFmpeg pipeline if that is preferred.

Key capabilities

  • Fetches files from local disk, remote URLs, Google Drive, Dropbox, Box, and a webcam, capturing selfies and recordings where a device file does not exist.
  • Performs resumable file uploads over the open tus standard via the @uppy/tus plugin, so large uploads survive network hiccups.
  • Ships @uppy/companion so remote sources sync between servers directly, bypassing the user's device; it is configured through the companionUrl option on RemoteSources.
  • Offers three UI construction paths per supported framework: pre-composed plug-and-play components, headless components for style overrides, and hooks for a tailor-made UI.
  • Provides first-class integrations for plain JS/HTML, React, Svelte, Vue, and Angular.
  • Includes optional file recovery after a browser crash through Golden Retriever.
  • Speaks several languages through built-in i18n and is built with accessibility in mind.

Who uses it and how

  • Teams running their own Apache, Nginx, Node, or FFmpeg pipeline that want client-side fetching, preview, and upload without a hosted encoding backend.
  • Applications that self-host the @uppy/companion server, setting companionUrl to their own instance, so provider credentials never route through a third party.
  • Products that need large, interruption-tolerant uploads and therefore point the Tus plugin at a tus-compatible endpoint.
  • Single-page applications in React, Svelte, Vue, or Angular that embed the dashboard trigger and extend it with ImageEditor or Webcam.
  • Projects running in restricted environments where the prebuilt CDN bundle is acceptable, loading it as uppy.min.mjs so Uppy attaches to window.Uppy.

Getting started

Install with npm install @uppy/core @uppy/dashboard @uppy/tus, then add uppy.min.css to the page or include it through a bundler. A prebuilt bundle is also available from Transloadit's CDN, in which case Uppy attaches itself to the global window.Uppy object.

How it compares

The facts provided name no comparable paid products and no peer uploader projects, so Uppy stands alone in this registry on both counts. Its distinguishing position is therefore the one the README states directly: it is free for the world forever, under MIT, and it works either with Transloadit as a paid encoding backend or without one.

When to use it — and when not to

A self-hoster takes on real operational surface: the @uppy/companion server must be run for remote source syncing, a tus-compatible endpoint must exist for resumable uploads, and any encoding or conversion beyond Transloadit has to be provided by the team's own pipeline. Anyone wanting a drop-in uploader with zero server components, or expecting a hosted managed service from this project alone, should look elsewhere. The README excerpt available here is also truncated mid-link and describes installation at v6.0.1, and the documentation itself warns that the CDN bundle ships most plugins and is not recommended for production.

project readme (upstream, from github) — read inline

Uppy uppy on npm

Uppy logo: a smiling puppy above a pink upwards arrow

Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, has a comprehensible API and lets you worry about more important problems than building a file uploader.

  • Fetch files from local disk, remote URLs, Google Drive, Dropbox, Box, or snap and record selfies with a camera
  • Preview and edit metadata with a nice interface
  • Upload to the final destination, optionally process/encode

Read the docs | Try Uppy

Developed by Transloadit

Uppy is being developed by the folks at Transloadit, a versatile API to handle any file in your app.

TestsCI status for Uppy testsCI status for Companion tests
DeploysCI status for CDN deploymentCI status for Companion deploymentCI status for website deployment

Example

Code used in the above example:

import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import RemoteSources from '@uppy/remote-sources'
import ImageEditor from '@uppy/image-editor'
import Webcam from '@uppy/webcam'
import Tus from '@uppy/tus'

const uppy = new Uppy()
  .use(Dashboard, { trigger: '#select-files' })
  .use(RemoteSources, { companionUrl: 'https://companion.uppy.io' })
  .use(Webcam)
  .use(ImageEditor)
  .use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
  .on('complete', (result) => {
    console.log('Upload result:', result)
  })

Try it online or read the docs for more details on how to use Uppy and its plugins.

Integrations

Uppy has first-class support for plain JS/HTML, React, Svelte, Vue, and Angular.

For the supported frameworks (except Angular) Uppy offers three ways to build user interfaces:

  1. Pre-composed, plug-and-play components. Mainly ``. The downside is that you can’t customize the UI.
  2. Headless components. Smaller components, easier to override the styles or compose them together with your own components.
  3. Hooks. Attach our logic to your own components, no restrictions, create a tailor-made UI.

Features

  • Lightweight, modular plugin-based architecture, light on dependencies :zap:
  • Resumable file uploads via the open tus standard, so large uploads survive network hiccups
  • Supports picking files from: Webcam, Dropbox, Box, Google Drive, bypassing the user’s device where possible, syncing between servers directly via @uppy/companion
  • Works great with file encoding and processing backends, such as Transloadit, which handles encoding, conversion and delivery for you; works great without one too, if you would rather run and scale your own Apache/Nginx/Node/FFmpeg pipeline
  • Sleek user interface :sparkles:
  • Optional file recovery (after a browser crash) with Golden Retriever
  • Speaks several languages (i18n) :earth_africa:
  • Built with accessibility in mind
  • Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽)
  • Cute as a puppy, also accepts cat pictures :dog:

Installation

npm install @uppy/core @uppy/dashboard @uppy/tus

Add CSS uppy.min.css, either to your HTML page’s `` or include in JS, if your bundler of choice supports it.

Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: Smart CDN. In that case Uppy will attach itself to the global window.Uppy object.

⚠️ The bundle consists of most Uppy plugins, so this method is not recommended for production, as your users will have to download all plugins when you are likely using only a few.

<!-- 1. Add CSS to `<head>` -->
<link
  href="https://releases.transloadit.com/uppy/v6.0.1/uppy.min.css"
  rel="stylesheet"
/>

<!-- 2. Initialize -->
<div id="files-drag-drop"></div>
<script type="module">
  import {
    Uppy,
    Dashboard,
    Tus,
  } from 'https://releases.transloadit.com/uppy/v6.0.1/uppy.min.mjs'

  const uppy = new Uppy()
  uppy.use(Dashboard, { target: '#files-drag-drop' })
  uppy.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
</script>

Documentation

  • Uppy — full list of options, methods and events
  • Companion — setting up and running a Companion instance, which adds support for Dropbox, Box, Google Drive and remote URLs
  • React — components to integrate Uppy UI plugins with React apps
  • Architecture & Writing a Plugin — how to write a plugin for Uppy

Plugins

UI Elements

  • Dashboard — universal UI with previews, progress bars, metadata editor and all the cool stuff. Required for most UI plugins like Webcam
  • Headless components (react, svelte, vue)

Sources

  • Drag & Drop — plain drag and drop area
  • File Input — even plainer “select files” button
  • Webcam — snap and record those selfies 📷
  • Google Drive — import files from Google Drive
  • Dropbox — import files from Dropbox
  • Box — import files from Box
  • Facebook — import images and videos from Facebook
  • OneDrive — import files from Microsoft OneDrive
  • Import From URL — import direct URLs from anywhere on the web

The ⓒ mark means that @uppy/companion, a server-side component, is needed for a plugin to work.

Destinations

  • Tus — resumable uploads via the open tus standard
  • XHR Upload — regular uploads for any backend out there (like Apache, Nginx)
  • AWS S3 — plain upload to AWS S3 or compatible services

File Processing

  • Transloadit — creates Assemblies that upload files to Transloadit’s encoding backend. See the integration guide for JavaScript, React, Next.js, Vue, and Angular examples with server-signed Assembly options

Miscellaneous

  • Golden Retriever — restores files after a browser crash, like it’s nothing
  • Thumbnail Generator — generates image previews (included by default with Dashboard)
  • Form — collects metadata from `` right before an Uppy upload, then optionally appends results back to the form

Browser Support

We aim to support recent versions of Chrome, Firefox, and Safari.

FAQ

Why not use ``?

Having no JavaScript beats having a lot of it, so that’s a fair question! Running an uploading & encoding business for ten years though we found that in cases, the file input leaves

readme truncated — read the full docs on github

Frequently asked questions

Is uppy free to use?

uppy is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does uppy do?

The next open source file uploader for web browsers :dog:

What is uppy written in?

uppy is primarily written in TypeScript. Its source is publicly available at https://github.com/transloadit/uppy, and it has 30,984 GitHub stars.