joaopaulolndev/filament-check-ssl-widget
Filament Check SSL Widget adds a dashboard widget to monitor SSL certificates for your domains, showing validity status and expiration days at a glance. Keep track of upcoming certificate expirations directly in Filament.
Install the package and register the widget with your Filament panel:
composer require joaopaulolndev/filament-check-ssl-widget
php artisan vendor:publish --tag="filament-check-ssl-widget-config"
Where to look first, in order:
Joaopaulolndev\FilamentCheckSslWidget\... — verify against the release you installed, since it has shifted between Filament v3/v4 releases).config/filament-check-ssl-widget.php after publishing — this is where you list the domains the widget inspects.Widgets/CheckSslWidget.php), which is where the certificate lookups happen and where you will extend behavior if the defaults don't fit.Register the widget in your panel provider:
use Joaopaulolndev\FilamentCheckSslWidget\Widgets\CheckSslWidget;
public function panel(Panel $panel): Panel
{
return $panel
->widgets([
CheckSslWidget::class,
]);
}
First use case: drop the widget on the dashboard of an internal admin panel, list the handful of client-facing domains you own, and get an at-a-glance view of issuer, validity window, and days-until-expiry. That alone replaces a recurring "check the certs manually" chore.
Dashboard widget for ops teams. The simplest productive pattern is one widget listing several domains in a table. Populate domains from the config file, or override the domain source in a subclass if you want them to come from a model:
class ClientSslWidget extends CheckSslWidget
{
protected function getDomains(): array
{
return \App\Models\Domain::pluck('hostname')->all();
}
}
Dedicated page for a "System Health" area. Instead of flooding the main dashboard, register the widget on a custom Filament page (->widgets([...]) on the page class). This keeps the synchronous SSL checks off the most-hit screen.
Polling for near-real-time data. Filament widgets support protected static ?string $pollingInterval = '60s';. Set it thoughtfully — every poll re-runs the lookups (see Gotchas). A 5-minute interval is usually plenty for certificates that change every 60 days.
Pair with notifications. Wire a scheduled command or a Widget::make() observer that inspects days-to-expiry and fires a Filament notification or Slack alert at 30/14/7 days. The widget is a display layer; the alerting layer is yours to build around it.
Cache the lookups in a service. Wrap the certificate check in a small SslInspector class and cache per-domain results:
Cache::remember("ssl:{$domain}", now()->addHours(6), fn () => $this->fetch($domain));
Call it from your widget (via subclass) and from your scheduler. This decouples the UI from the network and makes both the dashboard and cron cheap.
Multi-tenant panels. Register the widget per-panel and feed domains scoped to the current tenant:
->widgets([
CheckSslWidget::make()->domains(
fn () => tenant()->domains()->pluck('host')->all()
),
])
If the widget doesn't expose a fluent setter, subclass and override the domain-getter — that's the cleanest extension seam.
ext-openssl is required. Verify it's enabled on the server (php -m | grep openssl), especially on managed hosting and Alpine containers.php artisan config:cache in production — otherwise stale domains linger.composer require joaopaulolndev/filament-check-ssl-widget:^X.Y) and check the release notes before upgrading Filament itself.php artisan filament:cache-components (and config:cache) as part of your deploy — new widgets otherwise don't appear until the next request warms the cache.*.example.com cannot be checked directly — pick a concrete hostname (www.example.com) that the wildcard covers. IDN names need punycode; convert with idn_to_ascii() before passing them in.openssl_x509_parse) from the fetch method. Most "wrong issuer" bugs are either a proxy/CDN in front of the domain or a cached response from an earlier domain.How can I help you explore Laravel packages today?