Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filemanager Laravel Package

livewire-filemanager/filemanager

Livewire-powered file manager for Laravel with drag-and-drop uploads, search, dark mode, multi-language support, and API endpoints. Integrates with spatie/laravel-medialibrary for easy file and folder management.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

The package is a drop-in Laravel/Livewire component (<x-livewire-filemanager />) layered on spatie/laravel-medialibrary. That means the storage abstraction is a well-known Laravel standard rather than a proprietary black box, which materially lowers the long-term architectural risk versus a bespoke vendor SDK. It fits best where the host application is already a Blade + Livewire monolith and already uses Tailwind CSS and Alpine.js.

Fit is a spectrum, and the TPM should treat it as such:

Host architecture Fit Why
Blade + Livewire app, Tailwind present Strong Component, assets, and styling all align; near-zero glue code
Blade app without Tailwind/Alpine Moderate Works via @filemanagerStyles (Tailwind Play CDN) but that path is explicitly not production-safe — you must adopt a real Tailwind build
Inertia/React/Vue SPA Weak UI is Blade-rendered; only the REST API (/api/filemanager/v1/, Sanctum) is reusable
API-only / headless service Weak You inherit a UI package's models, migrations, and config for an API surface you could specify yourself
Multi-tenant SaaS Weak as-is No tenant isolation, no per-tenant quotas, no scoped storage roots; ACL is per-owner, not per-tenant
Admin panel / internal tool / CMS back office Strong This is the sweet spot: commodity file management behind a trusted-auth boundary

The architectural coupling runs deeper than "it's just a component." The package owns a folders table, its own Media model option, its own config namespace, and (optionally) a catch-all public asset route. Adopting it is a schema and routing commitment, not just a composer line.

Integration feasibility

Mechanically the install is trivial — composer require, two migration publishes, php artisan migrate, drop the component tag, add asset directives. The friction is in the three optional-but-real integration paths:

  1. Styling. The default asset directive pulls Tailwind's Play CDN. For production you must add the vendor Blade path to your Tailwind content sources (v3: tailwind.config.js content array; v4: @source in app.css). If the host's Tailwind major version differs from the package's expectations, class generation silently breaks — visual regressions, not errors.
  2. ACL. Enabling acl_enabled requires pointing Spatie's media_model at LivewireFilemanager\Filemanager\Models\Media. That is a global swap affecting every media model in the application, not a scope-limited change. The HasMediaOwner trait is the less invasive alternative but only applies where you opt in.
  3. Public asset serving. The documented route is Route::get('{path}', ...)->where('path', '.*') registered in web.php. A wildcard catch-all at the root of the web route table is a genuine hazard — it can shadow or conflict with existing routes depending on registration order, and it exposes a file-serving surface whose authorization semantics are not described in the README.

Technical risk

  • Security posture is explicitly declared out of scope. The README states the package ships no security layer for uploaded documents and that you are responsible for controlling access. This is the single largest item on the risk register: authorization wrapping, malware scanning, MIME/extension validation, quotas, retention, audit logging, and public-route exposure are all your deliverables.
  • Documentation contradicts release status. The README still carries the "still in development, structure can change, use with caution" banner while the changelog shows v1.0.0 (first stable) and v1.1.0 (Laravel 13 support). Buyers need to decide which artifact is authoritative; treat the banner as a signal about the maintainers' own confidence in API stability, not as stale text to ignore.
  • The 1.0.0 release was a rename. livewire-fileuploader → livewire-filemanager across config keys, publish tags, view and translation paths. A filemanager:migrate-config command mitigates it, but it demonstrates the package's naming surface is not yet settled and that a future breaking rename is plausible.
  • Adoption signal is thin. 367 stars and zero listed dependents, effectively one primary maintainer plus a first-time translation contributor. Bus factor of one is the realistic planning assumption.
  • Global media model override. The ACL path's blast radius extends to unrelated features that use spatie/laravel-medialibrary. This is a cross-cutting change disguised as a config toggle.
  • Metadata anomaly. The release date is recorded as 2026-10-31 (future-dated). Flag it, verify against Packagist, and don't let it inflate perceived freshness.

Key questions

  1. Is our application Blade + Livewire with Tailwind already in the build, or will this force a styling stack decision?
  2. Who owns the security wrapper — authorization policy, tenant scoping, virus scanning, quotas, audit trail — and is that scoped as a companion epic with its own estimate?
  3. Can we accept swapping Spatie's global media_model, or must we use HasMediaOwner and accept partial coverage?
  4. Do we need the public asset route at all? If yes, what is its authorization model and where does it sit in the route table?
  5. Is the /api/filemanager/v1/ surface something we will actually consume, or is it a feature we're inheriting and must then support?
  6. What is our exit cost? Which of our tables, routes, and config keys become package-shaped, and how would we migrate off if the maintainer stops publishing?

Integration Approach

Stack fit

