nicolassing/maintenance-bundle
A lightweight Symfony bundle for adding maintenance mode to your application. Toggle maintenance during deployments, migrations, or upgrades and present visitors with a customizable holding page instead of the live site, helping avoid exposing incomplete changes. Simple to configure.
First-order finding: this is not a Laravel package. CorleyMaintenanceBundle is a Symfony bundle (Composer type symfony-bundle, registered via AppKernel/bundles.php, wired through the Symfony DI container and kernel.request event). It has no service provider, no facade, no config/*.php publish step, and no Laravel-compatible bootstrapping. If the target stack is Laravel, the evaluation ends here — the native php artisan down command plus the CheckForMaintenanceMode middleware already covers this capability with first-party support.
Architecture fit (Symfony context). The bundle's likely design — an event listener on kernel.request that inspects a flag and short-circuits with a 503 response — is architecturally sound and idiomatic for Symfony 2.x/3.x. It is also roughly 50–100 lines of code that any mid-level Symfony developer can reproduce and own. The bundle adds a layer of indirection over a trivial capability, which is a poor trade in the absence of community maintenance.
Integration feasibility. composer require will succeed only if the bundle's Symfony constraints resolve against the host application. Given zero stars, zero dependents, and no visible release activity, the constraint set is almost certainly ^2.x (and possibly ^3.x) — this will hard-conflict with Symfony 5/6/7 projects and block the entire dependency graph, not just this package. Expect to either pin the app to an EOL Symfony branch or fork and patch the constraints.
Technical risk. Concentrated in three areas:
Key questions for the requester:
Retry-After, IP allowlist, CLI toggle, scheduled windows, multi-node consistency?503 + Retry-After better handled at the load balancer / ingress layer, removing the application dependency entirely?Stack fit. Applicable only to Symfony applications. For Laravel, the equivalent requirement is satisfied by artisan down --secret (preview bypass), custom resources/views/errors/503.blade.php, and optional IP allowlisting via middleware — all first-party and version-guaranteed. Do not bridge frameworks via a Symfony bundle.
Migration path (Symfony). Treat this as a build-vs-adopt decision, not a drop-in install:
MaintenanceListener + maintenance.enabled parameter — typically under a day of work, no external dependency, no version constraints, full ownership.Against the modern landscape the bundle is architecturally dated: the common 2024-era pattern is either infra-level gating (LB/ingress rule or feature flag) or a hand-rolled listener, not a third-party bundle. lexik/maintenance-bundle — the established Symfony option — is itself archived, which is a strong signal about the category.
Compatibility. Verify PHP constraint, Symfony constraint, and autoloading against the target app before any other work. If a fork is required to widen constraints, that fork is now a maintained internal artifact and must be scheduled as such.
Sequencing.
composer why-not constraint check (½ day).Maintenance. Effectively zero upstream maintenance. Adoption transfers full ownership to your team: dependency updates, security patches, Symfony-version compatibility. That ownership cost is fixed and ongoing while the functional value is a one-time, near-trivial capability — a poor ratio. Budget for a fork the day you adopt.
Support. No vendor, no SLA, no active issue triage. Internal escalation falls to whoever forked it, and that person becomes a single point of failure unless the fork is documented and preferably replaced by in-repo code.
Scaling. The critical unknown is the maintenance-state mechanism. If it is a filesystem flag or a container parameter, it does not propagate across nodes — producing the worst failure mode: a partially-maintained fleet where some instances serve 503 and others serve live traffic, non-deterministically. Any production use requires state in a shared store (Redis/DB/feature-flag service) and a documented propagation and verification step. This, more than the abandonment risk, is the reason to prefer an ingress-layer solution.
Failure modes.
Ramp-up. Technical ramp-up is low — the code is small and the concept is universally understood; a developer is productive in under a day. Governance ramp-up is the real cost: someone must own the fork, the runbook, the toggle verification, and the upgrade-compatibility work. That overhead exceeds the cost of writing the listener in-house on essentially every axis.
Recommendation. Do not adopt for a Laravel stack — it is incompatible by construction, and first-party tooling is superior. For a Symfony stack, favor an in-repo listener or ingress-level gating; consider this bundle only if a source audit reveals meaningful behavior beyond a 503 short-circuit, and only as a pinned, forked, internally-owned dependency.
How can I help you explore Laravel packages today?