Weave 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

Livewire Honeypot Laravel Package

blendbyte/livewire-honeypot

Blendbyte Livewire Honeypot provides lightweight, CAPTCHA-free spam protection for Laravel Livewire forms. It uses hidden honeypot fields and timing checks to catch automated submissions, helping keep forms simple, accessible, and user-friendly for real visitors.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. blendbyte/livewire-honeypot is a spam-mitigation layer that in 2.1 and earlier was bound to Livewire's component lifecycle. Release 2.2.0 changes that: <x-honeypot /> now emits a signed token that works for plain HTML forms posting to a controller. For a TPM this is the material shift — the package moves from "Livewire-only hardening" to "form-layer control usable across the whole Blade surface," which widens applicability (marketing/contact/lead forms that were never Livewire components) and reduces the need to maintain a second anti-spam mechanism alongside it.

Two secondary architectural changes matter:

  • Bait field naming is now per-form and generated (referral_3f9a). This is a defensive change against bots and password managers that target well-known honeypot field names and autofill them. It implies the field name is no longer a stable contract — anything that hardcodes the old name (tests, custom JS, analytics, QA scripts) breaks silently.
  • Filling the bait no longer sends a request before submission. The prior behaviour fired a round-trip on bait interaction, which both leaked the trap to sophisticated bots and created request amplification. Removing it is a genuine reliability and abuse-resistance improvement, not cosmetic.

The screen-reader-only CSS plus inconspicuous class is an accessibility correction — hidden honeypots styled with display:none are skipped by screen readers but also flagged by some assistive tooling; the new approach keeps the field out of the accessibility tree without an obvious display:none tell.

Integration feasibility. Low-to-moderate effort. Upgrade is described as no-code-change for existing forms, which is credible for the common case: config default, component usage, and the service provider wiring are unchanged. The real work is not the upgrade itself but the three behavioural deltas it introduces (expiry, event reason, test selectors).

Technical risk.

  1. New cryptographic surface. Signed tokens mean form validity now depends on APP_KEY (or a package-specific signing key). Key rotation, multi-app deployments sharing a codebase with divergent keys, and load-balanced environments with inconsistent keys all become failure modes that present as user-facing "This form has expired" rather than as an error. This is the highest-severity item in the release and needs explicit confirmation of which key is used and how rotation is handled.
  2. Expiry introduced as a new default-on gate. A maximum fill time is now enforced. The upgrade notes call out that installations with a minimum fill time of one hour or more must raise HONEYPOT_MAXIMUM_FILL_SECONDS; the inverse implication is that any legitimate long-lived form — multi-step expense claims, saved-draft checkouts, open admin data-entry tabs, slow mobile users on poor connections — will now fail at submit time rather than at validation. This is a conversion-risk change, not just a config change.
  3. Silent deprecation. token_min_length is now ignored. A config key that remains present but does nothing is a false assurance: anyone who set it believes they have a security control they no longer have. This should be treated as a documentation and inventory task, not left to the 3.0 removal.
  4. Test-suite breakage. Browser tests must select the bait by wire:model. Any Dusk/Pest browser coverage asserting on the hidden field by name or class will fail, and because the failure mode is "honeypot not filled → submission succeeds," a badly written test may pass for the wrong reason.
  5. Opt-in bait-value logging. HONEYPOT_LOG_VALUE writes attacker-controlled input into logs. Useful for tuning, but it is a log-injection and log-volume vector and may capture data from real users who trip the trap via autofill. Should default off and be time-boxed.

Key questions.

  • Which key signs the token — APP_KEY or a package-specific value — and what happens to in-flight forms on rotation?
  • What is the actual default for HONEYPOT_MAXIMUM_FILL_SECONDS, and is it measured from form render or from page load?
  • Is form_expired emitted as a validation failure, an exception, or a dispatched event? Does it surface to the user as a hard block with no recovery path?
  • Are there supported-version constraints (Laravel, Livewire 2 vs 3, PHP) that change for 2.2.0?
  • Does the plain-form path require controller-side validation, or does the package intercept globally via middleware?
  • Is there a migration or compatibility shim planned ahead of the 3.0 removal of token_min_length?

Integration Approach

Stack fit. Good for a standard Laravel monolith or modular monolith serving Blade views with Livewire islands. It is a poor fit only where forms are rendered by a separate SPA/front end — the signed-token model assumes server-side rendering, so a React/Vue front end posting to the same controllers would need to fetch and embed the token itself. Confirm whether that is supported before scoping.

Migration path.

  1. Remove token_min_length from published config files and note it in the internal deprecation register so 3.0 is not a surprise.
  2. Set HONEYPOT_MAXIMUM_FILL_SECONDS deliberately. Do not accept the default. Walk the form inventory and set the value against the longest legitimate completion time for each form class; use 0 only where a form is genuinely session-bounded elsewhere.
  3. Leave HONEYPOT_LOG_VALUE off in production; enable temporarily in staging or behind a short-lived flag during tuning.
  4. Update browser tests to select the bait via wire:model before merging, not after.
  5. Verify any custom JS, QA scripts, or analytics that referenced the old static bait field name.

Compatibility. The plain-form capability is additive and can be adopted per-form. The expiry behaviour is effectively a breaking change in semantics even though it is presented as a feature — treat it as such in change management. The 3.0 removal of token_min_length gives a clean window to complete sequencing, but the key management question should be resolved before 2.2.0 goes anywhere near production.

Sequencing. (1) Pin and stage; (2) confirm key source and rotation semantics with the maintainer or by reading the package source; (3) inventory forms and classify by expected completion time; (4) set expiry config per environment; (5) update tests; (6) instrument form_expired in observability; (7) canary one low-risk form, then roll forward; (8) adopt the plain-form path as a separate, later change so failures are attributable.

Operational Impact

Maintenance. Low ongoing cost. The package is small, single-maintainer, and the release is incremental. The main maintenance debt is the ignored token_min_length key surviving in config repos until 3.0 — cheap to fix now, mildly confusing if left.

Support. Expect a new class of support ticket: users who left a form open and are told "This form has expired" with no obvious remedy. The message is clear, which helps, but support and UX teams need to know it exists and what produces it. The form_expired event reason should be wired into whatever error/analytics pipeline already captures validation failures so the volume is visible rather than anecdotal.

Scaling. Neutral to marginally positive. Token signing is a cheap HMAC-style operation and will not register against application load. The removal of the pre-submission request on bait fill is a net reduction in load and eliminates a small amplification vector — a bot could previously trigger a request per bait interaction. No new scaling concerns.

Failure modes.

  • Mass form_expired after key rotation or across inconsistent keys — highest impact, presents as user error, hardest to diagnose.
  • Expiry misconfiguration — too short and legitimate slow users are rejected; 0 disables the control entirely and should be an explicit, documented decision, not a default.
  • Silent weakening — teams assuming token_min_length still applies.
  • Test false-passes — honeypot tests that no longer fill the field and therefore validate the wrong path.
  • Log volume and injection if HONEYPOT_LOG_VALUE is left on in production.

Ramp-up. Low. Existing <x-honeypot /> usage is unchanged; the new surface (plain forms, expiry config, logging flag) is documented and small. A mid-level Laravel engineer can own this in under a day. The one area requiring review by someone senior is the signing-key model — that should not be left to the implementer to infer.

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.
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator