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.
Feature scoping — "maintenance mode" as a real product surface, not a flag. The bundle packages three capabilities that map directly to distinct product requirements, and each is a separate scope decision:
Build vs. buy. Maintenance mode is commodity functionality — roughly a listener/kernel hook plus a response template. Buying is justified only if you actually consume the panel CRUD and pluggable storage; if you need a flag read from config in a single middleware, build it in a day and own it. The bundle's value is the admin UI + storage abstraction, not the 503 response.
Roadmap inputs it surfaces (gaps to plan around, not promises from this package). Scheduled windows with start/end times; per-tenant or per-brand maintenance state in a multi-tenant product; bypass tokens for external testers without IP coordination; differentiating "planned maintenance" from "incident/outage" in status messaging; correct 503 + Retry-After semantics and CDN/LB behavior so probes and health checks aren't served a maintenance page.
Use cases where it earns its place. Pre-release data migrations on a live product; regional or tenant-scoped blackouts for compliance windows; freezing checkout while keeping catalog browsable; giving support a self-serve toggle instead of paging an engineer.
The Laravel caveat is a decision, not a footnote. Despite the framing, this is a Symfony bundle (Composer constraints ^7.4 || ^8.0, PHP >=8.2 <8.6). It does nothing for a Laravel codebase — Laravel teams should use php artisan down/up or an equivalent Laravel package. If your portfolio spans both frameworks, treat this as "Symfony-only; no shared component," which likely kills any consolidation argument.
Maturity signal for roadmap weighting. 0 stars, 0 dependents, score 20 — zero external validation. Do not put this on a critical path or in a customer-facing SLA story until it has survived an internal pilot with a pinned version and a code review of the listener and storage adapters.
Adopt (pilot) when:
Look elsewhere / build it when:
Verification before any commitment: confirm the release timeline (the listed last release, 2026-10-28, is future-dated relative to normal review cycles — treat the version metadata as unconfirmed), inspect the actual storage adapters and whether the listener runs before/after the firewall, and confirm the response is a true 503 with Retry-After and a noindex posture rather than a 200.
For executives (one paragraph). We evaluated a small open-source Symfony component that adds a professional maintenance-mode capability: an admin screen to switch the site off, rules for who can still get in, and storage that keeps that state consistent across all servers. It is MIT-licensed and free, but it is a single-maintainer project with no external users, so it carries dependency risk rather than license cost. Recommendation: treat it as a low-cost pilot, not a platform commitment — it can replace a hand-rolled toggle and give support staff self-serve control, but it must not sit on a revenue-critical path without an internal owner and a fallback. It is Symfony-only and does not serve our Laravel work.
For engineering (what you're actually signing up for). Small, conventional bundle: a maintenance listener, a CRUD panel for state, configurable exclusions, and a storage abstraction. Compatible with Symfony ^7.4 || ^8.0 on PHP >=8.2 <8.6. Cost is low integration effort plus a one-time review of the listener and the storage adapter you choose (Redis/DB, not filesystem, if you run more than one node). Ask for: version pin, a smoke test covering allowlisted IP + allowlisted path + a health-check endpoint, and confirmation of 503/Retry-After behavior in front of our CDN. Budget a fork-and-own contingency — with zero dependents, we are the first real user and should behave accordingly. If we only need a config-driven flag, build the ~100-line version instead and skip the dependency.
How can I help you explore Laravel packages today?