anomaly/files-module
Files module for the Anomaly CMS brings file and folder management to Laravel: upload, organize, browse, and attach files through a unified filesystem interface, complete with an admin UI and a field type for linking uploads to your content.
Architecture fit. anomaly/files-module is not a general-purpose Laravel asset library — it is a module in the PyroCMS addon ecosystem, built on top of anomaly/streams-platform. Its role is to provide file/folder entities ("streams"), a control-panel UI, a FileFieldType for attaching assets to other content types, a template plugin (FilesPlugin), and storage/transform handling layered over Flysystem and Intervention Image. This means the unit of adoption is not "add a package" but "adopt the Streams Platform's data model, addon registration, and admin scaffolding." If the target application is not already a PyroCMS/Streams application, the true integration surface is many multiples of this repository's own footprint.
Integration feasibility. Low for a conventional Laravel service. Feasibility rises to moderate only under two scenarios: (a) the organization is already committed to PyroCMS and needs the standard asset module, or (b) the team wants a reference implementation of file/folder/field-type design to fork rather than consume. For a vanilla Laravel app on a current version, direct consumption is not realistic — the module's contracts assume Streams' field types, view namespaces, asset publishing, and addon manifests.
Technical risk. High, concentrated in four areas:
illuminate/* and anomaly/streams-platform constraints will pin the host application's Laravel version. Verify constraints before any spike; a mismatch is a hard stop.Key questions.
Stack fit. Poor as a standalone dependency; acceptable only as part of a PyroCMS deployment. If the requirement is "asset management in a Laravel app," the better-fitting options are Spatie Laravel Media Library (file attachments to models), a thin Flysystem service class (raw storage), or the file-upload primitives of our admin layer (Filament FileUpload, Nova File). The Files module's genuine differentiators — folder tree, CP browsing UI, and a reusable FileFieldType for Streams-based content types — are only valuable if we are inside Streams.
Migration path. Two viable paths, chosen by scenario:
Compatibility. Confirm before anything else: PHP version, illuminate/* constraints, anomaly/streams-platform constraint, Flysystem major (v1 vs v3 is a breaking API difference in this lineage), and Intervention Image major (v2 vs v3 changed the API). Any one of these mismatching our baseline converts the evaluation into a fork-and-port decision with a materially different cost profile.
Sequencing.
composer.json and the Streams Platform constraint; produce a go/no-go on version compatibility.Maintenance. The dominant cost. Low adoption means we are, in practice, the maintainers. Assume we own patch response for Laravel upgrades, Intervention/Flysystem major bumps, and security fixes. This is acceptable only if the module is small and well-factored enough to fork cleanly (verify LOC and coupling to Streams internals), and if we formally accept that fork as a costed line item rather than an implicit one.
Support. No commercial SLA, no dependents to learn from, and a small issue tracker. Internal knowledge will be concentrated in whoever runs the spike — a single-person dependency on top of a single-vendor one. Mitigate by pairing the spike and documenting the fork/upgrade runbook from day one.
Scaling. Storage scales well if we stay on Flysystem with object storage plus a CDN; the module's abstraction here is a genuine strength. The scaling concern is image derivatives: on-demand transformation is CPU-bound and, if not aggressively cached at the edge, becomes the bottleneck under load. Verify derivative caching behavior and whether transforms are generated at upload time or request time. Also verify folder-tree queries do not degrade with deep nesting or high file counts, and that the CP listing is paginated.
Failure modes to plan for.
Ramp-up. Non-trivial and specific to Streams Platform: developers must absorb streams, assignments, field types, addon manifests, and control-panel/API namespacing before touching the Files module productively. Estimate one to two weeks of ramp for a mid-level Laravel developer, on top of the spike. If the team is not otherwise learning Streams, that ramp cost is pure overhead against a requirement that is usually satisfiable with a mainstream package.
How can I help you explore Laravel packages today?