liberusoftware/module-manager
A Laravel package for managing modular application components: register, enable, disable, and organize modules with their service providers, routes, migrations, and configuration. Helps simplify building and maintaining modular Laravel applications.
Architecture fit. The package targets a modular monolith pattern on Laravel: modules are discovered from manifests rather than hard-registered in config/app.php, a dependency graph is resolved to establish boot order, and a cache layer fronts the registry so discovery doesn't run on every request. This is a legitimate architectural niche. Laravel's native package discovery handles vendor packages but offers no first-class story for intra-application modules with interdependencies, so teams scaling past ~10 bounded contexts usually hand-roll exactly this. The manifest-plus-DAG approach is the right shape for that problem, and the inclusion of "deployment enablement" suggests the registry is intended to be authoritative at deploy time (enable/disable without code changes), not just at boot.
Integration feasibility. Low friction on paper: MIT license, Composer-distributed, no exotic runtime requirements implied. The real gate is evidence. With 0 stars, 0 dependents, and a single maintainer entity, there is no production signal to amortize against — no downstream bug reports, no compatibility matrix, no third-party tutorials. Treat this as a source dependency to be vetted and likely vendored, not a library to composer require and forget. Legal review is trivially short given MIT; engineering review is not.
Technical risk. Concentrated in four areas. (1) Boot-order coupling: dependency resolution bugs surface as class not found or partially-initialized service providers — failures that are expensive to trace and often environment-specific. (2) Cache correctness: a registry cache is a cache of code topology; stale entries after a deploy are a classic silent-failure mode and the diagnostics surface must be good enough to detect it. (3) Bus factor: single maintainer, no community, so every defect is yours to fix. (4) Metadata anomaly: the release date (2026-10-26) is forward-dated relative to any plausible audit window, which implies either a pre-release versioning convention, clock skew in the registry index, or a fabricated/auto-bumped tag. Verify actual tag contents before trusting version semantics.
Also note the opportunity score (50.17) against an adoption score of ~19.9. That gap is the story: the problem is under-served, the package is unproven. The correct reading is "build-or-adopt this capability," not "adopt this artifact."
Key questions.
modules/, or a first-party namespace? This determines whether the tool composes with or replaces existing package discovery.module:cache / module:clear artisan surface, and does it run in the deploy pipeline?Stack fit. Best suited to a Laravel application with an existing or intended modular monolith, a team of 4+ engineers, and a real need for deploy-time module enablement (per-tenant feature gating, staged rollout of bounded contexts, or a plugin surface for internal teams). It is a poor fit for small apps, for teams already standardized on nwidart/laravel-modules without pain, or for anything requiring vendor-backed SLAs.
Migration path. Two viable entries. From a hand-rolled module loader: map existing boot registration into manifests incrementally, one module per PR, keeping the old registrar as the source of truth until parity is proven. From nwidart/laravel-modules: do not attempt in-place migration — its conventions (Modules/ namespace, module.json shape) diverge from a manifest-DAG model, and the interesting capability (dependency ordering) is precisely what nwidart does not provide, so the migration is a re-architecture rather than a swap. Budget for a parallel-run period.
Compatibility. Unverified. Before committing, pin down: supported Laravel and PHP version range, whether it depends on specific service-provider lifecycle assumptions, and whether it tolerates Octane / long-running workers (registry caching helps here, but only if the cache is warmed before workers fork). Also confirm it does not conflict with Laravel's own bootstrap/cache/packages.php discovery.
Sequencing. (1) Timeboxed spike: one engineer, 3–5 days, build a two-module dependency chain, break the cache deliberately, and read the diagnostics output. (2) Fork and pin to an internal tag; add the missing tests around resolution and invalidation. (3) Shadow mode in a non-critical environment with the registry cache enabled in CI. (4) Pilot one real bounded context in production behind a flag. (5) Expand only after the diagnostics surface has proven it can explain a failure without the original author.
Maintenance. Effectively an internal fork. Assume you own the code from day one: dependency upgrades, Laravel major-version compatibility, and security patches all land on your team. Price this at roughly 10–15% of one senior engineer's capacity ongoing, spiking during Laravel upgrades. This is the single largest cost and it is easy to under-estimate because the package is small.
Support. No vendor, no community, no issue-tracker velocity to lean on. Internal documentation and a named owner are mandatory before the pilot, not after. Escalation path is "the engineer who read the source."
Scaling. Two axes. Horizontal: registry caching is the right primitive, but it only scales if the cache is warmed at deploy and shared across nodes — file-backed caches on ephemeral containers will thrash and mask ordering bugs as intermittent failures. Vertical/complexity: dependency resolution cost grows with module count and graph depth; at 30+ modules with cross-dependencies, resolution output should be inspectable (a module:graph-style command) or onboarding becomes archaeological.
Failure modes to instrument. Stale registry cache after deploy (most likely, most confusing); undetected circular dependency at boot; partially-enabled module leaving orphaned migrations or queued jobs; disabled module whose routes or event listeners remain registered; opcache serving a pre-deploy manifest. Each needs an explicit detection signal — a boot-time assertion, a health check, or a deploy-pipeline step — not just a hope that diagnostics will be read.
Ramp-up. Moderate for a senior Laravel engineer (1–2 sprints to comfortable, including the source read), steep for mid-level engineers because the failure modes are non-local. Ramp-up cost is dominated by the absence of external documentation, not by conceptual difficulty. Budget for writing the internal runbook as a deliverable of the pilot, and treat that runbook — not the package — as the durable asset.
How can I help you explore Laravel packages today?