laravel/vet
Laravel Vet is a static analysis tool for Laravel apps that scans your codebase for security vulnerabilities and risky patterns—SQL injection, mass assignment, unsafe queries, and more—so you can catch and fix issues before they reach production.
laravel/vet is not the Artisan command — it is a committed vet.json at the repo root. That turns "which dependency versions are acceptable here" from reviewer memory or a wiki page into a diffable file that security, the owning team, and product can approve in the same PR as the change that motivated it. That is a governance decision, and it is yours to make, not the tool's.vet.json change with an obvious revert. Write the rollback into the runbook at the same time as the freeze, not during the incident.composer audit and Dependabot/Renovate in the pipeline alongside it, sequenced before it — otherwise week one reads as "this tool blocks security fixes," and you lose the argument for keeping it.Consider it when:
composer.lock committed and no formal, reviewable dependency-adoption policy today.require-dev entry plus one pipeline step, so it wins on maintenance cost if its rules fit your policy.vet.json and accept pre-1.0 churn: pin the exact version, and treat each minor upgrade as a reviewable PR because the config schema can move under you.composer.json/composer.lock, then widen.src/. The provided sources are a changelog and a contributor guide written for coding agents, not a user manual; budget roughly an hour to answer "does this version do the Laravel code checks the description advertises, or only the trust-file checks the changelog documents?"Look elsewhere — or do not rely on it — when:
composer audit covers advisories; Vet is not a substitute, and neither replaces the other.src/ rather than searching issues. Budget for the possibility of maintaining a fork.composer show laravel/vet) — the advertised last release date is 2026-09-27, a future date, and exit codes are not enumerated in the sources. Capture $? for pass, fail, and config-error cases and assert them in a small CI test so a minor bump fails loudly in one place instead of quietly disabling the gate.For executives — one paragraph: We have no written rule for how quickly we adopt newly published dependency versions. laravel/vet lets us write that rule as a small file in the repository, reviewed like code, instead of leaving it to reviewer judgment. The ask is not a platform commitment: it is one dev-only dependency and one CI step on a single non-critical service, running in report-only mode for two weeks, with a go/no-go on measured data — runtime cost and how many routine bumps it would have blocked. If the numbers are bad, we drop it at near-zero cost. If they are good, we widen enforcement to dependency-changing PRs only. It does not replace vulnerability scanning; it sits beside it and answers a different question.
For engineering — the framing that prevents the wrong expectation: This is a dependency-trust policy file, not an AppSec scanner. It makes release-age policy diffable and reviewable in the PR that motivated it, and it gives us a one-line, attributed freeze during a supply-chain incident with an obvious revert. It does not detect CVEs, does not emit an SBOM, and does not replace composer audit or Dependabot — those govern what has CVEs and when we move; this governs which versions are admissible. Sequence it after them, or the first-week experience is "this tool blocks security fixes."
For the adopting team — the honest caveats to state up front: v0.2.x, pre-1.0, ~185 stars, zero dependents. Pin the exact version and treat minor upgrades as PRs. The manifest description and the changelog describe two different products; assume the narrower one until someone reads src/. Exit codes are our integration contract and are undocumented — we verify them empirically and assert them in CI. And name an owner for vet.json before adoption, because exceptions are a PR to that file, dated and reversible, not a Slack override.
How can I help you explore Laravel packages today?