Craft 6 rebuilt asset uploads from scratch: tus, direct-to-S3 multipart, and uploads your PHP never touches
Large asset uploads through a PHP web server have always had a specific, annoying failure mode: you're bound by whatever request timeout and memory limit your server enforces, and a client's flaky connection means starting over from zero. Craft 6.0.0-alpha.19 (1 October 2026) replaces the entire upload pipeline specifically to get out of that bind, and it's a bigger architectural change than a changelog line like "migrated to Uppy" suggests.
What's actually new
Control Panel uploads — including user photos — now go through the native Uppy picker and shared upload sessions, with support for tus (resumable upload protocol) and direct S3 multipart transports, plus an extensible JavaScript upload API for anyone building custom upload UIs on top. The practical effect of "direct S3 multipart": the uploaded bytes can go straight from the browser to S3, in chunks, without ever passing through your PHP process. No request timeout to hit, no PHP memory ceiling to raise for a single big file, and tus gives you resumability if the connection drops mid-upload instead of restarting from byte zero.
The Assets index also got background uploads that continue while you navigate elsewhere in the Control Panel — persistent progress, retry, cancellation, and filename-conflict handling that doesn't block you from doing other work while a large file finishes. That's a real workflow change for anyone uploading video or large print assets through the CP rather than scripting it.
The breaking change, stated plainly
users/upload-user-photo now starts an upload session from JSON file metadata instead of accepting multipart file data directly. More significantly: the assets/upload and assets/replace-file multipart endpoints are removed outright, along with the legacy uploader events and overrides that plugins used to hook into them. If you've built or installed a plugin with a custom upload UI, or anything that listens for the old upload events, that code has a real rewrite ahead of it — this isn't a soft deprecation with a compatibility shim like the maintenance-mode change in alpha.18. The endpoints are gone.
Same release: the image editor finally got Undo/Redo and a "Revert to original" button. Previously, a destructive crop or rotation in the built-in editor had no way back except re-uploading the source file — a small addition, but the kind of missing safety net that's easy to not notice until the day you need it.
Why this matters beyond Craft specifically
Direct-to-storage multipart uploads with resumability are infrastructure most CMSes don't hand you for free — Drupal gets there through contrib (S3FS plus tuning, or a dedicated upload module) rather than a core upload pipeline built around it from the start. For anyone hosting on infrastructure with real request-timeout or memory constraints, or dealing with large media as a routine part of the content workflow, "the upload never touches your PHP process" is a meaningfully different cost and reliability profile than "raise upload_max_filesize and hope the connection holds."
What I'm doing about it
Nothing urgent on the Craft projects I run day to day — alpha releases aren't going into anything I'd call production yet. But if you maintain a plugin with a custom upload flow, the old multipart endpoints being fully removed (not shimmed) means this is worth testing against an alpha build now, not when 6.0 stable lands and the rewrite becomes mandatory on a deadline.