anomaly/search-module
A search module for the Anomaly CMS that adds site-wide search across your modules, with indexing, configurable results, and a simple integration for Laravel-based Anomaly applications.
Architecture fit. anomaly/search-module is not a general-purpose Laravel search package — it is a module in the PyroCMS 3 / Streams Platform ecosystem. It hooks into the Streams data model (streams, fields, assignments, criteria) and exposes a system-wide search index that other Pyro modules register against via a searchable contract. As a result, it only fits an application that is already a PyroCMS 3 site or is deliberately built on anomalylabs/streams-platform. In a vanilla Laravel application the integration surface is effectively the whole CMS: adopting this module means adopting Streams as the persistence layer for searchable entities. That is a platform decision, not a dependency decision.
Integration feasibility. Mechanically straightforward in the intended context: Composer install, service-provider auto-discovery, publish config and migrations (search index table), register searchable models, run an index build/refresh command, and expose the search endpoint or admin UI. The real feasibility constraint is version alignment — PyroCMS 3 spans Laravel 5.x through later 8.x-era releases, and PHP 8.x compatibility cannot be assumed from a package with zero stars and zero dependents. Compatibility must be verified against the exact streams-platform constraint before any estimate is credible.
Technical risk. High relative to the value delivered:
Key questions before committing:
streams-platform and Laravel/PHP versions does composer.json actually admit, and when was the last meaningful commit?Stack fit. Fits a PHP/Laravel stack running PyroCMS 3, MySQL or Postgres, with queue workers available for indexing. It does not fit a modern Laravel 10/11 application without a substantial fork, and it does not fit a polyglot stack where search is a shared service across non-PHP clients.
Migration path. Treat this as a spike, not a rollout. Run it in a disposable branch against a production-shaped dataset, measure index build time, query latency, and result quality on real queries. In parallel, prototype Laravel Scout + Meilisearch or Typesense against the same dataset. Pick based on measured outcomes, not on repository presence. If the organization is already on PyroCMS, the path inverts: this module is likely the lowest-friction option and the spike becomes a hardening exercise.
Compatibility. Pin the module, streams-platform, Laravel, and PHP versions explicitly in composer.json and lock them. Add a CI job that builds against the pinned matrix and runs the module's test suite (if any) plus your own integration tests over index build and query. Assume you own compatibility: with zero dependents, no one else will discover the breakage for you.
Sequencing.
SearchService interface so the module is swappable. This is the single highest-leverage design decision — it converts a platform lock-in into a replaceable dependency.Maintenance. Budget for fork-and-own. With no upstream momentum, expect to carry patches, PHP/Laravel deprecation fixes, and Streams upgrade churn yourself. A realistic steady-state estimate is a few engineer-days per quarter, spiking sharply on any Laravel or Streams major upgrade. If the organization cannot name an owner for that, do not adopt.
Support. There is no vendor and no SLA. Assistance is limited to the PyroCMS community channels and reading the source. Incident response for search defects will be internal, from first report to root cause, with no upstream escalation path.
Scaling. The critical unknown is the index backend. A database-backed index degrades predictably: full-text queries over a large search_index table become the bottleneck, and synchronous indexing on write adds latency to content saves. Mitigations are conventional — queue the writes, batch rebuilds, add composite indexes on the search table, paginate aggressively, constrain result counts, and consider a read replica for query traffic. If volume is expected to grow past low-hundreds-of-thousands of indexed records, validate the query plan before committing; if the plan is unacceptable, that is the trigger to prefer an external engine behind the SearchService interface.
Failure modes to instrument:
Ramp-up. The module itself is small; the Streams mental model is not. Engineers need to internalize streams, fields, assignments, and criteria before they can reason about why a document is or isn't indexed — realistically one to two weeks to productive, longer to confident. That ramp-up cost is a property of the platform, not the package, and should be counted against the module's 0.3 score rather than attributed to it.
Recommendation. Adopt only if the application is already committed to PyroCMS 3 and a Streams-native index is materially cheaper than an external engine. Otherwise, use the repository as a reference for how Streams-native search is structured and build on Laravel Scout with Meilisearch or Typesense, keeping the same SearchService seam so the decision remains reversible.
How can I help you explore Laravel packages today?