tomshaw/mediable
Mediable is a lightweight Livewire media manager for Laravel that lets you upload, convert, and attach images, videos, and documents to blog posts, carousels, and product previews, with configurable file types, storage, and SEO-friendly names.
Architecture fit
Mediable is a UI-first, Livewire-native media manager, not a headless asset library. Its integration contract is three-fold: a Livewire component tag (<livewire:mediable fullScreen />), a global browser-event bus (mediable.open, mediable.on), and a package-owned attachments table created by a shipped migration. That is a good fit only for applications already committed to Livewire 4 as their primary rendering model. For an Inertia/React/Vue, API-first, or Blade-plus-vanilla-JS estate, you would be mounting a Livewire island purely to obtain a file picker — a significant architectural tax for a component whose actual value is a modal and an upload form.
Critically, the package does not appear to own the media domain. The README documents file selection and event dispatch, but nothing about model relationships (no polymorphic mediable attach/detach trait), authorization policies, or per-record scoping. You would store attachment identifiers yourself and own referential integrity, cascade deletes, and orphan reconciliation. Treat Mediable as a picker/uploader surface and build your own media domain around it — not the reverse.
Integration feasibility
Mechanically the install is trivial and well-documented: composer require, mediable:install, migrate, add @mediableStyles/@mediableScripts to the layout, storage:link, set APP_URL. Config covers validation mimes, max size, disk, folder, and image-derivative behavior. No dependents and no published integration examples mean you are the first production consumer exercising this path.
The hard blocker is the requirement floor: PHP 8.5, Laravel 13.20, Livewire 4.x. This is a bleeding-edge matrix that tracks the maintainer's own environment. Most production estates are on PHP 8.2/8.3 and Laravel 10–12; adopting this package may mean upgrading the host application's entire runtime, which is a platform program, not a package decision. Confirm the floor is a true minimum and not merely the maintainer's CI target before scoping anything.
Technical risk
storage:link, APP_URL, default public disk) implies world-readable URLs. Private content, signed URLs, and per-user access control are not first-class; S3 is supported as a disk but the URL/visibility model is unverified.svg to the mimes list as a one-liner customization — that is a stored-XSS vector unless sanitized, and no sanitization is documented. There is no mention of virus scanning, per-user quotas, or per-context validation policy (validation is one global rule).mediable.open / mediable.on are string-scoped, with a target-input id as the only disambiguation. Multiple pickers on one page or reused partials invite collisions; you must own the glue.attachments table is not yours to evolve freely. 1.5.0 introduced garbage collection for hidden attachments, implying an internal lifecycle you must understand before relying on it for cleanup.Key questions to resolve before commitment
attachments table suitable for 10k+ assets?Verdict: conditional no for core/DAM use, conditional yes as an embedded picker inside an existing Livewire 4 / Laravel 13 application, provided you wrap it behind an internal interface and budget for ownership. The 25/100 score is consistent with a promising but unproven single-maintainer component on a bleeding-edge matrix.
Stack fit
Proceed only if all three hold: the host app is on Livewire 4, the runtime is PHP 8.5 / Laravel 13.20, and the media use case is "browse, upload, pick, inject" (blog covers, product galleries, carousel assets) rather than governed digital asset management. If any of the three fails, do not adopt; the cost of bending the runtime or the rendering model exceeds the value of a picker modal. For non-Livewire front ends, the correct move is a purpose-built picker on your own media service, with Spatie Media Library or an equivalent as the storage layer.
Migration path
Treat this as an additive capability, never a migration of existing media. Existing assets should be imported into your media model; Mediable should only ever write its own uploads. Concretely:
MediaPicker) and a Media model/policy owned by your app. The package supplies the picker and the file write; your domain supplies identity, ownership, authorization, and lifecycle.attachment IDs in your own table with a source discriminator, so a future swap is a data backfill rather than a rewrite.svg from the mimes list, add per-context validation and quotas in your own layer, and decide derivative strategy (disable AVIF if synchronous encoding is unacceptable, or queue it yourself).Compatibility checks
imagewebp() / imageavif() or the imagick AVIF delegate exist in every target environment image (local, CI, staging, prod, any Vapor/serverless runtime).@mediableStyles / @mediableScripts behave with your Vite build, your asset versioning, and any CSP nonce/hash policy — inline injected assets are a common CSP failure.APP_URL correctness under load balancers and reverse proxies, and re-verify after every deploy topology change.upload_max_filesize / post_max_size / memory_limit against your intended max size; the default validation is 10 MB, and the docs suggest 50 MB as an example, which is well beyond typical PHP defaults.Sequencing
Runtime validation → security review of the upload path → derivative strategy decision → adapter and ownership model → single low-risk pilot surface (blog post images) → two-to-four weeks of observation → expand to further surfaces → document the exit plan. Do not parallelize the security review with the pilot; the upload path is the entire risk surface.
Rough effort: 3–5 engineer-days for the spike and compatibility validation; 2–3 engineer-weeks for the adapter, policy layer, derivative strategy, and hardening; ongoing ownership thereafter.
Maintenance
You are buying an ongoing obligation, not a dependency you can ignore. With one maintainer, zero dependents, and a version line that has already rewritten its component layer once, assume you will occasionally be maintaining a fork. Pin exact versions, keep a patch branch, and schedule re-validation against each Laravel 13.x and Livewire 4.x minor. Budget roughly 1–2 engineer-days per month plus discrete upgrade events, and assign a named internal owner — "the community maintains it" is not an available answer here.
Support
MIT, GitHub issues only, no SLA, no commercial option, no track record. Escalation path ends at your team reading the source. Set that expectation with stakeholders explicitly before approval; if the business requires vendor accountability for a media pipeline, this package cannot provide it.
Scaling
Three pressure points. First, synchronous conversion: each upload blocks a PHP worker for the duration of WebP plus AVIF encoding; AVIF is materially slower than WebP and scales badly with concurrency. Second, storage growth: derivatives multiply object count per image (original + WebP + AVIF), and the only documented cleanup is GC for hidden attachments — orphan policy for records deleted elsewhere is undefined and needs verification. Third, query volume: a single attachments table with undocumented indexing needs an audit before you exceed ~100k rows. Mitigate by fronting the disk with a CDN, right-sizing memory limits, and queueing derivatives if the package permits it.
Failure modes to instrument
APP_URL / storage:link drift after deploy or proxy change → silent 404s on all media.disk, folder, derivative flags) — the docs call out config:clear; make it part of the deploy checklist.Ramp-up
Usage ramp-up is fast: a Livewire-fluent engineer can wire the component and event handlers in under a day, and the README is sufficient for the happy path. Ownership ramp-up is the real cost. There is no tutorial ecosystem, no community answers, and no internal documentation beyond a README — troubleshooting is source-diving into Livewire components, transformation traits, and GC logic. Plan one sprint of an experienced Laravel engineer to read the source and produce an internal runbook covering derivative behavior, cleanup semantics, config surface, and the upgrade procedure. Onboarding for consumers of the picker is cheap; onboarding for owners is not, and that asymmetry should drive the staffing decision.
How can I help you explore Laravel packages today?