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 Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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.

  • Abandonment. Assume de facto unmaintained. You will be the maintainer after the first framework upgrade that breaks it.
  • Availability blast radius (request-path variant). A maintenance-mode gate that fails open serves a half-migrated application to customers; one that fails closed locks out on-call during the exact incident it was meant to help with. Both are outages, and both are decided by code you did not write.
  • Destructive overreach (command variant). Storage pruning and cache clears are privileged, state-mutating operations. A bug there is an outage, not a stack trace.
  • Silent failure. Command-name collisions with framework built-ins resolve silently — discovery registers the command, one definition wins, and your runbook quietly does the wrong thing.
  • New owned surface. The DB-driven variant adds a migration and a table you own forever, plus a scheduling UI/concept if you build one.

Key questions.

  • Which capability is actually implemented — middleware gate, command suite, or both?
  • Does the middleware fail open or closed when the DB is unreachable? Is that behaviour configurable and documented?
  • Does it support a bypass secret and IP whitelisting with correct X-Forwarded-For / trusted-proxy handling (spoofable whitelists are worse than none)?
  • Are queue workers and scheduled jobs paused during maintenance, or does only the HTTP path get gated?
  • Do commands and state changes use onOneServer/locking and remain idempotent across a fleet?
  • Declared Laravel/PHP constraints, test coverage on destructive paths, and transitive Grafite dependencies?
  • Is upstream accepting issues and PRs, or dormant?

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.

Integration Approach

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.

  1. Build on native Laravel. 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.
  2. Fork and own. MIT, small surface: vendor the code into 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.
  3. Adopt from Packagist. Only defensible if the key questions return strong answers on compatibility, failure semantics, and activity — and only with an exact pin, committed 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.

  1. Resolve the capability ambiguity from source; write a one-page "what this actually does."
  2. Map each feature to its native-Laravel equivalent and quantify the real delta (the scheduling/shared-state story is the only candidate).
  3. Decide adopt / fork / build; default to build-or-fork.
  4. If proceeding, dry-run in staging with production-shaped data — cache backends, storage layouts, and multi-host topologies all behave differently from local.
  5. Wire in one command or one gate first, behind a flag, in a single low-blast-radius app.
  6. Document the runbook and the rip-out procedure before the second app.

Operational Impact

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.

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.
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin
skyraptor/chatter
edlugz/sasapay
abbasudo/artisan-route