mradder / filament-s3-browser
Browse and manage S3 buckets directly inside your Filament admin panel.
Requires
- php: ^8.2
- filament/filament: ^4.0 || ^5.0
- illuminate/auth: ^11.0|^12.0
- illuminate/contracts: ^11.0|^12.0
- illuminate/filesystem: ^11.0|^12.0
- illuminate/http: ^11.0|^12.0
- illuminate/routing: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
- spatie/laravel-package-tools: ^1.19
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.18
- nunomaduro/collision: ^8.0
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/phpstan: ^2.1.32
README
Browse and manage S3 buckets directly inside your Filament admin panel.
Filament S3 Browser adds a storage browser to your admin interface so you can view, upload, move, delete, and preview files stored on S3-compatible storage without leaving Filament.
It supports Amazon S3, MinIO, Cloudflare R2, Wasabi, DigitalOcean Spaces, and
any other Laravel filesystem disk exposed through the Storage facade.
Features
- Browse configured Laravel filesystem disks directly inside Filament
- Navigate folders with breadcrumbs
- Upload files and create folders
- Rename, move, delete, and download files
- Preview images, PDFs, and small text files
- View metadata for binary files and unsupported previews
- Generate temporary signed URLs when the disk supports them
- Copy relative paths and public URLs
- Search entries in the current directory
- Switch between table and grid views
- Sort by name, size, or last modified date
- Restrict browsing to safe root prefixes
- Extend authorization with policies or use config fallbacks
Requirements
- PHP 8.2+
- Laravel 11 or 12
- Filament 4+
- Livewire 3
Installation
Install the package via Composer:
composer require mradder/filament-s3-browser
Publish the configuration file:
php artisan vendor:publish --tag="filament-s3-browser-config"
Register the plugin in your Filament panel provider:
<?php declare(strict_types=1); namespace App\Providers\Filament; use Filament\Panel; use Filament\PanelProvider; use MrAdder\FilamentS3Browser\FilamentS3BrowserPlugin; final class AdminPanelProvider extends PanelProvider { public function panel(Panel $panel): Panel { return $panel ->default() ->id('admin') ->path('admin') ->plugins([ FilamentS3BrowserPlugin::make(), ]); } }
Configuration
The package is configured through config/filament-s3-browser.php.
Example configuration:
<?php declare(strict_types=1); return [ 'disks' => [ 's3' => [ 'label' => 'Assets', 'root' => 'tenants/acme', 'temporary_urls' => true, ], 'archive' => [ 'label' => 'Archive', 'root' => 'archive', 'temporary_urls' => false, ], ], 'default_disk' => 's3', 'permissions' => [ 'view' => true, 'upload' => true, 'rename' => true, 'move' => true, 'delete' => true, 'download' => true, 'create_directory' => true, 'set_visibility' => true, ], 'temporary_urls' => [ 'enabled' => true, 'ttl' => 5, ], 'navigation' => [ 'enabled' => true, 'group' => 'Storage', 'label' => 'S3 Browser', 'icon' => 'heroicon-o-cloud', 'sort' => 50, ], 'preview' => [ 'text_limit_bytes' => 131072, 'signed_url_ttl' => 5, ], 'upload' => [ 'max_size_kb' => 51200, ], ];
Config notes
disksis keyed by the Laravel disk names defined inconfig/filesystems.phprootlimits the browser to a safe subdirectory on that disktemporary_urls.ttlis expressed in minutespreview.text_limit_bytescontrols how much text can be previewed inlineupload.max_size_kbcontrols the upload limit enforced by the Filament page
Example filesystem disks
Any Laravel filesystem disk can be browsed. For S3-compatible services that
use Flysystem's S3 driver, your config/filesystems.php may look like this:
'disks' => [ 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), ], ],
That same pattern works for MinIO, Cloudflare R2, Wasabi, and other S3-compatible providers by changing the credentials, bucket, region, and endpoint values.
Root restrictions
If you set a disk root such as 'root' => 'tenants/acme', the browser will
normalize every path and prevent traversal above that prefix.
Temporary URLs
When the disk supports Laravel's temporaryUrl() method, the browser can
generate short-lived links for downloads and previews. Image and PDF previews
use an internal signed route so private disks can still be previewed safely.
Usage
After installation, a new Filament navigation item appears by default:
Storage -> S3 Browser
From the browser page you can:
- switch between configured disks
- navigate folders with breadcrumbs
- search within the current directory
- refresh the current listing
- upload files
- create folders
- preview supported file types
- rename, move, download, and delete files
- copy relative paths, public URLs, and signed URLs
- inspect file metadata
Folders are listed before files, and users can switch between a table view and grid view.
Permissions
By default, the package uses the fallback flags in
filament-s3-browser.permissions.
For example, this disables uploads and deletes globally:
'permissions' => [ 'upload' => false, 'delete' => false, ],
If you need user-aware authorization, register a Laravel policy for
MrAdder\FilamentS3Browser\Data\BrowserTarget.
Example policy:
<?php declare(strict_types=1); namespace App\Policies; use App\Models\User; use MrAdder\FilamentS3Browser\Data\BrowserTarget; final class BrowserTargetPolicy { public function view(User $user, BrowserTarget $target): bool { return $user->can('media.view'); } public function upload(User $user, BrowserTarget $target): bool { return $user->can('media.upload'); } public function rename(User $user, BrowserTarget $target): bool { return $user->can('media.rename'); } public function move(User $user, BrowserTarget $target): bool { return $user->can('media.move'); } public function delete(User $user, BrowserTarget $target): bool { return $user->can('media.delete'); } public function download(User $user, BrowserTarget $target): bool { return $user->can('media.download'); } }
Then register the policy in your AppServiceProvider or AuthServiceProvider.
Preview Support
Supported preview types:
| Type | Behavior |
|---|---|
| Images | Inline preview modal |
| Opens in a new tab | |
| Text files | Inline preview when under preview.text_limit_bytes |
| Other files | Metadata view |
Testing
Run the package checks locally with:
composer test
composer analyse
composer format
The automated test suite uses Pest, Orchestra Testbench, and Storage::fake()
to cover:
- listing and nested directories
- folder creation
- file uploads
- renames and moves
- deletes
- root restriction safety
- temporary URLs
- preview modes
- unsupported filesystem features
- authorization fallback and policies
Extending
You can adapt the package by:
- adding more disks to the browser config
- scoping each disk to a specific root prefix
- adjusting preview limits and upload size limits
- implementing policies for
BrowserTarget - reusing the service layer in custom package integrations
The core browser logic lives in
MrAdder\FilamentS3Browser\Services\FilesystemBrowserService, while previews
and authorization are handled by dedicated services.
Screenshots
Screenshot placeholders can be added under docs/images/ as the package UI
evolves.
Roadmap
Planned improvements:
- drag and drop uploads
- bulk selection actions
- richer preview support for audio and video files
- optional visibility editing UI
- dashboard or widget integration for custom Filament experiences
Contributing
Pull requests are welcome.
Please read CONTRIBUTING.md before submitting changes.
Security
If you discover a security issue, please review SECURITY.md.
License
MIT License. See LICENSE.md.
Support the Project
If this plugin saves you time, consider giving it a GitHub star. It helps other Filament and Laravel developers discover the project.