capevace/cabinet
Cabinet is a Laravel package for file and media management, offering an Eloquent-backed file manager with uploads, storage disk integration, and folder organization. It makes adding media handling and file browsing to your Laravel apps simple and clean.
Architecture fit. Cabinet is a Laravel-native package: Composer-installable, auto-discovered service provider, publishable config/migrations/assets, and a facade-driven API surface. The architectural bet is a pluggable "file source" driver layer — disks, spatie/laravel-medialibrary, custom DB tables, and external APIs are abstracted behind a common contract, with models attaching files. This is a sensible design for a Laravel monolith where files are a cross-cutting concern and the storage origin varies per domain. It fits poorly where the application is API-first/headless and expects to own its own file schema, or where multi-tenancy must be enforced at the storage abstraction level.
Integration feasibility. High for greenfield Laravel projects or for an admin-panel-scoped use case; medium for an existing product. The main constraint is that Cabinet is "turn-key" — it likely ships its own routes, middleware, UI bundle, and a metadata table it owns. That is fine if you treat it as a bounded subsystem, and problematic if you expect it to conform to an existing media pipeline. A notable positive: claiming media-library as a source implies read-through coexistence rather than forcing a migration, which materially lowers switching cost.
Technical risk.
Key questions for the maintainer / spike.
Stack fit. Verify composer.json constraints against your Laravel/PHP baseline first — that is a five-minute gate that can kill the evaluation. Storage scaling is inherited from Laravel's filesystem layer, so S3/Spaces/CDN support is free. Frontend fit depends on whether the shipped UI is Livewire/Blade or a JS SPA; if it is the latter, confirm the published assets are pre-built and versioned, or you inherit a Node build step in CI.
Migration path (recommended, low-blast-radius).
spatie/laravel-medialibrary is already in use, validate the media-library source driver as a reader before writing anything through Cabinet. This is the cheapest way to test the abstraction without committing data.Compatibility. Explicitly test against any package that also owns a media/files table or registers routes under a similar prefix. Treat the published migration as immutable — never edit it in place, and confirm the package tolerates additive columns.
Sequencing and build-vs-adopt. Given the opportunity score of 0.38 and 19 stars, I would not adopt Cabinet as core infrastructure. Adopt it as a bounded admin-surface component, and wrap access behind a thin in-house interface (FileManager contract) so the package is replaceable in a sprint rather than a quarter. If the UI is the main value, evaluate it as a UI decision, not a platform decision.
Maintenance. You should assume you will eventually own this code. MIT licensing makes that survivable — fork-and-vendor is a legitimate exit — but plan for it. Budget roughly 1–2 engineer-days per month plus a half-day per Laravel major upgrade. Release activity (last release Sept 2025) is a positive health signal and suggests active caretaking; re-check cadence quarterly.
Support. No SLA, no commercial backing, GitHub issues only. Acceptable for internal tooling, not acceptable for a customer-facing upload path in a regulated context.
Scaling. Object storage scales horizontally and is not the constraint. Watch: (a) metadata table growth and indexing on the polymorphic attachment lookup, (b) N+1 queries when listing models with attached files — eager-load the relation, (c) thumbnail/transform cost and cache warming, (d) egress on CDN-fronted downloads, and (e) external-API sources, which put a third-party's latency inside your admin request cycle.
Failure modes to instrument before launch.
Ramp-up. The package itself is learnable in days for a mid-level Laravel developer; the abstraction is straightforward. The real ramp-up cost is ownership transfer — the team must read the source for the source-driver contract, deletion semantics, and authorization hooks, because documentation depth in a 19-star project is unlikely to cover edge cases. Front-load that reading during the spike, not after adoption.
How can I help you explore Laravel packages today?