outl1ne / nova-media-hub
A Laravel Nova tool for managing media.
Fund package maintenance!
Requires
- php: >=8.2
- laravel/nova: ^5.0
- outl1ne/nova-translatable: ^3.0
- outl1ne/nova-translations-loader: ^5.0
- spatie/image: ^3.0
- spatie/image-optimizer: ^1.7
Requires (Dev)
- laravel/nova-devtool: ^1.8
This package is auto-updated.
Last update: 2026-07-29 12:53:14 UTC
README
This Laravel Nova package allows you to manage media and media fields.
Requirements
php: >=8.2laravel/nova: ^5.0
Other Versions
Features
- Media Hub UI in separate view
- Media Hub field for selecting single/multiple media
- Collection renaming from the collections list
- Image optimization and multiple conversions support
- File naming and path making customization
- Dark mode support
- A lot configuration options
Screenshots
Installation
Install the package in a Laravel Nova project via Composer and run migrations:
# Install nova-media-hub composer require outl1ne/nova-media-hub # Run migrations php artisan migrate
Register the tool with Nova in the tools() method of the NovaServiceProvider:
// in app/Providers/NovaServiceProvider.php public function tools() { return [ // ... \Outl1ne\NovaMediaHub\MediaHub::make() // You can choose to hide the Tool from the sidebar ->hideFromMenu() // Optionally add additional fields to Media items ->withCustomFields( ['copyright' => __('Copyright')], overwrite: false ) ]; }
Usage
Fields
This package provides a field MediaHubField which allows you to select media. This saves the media as a JSON array into the database.
Example usage:
use Outl1ne\NovaMediaHub\Nova\Fields\MediaHubField; // ... MediaHubField::make('Media', 'media') ->defaultCollection('products') // Define the default collection the "Choose media" modal shows ->multiple(), // Define whether multiple media can be selected
Casting
The media column of models can be automatically cast as a Collection of Media models:
class Product extends Model { protected $casts = [ 'media' => \Outl1ne\NovaMediaHub\Casts\MediaCast::class, ]; }
$cover = Product::first()->media->first(); // ... $urls = Product::first()->media->pluck('url'); // ... $collection = Product::first()->media->where('collection_name', 'Details');
Configure
The config file can be published using the following command:
php artisan vendor:publish --provider="Outl1ne\NovaMediaHub\MediaHubServiceProvider" --tag="config"
Renaming collections
Each collection in the Media Hub sidebar has an edit button that renames the collection and moves all of its media items along with it. Files on disk are stored under a path derived from the media ID, so nothing is moved on the disk and existing media URLs keep working.
Renaming is only available when user_can_create_collections is enabled in the config, since a rename
introduces a new collection name. Collections listed under the collections config key always exist and
can't be renamed, so they have no edit button.
Custom optimizer chain
You can define a custom optimizer chain or add items to it like so:
// in app/Providers/AppServiceProvided.php public function register() { // ... // https://github.com/spatie/image-optimizer#creating-your-own-optimization-chains \Outl1ne\NovaMediaHub\MediaHub::withOptimizerChain( (new OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(new Pngquant([ '--force', ])) ); }
Localization
The translation file(s) can be published by using the following command:
php artisan vendor:publish --provider="Outl1ne\NovaMediaHub\MediaHubServiceProvider" --tag="translations"
Credits
License
Nova Media Hub is open-sourced software licensed under the MIT license.

