🗂️ Filament File Explorer

Configuration

php artisan filament-file-explorer:install

publishes config/filament-file-explorer.php.

Config or plugin

Anything in the standalone block, plus quota, refresh, view.default, dates.* and folders.max_depth, can also be set on the plugin — and the plugin wins. That keeps settings panel-scoped in a multi-panel application instead of mutating global config, and keeps things working outside a panel (console, tests) where there is no plugin to ask.

Marked P below where a plugin setter exists. See The standalone page.

Two settings are config only, and deliberately: thumbnails.* and folders.model. Both are read by the model, which knows nothing about the panel it is being browsed from.

Top level

Key Default  
authorizer AllowAllAuthorizer P — your FileExplorerAuthorizer
collection 'file-explorer' The media collection files live in
auto_create_root true Create a root folder when a HasFileExplorer model is created — and on the first visit to a record that has none, see Records that already exist
morph_class null Only when migrating from another implementation
livewire_component Livewire\FileExplorer The component the pages mount

routes

The media routes — download, preview, thumbnail, archive.

Key Default
prefix 'file-explorer/media'
middleware ['web', 'auth']
name 'filament-file-explorer.media.'

The route names are frozen at 1.0.0. They never trust the scope key in their own URL — see Authorization.

upload

Key Default  
max_size_kb 51200 A promise, not a ceiling — read Large uploads
allowed_extensions every kind the icons render SVG deliberately absent
allowed_mime_types matching list Checked against the sniffed type
on_conflict 'rename' rename, replace or skip — see Uploads
chunk.enabled true Slicing
chunk.size_kb 4096 An upper bound; sized down to fit post_max_size, floored at 256 KB
chunk.ttl_minutes 60 How long an interrupted upload’s bytes are kept
chunk.directory 'file-explorer-chunks' Its own, never Livewire’s
chunk.routes.* ['web', 'auth'] Registered on the setting, not on whether slicing engages

listing

Key Default  
per_page 100 Items per window; “Load more” raises it by this again

thumbnails

Config only.

Key Default  
enabled true  
width / height 320  
queued false A host with no worker would never get one
kinds ['image'] pdf and video need tooling — Thumbnails
pdf_page 1  
video_second 1 Not 0: many videos open on black

quota

Key Default  
bytes null P — per root folder, not per application. Quotas

->quota(null) lifts a limit config had set: null means no limit, not no opinion.

refresh

Key Default  
seconds null P — floored at 5. Live updates

share

Key Default  
enabled true Share links
table file_explorer_shares  
default_ttl_days 7 null for links that never expire by default
max_ttl_days 30 A ceiling; null allows non-expiring links
routes.middleware ['web'] Without auth, deliberately

annotations

Key Default  
enabled true Tags and descriptions
descriptions_table file_explorer_descriptions  
tags_table file_explorer_tags  
tag_items_table file_explorer_tag_items  

trash

Key Default  
enabled true false deletes permanently. Trash
collection file-explorer-trash Must not equal the live collection

versions

Key Default  
enabled true Only engages on on_conflict => 'replace'. File versions
collection file-explorer-versions Must equal neither the live nor the trash collection
keep 3 Minimum 1
table file_explorer_file_versions  

folders

Key Default  
max_depth 12 P — bounds creation, uploads, copies and the column panes
table file_explorer_folders  
model Models\Folder Config only. Your own folder model

view

Key Default  
default 'grid' Pgrid, columns or details. Until the user picks

dates

P->dateFormat(...) and ->dateLocale(...).

Key Default  
format 'Y/m/d H:i' One pattern, or an array keyed by locale
locale null The language month and day names are written in; null follows the application’s

Every date the explorer shows goes through it: the Get Info inspector, the date column of the details and list views, the lightbox, the trash, the version history and a share link’s expiry.

The pattern is PHP’s own date() letters, formatted the translated way — so 'j F Y' reads 1 septembre 2026 under a French locale and 1 September 2026 under an English one. A literal letter has to be escaped: '\l\e j F Y'.

'dates' => [
    'format' => 'd/m/Y H:i',
],

One pattern per locale instead, with default answering for the rest. A regional locale falls back to its language, so fr also answers for fr_CA:

'dates' => [
    'format' => [
        'fr' => 'd/m/Y \à H:i',
        'en' => 'M j, Y g:i A',
        'default' => 'Y/m/d H:i',
    ],
],

locale pins the language regardless of the application’s, which is how a panel writes French dates in an English application:

FilamentFileExplorerPlugin::make()
    ->dateFormat('j F Y \à H:i')
    ->dateLocale('fr')

standalone

All P. See The standalone page.

Key Default  
enabled true Master switch
register_pages true Off to register the page classes yourself
files_page true The flat files table
slug 'file-explorer' Relative to the panel path
files_slug 'file-explorer/files'  
scope_key 'library' Authorization and session namespace
resolver GlobalRootResolver Choosing the root folder
root.name / root.slug Library / library Created on first visit
storage_widget false The dashboard widget
navigation.enabled true  
navigation.files_enabled false  
navigation.label null  
navigation.icon heroicon-o-folder  
navigation.group null  
navigation.sort null  

Settings that live elsewhere

Worth knowing where to look, because these decide things people expect to find here:

  Where  
The disk files go to media-library.disk_name Where files land
The path layout media-library.custom_path_generators Same page
The real per-file ceiling media-library.max_file_size Large uploads
Direct-to-storage livewire.temporary_file_upload.disk Same page
The temporary upload rules livewire.temporary_file_upload.rules Same page
Thumbnail generators media-library.image_generators Thumbnails
The ffmpeg binary media-library.ffmpeg_path Same page
The accent colour, the height your own theme’s CSS Theming

Adding a standalone setting

If you are contributing one, it goes in three places or it does not work:

  1. the config file,
  2. a fluent setter plus an accessor on FilamentFileExplorerPlugin,
  3. a reader on Support\StandaloneSettings — the single reader, never config() at a call site.

And if its “unset” value is a legal value — a nullable number, say — it needs its own has*() flag beside the getter, or the plugin cannot tell no opinion from no limit.