Weave Code
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 Turnstile Laravel Package

l3aro/filament-turnstile

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Pros:

    • Filament-Native: Designed specifically for Filament (v3+), leveraging its form component system (Forms\Turnstile). Avoids reinventing wheel for CAPTCHA integration in Filament admin panels.
    • Cloudflare Turnstile Alignment: Tightly couples with Cloudflare’s Turnstile API, ensuring compliance with their latest features (e.g., privacy-friendly design, no cookies).
    • Event-Driven Reset Logic: Built-in support for resetting CAPTCHA on validation errors (critical for login/registration flows) via Filament’s onValidationError hook.
    • BackedEnum Support: Recent fixes (v1.0.7) address Blade template compatibility, ensuring seamless integration with Filament’s view layer.
    • Lightweight: Minimal overhead (~100 LOC for core functionality), ideal for performance-sensitive admin panels.
  • Cons:

    • Filament Version Lock: Explicitly tied to Filament v5 (per v1.0.6 changelog). May require updates if upgrading Filament major versions.
    • Limited Customization: Relies on Cloudflare’s Turnstile client-side rendering; advanced UI tweaks (e.g., CSS overrides) require manual JavaScript.
    • No Server-Side Validation Abstraction: Developers must manually handle Turnstile token validation (e.g., in Form::submit() callbacks) unless using Filament’s built-in validation rules.

Integration Feasibility

  • High:

    • Composer Integration: Zero-config installation (composer require + vendor:publish).
    • Form Component API: Drop-in replacement for Filament’s native form fields (e.g., TextInput). Example:
      Turnstile::make('captcha')
          ->theme(TurnstileTheme::Auto)
          ->size(TurnstileSize::Normal);
      
    • Cloudflare API Compatibility: Uses standard Turnstile keys (SITE_KEY, SECRET_KEY) and validation endpoints.
    • Event System: Leverages Filament’s event bus for CAPTCHA reset (e.g., reset-captcha), reducing coupling.
  • Blockers:

    • Filament Version Mismatch: If using Filament < v3 or > v5, may require forks or compatibility layers.
    • Cloudflare Dependency: Requires Cloudflare Turnstile account (free tier available). No fallback to other CAPTCHA providers.

Technical Risk

  • Low to Medium:
    • Dependency Risk: Cloudflare Turnstile is stable (used by Laravel, Symfony, etc.), but API changes could break integration. Monitor Cloudflare’s deprecation policy.
    • Filament Ecosystem Risk: Package is untested with Filament plugins (e.g., Spatie Media Library forms). Validate in staging.
    • Token Validation: Developers must implement server-side validation (e.g., via Filament\Forms\Components\Concerns\ValidatesTokens). Example:
      use l3aro\FilamentTurnstile\Forms\Concerns\ValidatesTokens;
      
      class MyForm extends Form {
          use ValidatesTokens;
      }
      
    • Blade Template Issues: Fixed in v1.0.7, but test with custom Filament themes (e.g., Tailwind CSS overrides).

Key Questions

  1. Filament Version Compatibility:

    • Are we locked to Filament v5, or can we upgrade/downgrade without breaking this package?
    • Mitigation: Check Filament’s upgrade guide for v5-specific changes.
  2. CAPTCHA Validation Strategy:

    • How will we validate Turnstile tokens server-side? Will we use Filament’s built-in rules or custom logic?
    • Example: Extend ValidatesTokens or use a middleware like:
      use l3aro\FilamentTurnstile\Facades\FilamentTurnstileFacade;
      
      public function validateTurnstile($request) {
          return FilamentTurnstileFacade::validate($request->input('captcha'));
      }
      
  3. Reset Event Scope:

    • Should CAPTCHA reset globally (e.g., all forms) or per-form? The package supports both via reset_event config.
    • Tradeoff: Global reset simplifies code but may impact UX (e.g., resetting a solved CAPTCHA on unrelated form errors).
  4. Testing Coverage:

    • Are we testing edge cases like:
      • Network failures during CAPTCHA verification?
      • Concurrent form submissions with stale CAPTCHA tokens?
    • Recommendation: Use Cloudflare’s testing keys in CI.
  5. Performance Impact:

    • Will Turnstile’s JavaScript library add noticeable load to admin panel pages?
    • Benchmark: Test with Lighthouse or WebPageTest before production rollout.

