vadage/presigned-uploader-bundle
Symfony bundle that generates presigned upload URLs so clients can send files directly to cloud storage such as S3. Keeps credentials server-side, offloads large transfers from your application, and simplifies secure direct-to-storage uploads with minimal configuration.
Baseline note: no prior assessment exists, so this is an initial evaluation rather than a delta review. v0.2.1 is a patch release with no API or breaking changes, but it is the first version that can actually be consumed through its documented loader path — treat >=0.2.1 as the minimum viable floor and block anything below it.
Architecture fit — primary finding: the release notes describe @vadage/presigned-uploader-bundle as a Symfony package, not Laravel. The evidence is unambiguous: an ...Bundle suffix, assets/controllers.json (Symfony UX / Stimulus controller registration), Webpack Encore, and vite-plugin-symfony. There is no Laravel service provider, no config/*.php publishable config, no Storage/Filesystem integration, and no Laravel package discovery metadata implied anywhere. The premise of a "Laravel/PHP package" should be corrected before any planning proceeds: this is a Symfony bundle whose only Laravel-reusable artifact is the framework-agnostic Stimulus controller.
laravel-vite-plugin + resources/js/app.js, with Alpine/Livewire as the interaction layer. Symfony UX controller conventions do not map onto it without adapter work.dist/upload_controller.js — a Stimulus controller that may be usable under Laravel if Stimulus is already in the stack; (2) the PHP-side presigned-URL generation, which is Symfony-DI-configured and would have to be re-implemented, not installed.Webpack Encore failed the build whenever the package was listed; vite-plugin-symfony failed once the upload controller was enabled), so a spike is now possible where it previously was not.package.json and entry file — means the package had effectively zero working installs through its documented path prior to this patch. That points to thin packaging/CI validation (no post-build consumer smoke test). Combined with a 0.x version line, assume the API and asset layout can shift in any minor release.upload_controller.js free of Symfony UX runtime assumptions (controller registry, data-controller bootstrapping, symfony/ux-* helpers)?exports map in package.json stable, and will subpath exports be considered a compatibility surface?Stack fit: Laravel (Vite, laravel-vite-plugin, Alpine/Livewire) against a Symfony UX Stimulus package. Nothing composes out of the box. The viable shape is a thin internal adapter, not an installation.
Recommended target architecture:
resources/js/app.js.POST /uploads/presign) using Storage::disk('s3')->temporaryUploadUrl() or the AWS SDK directly. This is the piece you own; do not attempt to port the Symfony DI configuration.Migration path from the previous state: there is nothing to migrate — no prior adoption. The de-risking sequence is:
package.json, dist/upload_controller.js, and a valid exports map are present in the 0.2.1 tarball (npm pack --dry-run or unpack the tarball). Do not trust the changelog alone; the changelog is a claim that the artifact changed.npm run build and npm run dev. The v0.2.1 fix targets Encore and vite-plugin-symfony; plain Vite + laravel-vite-plugin is a different resolver path and is not what was fixed. Verify it independently.Compatibility: verify PHP constraint (assume 8.1+; unconfirmed), Stimulus 3.x against whatever the rest of the front end uses, and Node/Vite resolver behavior around exports. Note that adding an exports map is itself a resolution change — it can restrict previously-deep-importable subpaths, so pin the version rather than floating ^0.2.
Sequencing: artifact verification → Vite resolution spike → go/no-go on controller reuse → Laravel signing endpoint → integration test → pin. Do not start with the endpoint before the resolution spike; if step 2 fails, the endpoint is wasted work.
Maintenance: the dominant cost is the adapter, not the dependency. Every upstream 0.x minor can break the controller's expected events, attributes, or asset paths, and you own the reconciliation because the PHP half is not portable. Budget a standing per-release review; a patch that touches packaging (as 0.2.1 does) still requires re-running the resolution spike, since the failure mode is a build-time resolve error, not a runtime exception.
Support: community/maintainer-led, pre-1.0, single-vendor (@vadage). No commercial backing implied, no LTS, no documented Laravel support channel. Escalation for a Symfony-specific regression that blocks a Laravel use case is unlikely to be prioritized. Mitigation: fork dist/upload_controller.js into resources/js/vendor/ and treat upstream as a reference implementation rather than a dependency. This converts an availability risk into a known, small, owned surface.
Scaling: the presigning model scales well if the flow is direct-to-object-storage — the app server only signs, so bandwidth and memory stay flat as file volume grows. Watch three things: signing endpoint rate limits (one call per file, so it inherits upload concurrency), presigned URL TTL versus large-file upload duration (short TTLs fail mid-upload on slow links), and storage-side CORS plus multipart cleanup for abandoned uploads. If the bundle instead proxies bytes through PHP, that is a hard scaling constraint and a reason to reject full-stack adoption outright — confirm this in question 3 above.
Failure modes:
Could not find module during npm run build/dev. Blast radius is total: a broken asset build blocks all deploys, not just uploads.Ramp-up: low for the JS controller if the team already knows Stimulus; effectively a from-scratch implementation for anyone on Alpine/Livewire. Realistic estimate: 1–2 days to evaluate and spike, 2–4 days to build and test the Laravel signing endpoint plus validation, and a recurring half-day per upstream release to re-verify packaging and resolution.
Recommendation: do not adopt this as a Laravel dependency. Run the resolution spike to confirm whether dist/upload_controller.js is framework-agnostic; if it is, vendor it and pair it with a Laravel-owned presigning endpoint. If it is not, build the upload flow directly. Either way, pin 0.2.1 exactly and require a clean-install smoke test in CI for anything pulled from this package.
How can I help you explore Laravel packages today?