muazzambuilds/filament-turnstile
Easily add Cloudflare Turnstile CAPTCHA protection to Filament forms with this lightweight package. It blocks spam and bot submissions using a privacy-friendly challenge, offers simple configuration, and keeps the experience smooth for real users. Quick to install and configure in minutes.
Architecture fit
Filament Turnstile is a panel plugin for Filament v5 that adds Cloudflare Turnstile bot protection to Filament panel surfaces — most plausibly the authentication screens (login, registration, password reset) and optionally arbitrary forms. Architecturally this is a natural fit: Filament plugins register through the existing Panel::plugin() contract, so adoption is additive and does not require forking or patching Filament internals. Turnstile itself is a drop-in CAPTCHA replacement that renders client-side and verifies server-side against Cloudflare's siteverify endpoint, which is a standard pattern already used by the reCAPTCHA/hCaptcha plugin family. The important architectural nuance is that this introduces a hard runtime dependency on a third-party network call into the authentication path — the single most availability-sensitive part of the admin panel.
Integration feasibility Installation is a one-line Composer require, which suggests a conventional Laravel package layout with a service provider and auto-discovery. Feasibility is high but under-specified: the release notes cover installation and nothing else. There is no documented configuration surface (site key / secret key binding, env variable names, publishable config), no statement of which Filament pages are instrumented, no guidance on enabling/disabling per panel or per form, and no mention of local development keys. Cloudflare publishes well-known always-pass/always-fail test keys, but we cannot assume the package honours them without checking source. Realistically this is a half-day spike to read the provider and confirm behaviour, not a documented configuration task.
Technical risk
The dominant risk is vendor and maturity risk. This is a 1.0.0 from an individual maintainer (muazzambuilds) with no linked repository, no stated license, no test suite evidence, no security policy, and no support channel in the notes. The package executes inside the admin panel — a privileged, high-value surface — so supply-chain diligence is warranted before it touches production auth. Secondary risks: Filament v5 is itself recent, so the compatibility matrix (Filament 5.x, Livewire 3, Laravel 11/12, PHP 8.2+) is narrow and untested in our context; Turnstile requires CSP allowances for challenges.cloudflare.com in both script-src and frame-src, which will break silently on a hardened CSP; and Livewire's SPA-style navigation can cause widget re-render or duplicate-token issues that a v1.0.0 may not have handled.
Key questions
siteverify is unreachable or returns 5xx — fail-open (auth bypass) or fail-closed (lockout)? Is it configurable?Stack fit
Assumes Laravel 11/12, PHP 8.2+, Filament 5.x, Livewire 3. Our panels are on Filament, so the fit is direct with no adapter layer. The plugin adds an outbound HTTPS dependency to challenges.cloudflare.com from the application server, which must be permitted through egress rules in restricted environments — this is a common oversight in locked-down VPCs and should be validated early.
Migration path
Additive, greenfield. No schema changes, no data migration, no backfill. The only "migration" concern is configuration: secrets must be introduced via the existing secret-management path (TURNSTILE_SECRET_KEY in the environment store, never committed), and CSP headers must be amended before rollout or the widget will not render. Rollback is a Composer removal plus a config revert, which makes this cheap to trial and cheap to abandon.
Compatibility
Two compatibility axes to verify rather than assume: the Filament major version (v5 only per the notes — no stated support for v4, so panels mid-upgrade cannot adopt this yet) and our CSP/security-header posture. Also verify behaviour behind a reverse proxy or WAF, since client IP forwarding affects Turnstile scoring and verification. Third-party captcha plugins in this ecosystem have historically lagged Filament majors; a 1.0.0 tied to v5 carries no track record of keeping pace through v6.
Sequencing
Maintenance
Ongoing cost is low in code terms but non-zero in attention: we inherit the maintainer's release cadence for Filament major upgrades. Given a single-maintainer 1.0.0, assume we may need to fork or vendor the package if it goes stale — budget for that as a contingency rather than a surprise. Pin to an exact version and review diffs on upgrade; do not float the constraint, because a patch release here executes in the auth path.
Support No stated support channel, SLA, or security disclosure process. Internal ownership must be assigned explicitly — this is the kind of dependency that quietly becomes nobody's. Add it to the dependency register with a named owner and a review date, and treat it as a security-relevant third party rather than a convenience library.
Scaling
Negligible CPU/memory footprint; the cost is per-authentication-attempt network latency to Cloudflare (typically tens of milliseconds) plus potential rate limiting on siteverify under credential-stuffing bursts — precisely when login volume spikes. Note the irony: the protection is most load-bearing during an attack, which is also when the dependency is most stressed. Confirm timeout and retry behaviour on the verification call; a generous timeout in the login path is a self-inflicted DoS vector.
Failure modes
Ramp-up Low for a Laravel developer — the install is one command and the domain concept (CAPTCHA) is familiar. The real ramp-up cost is undocumented behaviour: expect to read the service provider to learn the config keys, protected routes, and failure semantics. Call it half a day for a confident engineer to reach production-ready understanding, plus the security review. Provide the team a short internal note covering the env vars, the kill-switch, the local bypass, and the CSP requirements — none of which ship with v1.0.0.
How can I help you explore Laravel packages today?