dgtlss/warden
Warden is a Laravel package that runs security audits against your application, flagging common misconfigurations, exposed files, and risky settings. It provides actionable Artisan reports and configurable checks so teams can catch issues early and keep production environments protected.
Architecture fit
warden:audit). No runtime dependency, no service to operate, no data plane — it fits a Laravel application/monorepo's existing CI and local tooling with near-zero architectural surface area.composer audit, Dependabot, and platform-level code scanning. Multi-report output in 2.2 is the significant architectural improvement: one scan now feeds JSON, SARIF, JUnit, and GitHub annotations from a single timestamped, gated result set, which removes the common anti-pattern of running the scanner three times to satisfy three consumers.2.0.0 default, json-v2.1 opt-in, SARIF 2.1.0, GitLab dependency scanning 15.2.4, baseline 1.0.0). That is good contract hygiene but introduces a second axis to track during upgrades.Integration feasibility
composer require --dev and the command runs anywhere PHP CLI runs; generated GitHub/GitLab workflows reduce the setup effort to reviewing a diff. Generated GitLab jobs preserve existing stages, which lowers the political cost of adoption in an established pipeline.json-v2.1 — a clean, reversible migration lever.Technical risk
Request parameters, and named arguments are resolved. This will surface findings that were previously masked. Teams gating with --fail-on should expect red builds on upgrade day without any code change. Fingerprint/baseline stability is claimed for unchanged source, but that claim needs validation against our own codebase, not accepted from release notes.2 before scanning. Any hand-edited or script-generated suppression file is now a pipeline-breaking artifact. This is fail-closed and defensible, but it is a breaking change in practice for teams with loose suppression hygiene..env.example, .github files, and similar. Expect a burst of low-severity findings in committed example/config files, and a triage/allowlist burden immediately after adoption.Key questions
2.0.0 JSON and 1.0.0 baseline schemas supported? Is there a deprecation policy tying package majors to schema majors?rule-wide suppressions (fingerprint omitted), which are the highest-blast-radius suppression type?Stack fit
composer audit/Dependabot for dependency CVEs and platform code scanning for language-level SAST. Position Warden as the Laravel-aware application-security layer covering secrets, taint-style sinks, and framework-specific sanitizer semantics.Migration path
--fail-on=high.^2.2 with --with-all-dependencies, regenerate CI workflows, and run a report-only comparison scan before re-enabling the gate. Diff the finding set against the 2.1 baseline to isolate stricter-detection deltas from real regressions.2 will block every build.Compatibility
2.0.0) and public object serialization, including new JsonReporter(), remain unchanged — existing parsers and dashboards are safe.json-v2.1 (via --format=json-v2.1, --report=json-v2.1:path, or new JsonReporter(extended: true)) is opt-in and required for gate and coverage fields. Generated GitLab config explicitly opts in; the GitHub summary tolerates legacy reports lacking gate data, which gives a mixed-version fleet a soft landing.2.1.0 is consumable by GitHub code scanning; GitLab dependency scanning 15.2.4 is supported. Notification preferences carry forward; legacy findings-only channel methods still exist.npm-shrinkwrap.json taking precedence over package-lock.json — verify this does not lengthen pipeline runtime unexpectedly on JS-bearing Laravel apps.Sequencing
dgtlss/warden:^2.2 in a branch; confirm PHP/Laravel matrix compatibility per repository.rule-wide only where justified); verify exit 0/2 behavior in a scratch pipeline.--fail-on=high plus --report=json-v2.1, --report=sarif, --report=junit. Confirm no two report paths resolve to the same inode.warden.notifications.on_errors=true so incomplete scans are never silent. Document that delivery never changes the audit exit code.Maintenance
Support
php artisan warden:audit plus flags), so first-line support load is low. Second-line load concentrates on triaging new findings after each stricter-detection release, which is recurring and non-trivial.*.Scaling
Failure modes
2 before scanning on malformed suppressions: fail-closed, but presents as a pipeline outage rather than a security finding. Document the error text and remediation steps.on_errors=false are silenced entirely, including incomplete reports that contain findings. That is a legitimate operator choice but a genuine "green build, unknown coverage" risk; the default (missing/null uses existing filters) is safer.on_errors=true unless there is a strong reason not to.json-v2.1 and others do not, producing dashboards that variously lack gate and coverage fields.Ramp-up
on_errors vs. finding-only mode) each need a documented decision.How can I help you explore Laravel packages today?