jason/captcha
jason/captcha is a lightweight CAPTCHA package for Laravel that helps protect forms from automated submissions with simple challenge generation, validation, and configurable routes, views, and styling options.
Abuse-prevention scope on the roadmap. A self-hosted CAPTCHA layer is the cheapest possible answer to "how do we stop spam signups / credential stuffing probes / contact-form floods before we staff a Trust & Safety function?" It lets you scope bot mitigation as a tactical hardening item in an existing sprint rather than a platform initiative — no vendor contract, no procurement cycle, no new line item in the security budget.
Build vs. buy vs. adopt. For a Laravel shop, the honest build/buy comparison is: building an image CAPTCHA in-house is 3–5 engineer-days plus indefinite maintenance of a security-sensitive surface; a third-party service (reCAPTCHA, hCaptcha, Cloudflare Turnstile) is ~hours of integration but adds a vendor, a JS payload, a data-sharing agreement, and a dependency on someone else's uptime. This package sits in the third lane — adopt — at a few hours of integration and near-zero ongoing cost. That is a meaningful option to have priced before you commit to either extreme.
Use cases worth prototyping against:
What it explicitly should not drive. It should not anchor a "bot mitigation strategy" narrative to the board. A 6-star, zero-dependent package is a component, not a platform. Treat adoption as a reversible, time-boxed decision with a named fallback (Turnstile) already scoped.
Roadmap signal. High opportunity score against very low adoption is the classic shape of an under-marketed utility, not a hidden gem with latent demand. Read it as: the problem space is real and underserved, but this specific implementation has not earned the community's trust yet — which is a signal about distribution and proof, not about whether you should care about form abuse.
Adopt (pilot) when all of the following hold:
Look elsewhere when any of the following is true:
Decision hygiene: adopt behind an interface (a CaptchaService contract with this package as one implementation) so swapping to Turnstile later is a config change, not a refactor. This single design choice converts a risky dependency into a cheap, reversible experiment — which is the only way this package makes sense.
To executives — one paragraph: We have a recurring, low-grade abuse problem on our public forms, and we have three ways to solve it: build our own challenge system (engineer-weeks, plus permanent ownership of a security-sensitive component), buy a third-party bot-detection service (hours to integrate, but a new vendor, a recurring fee, third-party JavaScript on our auth pages, and a data-processing agreement to negotiate), or adopt a small open-source Laravel package under the permissive MIT license (hours to integrate, no fee, no data leaves our infrastructure). I recommend the third option as a scoped pilot — it is reversible in a day, it does not commit us to a vendor, and it lets us measure the real spam volume before we spend real money. The trade-off is honest: the package is maintained by a single author with a small user base, so it carries concentration risk. We mitigate that by putting it behind our own interface so we can swap it out, and by keeping rate limiting as the primary control. Success criterion for the pilot: measurable reduction in form spam with no drop in legitimate submissions; if it doesn't clear that bar in one sprint, we revert and buy Turnstile.
To engineering — the ask:
CaptchaService contract. No direct facade calls from controllers. This is non-negotiable and is the entire risk mitigation.How can I help you explore Laravel packages today?