arcanedev/no-captcha
Laravel wrapper for Google reCAPTCHA v2 and v3 that simplifies spam protection. Includes validation rules, Blade directives, helpers, and configurable options so you can secure forms and verify tokens with minimal setup and clean configuration.
Release reviewed: 13.0.0 — published with empty release notes. No changelog body, no migration guide, and no dependency/platform data was included with this release. The version number is the only signal available, and a version number is not evidence of what changed. This assessment is updated to reflect the fact of a major bump while explicitly marking every compatibility claim as unverified pending the tag diff and composer.json.
Architecture fit. Unchanged in substance. arcanedev/no-captcha remains a thin Laravel adapter over Google's siteverify endpoint: a service provider, a facade (NoCaptcha), a publishable config file, a captcha validation rule, and Blade helpers. No persistence, no schema, no queue or event coupling, no domain model — it touches only the HTTP client contract and Laravel's validator. Still a clean fit for a server-rendered Laravel monolith validating via FormRequests or $request->validate().
Still a poor fit — and to be scoped out — for API-first, SPA/Inertia, or mobile clients, where the widget is rendered by a JS SDK, the token is POSTed to your own JSON endpoint, and you would call siteverify directly. The Blade layer is where the value lives; a headless target reduces the package to "a Guzzle call plus a config array."
Caveat added by this release: a major version bump is exactly when thin-surface packages tend to change their surface — facade aliases, config keys, the validation rule name, directive names. We should assume the shape described above still holds only after confirming it against 13.0.0.
Integration feasibility. Greenfield effort is still low and low-uncertainty: 0.5–1 developer-day including tests, contingent on the version constraint resolving on our platform. Two new feasibility items, both caused by the release rather than by the package's design:
13.0.0 under ARCANEDEV's Laravel-tracking convention most plausibly indicates support for a newer Laravel major (the illuminate/support constraint is the thing to check first). If so, the previous "fails composer update on Laravel 10+" finding is stale and must be retired. We cannot assert this without the tag.composer.json and the source between our pinned tag and 13.0.0. Budget +0.5–1 developer-day for that diff if an existing pin is in play.Technical risk. The risk profile has shifted rather than shrunk:
siteverify is a simple, stable API and the wrapper is a few hundred lines. Forking, vendoring, or reimplementing is genuinely cheap. The package is viable as a starting implementation, not a strategic dependency.Key questions to resolve before commitment:
13.0.0 actually change? The release body is empty — read the CHANGELOG, the compare diff from our last-known tag, and the composer.json constraint.composer why-not settles it.captcha rule name, @captcha directive? Any of these breaking is a silent-runtime failure for us.php artisan config:cache?Stack fit. Unchanged in principle: best value in a Blade-rendered Laravel app on the version line the package supports. What changed is that we no longer know which line that is — 13.0.0 may extend support to a newer Laravel major, which would convert this from a fork-first exercise back into a plain composer require. Do not pre-commit to the fork path until the constraint is verified; equally, do not assume the new major resolves cleanly just because the number went up. And continue to refuse permanent constraint overrides (--ignore-platform-reqs, hand-edited composer.json) as an undocumented steady state.
Migration path. Same shape, with a mandatory first step inserted:
13.0.0 against our last-known-good tag — composer.json constraints, facade registration, config file keys, validation rule signature, Blade directive output. Produce a one-page internal changelog, because upstream did not.CaptchaVerifier::verify(string $token, ?string $ip): Result and register the package as one adapter behind it. ~40 lines that convert stale-package and breaking-change risk into a swappable implementation detail — and that insulate us from the next undocumented major.NoCaptcha:: facade calls in controllers, services, or jobs; only in the adapter and rule registration.vendor/. Publishing config and owning the fork in an internal namespace keeps the Blade directive stable for template authors.Compatibility. Verify against the full matrix, not just our runtime version: PHP 8.x, illuminate/* constraints, config:cache and route:cache interaction, and rule registration under the target Laravel's discovery conventions. Re-test the JS asset path specifically — major versions are a common point for the pinned Google URL to change, which matters if we run a strict CSP (script-src / frame-src allowlisting of google.com and gstatic.com).
Sequencing.
13.0.0 in a scratch branch on the real Laravel version, confirm resolution, read the delta, and confirm a real token verifies server-side. Kill the option early if the constraint fight is ugly.Maintenance. Revised. The prior "expect near-zero upstream activity" is no longer accurate, but it has not been replaced by a track record. Budget 2–4 hours per quarter for dependency review, and now also require a delta review on every upstream major — the empty 13.0.0 notes mean the changelog cannot be assumed to exist. Add "major release without a changelog" to the fork trigger alongside a Laravel major upgrade, a PHP minor that breaks a constraint, or any security advisory on the HTTP path. The fork remains small enough to own without dedicated headcount; name an owner explicitly.
Support. Community-only — no vendor, no SLA, no disclosure process — at 13.0.0 just as before. Incidents route to our own on-call. Ramp-up for a Laravel-fluent engineer stays around half a day. The knowledge that matters is not the package but the failure policy and the key rotation procedure; document both. Add a third document: our internal changelog from step 1, so the next upgrade has a baseline the release notes did not provide.
Scaling. Unchanged and version-independent. Each submission adds one synchronous outbound HTTPS call to Google, typically 100–300 ms p95 depending on region and connection reuse — a real tail-latency contributor at volume and a throughput dependency on a third party. Keep the call off critical read paths, set explicit Guzzle timeouts (the default "no timeout" is a hazard), and verify quota and billing posture on the Google side; Enterprise tiers differ from free tier.
Failure modes. Same set, with one addition:
invalid-input-secret, timeout-or-duplicate, hostname-mismatch). Log the response code, never the secret.Overall. The 13.0.0 release materially changes one input — the package is not abandoned as of 2022, and the previously assumed Laravel 9 ceiling may be gone — but it changes it without documentation, which adds an upgrade risk it did not previously carry. The structural judgment holds: low integration cost, contained blast radius, single maintainer, an unresolved Google compliance question. Adopt it as a reasonable accelerator for a Blade-based Laravel app only if we (a) diff the release before pinning, (b) wrap it behind an internal interface, (c) pin to an exact version and document why, and (d) name a fork owner. Treat it as replaceable from day one; do not adopt it as a strategic dependency without a Privacy sign-off on the Google relationship.
How can I help you explore Laravel packages today?