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

Filament Check Ssl Widget Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Getting Started

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:

  1. The package README for the exact config key names and widget class namespace (Joaopaulolndev\FilamentCheckSslWidget\... — verify against the release you installed, since it has shifted between Filament v3/v4 releases).
  2. config/filament-check-ssl-widget.php after publishing — this is where you list the domains the widget inspects.
  3. The widget class itself (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.

Implementation Patterns

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.

Gotchas and Tips

  • The checks are synchronous and network-bound. A dashboard with 20 domains can add seconds to TTFB. Cache aggressively, or move checks to a scheduled job that writes results to a table the widget reads from.
  • ext-openssl is required. Verify it's enabled on the server (php -m | grep openssl), especially on managed hosting and Alpine containers.
  • Expired or self-signed certificates will throw. Wrap the fetch in try/catch and render a clear "invalid/expired" state rather than letting the widget 500. This is the #1 debugging complaint with SSL-check widgets.
  • Firewall / egress rules. If your app server can't reach port 443 to the domain, you'll get a false "down" — check connectivity from the web server, not your laptop.
  • SNI on shared hosting. Domains sharing an IP need SNI support; an old cURL against a shared IP returns the wrong certificate. The PHP stream context used by most of these widgets usually handles SNI, but verify with a test domain if results look wrong.
  • Config cache. After editing the domain list in config, run php artisan config:cache in production — otherwise stale domains linger.
  • Timezone in expiry display. Certificates use UTC; if you render "expires in X days" in local time, off-by-one errors appear around midnight. Normalize to UTC before diffing.
  • Filament v3 vs v4. The package tracks Filament releases; pin the version compatible with your panel (composer require joaopaulolndev/filament-check-ssl-widget:^X.Y) and check the release notes before upgrading Filament itself.
  • Production asset/cache commands. After registering the widget in a panel provider, run 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.
  • Wildcard and IDN domains. *.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.
  • Debugging tip: temporarily log the raw certificate array (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.
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.
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core
nodisrupt/laravel-agent
sierratecnologia/media-manager