Works with any backend npm install Zero dependencies

tus 1.0 resumable uploads

MultipleUpload ships a zero-dependency tus 1.0 client (Core + Creation + Termination extensions). It interops with any tus-1.0 server - tusd, uppy-companion, transloadit, your own. Resume survives reloads by reading Upload-Offset from the server via HEAD and continuing the PATCH stream from there.

Live against tusd's public demo. The uploader below points at https://tusd.tusdemo.net/files/, a free public tus server. Try a large file; reload the page mid-upload and watch it resume from where it left off.
Client configuration
new MultipleUpload('#uploader', {
 strategy: 'tus',
 tusEndpoint: 'https://tusd.tusdemo.net/files/',
 chunkSize: 5 * 1024 * 1024, // PATCH chunk size
 persistState: true,
 persistAdapter: 'indexeddb' // resume HEAD+PATCH across reloads
});
Self-hosted tus server (tusd)
# Run tusd locally with filesystem storage
docker run -d --name tusd -p 1080:1080 \
 -v $(pwd)/uploads:/srv/tusd-data/data \
 tusproject/tusd:latest -behind-proxy -hooks-dir /srv/tusd-hooks

# Point the client at it:
# tusEndpoint: 'http://localhost:1080/files/'
Wire protocol (tus 1.0.0)
  • OPTIONS {endpoint} -> capabilities (Tus-Version: 1.0.0, Tus-Extension: creation,termination)
  • POST {endpoint} -> 201 + Location: {endpoint}{id} (Creation extension)
  • HEAD {endpoint}{id} -> current Upload-Offset (used for resume)
  • PATCH {endpoint}{id} <- bytes with Content-Type: application/offset+octet-stream
  • DELETE {endpoint}{id} on cancel / fatal error (Termination extension)

Upload metadata (filename, filetype) is sent via the Upload-Metadata header as comma-separated base64-encoded key-value pairs - the client handles this for you.