Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Maintenance Mode Bundle Laravel Package

nowo-tech/maintenance-mode-bundle

nowo-tech/maintenance-mode-bundle provides a simple maintenance mode for PHP applications: toggle downtime, show a friendly holding page, and control who can access the app during maintenance windows. Lightweight, configurable, and easy to integrate.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Framework mismatch is the headline finding. The asset under review is a Symfony bundle (PHP >=8.2 <8.6; Composer ^7.4 || ^8.0; Symfony 7.4 / 8.0 / 8.1). The stated target stack is Laravel. A Symfony bundle is not installable into a Laravel application as a working maintenance-mode solution: Laravel's service container, HTTP kernel, middleware pipeline, config repository, and Blade view layer are all distinct from Symfony's bundle/DI-extension model. Only Symfony's components (HttpFoundation, HttpKernel pieces) are shared, not the bundle wiring. Treat any "Laravel leverage" story as an integration project, not a composer require.

Architecture fit — low for Laravel, moderate for Symfony. The bundle's design (configurable exclusions, admin panel CRUD, pluggable storage for the maintenance flag and bypass tokens) is a reasonable shape and maps cleanly onto Symfony's request-event/kernel-listener model. For Laravel, the equivalent native capability already exists: php artisan down with --secret, --redirect, --render, --status, --retry, APP_MAINTENANCE_DRIVER (file/cache), and php artisan up, plus the PreventRequestsDuringMaintenance middleware. The bundle's differentiators over Laravel's built-ins are essentially the CRUD panel (non-engineer toggling) and pluggable storage backends (e.g., DB/Redis flag readable across instances). Those two capabilities are the only defensible reasons to consider this package at all, and both are cheaper to build natively in Laravel than to port.

Integration feasibility — poor as-is, viable only via a rewrite. Realistic paths:

  1. Do not adopt — use Laravel's native maintenance mode; scope a small internal admin UI if non-engineers need a toggle. ~2–5 engineer-days.
  2. Port the concept, not the code — reimplement the exclusion-matching and pluggable-flag abstractions as a Laravel package/middleware. ~8–15 engineer-days including tests.
  3. Run the bundle in a sidecar Symfony app sharing the same datastore — architecturally incoherent for a maintenance flag; adds a second runtime, deploy target, and failure domain for near-zero benefit. Reject.

Technical risk — high, driven by project health, not code quality. Zero stars, zero dependents, no downstream usage signals, and a single-maintainer provenance ("nowo-tech"). There is no ecosystem evidence of production hardening: no reported battle-testing of the exclusion rules (IP ranges, path globs, token bypass), no evidence of load behavior when the flag flips mid-deploy, and no third-party security review of the admin panel surface. The last release is dated 2026-10-28 — a future date relative to any normal review cadence, which is a release-metadata integrity red flag: either the repository's versioning/tagging is unreliable or the release feed is synthetic. Either way, you cannot use "recently released" as a maintenance-health signal here. Additional risks: a maintenance-mode toggle is a privileged control plane (it can take the site down); the CRUD panel is an attack surface that must not itself be gated behind the mode it controls; and bypass tokens are effectively credentials requiring rotation and audit logging. Supply-chain review (composer audit, pinned versions, composer.lock diff, license/attribution check) is mandatory before any adoption.

Key questions for the maintainer / before commitment:

  • Is there a Laravel adapter or any Laravel usage in the wild? If not, is a port explicitly out of scope?
  • Why does the single release predate its own publish date — is the tagging pipeline automated or manual, and is the tag signed?
  • How is the maintenance flag read on every request (cache read vs. datastore hit)? What is the p99 added latency at expected RPS?
  • Does the exclusion matcher fail open or closed on malformed config, and is the bypass token compared in constant time with rotation support?
  • What is the deprecation policy across Symfony 7.4 → 8.x, given the constraint string must carry both majors?
  • Who is the second maintainer / what is the bus factor, and is there a documented security disclosure channel?

TPM verdict: Score 20 with opportunity 43.7 reflects a credible idea with no distribution and a stack mismatch. Recommendation: no-go for Laravel adoption; retain as a design reference for exclusion-matching and pluggable-flag semantics, and build the Laravel-native equivalent.

Integration Approach

Stack fit. Against a Laravel codebase the fit is conceptual only. The bundle contributes three transferable design ideas worth mimicking in a native implementation: (a) a request-level exclusion evaluator (path, IP/CIDR, header/cookie, allow-listed routes) layered ahead of routing; (b) a pluggable flag store behind a narrow interface so the maintenance state can live in file, cache, or database depending on whether the deployment is single-node or autoscaled; (c) an admin CRUD surface for toggling state and managing bypass tokens. In Laravel these map to a MaintenanceFlag contract bound in a service provider, a middleware registered in the global stack ahead of StartSession/routing, a config file mirroring the exclusion schema, and a small Livewire/Filament or Blade+controller panel behind can:manage-maintenance. That is the whole of the value proposition, and it is roughly 300–600 lines plus tests.

Migration path. There is no migration from this bundle into Laravel — no shared persistence schema to carry, no config keys to translate mechanically (Symfony's config/packages/*.yaml bundle extension tree has no Laravel analogue), no assets to lift (Twig templates and the Vite/src/Resources/public/build pipeline in the repo's own guidance are Symfony-rendered and must not be copied wholesale). The migration is therefore greenfield with borrowed requirements: extract the behavior spec from the bundle's docs, then implement. If the organization already runs Symfony services and this assessment was mis-scoped, the migration path is trivial — composer require, register the bundle, publish config, verify the panel route is behind a role — and the effort drops to 2–4 days.

