Direct-to-S3 / Azure tus 1.0 resume IndexedDB Golden Retriever 30 locales Webcam & screen capture

CoreUpload vs Uppy

Uppy is an excellent, widely used open-source JavaScript uploader from Transloadit, and it is the closest feature match to CoreUpload. If you are building on ASP.NET Core, the practical difference is how much of the server you assemble yourself.

The honest summary

Uppy and CoreUpload overlap a great deal on the browser side: both do resumable uploads, both speak tus, both can push parts straight to S3, and both can pull files from remote sources.

The difference is scope. Uppy is deliberately backend-agnostic — it works with any server you write, and its Companion service handles remote-source OAuth and fetching. CoreUpload is ASP.NET Core-specific and ships the receiving endpoints in the same NuGet package.

Choose Uppy if you want one uploader across a mixed stack, or you are not on .NET. Choose CoreUpload if you are on ASP.NET Core and would rather not hand-write the chunk assembler, resume store and cloud signer.

Where they line up

These are genuine strengths of both projects, not differentiators:

Resumable uploads

Both implement the tus 1.0 protocol and both survive a page reload — Uppy via Golden Retriever, CoreUpload via IndexedDB blob persistence.

Direct-to-cloud

Both can upload parts straight from the browser to S3-compatible storage using pre-signed URLs, bypassing your web server.

Remote sources

Google Drive, Dropbox, OneDrive and friends. Uppy uses Companion; CoreUpload ships a self-hosted Companion-compatible broker.

Image handling

Both offer client-side image work before upload; both let you resize/crop rather than shipping full-size originals.

Where they differ

Dimension Uppy CoreUpload
Scope Client library (+ Companion for remote sources). You provide the upload endpoint. Client runtime + ASP.NET Core endpoints in one package.
Stack Any backend — Node, PHP, Python, .NET, Go. ASP.NET Core (.NET 8+). Not a fit outside .NET.
Server setup You implement receiving, chunk assembly and storage (or run tusd / Companion). app.MapCoreUploadEndpoints() maps upload, chunk, chunk/status, tus and cloud-signing routes.
Markup JavaScript instantiation; official React/Vue/Svelte/Angular components. A <core-upload> Tag Helper in Razor, or the JS API directly.
Licensing Open source (MIT). Commercial licence; free on localhost for evaluation.
Framework wrappers First-party React/Vue/Svelte/Angular packages. Razor Tag Helper plus first-party React/Vue hooks, a Svelte action and an Angular service shipped in the package (_content/CoreUpload/adapters/).
Instant upload (dedupe) Not built in — deduplication is left to your backend. Opt-in SHA-256 dedupe (instantUpload): content the server already stores completes instantly with zero bytes transferred; the server hashes stored uploads itself.
Blazor JavaScript library - no first-party Blazor component; Blazor users write JS interop or rely on a community wrapper. Ships a native <CoreUploader /> Blazor component (Server + WebAssembly) with typed C# events, in the same NuGet package.

Less common capabilities in CoreUpload

These are the pieces we most often hear are hard to assemble elsewhere. Each has a live demo:

  • Cross-tab de-duplication. Open the same file in two tabs and it uploads once, with a shared progress view. See it.
  • Adaptive concurrency + circuit breaker. Concurrency rises and backs off (AIMD) with your endpoint's health, and a failing endpoint trips a breaker instead of being hammered. See it.
  • Client-side encryption at rest. AES-GCM-256 in the browser, so ciphertext is all your server ever holds. See it.
  • Magic-byte MIME validation. Content sniffing rather than trusting the file extension. See it.
  • Capture sources. Webcam, screen and audio recording as upload inputs. See it.

Migrating from Uppy?

If you are already on tus or S3 multipart, the transport contract is the same — CoreUpload can talk to a tus server you already run (asp-strategy="tus"), so you can move the UI first and the server later.