File uploads, built for shadcn.
Upload components that look like the rest of your app, with a tested engine underneath: queues, retries, resumable transfers, any storage. Copy the UI and own the code.
Next.js · TanStack Start · Vite · React Router. Radix, Base UI or React Aria, in all 8 shadcn styles.
Folder upload
Upload island
Avatar & buttons
JPG, PNG or WebP. Cropped to a square.
Animated queue
Upload terminal
$ uploadcn push --watch
drop files here, or click to browse
AI chat attachments
Progress ring
Drop files on the ring, or click it
Composable queue
Upload dock
Attachment chips
Polaroid photos
Upload stack
The whole lifecycle
A dropzone is easy. Everything behind it isn't.
UploadCN handles the hard parts so your upload UI survives real networks, large files and impatient users.
- 01
Validate
Types, sizes, counts, duplicates, image dimensions, durations, and your own async rules.
- 02
Transform
Crop, rotate, resize and compress in the browser. EXIF orientation handled.
- 03
Queue
Concurrency limits, batches, priorities and per-file progress, speed and ETA.
- 04
Upload
Direct to S3 or R2 with presigned URLs. Bytes never touch your server.
- 05
Pause & resume
Parallel multipart parts that resume after a pause, a dropped connection or a reload.
- 06
Retry
Exponential backoff with jitter and Retry-After. Permanent errors fail fast.
- 07
Go offline
Uploads wait for the network and continue, without burning retries.
- 08
Scan & process
Scan files with ClamAV or VirusTotal in your route and read text with any OCR engine. Nothing is faked in the browser.
Composable
Compose it like any shadcn component.
Small parts with sensible defaults. Swap any of them, restyle every class, or drop down to the headless primitives.
<Upload adapter={s3Adapter({ endpoint: "/api/upload" })}>
<UploadDropzone>
<UploadDropzoneHeader>
<UploadDropzoneMedia variant="icon" />
<UploadDropzoneTitle>Drop files here</UploadDropzoneTitle>
<UploadDropzoneDescription>or click to browse</UploadDropzoneDescription>
</UploadDropzoneHeader>
</UploadDropzone>
<UploadList>
<UploadItem>
<UploadItemMedia />
<UploadItemContent>
<UploadItemTitle />
<UploadItemDescription />
</UploadItemContent>
<UploadItemActions />
<UploadItemProgress />
</UploadItem>
</UploadList>
</Upload>Components
Ready-made upload experiences.
From a single button to AI ingestion pipelines, each one a file in your project.
- UploadThe composable parts
- AnimatedFolder UploadOpens as you drag
- AnimatedMorphing ButtonButton → progress → done
- Image UploadCrop and compress
- Avatar UploadRound crop, progress ring
- Chat AttachmentsPaste, drop, send
- ParseChunkEmbedIndexDocument IngestRAG pipelines
- AnimatedAnimated QueueRows in motion
- AnimatedUpload StackFans out on hover
- AnimatedPolaroid UploadPhotos with a spring
- Video UploadResumable, with playback
- Upload FieldForms and server actions
- AnimatedUpload IslandA pill that morphs
- Upload DialogPick, review, upload
- AnimatedProgress RingOne ring for the batch
- Upload TableThe queue as a data table
- › deck.pdf ✓› data.csv ████░░$AnimatedUpload TerminalUploads as a CLI log
- ACACLogo UploadLight and dark previews
- AnimatedUpload DockMagnifies under the cursor
- AnimatedLiquid DropzoneFills up as it uploads
- Product MediaStorefront cover and gallery
- Identity VerificationKYC: ID and selfie
- SKUTitlePriceA-1A-2A-3CSV ImportCheck columns, then import
- Document ChecklistClaims and onboarding
Any storage
S3, R2, Cloudinary, local disk, Supabase, tus or your own endpoint. An adapter is a single function.
Secure by default
Signed URLs lock size and type, uploads are verified and scanned before they complete, and keys never come from the client.
Accessible & tested
Keyboard-first dropzones, real progressbars, live announcements, and 100+ tests on the engine.
What is UploadCN?
UploadCN is an open-source file upload kit for shadcn/ui. It ships upload components and blocks through a shadcn registry, so the UI is copied into your project, plus three small npm packages (@uploadcn/core, @uploadcn/react and @uploadcn/server) for the upload engine, React hooks and server routes.
How do I add a file upload component to a shadcn project?
Run npx shadcn@latest add @uploadcn/file-upload in a project set up with shadcn/ui. The CLI copies the component into components/ and installs its dependencies. Every block has its own install command on its docs page and on the examples page.
Is there a drag and drop file upload component for shadcn/ui?
Yes. UploadCN's File Upload is a shadcn/ui dropzone with drag and drop and click to browse, plus a file list with previews, progress, retry and remove. Install it with npx shadcn@latest add @uploadcn/file-upload, or pick one of 58 blocks such as image, avatar, gallery, document and video uploads.
Does UploadCN work with Next.js, Vite and TanStack Start?
Yes. The components are plain React, so they work in any React app set up with the shadcn CLI: Next.js (App Router), Vite, React Router, TanStack Start and Astro. The upload route ships for Next.js and TanStack Start, and the adapters work with any backend.
Which storage does UploadCN work with?
Any storage. Amazon S3, Cloudflare R2, MinIO, Backblaze B2 and other S3-compatible buckets use presigned URLs, so files go straight from the browser to the bucket. Cloudinary, local disk, tus servers, your own endpoint or any SDK (Supabase, Firebase, Vercel Blob) work through adapters, and localAdapter keeps files in the browser for forms.
Does it support large, resumable and chunked uploads?
Yes. Large files upload in parallel multipart chunks that resume after a pause, a dropped connection or a page reload. Retries use exponential backoff, and uploads wait for the network to come back when the user goes offline.
Does UploadCN work with every shadcn style and icon library?
Yes. Components follow all eight shadcn styles (Vega, Nova, Maia, Lyra, Mira, Luma, Sera and Rhea), the Radix, Base UI and React Aria bases, every theme, and the Lucide, Tabler, Hugeicons, Phosphor and Remix Icon libraries.
Can uploads be scanned for viruses?
Yes, on your server. The upload route can scan every file with ClamAV, VirusTotal or your own scanner before the upload completes. Infected files are deleted and shown to the user as rejected.
Can UploadCN read text from images and PDFs (OCR)?
Yes. OCR works with Google Cloud Vision, AWS Textract, Azure Document Intelligence, Mistral OCR or your own service through a server route, or with Tesseract directly in the browser. The OCR Upload and Receipt Upload blocks use it.
Is UploadCN free?
Yes. UploadCN is open source under the MIT license. You own the component code you install, and the npm packages are free to use in commercial projects.
Ship uploads your users won't notice.
Add the upload route, drop in a component, and point it at your bucket. That's it.