grantholle/laravel-altcha
Laravel ALTCHA offers a privacy-friendly, proof-of-work CAPTCHA alternative for Laravel apps. Add the Blade widget, verify submissions server-side, and configure challenges without third-party tracking or frustrating image puzzles.
Architecture fit. laravel-altcha is a thin Laravel adapter over altcha-org/altcha: server-side verification of proof-of-work payloads, a validation rule, a Blade component, and a publishable config file. It occupies the CAPTCHA slot in the form pipeline. The default path is stateless — no migrations, no queue, no daemon — so it slots into horizontally scaled, containerized, multi-node deployments without shared state. That statelessness is the main architectural draw versus traditional CAPTCHA services (which add a third-party network hop and a privacy/compliance conversation).
Integration feasibility. High. Composer install, publish config, add the rule to existing FormRequests, drop the widget into Blade. Existing $errors handling works unchanged. The real work is front-end: the solved token must be injected into the payload before submit. Plain Blade forms are trivial; Livewire/Inertia/SPA forms require manual token plumbing and are where the estimate grows.
Technical risk.
altcha-org/altcha v2 (a major). Risk is low if we only touch the Laravel-facing surface; it becomes a de facto breaking change if any of our code or an intermediate package called the vendor library's challenge/verify API directly.Key questions.
script-src, worker-src) and availability story?Stack fit. Blade + FormRequest applications: drop-in. Livewire/Inertia/SPA: workable, but treat token capture as a small integration project. No Octane or Horizon concerns beyond cache-driver choice. Multi-tenant safe because default mode is stateless.
Migration path. There is no prior assessment, so scope this as a net-new dependency, not an upgrade. Pin ^2.3 for the package and pin altcha-org/altcha explicitly in composer.json so a future minor release cannot silently drag in another vendor major. Avoid wildcard constraints.
Compatibility. Verify declared PHP/Laravel support against our runtime before the spike. Check the published config filename and Blade component namespace for collisions. Confirm CSP permits the widget script and the Web Worker it spawns — worker-src omissions are the most common silent failure with this class of library.
Sequencing.
Do not put this in front of authenticated high-frequency API traffic; the cost/benefit inverts there.
Maintenance. Low baseline cadence — mostly dependency-bump PRs and rare feature drops — but this release shows the pattern: a vendor major arriving inside a package minor. We own the pin and the upgrade testing. Treat any release touching the altcha-org/altcha constraint as a full verification test pass regardless of semver.
Support. No vendor SLA. Escalation path for a production break is "fork and patch." Confirm we can read and modify a few hundred lines of PHP and that the license permits it.
Scaling. Server-side verification is CPU-cheap (hash comparison) and scales linearly when stateless. Single-use enforcement converts every verification into a cache/DB read-write, inheriting that store's scaling and availability profile. Negligible on Redis; an extra write per submission plus a cleanup job on a database table. Size accordingly.
Failure modes (roughly by likelihood):
Ramp-up. ~0.5 day for a Laravel-comfortable engineer to ship one form. Add 1–2 days for Livewire/Inertia/SPA token plumbing, and 1–2 days more if we commit to single-use with a new storage path and expiry cleanup. No new infrastructure class is introduced unless single-use is enabled.
Recommendation. Adopt 2.3.0 for a scoped pilot on one public form. Pin the vendor library explicitly. Make the single-use decision before rollout rather than after. Re-review once PoC data on solve time and abandonment is in hand.
How can I help you explore Laravel packages today?