Prerequisites to confirm before committing: PHP ≥ 8.2 (≥ 8.3 if you're on Laravel 13), Laravel 10–13, Livewire, Alpine.js, Tailwind (3 or 4 — and be deliberate about which), a queue driver with running workers, and spatie/laravel-medialibrary configured or configurable. The queue requirement is not optional: image thumbnails are dispatched to the queue by default, so without workers the UI degrades to missing previews.

Migration path

The schema footprint is small and additive: a folders table plus Spatie's media table if not already present. The harder questions are organizational, not technical:

  • Greenfield — low risk. Install into a sandbox environment first, confirm the interface, then layer security before any user sees it.
  • Existing Spatie usage — medium risk. The media_model swap must be reviewed model-by-model; run it in a branch and diff behavior across every feature that touches media.
  • Existing file storage — medium-high risk. If you already have an asset table or S3 layout, migrating into the package's folders structure means adopting its taxonomy. Decide up front whether the package owns the canonical asset hierarchy or whether it's a view over your existing one. Retrofitting later is expensive.
  • Exit path — because the data lands in two conventional tables and the storage goes through Spatie, an exit is a UI-and-model replacement rather than a data extraction. That's a favorable property; document it as a hedge.

Compatibility

Pin the version explicitly and re-verify at upgrade. Two concrete compatibility traps: the config file must be re-published or manually diffed on upgrade ("If upgrading the package, you may update the config file as well" — silent config drift is a real failure mode), and the Tailwind major-version split changes the correct integration snippet. Livewire major upgrades are the third variable; the package tracks them, but not necessarily on your timeline.

Sequencing

  1. Spike (days, not weeks). Install in a throwaway branch. Exercise drag-and-drop, search, thumbnails with a real queue, dark mode, and localization. Screenshot the interface for stakeholders. Answer: does this clear the bar for our use case?
  2. Security design gate. Before any integration work, write the authorization and exposure model: who can see which folders, how the component's mount point is gated, whether the public route ships at all, scanning and quota policy. Do not let this trail behind the UI work.
  3. Styling integration. Replace Play CDN with a real Tailwind build; wire the vendor Blade path; verify class generation in a production-mode build.
  4. ACL decision. Choose global media_model swap vs HasMediaOwner; document the blast radius either way.
  5. API evaluation. Only after the UI path is stable, assess whether /api/filemanager/v1/ meets SPA/mobile/automation needs or whether a thinner bespoke API is cheaper than inheriting and supporting this one.
  6. Rollout behind a feature flag, to an internal/trusted-user cohort, with upload telemetry from day one.

Operational Impact

Maintenance

Ongoing maintenance is light in code and non-trivial in attention. You are tracking a single-maintainer package through a config file you have forked into your repo, a Tailwind content path that can break on major upgrades, and a Spatie dependency that has its own release cadence. Budget a recurring review at each Laravel and Livewire major bump rather than continuous work. The v1.0.0 rename and the v1.1.0 Laravel 13 changes (model event registration moved boot() → booted()) are the kind of churn to expect — backward-compatible, but not zero-touch.

Support

MIT license, no commercial support, no SLA. Documentation is genuinely above average for this class of package — a full docs.md, per-version changelog entries, an UPGRADE.md, and a recorded conference talk. The realistic support model is: your team reads the source when the docs run out, and you should assume you are the escalation path. That's acceptable for internal tooling and unacceptable if this becomes a customer-facing SLA-bearing capability without a fallback plan.

Scaling

Three scaling axes to watch. First, storage and DB growth: every upload writes media rows plus filesystem objects; thumbnails are a second derived object per image. Second, queue throughput: thumbnail generation is the async hot path, so upload bursts translate directly into worker backlog and temporary UI degradation. Third, folder hierarchy depth: hierarchical folder trees queried naively get slower with depth and breadth; validate against a realistic tree (hundreds of folders, thousands of files) before committing, and decide whether search needs indexing beyond the package's built-in search.

Failure modes

Failure Symptom Mitigation
No queue worker running Thumbnails never appear; uploads look broken Health check on queue depth; alert on backlog; document QUEUE_CONNECTION requirement in runbook
Tailwind vendor path missing or wrong major Component renders unstyled in production build only Add a visual smoke test to CI; verify production CSS build
Play CDN shipped to production Runtime CSS from third-party CDN; render/perf risk Treat @filemanagerStyles as dev-only; enforce via review checklist
Global media_model swap Unrelated media features silently change behavior Branch test across all media-consuming features before merge
Wildcard asset route conflicts 404s or hijacked URLs elsewhere in the app Register last, scope the prefix, or omit entirely and serve via signed URLs
Config file drift after upgrade New options absent; behavior diverges from docs Diff published config on every bump; record in upgrade checklist
Missing authorization on mount point Any authenticated user reaches all files Gate the component and route at the middleware/policy layer, not in the package
Upstream abandonment No fixes for a future Laravel major Exit-path hedge is cheap here (two conventional tables); re-evaluate annually

Ramp-up

Engineers need working familiarity with Livewire, Alpine, Tailwind content configuration, and Spatie medialibrary conventions — roughly a day for a Laravel-fluent developer to be productive, more if they've never configured Spatie. The larger ramp-up cost is conceptual, not technical: the team must internalize that the package provides a UI and a data model, and that authorization, scanning, quotas, retention, and audit are unowned by default. If that gap isn't explicitly assigned to a named owner before integration starts, it will be discovered by a security reviewer or a customer rather than by the team — which is the most expensive possible time to find it.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
muka/shape-reader
tdt/json
refinery29/php-cs-fixer-config
hotmeteor/eco-env
mvaliolahi/hydrate
wearede/tbcpay-php
parsnick/steak
thibaud-dauce/mattermost-php
multilinguals/apollo-client
antaresbr/collection
kr0lik/phpstan-rules
loco/loco
starfederation/datastar-php
yupmin/modern-phystrix
stephenjude/extended-artisan-commands
lumphp/laravel-macroable
lumphp/laravel-collections
lumphp/laravel-contracts
sermepa/sermepa
arkecosystem/fortify