grafite/maintenance
Grafite Maintenance provides a configurable maintenance mode for Laravel applications, letting you enable downtime with allowlisted bypasses, custom views, and Artisan commands for planned deployments and upgrades.
Architecture fit — resolve the ambiguity first. The supplied sources describe two different packages. The marketing description frames grafite/maintenance as a request-path feature: database-driven maintenance mode, scheduled windows, custom maintenance pages, IP/user whitelists, middleware integration. The prior engineering assessments describe it as an ops-time command suite: thin aliases over cache:clear, config:clear, route:clear, queue:restart, down/up. These have materially different architectures and materially different risk profiles — one touches every HTTP request, the other touches none. A TPM cannot approve, scope, or sequence work until the source tree settles which one this is. Reading src/ and the service provider is a half-hour task and should be the first deliverable, not an assumption.
If it is the request-path variant: the shape is a service provider, a middleware registered into the web group, a config file, and at least one migration for the maintenance-state table. That is a conventional Laravel integration but it inserts a third-party package into the availability path of the application — the middleware must run early, must not itself fail, and must consult the database on requests that may occur precisely when the database is under stress. If it is the command-suite variant: near-zero coupling, near-zero architectural consequence.
Integration feasibility. Mechanically trivial either way — one composer require, package auto-discovery, no application code. The feasibility question is lifecycle, not mechanics. 0 stars, 0 dependents, and a 0 composite score are not maturity signals; they are absence-of-signal. There is no production footprint to infer compatibility from, no downstream pressure to maintain Laravel-major compatibility, and no advisory path. "It installs" and "it is supported" are separate findings requiring separate verification.
Technical risk.
Key questions.
X-Forwarded-For / trusted-proxy handling (spoofable whitelists are worse than none)?onOneServer/locking and remain idempotent across a fleet?PM read: the ~31 opportunity score reflects a commoditized capability. Evaluate this as source material and a decision input, not as a dependency to adopt.
Stack fit. Reasonable for a small fleet of Laravel services that wants one consolidated maintenance verb and an in-app toggle instead of tribal knowledge. Poor fit for anything with compliance, audit, or revenue-critical availability obligations, where every state-mutating operation needs a maintained, attributable owner.
Migration path — three options, in preference order.
php artisan down --secret --render --retry plus schedule:run and a deploy hook covers the majority of the value. The genuine delta this package claims is shared, database-backed state — which matters on multi-server fleets, where a file-based down only affects the host you ran it on unless /storage is shared. If that delta is the whole reason you are interested, say so explicitly; it changes the build-vs-buy math.app/Console/Commands or an internal org/maintenance package. Converts an unmaintained dependency into first-party code for hours of effort, removes supply-chain exposure, and gives you a named owner. Default choice absent contrary evidence.composer.lock, and a documented exit plan.Compatibility. Pin tightly; gate the merge on a green CI matrix across every Laravel/PHP combination you support. Auto-discovery means activation is immediate and all-or-nothing — there is no partial-adoption mode. Verify registration explicitly with php artisan list and confirm no collisions before promoting past a feature branch. For the request-path variant, review the migration and the middleware's position in the stack; registration order determines whether it can actually gate anything.
Sequencing.
Maintenance. Budget for ownership. Under the dependency path you inherit a package with no observable maintainer throughput, so the realistic plan is "we patch it ourselves after each Laravel major." The fork path just moves that cost to a known owner — which, at this size, is the better trade.
Support. No vendor, no SLA, no CVE feed, no upgrade guide. Support burden lands entirely on the adopting team. Acceptable for developer convenience; unacceptable for anything touching production data retention or customer-facing availability without an explicit owner.
Scaling. Ops-time commands do not affect throughput. The real scaling concern is fleet coordination: run maintenance toggles from one place, lock destructive commands with onOneServer, and make everything idempotent. Wholesale cache clears on a high-traffic system can stampede the origin database — prefer targeted invalidation and schedule deliberately. Note the flip side: if the package's shared DB state genuinely solves the multi-server down problem, that is its one defensible operational advantage and the strongest argument for evaluating it at all.
Failure modes. (1) Middleware fails open — customers hit an app mid-migration. (2) Middleware fails closed — on-call is locked out during an incident. (3) Queue workers keep processing because only HTTP is gated. (4) A scheduled window overlaps a deploy and nobody notices until both are running. (5) Silent no-op after a framework upgrade erodes trust in the runbook. (6) Command-name collision executes the wrong definition. (7) A whitelist that trusts spoofable forwarded headers. (8) Partial failure across hosts leaves the fleet in inconsistent state.
Ramp-up. Low. A Laravel-fluent engineer reads the whole surface in an hour and reimplements it in a day. That low cost is exactly why carrying an unmaintained dependency is hard to justify — and why the TPM recommendation should be a short evaluation spike that harvests the useful patterns, plus a dependency-governance note placing this package in the evaluate-only tier.
How can I help you explore Laravel packages today?