mulertech/captcha
MulerTech Captcha is a Laravel package for adding image-based captcha challenges to forms, with validation rules, customizable configuration, and simple Blade integration to help protect your application from bots and spam.
error_bubbling disabled by default, and distinct "wrong answer" vs. "expired token" messages are direct inputs to the signup/contact/checkout error-state design. The refresh endpoint also lets us decide whether a failed submission re-renders a fresh challenge or reuses one.Consider it when:
CaptchaType, ValidCaptcha constraint, Twig form theme, auto-registered routes), not a Laravel package. Despite the framing of this assessment, there is no Laravel service provider, validation rule, or Blade integration here. Do not plan a Laravel adoption around v1.0.0.ext-gd available and a session-backed state model. Session-stored answers mean it will not work cleanly for stateless/API-only flows, multi-node setups without shared session storage, or mobile/native clients.Look elsewhere when:
For executives: This is a self-hosted bot filter for public web forms that eliminates a third-party vendor, its subscription cost, and its data-sharing exposure. It runs entirely on our own servers with no API keys and no external calls, which simplifies privacy and procurement review. The trade-off is that it is a basic deterrent — appropriate for routine form spam, not for defending against a determined attacker — and it introduces an accessibility gap we would need to address separately before shipping to all audiences.
For engineering: A first-release (v1.0.0) Symfony bundle targeting PHP 8.4+ and Symfony 6.4/7.x/8.x, requiring ext-gd. It provides a compound CaptchaType form field, a ValidCaptcha constraint, an auto-registered Twig theme and /captcha/refresh endpoint, server-side session answer storage with 10-minute token TTL and a 5-token-per-session cap, and CSP-nonce-aware JavaScript. Integration cost is low. Key caveats: it is Symfony-only — not Laravel; it is session-dependent, so confirm shared session storage before relying on it across multiple nodes; it is image-only with no audio fallback; and it carries standard v1.0.0 maturity risk on a security-adjacent component. Recommend a scoped pilot on one low-risk public form, with a documented accessibility workaround and a fallback plan, before broad rollout.
How can I help you explore Laravel packages today?