amjadiqbal/filament-uptime-monitor
Filament Uptime Monitor is a Laravel Filament plugin for tracking website and service availability. Monitor URLs, view uptime status and response times in your dashboard, and get alerted when endpoints go down.
What this release is. v1.0.1 is a security-hardening and correctness release, not a feature release. There is no new capability to sell internally; the value is in closing an SSRF hole in the manual "Check now" action and in fixing two defects that produced misleading signal.
Architecture fit. The package is a Filament panel plugin layered on spatie/laravel-uptime-monitor. It owns presentation (Filament resources/widgets), the manual check action, and a bulk-check entry point; scheduling, persistence, and notification semantics belong to the upstream Spatie package. This is a good fit only where the team is already standardised on Filament and needs a lightweight operator surface over a small number of HTTP checks. It is not a monitoring engine and should not be positioned as one — there is no probe distribution, no multi-region vantage point, and no synthetic transaction support.
Integration feasibility. Composer-level and cheap: one package, one command. The real work is not installation but verification, because this release's fixes are the kind that pass silently when absent (see risk below).
Technical risk.
| Risk | Assessment | Mitigation |
|---|---|---|
Dependency floor bump to spatie/laravel-uptime-monitor ^4.7 |
Hard gate. On 4.6 the redirect guard silently did nothing — no error, no log, guard simply inert. Any environment still resolving 4.6 has been running without the protection it appeared to have. | Audit lockfiles and any pinned/patched forks before rollout; treat 4.6 as "guard absent", not "guard degraded". |
| Security fix is partial by design | The address guard does not cover custom request actions or the certificate check's own connection. Documented, but easy to read past. | Inventory monitors using custom request actions; treat those as trusted-input-only. |
DNS pinning via CURLOPT_RESOLVE |
Pinning the request to the pre-resolved IP is correct for SSRF defence but changes connection semantics for CDN-fronted, load-balanced, or SNI-dependent hosts. | Validate against representative production endpoints, not just public reference sites. |
| Unresolvable host now marked down | Correct, but converts transient resolver blips into downtime events and potentially pages. | Confirm notification routing and flap/retry behaviour before enabling on customer-facing monitors. |
| Private-address refusal | Intentional, but it breaks "Check now" for internal/staging hosts behind private ranges. | Expect the first support ticket from whoever monitors an internal URL; decide the workaround (external probe) up front. |
| Coupling to upstream internals | The guard extends a specific upstream request action class, so the plugin is now tightly bound to that class's shape across Spatie minor versions. | Watch upstream changelogs; do not let this package drift a minor behind. |
Test evidence. Reasonable for a package of this size: static analysis at PHPStan level 5, 82 Pest tests across PHP 8.2–8.5 × Laravel 12/13 × Filament 4/5, plus a 45-check headless-Chrome UI pass in light and dark, and a clean-cache install from Packagist on both version pairs. The UI suite now includes a pinned check of a public site with private hosts blocked — that is the right test to have added. Note the gap: no negative test against a load-balanced or CDN-fronted host is described, which is precisely where pinning is most likely to surprise.
Key questions for the maintainer / our team.
Stack fit. Laravel 12 or 13, PHP 8.2–8.5, Filament 4 or 5, Guzzle 7 (a hard requirement of spatie/laravel-uptime-monitor 4.7.x, and the most likely source of transitive churn). The tested matrix is current and wide enough that most estates will land inside it. Anything on Filament 3 or PHP 8.1 is out of scope and should be treated as a separate decision.
Migration path. composer update amjadiqbal/filament-uptime-monitor, adding -W on Laravel 13 as for the initial install. No deprecations, no configuration migration, no data migration are announced. The only substantive change is the transitive requirement bump on the Spatie package — with -W this may resolve more of the dependency graph than intended, so review the full composer.lock diff rather than just the plugin's own version.
Compatibility. Two axes to check:
Sequencing.
-W off, then with it on, and diff the lockfile.Maintenance. Low ongoing effort, but the dependency posture has tightened. The plugin now depends on a specific upstream class shape, so an upstream minor release can break the guard. Budget for a monthly version check rather than a set-and-forget assumption. The plugin's own release cadence looks disciplined (security fix, doc fix, CI evidence in one patch release), which is a good signal for a package sitting in an admin panel.
Support. Net improvement. The README now states the exact bulk-check cap, the per-user rate limit, the guard's coverage boundaries, and the Guzzle 7 requirement — all four are classic first-week tickets. Support should point at the documented scope rather than treating "the guard didn't fire for my custom action" as a defect. Expect one predictable class of ticket regardless: users who cannot "Check now" an internal host.
Scaling. Bounded by the bulk-check cap and per-user rate limit, which is appropriate — an admin button that can fan out to unbounded outbound requests is an availability risk in its own right. Get the actual numbers before publishing operator guidance. Beyond those limits, scale is an upstream Spatie question, not a plugin one.
Failure modes to instrument.
Ramp-up. Low for a Laravel developer — a Composer update and a Filament panel registration. The non-obvious knowledge is concentrated in two places: the guard's scope boundaries, and the fact that the previous release could look healthy while the guard was inert. Put both in the runbook. On-call needs a one-paragraph briefing covering the new DN"S-unresolvable-means-down semantics and the private-address refusal, since both change what a "down" alert means in practice.
How can I help you explore Laravel packages today?