Works with any backend npm install Zero dependencies

Card Layout

Display queued files as individual cards in a responsive grid layout.

Drag & drop files here
var uploader = new MultipleUpload(el, {
 uploadUrl: '/api/upload',
 onFileAdded: function(task) {
 var card = createFileCard(task);
 grid.appendChild(card);
 },
 onTaskProgress: function(task, pct) {
 updateCardProgress(task.id, pct);
 },
 onTaskComplete: function(task) {
 markCardDone(task.id);
 }
});

Rendering the queue yourself

This is the headless pattern: the component handles selection, validation, transport, retry and progress, while the callbacks — onFileAdded, onTaskProgress, onTaskComplete — give you the events to build whatever UI you want from. Cards, a table, rows in an existing list: none of it requires overriding the component's CSS.

What you take on

Everything the built-in queue was doing for you: showing failures, offering retry, reporting why a file was rejected, and keeping the whole thing usable from a keyboard. Worth it when the upload UI has to sit inside an existing design system; a lot of work to reproduce when it does not.