marshmallow/advanced-nova-media-library
Advanced media library for Laravel Nova. Manage images and files through a polished Nova field, organize assets in folders, and attach reusable media to your Eloquent models with conversions and responsive images. Built for developers who need more than Nova's default file field.
Architecture fit. Unchanged: the package is a Laravel Nova field/tool wrapping spatie/laravel-medialibrary, giving Nova admins upload, crop, conversion, responsive-image, ordering, and custom-property controls. It fits only where Nova is licensed, Spatie Media Library is the canonical media layer, and models use HasMedia with defined collections/conversions. It remains a UI layer over Spatie; persistence, conversions, and URL generation stay Spatie's responsibility, which is the right separation — media data survives a field failure.
Integration feasibility. Composer-installable Laravel package with a Nova field class (AdvancedNovaMediaLibrary::make(...)). The 5.3.2 release materially changes the feasibility picture in two directions:
ebess/advanced-nova-media-library — strongly consistent with the fork hypothesis. This is a maintained internal fork with a working tracker, not an abandoned placeholder.Ecosystem adoption is still zero (0 stars, 0 dependents, no community compatibility reports), and the anomalous future-dated release metadata (2026-09-07) remains untrusted — but it now reads as a private/forked release pipeline rather than an untagged stub. Nova's proprietary license still blocks CI on public runners.
Technical risk.
marshmallow-packages plus a 5.3.2 version line confirms we are almost certainly dealing with a fork/rename of ebess/advanced-nova-media-library. Still required: confirm lineage, diff against upstream at the corresponding tag, verify license, and determine whether the 5.3.1 regression exists upstream or is fork-local. The answer changes the remediation burden significantly.handleMedia() runs removeDeletedMedia() before reconciling submitted values, so any submitted reference that is unresolvable — a row deleted after form render, or null/'' coerced by ConvertEmptyStringsToNull — is treated as "not kept" and the collection is emptied. 5.3.2 validates first and throws ValidationException before the destructive path. The ordering of that method is the single most important code to review.ValidationException for null, '', and stale ids. Any non-Nova caller of handleMedia() — API resource, import job, artisan command, Nova action — now throws where it previously 500'd or silently passed. Queue workers will surface these as failed jobs.Key questions.
null and '' now raising ValidationException, what is the sanctioned "remove all media" path, and does the Nova field's own UI produce it?ebess/advanced-nova-media-library at the matching tag, and what is the license?handleMedia() / removeDeletedMedia() for null, stale id, empty string, and valid id — or is the verification table the only record?handleMedia() in this codebase or in the package (API controllers, actions, jobs), and do those paths now throw where they previously did not?spatie/laravel-medialibrary v10/v11?Stack fit. Unchanged: Laravel 10–12, Nova 4/5, spatie/laravel-medialibrary v10/11, PHP 8.1+, queue driver (Redis/SQS), configured disk (local or S3). The package remains UI-only; all persistence and conversions are Spatie's.
Migration path.
^5.x constraint. Use an exact version constraint and commit the lockfile. If a lockfile currently resolves to 5.3.1 in any environment — including local and staging — treat that environment as a potential data-loss incident and audit its media collections immediately.null, '', stale id, valid id. Confirm the collection survives all three failure inputs and that the field still provides a working way to intentionally clear media.Compatibility. Build the matrix from your own smoke tests: Nova version, Laravel, PHP, Spatie Media Library, image driver. Because there are zero dependents, no community compatibility reports exist. Nova 5's field/Vue build changes still need checking against committed compiled assets. Add one compatibility dimension the original assessment lacked: package version × destructive-path behavior, since 5.3.1 and 5.3.2 are behaviorally different in a way that affects data durability, not just rendering.
Sequencing. (1) Pin to 5.3.2 / audit any environment on 5.3.1 → (2) license and upstream-lineage diff, including whether the regression is fork-local → (3) scratch-app PoC with regression inputs → (4) compatibility matrix and CI smoke test → (5) single-resource pilot → (6) broaden to all media-bearing resources → (7) runbook, backup/restore drill, fork contingency. Do not sequence the pilot before the queue, disk, and backup/restore path are proven — the 5.3.1 incident shows media loss propagates to rendered pages within minutes, so recovery speed matters as much as prevention.
Maintenance. Effectively self-supported. Budget an internal owner, quarterly dependency reviews, and a fork fallback. Track both Spatie Media Library and Nova release notes. If this is a renamed fork, upstream fixes will not flow automatically — plan to cherry-pick, and diff every release rather than reading changelogs alone.
Support. Zero stars and zero dependents means no Stack Overflow corpus and unknown issue responsiveness. The 5.3.2 notes are unusually candid and well-reasoned — a positive maintainer signal — but a single responsive maintainer is not an escalation path. Escalation is internal engineering plus Spatie docs.
Scaling. Media is I/O- and storage-bound, not CPU-bound in the admin. Conversions need queue workers with retry/backoff; large uploads need chunking or direct-to-S3 and tuned upload_max_filesize/post_max_size/Nginx limits. Nova edit pages with many media items can get slow — verify pagination/lazy loading. Plan CDN and responsive URLs to avoid serving originals.
Failure modes.
null, ''). Present in 5.3.1, fixed in 5.3.2 by validating before removeDeletedMedia(). Highest-severity mode; recovery requires a media-table and object-store restore.handleMedia() will surface as ValidationException in jobs, APIs, or actions. Enumerate callers before upgrading.HasMedia cleanup is unconfigured.Ramp-up. A Laravel developer familiar with Nova fields completes a PoC in about half a day and a production integration in 2–3 days excluding review. Operational ramp-up rises modestly with the new evidence: queue workers, storage lifecycle, image driver, and CDN add 1–2 days for platform/ops, plus half a day to establish and drill a media restore path (DB row restore plus object-store versioning), which the 5.3.1 incident shows is not optional. TPM framing: this is now a low-cost UI convenience with a demonstrated destructive failure mode and an actively patching maintainer — the provenance question is largely answered, but the package must be version-pinned, upgrade-staged, and backed by a tested restore path before it touches anything with unrecoverable content. Evaluate against Nova's native File field plus a small custom tool, or upstream ebess/advanced-nova-media-library at a known-good version, before committing.
How can I help you explore Laravel packages today?