liberu-maintenance/maintenance-laravel
A Laravel package for managing application maintenance mode with flexible configuration. Toggle maintenance, customize the response view, whitelist IPs, and control access so deployments, upgrades, and downtime are handled cleanly without exposing unfinished work to users.
Architecture fit. liberusoftware/maintenance-laravel is a domain package for Laravel covering CMMS-style functionality: assets, work orders, preventative maintenance, recurring schedules, priorities, and a commercial module. The v0.15.0 changes reinforce a deliberately layered design — PRs reference "presentation action boundaries," "mutation boundaries," and "query boundaries," which is the vocabulary of an action/command-handler pattern (or a light CQRS split) sitting on top of Eloquent. For a TPM, the read is that this is an opinionated domain package, not a thin CRUD scaffold. It will fit teams already using action-oriented Laravel architectures; it will fight teams running fat controllers plus service classes, because adopting it means adopting its boundary conventions.
Integration feasibility. Feature surface expanded meaningfully in this window: work order comments (#521), a core priority resource (#522), restoration of the preventative maintenance completion lifecycle (#523), recurring scheduling, and query boundary work (#524). Comments and priorities are table-stakes for any maintenance product, so their arrival reduces the amount of custom glue you would otherwise own. The lifecycle restoration (#523) is the most consequential change: completion transitions are the state machine your operations team actually depends on, and a "restore" implies the behavior had been removed or broken. Treat the PM completion flow as an integration checkpoint requiring explicit test coverage, not as a given.
Technical risk. Three material risks. First, version trajectory: the changelog spans v0.2.0 → v0.15.0, meaning roughly thirteen minor releases collapsed into a single notes window, with v0.12.0, v0.13.0, and v0.15.0 all shipping inside it. Pre-1.0 semver grants the maintainer license to break APIs on any minor bump, and thirteen minors in one window is a wide blast radius for migration planning. Second, churn signal: two PRs are explicitly restorative (#523, #524), and several are "complete the boundaries" cleanups. That pattern is normal for a package hardening its seams, but it also means interfaces are still moving — pinning to a commit and reading the diff, not the release title, is the only safe way to assess upgrade cost. Third, bus factor: every PR in this release is authored by a single contributor, including all release PRs. There is no evidence of a second reviewer or committer.
Key questions.
Stack fit. Standard Laravel package shape — Composer-installed, service-provider registered, migrations published. It presumes a conventional Laravel data layer (Eloquent models, migrations, likely policies for authorization) and will sit cleanly beside an existing app's user/auth model if it exposes the usual configurable model bindings. The boundary-oriented design implies the package owns its own request→action→persistence path, so integration is less "call these models" and more "route these operations through the package's actions." Confirm where the seams are before design work starts: if the package expects to own work-order writes end to end, your existing work-order code becomes a migration problem rather than an extension point.
Migration path. Two distinct migrations, and they should be sequenced, not merged. The first is package adoption — install, publish config and migrations, stand up the assets/work-order/priority tables alongside existing tables. The second is behavioral adoption — move reads and writes onto the package's query and mutation boundaries module by module. Do the second one domain at a time: priorities and comments first (additive, low risk, no existing behavior to displace), then assets, then work orders, and preventative maintenance plus recurring scheduling last, since #523 shows the completion lifecycle is the area that has most recently changed shape. Running both migrations concurrently is how teams end up unable to attribute a regression to either.
Compatibility. The package is pre-1.0 and the release notes give no Laravel or PHP version constraints — that must be read from composer.json directly before committing. Because thirteen minors are collapsed here, do not assume v0.2.0-era code samples, docs, or community snippets remain valid. The README branding update (#526) may have moved or renamed documentation anchors; verify docs against the tagged source rather than the GitHub default branch. Pin an exact tag in composer.json — a caret constraint on a package that ships thirteen minors in one window will pull unexpected surface area into CI.
Sequencing. (1) Pin and read the actual v0.2.0→v0.15.0 diff; classify each PR as additive, breaking, or restorative. (2) Spike an install against a throwaway branch with the migrations run and the PM completion lifecycle exercised end to end. (3) Write characterization tests around PM completion and recurring schedule generation before touching production code — these are the flows most likely to have shifted. (4) Land priorities and comments as the first production slice to validate the action-boundary conventions against your team's habits. (5) Defer work-order write-path migration until the boundary APIs have been stable across at least one further minor release.
Maintenance. You inherit a dependency on a fast-moving pre-1.0 package with a single active maintainer. Budget recurring effort for upgrade review — not a one-time integration cost. Concretely: a standing ticket per minor release to review the diff, and a rule that no upgrade lands without the PM completion and recurring-schedule tests passing. The "boundary completion" PR titles suggest the internal structure is being actively rationalized, which usually means a period of relative stability follows each wave — but you cannot assume you are at the end of the wave.
Support. No commercial support, no visible second committer. Escalation path is GitHub issues to one person. That is acceptable for internal tooling where you can vendor or fork; it is not acceptable for anything customer-facing or revenue-adjacent without a documented internal fork-and-patch capability. The commercial module in particular should be treated as higher-stakes: domain logic around commercial terms is exactly where you least want a single-maintainer dependency and least want silent behavior changes on a minor bump.
Scaling. Domain packages of this type scale with your database before they scale with anything else. Work orders, comments, and recurring schedule instances are all append-heavy tables, and recurring scheduling in particular can generate rows on a timer — a schedule definition that looks fine in a demo can produce a large, monotonically growing instance table in production. Confirm how schedule generation is triggered (queued job vs. synchronous) and whether it is idempotent, because non-idempotent generation on a retry is a classic duplicate-row incident. Comments and asset history will drive the largest growth; plan indexes and retention before volume, not after.
Failure modes. Ranked by likely impact: (a) silent lifecycle drift — the PM completion state machine changes behavior on an upgrade and completed work orders land in the wrong terminal state, corrupting maintenance history; (b) schedule duplication — recurring generation runs twice, creating phantom work orders that erode operator trust in the system; (c) boundary breakage — a minor bump renames an action or mutation signature and a call site fails at runtime rather than at boot, so it surfaces in production rather than in CI; (d) partial migration — reads on the package path, writes still on legacy tables, producing divergence that is hard to detect and harder to reconcile. Mitigations are cheap: pin exact versions, characterize the lifecycle and scheduler in tests, and treat every upgrade as a code change requiring review.
Ramp-up. Two audiences. For engineers, the cost is not Laravel familiarity but the package's own conventions — the action/mutation/query boundary vocabulary is idiomatic but specific, and the docs are single-author and may lag. Expect a few days for a mid-level Laravel developer to be productive, most of it spent reading source rather than documentation. For the TPM, the ramp-up is domain literacy: asset hierarchies, the work-order lifecycle, and preventative-versus-reactive maintenance are the concepts you need to write acceptance criteria that actually pin the lifecycle down. Do not delegate the lifecycle definition to the package's defaults — specify it explicitly and make the package conform, because #523 is evidence that the default has already changed once.
How can I help you explore Laravel packages today?