dominion-solutions/filament-captcha
Add CAPTCHA protection to Filament forms with dominion-solutions/filament-captcha. This package integrates captcha challenges into Filament forms to help block bots and spam, with straightforward configuration for your admin panels and Laravel apps.
composer require dominion-solutions/filament-captcha (note the 1.0.0 major bump — see Gotchas before upgrading from 0.2.x).php artisan vendor:publish --tag="filament-captcha-config" (and -views / -translations if you need to restyle or localize). Then re-run php artisan filament:assets if views were published.*_SITE_KEY env var and the secret in *_SECRET_KEY — the secret must never reach the browser..env, .env.example, and your deploy pipeline's secret store. Run php artisan config:clear locally (and config:cache in deploy) so the new keys are actually read.PanelProvider (or per-page form schema) attach the captcha component next to the email/password fields on Login, Register, and RequestPasswordReset.Where to look first, in order: the README's install + config table, config/filament-captcha.php (driver, keys, theme/size, enable flags), the Filament field/component class under src/ (to see which validation rule it registers), and the package's own tests (the fastest source of truth for the public API in 1.0.0, since the release notes are thin).
Schema/Form alongside your other fields. Validation happens server-side through the rule the component registers; you don't call the provider yourself.phpunit.xml (or the package's bypass flag in your TestCase) so the suite never makes a network call. Assert the rule behavior with a fake client in a dedicated test rather than exercising the real provider.RateLimiter/Filament's built-in login throttling — a captcha stops bots, throttling stops credential stuffing from a single IP.composer.json requirements against your app before bumping; expect renamed namespaces, changed config keys, and republished views/assets being required. Read PR #26 or the diff, not just the changelog line — the changelog here says nothing about migration steps.php artisan config:cache (or with a stale cache) silently keeps old keys. "Captcha always fails in staging" is almost always this or a domain mismatch.timeout-or-duplicate and users get stuck in a loop. Make sure the widget resets on validation error.wire:navigate, provider scripts loaded once in the layout won't re-initialize on subsequent page loads. Either exclude the auth pages from SPA navigation or add a re-init hook.script-src and frame-src allowances for the provider domains. A silent, non-rendering widget is usually a CSP violation, not a package bug — check the browser console before filing an issue.lang/ rather than hardcoding messages in your form.How can I help you explore Laravel packages today?