finller/laravel-media
Laravel Media gives Eloquent models a fluent API for attaching and managing files: define conversions, generate responsive images, and store media across local or cloud filesystems with minimal configuration and clean, expressive code.
Architecture fit. finller/laravel-media is a conventional Laravel package: a service provider with publishable config and migrations, an Eloquent Media model attached polymorphically to host models, Flysystem-backed disk abstraction, and a conversion pipeline that generates derivatives (including nested conversions, i.e., conversions of conversions). This is the same shape as spatie/laravel-medialibrary, so it slots into a standard Laravel app without architectural contortion. It is a good fit if we want a first-party-feeling media layer with richer built-in metadata extraction than rolling our own, and a poor fit if our media needs are trivial (single avatar upload) or highly bespoke (video transcoding farm, DRM).
Integration feasibility. High for a greenfield module: composer require, publish config/migrations, add a media collection trait/interface to the owning model, configure disks, queue the conversions. Requires PHP 8.x, a Laravel version inside the package's constraint, an image driver (gd/imagick) and, for audio/video metadata or conversions, ffmpeg/ffprobe on the worker fleet. Feasible in days for a spike, not weeks.
Technical risk. The dominant risk is maturity, not technology:
spatie/laravel-medialibrary is already present, we must not run two media subsystems against the same models.Key questions for the maintainer/evaluation spike.
Stack fit. Assumes a standard Laravel app on PHP 8.2+, Redis/DB queues, and S3-or-equivalent object storage in production. The package's Flysystem abstraction means local-in-dev / S3-in-prod works without code changes — a meaningful win for parity. It fits a modular monolith cleanly; in a multi-service estate it should own media for exactly one Laravel application, not act as a shared media service.
Migration path. Do not adopt directly in a revenue path. Sequence:
MediaService interface (attach, convert, URL, delete). This is the single most valuable insurance policy — it caps the cost of a fork, a swap to Spatie, or a rollback.Compatibility. Verify the Composer constraint against our Laravel minor before anything else; check for conflicts if spatie/laravel-medialibrary, intervention/image, or league/flysystem-aws-s3-v3 are already pinned. Confirm the image driver matches our base images and that ffmpeg is present on workers if we need AV metadata. Check that published migrations don't collide with existing table names.
Sequencing. Config and disk setup → model wiring → synchronous conversions in dev → move conversions to queues → add nested conversions → add CDN/signed URLs → add cleanup jobs. Defer nested conversions and rich metadata until the flat pipeline is proven; they are the features most likely to expose upstream bugs.
Maintenance. Budget an ongoing owner, not a one-off integration. Realistic load: a few hours per quarter tracking Laravel/PHP upgrades, plus contingency for upstream stalls. Pin the version, read changelogs before bumping, and keep the adapter layer thin so a fork remains a day's work rather than a quarter's. If the maintainer goes quiet, we own the package — accept that explicitly or choose Spatie.
Support. No commercial support, no SLA, small community. Internal escalation is "read the source," which is feasible for a package of this size and is a reasonable trade for a capable team. Document our own runbook; do not expect upstream answers on a deadline.
Scaling. Two axes. Storage: every conversion multiplies bytes; nested conversions multiply again. Enforce retention rules, generate derivatives lazily, and size S3 lifecycle policies before launch, not after the bill. Compute: conversions are CPU- and I/O-bound; isolate them on a dedicated queue and worker pool so image processing cannot starve transactional jobs. Metadata extraction on large video is the worst offender — cap file size and set job timeouts.
Failure modes to instrument.
Ramp-up. Low technical learning curve for any Laravel developer (familiar patterns, publishable config), but no community second opinions: expect the team to read vendor source for edge cases and to own the docs. Plan half a day of onboarding plus the runbook. The scarcity of external references also means LLM-assisted debugging will be unreliable — worth stating plainly to the team.
Verdict. Viable and pleasant for a greenfield, non-critical media feature in a team that can read PHP source and accept ownership risk. Not appropriate for a platform-critical media service, a compliance-sensitive pipeline, or an organization that requires vendor support. Gate adoption on the adapter layer and a successful spike against real files; otherwise default to the ecosystem incumbent.
How can I help you explore Laravel packages today?