outerweb/filament-image-library
Filament Image Library adds a reusable image library to your Filament panel, letting you upload, organize, and pick images from a central media pool in forms and tables. Browse, search, and reuse images instead of re-uploading them.
What it actually is. outerweb/filament-image-library is a Filament panel plugin that adds a shared image library — a management page inside the admin panel plus a picker field that lets editors reuse an existing image across many records instead of re-uploading per record. The durable artifacts it introduces into your codebase are an Eloquent model, a migration, a config file (disk/path/variants), and a form component. Everything else is UI that lives inside Filament.
Architecture fit. Fit is binary, and it's decided by one question: is your admin surface built on Filament v3? If yes, the plugin composes cleanly into the existing PanelProvider and form schema and costs almost nothing architecturally. If no, it is not a library you can extract value from — the picker is a Livewire/Filament component and has no headless API. A secondary fit question matters more than it looks: a shared library implies a many-to-many relationship between content records and image assets. That is the right model for editorial sites, catalogs, and marketing pages where hero images get reused. It is the wrong model for per-record uploads (avatars, KYC documents, user attachments) where lifecycle and authorization belong to the parent record. Adopting this plugin pushes you toward a global-asset mental model whether or not your domain wants one.
Integration feasibility. Mechanically trivial: composer require, register the plugin in the panel provider, publish config and migrations, php artisan migrate. A spike is a half-day to a day, including wiring one real resource. The cost is not installation — it is the downstream decisions the plugin forces (storage disk strategy, who owns deletion, tenant scoping), which are the same decisions you'd face building it in-house, minus the flexibility.
Technical risk. Material, and mostly about the package's maturity rather than its code quality:
Key questions to answer before committing.
spatie/laravel-medialibrary or roll its own storage? (This determines your exit cost and your conversion/thumbnail tooling.)Stack fit. Assumes a Laravel 10/11 + PHP 8.1+ + Filament v3 + Livewire 3 admin panel with a configured filesystem disk (local or S3) and, for production quality, a CDN in front of it. It slots in as a panel plugin, so it inherits your auth, policies, navigation groups, and theme — no separate frontend, no separate deployment unit. That is the core argument in its favor: if you already run Filament, this is a small delta.
Build-vs-buy framing. The honest comparison is not "this package vs nothing," it is "this package vs spatie/laravel-medialibrary plus Filament's first-party Spatie media library plugin." The first-party path has orders of magnitude more production usage and a supported upgrade story, at the cost of more integration work to get a shared, cross-record picker — which is precisely the gap this package fills. So the decision hinges on whether a shared library UX is a hard requirement or a nice-to-have. If it's nice-to-have, take the first-party route. If it's a hard requirement, this package is a genuine accelerant with a real tail of ownership.
Migration path. Greenfield is straightforward. For existing media, plan for a backfill: extract current file paths and metadata into the plugin's model, deduplicate by content hash where the same asset was uploaded repeatedly, then repoint form fields from raw uploads to the picker. Do this behind a feature flag per resource so you can roll back resource-by-resource. The important structural point is that data lock-in is low: the assets are files on your disk and rows in your database. If the package is abandoned, you keep the data and rewrite the picker UI in a few days. The lock-in is at the UI/component layer, not the storage layer — which is the safe place for it to be.
Compatibility. Pin the package to an exact minor version and pin Filament alongside it. Explicitly test the combination against your Livewire version; Filament plugin breakage usually surfaces as a Livewire component lifecycle error, not a PHP fatal, so it hides until someone opens the modal. Watch for a transitive dependency collision if you already use spatie/laravel-medialibrary — confirm whether it's a requirement or a peer, and at what constraint.
Sequencing.
App\Filament\Fields\LibraryImage) so application code never references the vendor namespace directly. Add upload validation, set disk/config explicitly, and add a policy.The wrapper in step 2 is the single highest-leverage decision here. It converts an unsupported 24-star dependency into a swappable internal abstraction and reduces abandonment from "rewrite the admin" to "rewrite one component."
Maintenance. Assume you own this. The realistic posture is: you monitor Filament releases, you test upgrades, and you carry a fork with a one-line patch at some point in the next 18 months. Budget a few hours per Filament minor and a day per major. That is cheap relative to building the feature, and expensive relative to a first-party dependency — the trade is deliberate and should be made explicitly, not by default.
Support. Community-only, no SLA, issue tracker as the sole channel. Outerweb is a working agency, so responsiveness will likely be decent but is not contractual and is not durable — if their priorities change, support ends with no notice. Do not put this on a roadmap that assumes a fix arrives by a date. For a package this small, the practical mitigation is that a competent Laravel developer can read the whole source in an hour, which is worth more than a support contract.
Scaling. Two axes.
Failure modes, ordered by likelihood × impact.
| Failure | Impact | Mitigation |
|---|---|---|
| Filament upgrade breaks the plugin | Panel media editing down | Version pin + wrapper component + fork |
| Deleting an in-use image breaks published pages | Broken images on live site | Reference counting; block or soft-delete; audit job |
| Disk/path misconfiguration or missing CDN rule | Uploads succeed, images 404 | Config in env, smoke test in CI |
| Any panel user can delete library assets | Content loss, no audit trail | Policy + activity log on the model |
| Tenant/customer sees another's assets | Data exposure | Verify scoping before multi-tenant use; likely needs custom work |
| Synchronous conversion on large uploads | Request timeouts | Move to queue; enforce size limits |
Ramp-up. Developers already fluent in Filament need 2–4 hours to be productive, mostly reading source. Content editors need real training, because the shared-library concept changes their mental model: they are no longer "uploading to a page," they are "choosing from a catalog," and deleting has cross-page consequences. That is a workflow change, not a UI change, and it is the part most likely to generate support tickets after launch.
Recommendation. Adopt only if (a) you are committed to Filament v3 for the near term, (b) a shared cross-record image library is a genuine product requirement rather than a convenience, and (c) you accept fork ownership. Under those conditions it saves roughly 3–5 developer-days against the build-it-yourself path and is worth the small dependency risk — provided it is wrapped in an internal component and gated by a spike that answers the authorization and deletion-semantics questions first. If any of those three conditions fails, take the first-party Spatie path instead; the incremental build cost is a few days and the operational risk profile is substantially better.
How can I help you explore Laravel packages today?