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' |
P — grid, 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:
- the config file,
- a fluent setter plus an accessor on
FilamentFileExplorerPlugin, - a reader on
Support\StandaloneSettings— the single reader, neverconfig()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.