ubient/laravel-pwned-passwords
Laravel validation rule that checks passwords against the HaveIBeenPwned Pwned Passwords database using k-anonymity, so only a partial hash ever leaves your server. Adds a simple "pwned" rule to reject compromised passwords during registration, login, or password changes.
Context and scope: This assessment is based on a single release artifact: v3.4.0, whose only documented change is "Add PHP 8 Support." No prior assessment exists and no package metadata, source review, or dependency manifest was supplied. The evaluation below is therefore provisional and should be treated as a framing document to drive diligence, not a verdict.
Architecture fit: A Laravel/PHP package that was previously PHP 7.x-only and now declares PHP 8 support is, architecturally, a compatibility enabler rather than a feature release. The semver signal (minor bump, 3.x → 3.4.0) implies additive, backward-compatible change — the package should still run on its previously supported PHP versions. For a TPM, the relevant question is not "what does PHP 8 support do" but "does this package now fit our platform roadmap, and does it bind us to a runtime we can support?" If our Laravel estate is on PHP 8.1+ (the realistic floor for supported Laravel versions), this release moves the package from "blocked" to "candidate."
Integration feasibility: Superficially high — a minor version bump with a compatibility claim is the cheapest possible integration event. In practice, "PHP 8 support" is underspecified and the feasibility hinges on what it actually means:
PHP_VERSION_ID branches) that create two effectively separate codebases with different defect profiles?Technical risk: Moderate and concentrated in two areas. First, PHP 8 is not a quiet runtime: it changes string-to-number comparison semantics, makes internal function parameter names part of the API, deprecates dynamic properties (8.2), and tightens type handling. A package that "adds PHP 8 support" without a major version bump is asserting that none of these behavioral shifts affect its public surface. That assertion deserves verification, because failures will be subtle and data-dependent rather than loud. Second, support-window risk: PHP 8.0 is end-of-life, so a blanket "PHP 8" claim may include a runtime we cannot use and may obscure whether 8.2/8.3 are genuinely validated.
Key questions:
composer.json constraints, and does that pull transitive dependencies forward?Stack fit: The release is only actionable once mapped against our actual runtime. The gating artifact is a support matrix: our Laravel versions, our PHP versions, and the intersection the package claims. If our platform is Laravel 9/10 on PHP 8.1/8.2, the package is viable only if the maintainer explicitly covers those cells — "PHP 8" generically is not sufficient evidence for 8.2, where the dynamic-property deprecation is the most common source of new noise.
Migration path: Low-ceremony by design. Because 3.4.0 is a minor release, the intended path is an in-place Composer constraint bump within the existing 3.x line, not a rewrite. Sequence it as: pin to the exact 3.4.x patch in a non-production branch → run the application's existing test suite under the target PHP version → run static analysis (PHPStan/Psalm at the project's configured level) → only then widen the constraint. Avoid jumping the constraint to ^3.4 in production until at least one patch release (3.4.1+) has shipped, since the first release to add a runtime is statistically where compatibility regressions surface.
Compatibility: Confirm three layers independently rather than trusting the changelog: PHP runtime, Laravel framework version, and transitive dependencies. The third is the one teams skip. A widened PHP constraint can cause Composer to select newer versions of shared libraries that were previously held back, so the integration test should include a composer update --dry-run diff review and a lockfile comparison. Also verify there are no deprecation notices emitted under PHP 8.2+ — treat a noisy deprecation log as a soft failure, since it will become a hard failure at the next major PHP.
Sequencing:
Maintenance: The primary operational cost is not adopting 3.4.0 — it is the ongoing obligation to track a package whose PHP support claim is broad. Broad claims age badly: "PHP 8" becomes ambiguous the moment 8.4 ships. Budget for re-validating this package at each PHP minor rather than assuming the 3.4.0 claim is durable. Conversely, if this release unblocks a PHP 8 upgrade elsewhere in the estate, its maintenance value is high — it removes a pinned dependency that would otherwise hold the platform back.
Support: Establish now whether upstream offers an issue tracker with responsive triage and whether there is a security disclosure channel. A single-maintainer package with a one-line changelog warrants an internal contingency note: identify whether the package is forkable, how large its surface is, and what the exit cost would be. Do not let a low-effort integration hide a high-effort exit.
Scaling: Compatibility releases are scale-neutral for throughput. The scaling concern is organizational: every team that consumes this package independently re-runs the same PHP 8 validation. Centralize the validated matrix and, ideally, a shared base image so the validation is done once rather than N times.
Failure modes:
Ramp-up: Low for engineers — this is a constraint bump plus a test run, roughly hours to a day per consumer. The TPM-side ramp-up is the real work: sourcing the support matrix, getting a maintainer response, and socializing the validation checklist so teams stop treating a minor bump as zero-risk. Recommend a short internal note pairing the version bump with the validated matrix and the deprecation-log check, so the next consumer inherits the diligence rather than repeating it.
How can I help you explore Laravel packages today?