Product Decisions This Supports
- Build vs. buy for media handling. This is the "buy" (well, free OSS) answer to a recurring build-vs-buy question: do we spend 3–8 engineering weeks building upload, storage abstraction, polymorphic attachment tables, image conversions, responsive images, and cleanup jobs — or do we adopt a 6.1k-star MIT-licensed package with years of changelog history? Adopting it moves that work from "roadmap item" to "sprint zero plumbing."
- Feature scoping for anything file-shaped. Avatars, product galleries, KYC document uploads, invoice PDFs, marketplace listing photos, LMS course assets, CRM attachments, support-ticket screenshots. One package covers all of these with the same mental model (
addMedia(...)->toMediaCollection('images')), which means one set of conventions across squads instead of four bespoke implementations.
- Roadmap sequencing. Media support is usually a dependency of a revenue feature, not the feature itself. Adopting this lets you pull "seller can upload 10 product photos" into Q1 without pulling "build a media subsystem" with it.
- Performance and cost decisions. Built-in conversions and responsive image generation let us take a deliberate position on image weight (LCP / Core Web Vitals) and on storage tiering — small files to
local, large assets to s3. That's a cost line item and a page-speed line item in one decision.
- Storage/vendor portability. Because it sits on Laravel's filesystem layer, we're not committing to a specific object store. This is a low-regret decision that keeps the S3-vs-GCS-vs-local call reversible.
- Multi-tenancy and data-retention design. Collections are a first-class concept, so "which media belongs to which tenant/model" and "what gets purged when a record is deleted" become configuration decisions rather than custom engineering.
- Explicitly not a DAM decision. This package doesn't decide whether we need asset search, tagging, approval workflows, or a marketing asset library. Keep that as a separate (and probably separate-vendor) question.
When to Consider This Package
Adopt when most of these are true:
- The stack is Laravel on PHP 8.x with Eloquent models as the domain core (the API is idiomatic Eloquent; it's awkward anywhere else).
- Attachments are associated with records — images on a product, a file on a ticket — rather than being a standalone library managed by non-technical users.
- You need image conversions / thumbnails / responsive variants. This is where the package earns its keep versus a thin wrapper over
Storage::put().
- You want polymorphic attachments (
HasMedia on many models) without designing the media table, path generators, and conversion pipeline yourself.
- Team is small-to-mid and time-to-market matters more than controlling the internals.
- You can accept following a well-documented but opinionated set of conventions, plus occasional major-version upgrade work.
Look elsewhere when:
- You need video/audio transcoding, streaming, or adaptive bitrate — outside scope; pair with a dedicated service.
- You need AI tagging, OCR, moderation, or faceted asset search — that's a DAM/media-AI product, not this.
- You're on Node/Django/Rails or a polyglot backend — the value is Laravel-native, and porting the concepts is a build project anyway.
- You're operating at very high asset volume (hundreds of millions of objects, heavy write concurrency) where the Eloquent-record-per-media model becomes a scaling consideration.
- You have hard compliance requirements (WORM retention, e-discovery, audited chain-of-custody, HIPAA-grade controls) that need a compliant platform, not a library.
- You want zero upgrade maintenance — this is a maintained library with breaking changes across majors (v10 → v11); someone owns upgrades.
- You want a managed, hosted solution with CDN, transformations at the edge, and vendor support SLAs.
How to Pitch It (Stakeholders)
For executives (30 seconds): Every product we build eventually needs file uploads — product photos, documents, avatars. Building that from scratch is 4–8 engineer-weeks we'd rather spend on differentiating features. spatie/laravel-medialibrary is a free, MIT-licensed, widely adopted Laravel package (6,100+ GitHub stars, actively released, documented, changelogged) that gives us uploads, storage abstraction, image resizing, and thumbnail generation out of the box. Cost is effectively zero; the main ongoing cost is periodic version upgrades. It's a low-regret, reversible decision — the data lives in our own database and any storage backend we choose, so we can walk away if needed.
For engineering (what they actually care about): Idiomatic Eloquent integration via a HasMedia trait; storage delegated to Laravel's filesystem so S3/GCS/local all work; supports uploads straight from the request, collections per model, per-collection filesystem selection, and configurable image/PDF conversions including responsive images and modern formats (WebP/AVIF). Mature docs and changelog; test suite runs across a PHP/Laravel matrix. Requires PHP 8.x and current Laravel; expect major-version upgrades with breaking changes to be budgeted as recurring maintenance, and note the maintainers also offer a paid Pro tier, so evaluate which capabilities sit behind it before committing. Alternatives exist (laravel-mediable, laravel-stapler, media-manager) but have materially less momentum — this is the de facto default in the ecosystem.
What we're explicitly saying no to by adopting it: we're saying no to a bespoke media subsystem, and no to solving video transcoding, asset search, AI tagging, or enterprise DAM workflows with this package. Those stay open, separate decisions.