brickx/laravel-filament-maintenance
A Filament plugin for managing Laravel maintenance mode from your admin panel. Toggle maintenance on or off, customize the page shown to visitors, and control access without editing config files or running artisan commands.
Architecture fit. Unchanged. The package remains a thin UI surface over Laravel's native maintenance mode (php artisan down / up), registered as a Filament plugin with a page or action inside the admin panel. No migrations, no service overrides, no event hooks. Blast radius stays small and the package remains removable without data remediation.
Integration feasibility. Mechanically trivial: composer require, register the plugin in a PanelProvider, optionally publish config/views. The 1.1.2 release adds a refresh option (PR #6) — presumably surfacing Laravel's --refresh flag so the maintenance page auto-refreshes after N seconds. This is additive and non-breaking at the patch level, but it tells us two useful things: the package now passes at least one more of Laravel's native down options through, and it is not fully inert — a community PR was merged. Neither changes the version-adjacency constraint: the plugin binds to Filament's page/plugin contracts, which have churned across v2 → v3 → v4, and nothing in these notes indicates a Filament compatibility statement or a tested-against matrix.
Technical risk. The dominant concerns from the prior assessment survive intact; 1.1.2 does not touch any of them.
secret exposure in URLs, logs, or browser history.refresh is written into the node-local maintenance payload, so the new feature inherits the same node-local semantics. It does not imply, and should not be read as, any move toward shared state across a fleet.Key questions. Largely unchanged, with one partially answered:
secret, retry, status, redirect, and render options, or only a boolean?refresh is now exposed. Still unknown for secret, retry, status, redirect, render.Artisan::call() or direct file manipulation? Policy/gate gating? Audit trail? Multi-node handling?Stack fit. Unchanged. Appropriate only for teams already running Filament as their operational console; disproportionate for anyone else. The new refresh option makes the package marginally more usable for planned-deploy messaging, which is the main scenario where it earns its keep — but it does not change the fit calculus.
Migration path. Recommendation stands: absorb, don't adopt. The functional core remains roughly one Filament page calling Artisan::call('down', [...]) / Artisan::call('up'), plus a policy check, a confirmation modal, and now a refresh argument. Reimplementing in-house takes hours, drops an unmaintained dependency, and lets us add authorization, audit logging, and multi-node handling that the package still lacks. If we evaluate anyway, install into a disposable panel, read the source, and use it as a reference implementation — 1.1.2 is worth reading specifically to see how it plumbs the refresh value through.
Compatibility. Unchanged: pin the Filament major in composer.json and re-test the toggle page on any Filament upgrade. 1.1.2 is a patch-level, additive change with no deprecations or breaking changes, so it does not itself require a migration step or a re-test. Do not infer from a patch release that current Filament majors are supported.
Sequencing. (1) Read the source, including the new refresh path, and confirm authorization and secret-handling behavior. (2) Decide fork vs. rebuild — still lean rebuild. (3) Implement with a gate, confirmation step, and audit log entry. (4) Decide the state mechanism: native file-based for single-node, shared cache/flag for multi-node. (5) Ship behind a feature flag and rehearse a toggle in staging before enabling in production. The refresh option, if we replicate it, should be included in step 3 rather than bolted on later, since it is part of the operator-facing UX during an outage.
Maintenance. Unchanged in substance. Maintenance cost is still ~100% ours. The 1.1.2 release is a data point that the project is not entirely dormant, but a single contributor PR is not something to build a dependency policy on — do not let it reset the "unmaintained" clock or defer the build-vs-fork decision. Every Filament major bump still requires touching plugin registration and the page contract.
Support. No vendor, no stated support commitment, no issue-response expectation. Internal documentation remains mandatory. The code is small enough to fully understand in an afternoon, which keeps the support burden low regardless of upstream activity.
Scaling. Unchanged and still the sharpest edge. Native maintenance mode is file-based and node-local; the new refresh option is a presentation concern layered on that same node-local state and provides no cross-node coordination. On a single VM it behaves correctly; on a load-balanced or autoscaling fleet, a toggle darkens only the node that served the request — now with the added wrinkle that the refresh page will cheerfully promise a return that the other nodes never left. Flag before adoption, not after the first partial outage.
Failure modes. Prior list stands, with one addition and one refinement:
up leaves the app dark; needs a documented manual escape hatch and alerting.Ramp-up. Unchanged: under a day for a Filament-familiar engineer to read, fork, and harden. The risk remains the temptation to deploy as-is because installation is easy — and a fresh patch release tends to increase that temptation by signaling activity. TPM recommendation holds: treat this as a design reference, build the ~100 lines internally, and decide authorization, confirmation, audit logging, refresh behavior, and multi-node strategy up front.
How can I help you explore Laravel packages today?