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

jeffersongoncalves/filament-check-whois-widget

A Filament widget that runs WHOIS lookups for domains and displays registration details, expiry dates, and registrar info right in your admin panel. Add fast domain checks to any dashboard without leaving Filament.

View on GitHub
Deep Wiki
Context7

Getting Started

composer require jeffersongoncalves/filament-check-whois-widget

Register the plugin in your panel provider (app/Providers/Filament/AdminPanelProvider.php) — this wires up the widget's views, translations and any config:

use JeffersonGoncalves\FilamentCheckWhoisWidget\CheckWhoisWidgetPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        ->plugin(CheckWhoisWidgetPlugin::make());
}

Then surface the widget. If your panel uses ->discoverWidgets(), it will be picked up automatically; otherwise add it explicitly to the dashboard:

->widgets([
    \JeffersonGoncalves\FilamentCheckWhoisWidget\Widgets\CheckWhoisWidget::class,
])

Publish the assets you intend to touch (do this before editing anything, so upgrades stay clean):

php artisan vendor:publish --tag=filament-check-whois-widget-views
php artisan vendor:publish --tag=filament-check-whois-widget-translations
php artisan vendor:publish --tag=filament-check-whois-widget-config

Where to look first: src/CheckWhoisWidgetPlugin.php (config surface and asset registration), the widget class in src/Widgets/ (the lookup call and the view data contract), resources/views/ for markup, and resources/lang/en/ for the strings you may want to reword.

First use case: an on-call/admin dashboard where you paste a client domain and immediately see registrar, creation date, expiry date and nameservers — the classic "is this domain about to lapse before the renewal invoice goes out?" check, without leaving the panel for a third-party WHOIS site.

Implementation Patterns

Dashboard-glance pattern. Put the widget on the dashboard with a small pollingInterval or sort order so it renders after the cheap widgets. Keep it lazy (protected static bool $isLazy = true, the default) — WHOIS over port 43 is slow and you do not want it blocking the first paint of your admin home.

Custom page instead of the dashboard. For anything used more than occasionally, mount the widget on a dedicated page so it isn't hit on every admin login:

class DomainTools extends Page
{
    protected static string $view = 'filament.pages.domain-tools';
}

and render <livewire:check-whois-widget /> in the Blade view, or call the widget's own Livewire component directly.

Wrap the lookup in a cache decorator. This is the single highest-value integration. WHOIS responses are network-bound, rate-limited and mostly static over a day. Cache per-domain for 6–24h and let the widget's refresh button bust the key:

$data = Cache::remember("whois:{$domain}", now()->addHours(12), fn () => $lookup->for($domain));

Pair it with a queued job if you check many domains (Cache::remember on a slow call still blocks the request).

Attach it to a resource. If you already model clients/domains, add a Filament Action on the DomainResource table row that opens a modal containing the widget with the domain pre-filled. This is more useful than a global dashboard widget because the context (which client, which renewal date) comes for free.

Bulk / repeatable checks. For agencies watching dozens of domains, build a Filament Repeater form (domain text input) on a custom page, loop the lookups inside a Job/Bus::batch, and render results in a table. The widget is good for one-off lookups; the batch is what you actually schedule.

Locale-aware panels. Since 1.1.0 the widget ships 16 locales. If your panel is multilingual, set ->locale(fn () => auth()->user()->locale) on the panel (or use Filament's per-user locale middleware) and the built-in strings follow. Publish translations only when you need to change wording, not to add a locale.

Testing seam. Do not hit the network in tests. Bind a fake implementation of whatever lookup service the widget resolves from the container, or Http::fake() if the package's lookup path is HTTP/RDAP-based. Raw socket WHOIS cannot be faked with Http::fake() — see gotchas.

Gotchas and Tips

No caching by default. The widget does a live lookup per render/refresh. On a busy panel this means repeated outbound connections and, for some TLDs, temporary bans from the registry. Always wrap with Cache::remember before you put this on a shared dashboard.

WHOIS port 43 is frequently blocked. Shared hosting, some container platforms and corporate egress rules drop outbound TCP/43. The widget will appear to hang or return blank. Test with nc -vz whois.verisign-grs.com 43 from the app server; if blocked, you need an RDAP/HTTP fallback rather than a config tweak.

Rate limits are per-registry, not per-app. .com/.net are generous; ccTLDs (.de, .uk, .ru) vary wildly and some require a web form. A loop over 50 domains will get throttled — add a sleep or stagger via queued jobs.

Parsing is not standardized and GDPR redaction bites. Registrant fields are usually REDACTED FOR PRIVACY; expiry-date formats differ per registrar and some responses omit them entirely. Treat every field as nullable and never let a missing expiry date throw — render "unknown" and log it.

Timezone on expiry dates. Expiry timestamps come back in the registry's own zone (often UTC) and as free text. Cast explicitly (Carbon::parse($raw, 'UTC')) before showing "expires in X days", or you will be off by a day for users in the Americas.

RTL locales. 1.1.0 adds ar and fa. If you publish and override the widget view, add dir="rtl" handling (Filament does this at panel level) — the default markup is fine, your custom markup may not be.

Publishing translations. Use the -translations tag and keep the tree lang/vendor/filament-check-whois-widget/{locale}/. Publishing with the wrong tag silently copies nothing, which is the usual cause of "my override isn't applied".

Upgrading from 1.0.x is safe. 1.1.0 is additive: 16 new lang files plus dev-only dependency bumps (pest 3, testbench 10, collision 8, phpstan major). No runtime API or config changes, no deprecations. The only thing worth checking is composer.json's PHP/Laravel floor — the bumped test matrix implies the package now targets newer PHP; if you're pinned to PHP 8.1 or Laravel 10, verify the constraint before composer update.

Extension point to prefer. Rather than forking the widget view to add "copy domain" / "open at registrar" buttons, publish the view and add a small Livewire action, or subclass the widget and override only getViewData(). Subclassing keeps you on the upgrade path for the lookup logic, which is the part you least want to maintain.

PHP timeouts. default_socket_timeout and max_execution_time are the usual culprits when a single slow registry makes the whole page 504. Set an explicit low timeout in the published config if one is exposed, and always guard the call in a try/catch that renders an inline error state instead of a Livewire error modal.

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.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums