Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Mediable Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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

  • Bus factor 1, zero validation. 20 stars, 0 dependents, single maintainer, MIT, no commercial support. There is no third-party production evidence and no Stack Overflow corpus; troubleshooting means reading source.
  • Bleeding-edge churn. The changelog shows a 0.x→1.8.0 arc with at least one wholesale component rewrite (0.9.0), a framework/PHP floor bump (1.4.0), and freshly landed features (1.7.0 derivatives, 1.8.0 image transformations). Expect upstream to break or lag on framework minors with no SLA to fix it.
  • Synchronous image derivative generation. WebP/AVIF conversion via GD/imagick appears to run inline on upload, with no documented queue support. AVIF encoding is CPU-expensive; per-upload blocking work is a PHP-FPM worker-starvation and request-timeout vector at any volume.
  • Public-disk assumption. The documented happy path (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.
  • Security posture of uploads. The README explicitly suggests adding 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).
  • Global event namespace. 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.
  • Ownership of the schema. A package-published migration means the 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

  1. Are the Blade/Livewire views and components publishable and overridable, or is UI customization a fork?
  2. Is there any authorization hook or policy layer, and does it support multi-tenant isolation?
  3. Can WebP/AVIF conversion be queued or deferred? What happens on conversion failure — is the original retained and is there a reconciliation path?
  4. Does the disk abstraction support private visibility and temporary/signed URLs?
  5. Is there a documented version-support policy, and will PHP 8.4 / Laravel 12 be supported?
  6. What is the maintainer's continuity plan, and is the repo responsive to security reports?
  7. Are there indexes and retention semantics on the attachments table suitable for 10k+ assets?
  8. What are the memory/time characteristics of AVIF generation on the target runtime, and is the AVIF delegate actually compiled into GD/ImageMagick there?

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.

Integration Approach

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:

  1. Spike in a throwaway Laravel 13 / PHP 8.5 app: install, migrate, upload one image and one PDF, confirm derivatives generate, confirm URL resolution behind a proxy.
  2. If viable, wrap it. Define an internal contract (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.
  3. Keep the package's attachment IDs in your own table with a source discriminator, so a future swap is a data backfill rather than a rewrite.
  4. Harden before first use: remove 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

  • Confirm imagewebp() / imageavif() or the imagick AVIF delegate exist in every target environment image (local, CI, staging, prod, any Vapor/serverless runtime).
  • Verify @mediableStyles / @mediableScripts behave with your Vite build, your asset versioning, and any CSP nonce/hash policy — inline injected assets are a common CSP failure.
  • Verify APP_URL correctness under load balancers and reverse proxies, and re-verify after every deploy topology change.
  • Check 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.
  • Pin an exact version. Do not float the constraint.

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.

Operational Impact

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.
  • Missing GD/imagick AVIF delegate in a rebuilt container → upload-time exceptions.
  • Conversion timeout or OOM → original stored, derivatives absent, no documented reconciliation loop. Detect and backfill.
  • Disk full or S3 credential/permission drift → failed uploads with package-level errors you must translate.
  • Orphaned files from record deletion outside the package's GC → unbounded cost creep.
  • Stored XSS if SVG is enabled per the README's suggestion.
  • Event-name collisions when two pickers share a page.
  • Stale config cache after env changes (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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console