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.
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:
Both implement the tus 1.0 protocol and both survive a page reload — Uppy via Golden Retriever, CoreUpload via IndexedDB blob persistence.
Both can upload parts straight from the browser to S3-compatible storage using pre-signed URLs, bypassing your web server.
Google Drive, Dropbox, OneDrive and friends. Uppy uses Companion; CoreUpload ships a self-hosted Companion-compatible broker.
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.