| Install | |
|---|---|
composer require mradder/filament-s3-browser |
|
| Latest Version: | v0.1.4 |
| PHP: | ^8.2 |
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.
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(),
]);
}
}
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,
],
];
disks is keyed by the Laravel disk names defined in config/filesystems.phproot limits the browser to a safe subdirectory on that disktemporary_urls.ttl is expressed in minutespreview.text_limit_bytes controls how much text can be previewed inlineupload.max_size_kb controls the upload limit enforced by the Filament pageAny 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.
If you set a disk root such as 'root' => 'tenants/acme', the browser will
normalize every path and prevent traversal above that prefix.
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.
After installation, a new Filament navigation item appears by default:
Storage -> S3 Browser
From the browser page you can:
Folders are listed before files, and users can switch between a table view and grid view.
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.
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 |
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:
You can adapt the package by:
BrowserTargetThe core browser logic lives in
MrAdder\FilamentS3Browser\Services\FilesystemBrowserService, while previews
and authorization are handled by dedicated services.
Screenshot placeholders can be added under docs/images/ as the package UI
evolves.
Planned improvements:
Pull requests are welcome.
Please read CONTRIBUTING.md before submitting changes.
If you discover a security issue, please review SECURITY.md.
MIT License. See LICENSE.md.
If this plugin saves you time, consider giving it a GitHub star. It helps other Filament and Laravel developers discover the project.