Compatibility. For the Symfony case: the constraint ^7.4 || ^8.0 with PHP >=8.2 <8.6 means Symfony 8.x consumers need PHP 8.4+, so pin the intersection deliberately and test the matrix rather than assuming the union works. For the Laravel case, the relevant compatibility axis is instead Laravel's own native maintenance feature set — confirm your Laravel minor supports APP_MAINTENANCE_DRIVER cache-based flags and --secret bypass before building anything, since a cache driver plus a secret already covers ~80% of the bundle's functional surface without new code.

Sequencing.

  1. Week 0 — decision + spike (1–2 days): confirm the stack assumption in writing; inventory what Laravel's native down mode already gives you against the bundle's stated features; identify the single gap that actually motivates the request (almost always "non-engineers can toggle it").
  2. Week 1 — supply-chain + threat review (1 day, parallel): composer audit, tag/signature verification, license check, panel authz review, token storage review. Gate: no adoption of the package itself until a maintainer-health and release-integrity answer exists for the future-dated release.
  3. Week 1–2 — thin slice (3–5 days): in the native implementation, ship flag contract + middleware + exclusion config + one integration test proving mode-on returns 503 with Retry-After and honours --secret bypass.
  4. Week 2–3 — panel (3–5 days): CRUD for toggle, schedule (start/end), and bypass tokens; authz, CSRF, audit log of every toggle with actor and timestamp.
  5. Week 3 — hardening (2–3 days): multi-instance propagation test (flag change visible on all nodes within cache TTL), load test at target RPS, rollback drill, runbook.
  6. Only after step 5: revisit whether the upstream bundle (or its Symfony-only panel) is still worth tracking for design drift; treat it as reference material, not a dependency.

Operational Impact

Maintenance. Zero-dependents status means the maintenance burden is fully internal regardless of choice — nobody else is absorbing bug reports. Adopting the bundle adds a second maintenance surface (a Symfony-shaped package inside a Laravel app, with its own Composer constraint ladder ^7.4 || ^8.0 and PHP ceiling <8.6) that no framework upgrade path will carry for you; every Laravel or PHP upgrade becomes a manual patch exercise against unfamiliar internals. The native path's maintenance is instead coupled to your own framework version, which you are already tracking. Budget ~1–2 engineer-days/quarter either way for a control-plane feature of this size, plus a mandatory review each time the PHP ceiling <8.6 is approached.

Support. Supportability is asymmetric. Native code: your team can read, debug, and hotfix it during an incident at 3am. Third-party bundle with one maintainer, no issue-tracker track record, and an unreliable release feed: you are the escalation path. The CRUD panel raises the support stakes — a mistake in the panel takes the site down, so you need a documented authorization model, a change log, and an explicit "who may toggle production" policy before launch. Add a runbook covering: intentional maintenance, accidental maintenance (mitigation: flag TTL/auto-expiry and a kill switch that cannot itself be gated behind the panel), and bypass-token compromise (rotation procedure).

Scaling. The flag read sits on the hottest path in the system — every request, including health checks. Design accordingly: read through a local in-process cache with a short TTL (5–10s) refreshed from cache or DB, never a synchronous datastore hit per request. At autoscale, flag propagation becomes a consistency question: with file-based storage behind the bundle's pluggable store, new instances come up with a stale or default flag, which can produce mixed modes across the fleet (some nodes 503, some 200) during the propagation window. Prefer a shared cache/DB driver and make the propagation ceiling an explicit SLO ("mode change effective fleet-wide within N seconds"). Also confirm the maintenance response is cheap and CDN-short-circuitable so a mode-on event does not turn into a traffic amplification event against your origins.

Failure modes to enumerate and test:

  • Fail-open vs. fail-closed: flag store unreachable — does the site serve traffic (availability risk) or 503 (availability risk of a different kind)? Pick deliberately; default to fail-open with an alert, never a silent lockout.
  • False positives in exclusions: an over-broad IP/CIDR or path glob exposes a real route during maintenance, or the bypass token leaks into logs/referrers.
  • Panel lockout: the panel itself becomes unreachable because it is covered by the exclusion logic — the classic self-inflicted outage.
  • Health-check suppression: load balancers receive 503 and drain all nodes, converting planned maintenance into a hard outage.
  • Split-brain deploys: rollback while flag is set, leaving old instances unaware of the flag.
  • Clock/date bugs in scheduled start/end windows (timezone or TTL off-by-one), the same class of integrity issue flagged by the future-dated release.
  • Verify Retry-After and search-engine 503 semantics so maintenance does not damage SEO, and confirm the mode's error page is served without touching the application's session/DB path.

Ramp-up. Low for the native path: a mid-level Laravel engineer familiar with middleware and service providers can own this after ~1 day of reading, and the whole feature is reviewable in a single PR. Ramp-up for the integration path is materially worse — a new contributor must carry two framework mental models (Symfony bundle conventions: DI extensions, compiler passes, Resources/config; plus Laravel's container and middleware stack) to safely modify a rarely-touched outage switch. That dual-model tax is the hidden cost that makes a 0-star, 0-dependent dependency unattractive at a 20 score: the code may be fine, but the operational organization around it is unbuilt, and you would be financing that build-out for a capability your platform already ships.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums