outl1ne/nova-media-hub

A Laravel Nova tool for managing media.

Maintainers

Package info

github.com/outl1ne/nova-media-hub

pkg:composer/outl1ne/nova-media-hub

Transparency log

Fund package maintenance!

outl1ne

Statistics

Installs: 57 092

Dependents: 0

Suggesters: 1

Stars: 46

Open Issues: 15

3.0.4 2026-07-29 12:52 UTC

README

Latest Version on Packagist Total Downloads

This Laravel Nova package allows you to manage media and media fields.

Requirements

  • php: >=8.2
  • laravel/nova: ^5.0

Other Versions

laravel/nova: ^4.0

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

Media Hub

Choose media

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.