Integration Approach

Stack Fit

  • Primary Fit:

    • Filament v3+: Core target (v5 explicitly supported).
    • Laravel Ecosystem: Works seamlessly with Laravel’s service providers, Blade views, and event system.
    • Cloudflare Turnstile: Requires Cloudflare’s CAPTCHA service (no alternatives).
  • Secondary Fit:

    • Livewire Forms: Package extends Filament’s Livewire-based forms, so it works with any Livewire-powered Filament resource/page.
    • Custom Filament Panels: Can be integrated into non-default panels (e.g., tenant-specific admin panels).
  • Non-Fit:

    • Non-Filament Laravel Apps: Not designed for vanilla Laravel forms (e.g., Inertia.js, API routes).
    • Other CAPTCHA Providers: Hardcoded to Cloudflare Turnstile (no hCaptcha/Google reCAPTCHA support).

Migration Path

  1. Pre-Integration:

    • Audit Current CAPTCHA: Document existing CAPTCHA implementations (e.g., reCAPTCHA) and their integration points (forms, APIs).
    • Cloudflare Setup: Register Turnstile keys in Cloudflare Dashboard and add to .env:
      TURNSTILE_SITE_KEY=your_site_key
      TURNSTILE_SECRET_KEY=your_secret_key
      
    • Filament Version Check: Ensure compatibility with Filament v3+ (preferably v5).
  2. Pilot Phase:

    • Low-Risk Form: Start with a non-critical form (e.g., feedback submission) to test integration.
    • Validation Logic: Implement server-side validation (e.g., middleware or form rule).
    • Reset Event: Test CAPTCHA reset on validation errors (e.g., login form).
  3. Rollout:

    • Critical Forms First: Prioritize login/registration forms (highest bot abuse risk).
    • A/B Testing: Compare Turnstile’s UX (e.g., conversion rates) vs. existing CAPTCHA.
    • Monitoring: Track Cloudflare Turnstile’s error rates and false positives.
  4. Post-Integration:

    • Deprecate Legacy CAPTCHA: Remove old CAPTCHA code (e.g., reCAPTCHA scripts).
    • Document: Update runbooks for CAPTCHA troubleshooting (e.g., Cloudflare outages).

Compatibility

  • Filament:
    • Supported: v3+, explicitly tested with v5.
    • Unsupported: v2 or custom Filament forks (may require patches).
  • Cloudflare Turnstile:
    • API Version: Uses latest stable API (monitor Cloudflare’s changelog).
    • Testing Keys: Supports Cloudflare’s dummy keys for development.
  • Laravel:
    • No Hard Dependencies: Works with any Laravel version supporting Filament v3+.
    • Service Provider: Registers via Filament’s plugin system (no manual binding needed).

Sequencing

  1. Phase 1: Setup (1–2 days)

    • Install package, publish config, and configure .env.
    • Add Turnstile to a single form (e.g., contact page).
  2. Phase 2: Validation (2–3 days)

    • Implement server-side validation (e.g., middleware or form rule).
    • Test reset events on validation errors.
  3. Phase 3: Rollout (1 week)

    • Integrate into login/registration forms.
    • Monitor error rates and UX feedback.
  4. Phase 4: Optimization (Ongoing)

    • Adjust Turnstile settings (e.g., theme, size) based on analytics.
    • Explore advanced features (e.g., Turnstile scoring).

Operational Impact

Maintenance

  • Pros:
    • Minimal: Package is lightweight (~100 LOC) with no external dependencies
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.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky