A vibe coding security scanner should be chosen by the evidence you need. Start with local secret, dependency, configuration, and static-code scans. Add an authenticated dynamic scan against staging when the app has logged-in workflows. Classify each result by what it proves: a confirmed private credential in browser-delivered code requires rotation without an exploit attempt, while a pattern match, package advisory, or suspicious response may need path and impact verification.
Five established tools cover most of that first pass: Gitleaks, Trivy, Semgrep Community Edition, Supabase Security Advisor, and OWASP ZAP. Four are open-source tools with no software licence charge. Supabase Security Advisor lives inside a Supabase project, whose plan and usage costs remain separate. Running all five can still miss an authorization rule that exists only in the founder’s head.
Scanner, audit, and pentest answer different questions
The labels get blurred on scanner landing pages. The useful boundary is the action performed and the evidence returned.
| Activity | Main question | Typical evidence | Main limit |
|---|---|---|---|
| Automated scanner | Does a rule, risky package, exposed secret, unsafe configuration, or suspicious response appear? | Rule ID, file and line, package and advisory, configuration check, or HTTP request and response | Coverage is limited to its rules, paths, identities, and runtime access |
| Code or application audit | Which findings and design gaps matter to this app and business workflow? | Source path, mechanism, behavior check where available, consequence, and priority | Runtime exploitability remains unproved unless the audit actively tested it |
| Penetration test | Can an authorized tester defeat a control in the scoped running target? | Repeatable requests, responses, exploit steps, affected identity, and impact evidence | A successful engagement still cannot prove the absence of every weakness |
A scanner belongs early in development and in CI. An audit is useful when the candidate list needs architectural context and business priority. A pentest is the right category when a contract or risk decision requires authorized adversarial testing against a defined running target. The rules of engagement decide how far impact may be demonstrated.
Five current tools and what each one covers
The table describes the documented open-source or included form of each tool as verified on August 2, 2026. Compute, CI minutes, setup, hosting, and triage still cost time or money. Commercial editions can add capabilities, so compare the exact edition rather than transferring a claim from one plan to another.
| Tool | Best use | Where it runs | Important limit |
|---|---|---|---|
| Gitleaks | Secrets in Git history, directories, files, and stdin | Local CLI or CI; pre-commit and GitHub Action paths are documented. Authenticated testing is not applicable | A pattern match cannot tell whether the credential is live; deleting it does not rotate it |
| Trivy | Known vulnerable packages, container or repository misconfiguration, secrets, licences, and SBOM data | Local CLI or CI through its GitHub Actions integration. Not applicable to web sessions | An installed vulnerable version does not establish that the affected function is reachable |
| Semgrep CE | Source patterns and project-specific rules before runtime | Local CLI or CI; CI configurations are documented. Not applicable to web sessions | CE deliberately keeps analysis within file and function boundaries, so cross-file data flow and business intent can be missed |
| Supabase Security Advisor | Supabase RLS, exposed objects, permissive policies, security-definer access, and database configuration | Inside the Supabase project, inspecting configuration rather than logging in as app users; treat CI coverage as absent unless you add a separate gate | A policy can exist and still compare against the wrong user or tenant value |
| OWASP ZAP | Passive and active testing of a running web app or API | Against a running target, with logged-in users through configured identities and Automation Framework authentication. Docker scans and GitHub Actions are documented | It sees only discovered routes and working sessions; active scans can change state |
What each tool hands back differs as much as what it looks at. Gitleaks returns a rule, file, line, commit, and fingerprint. Trivy returns a package, version, and advisory, or a configuration location. Semgrep CE returns a rule, source location, matched path, and message. Supabase Security Advisor names the advisor check and the affected database object. ZAP returns an alert, rule, URL, request and response context, and a confidence level.
Code and data handling splits along the same line. Gitleaks scans the supplied repository or files from a local CLI, and in CI it sees what its runner can access. Trivy reads the selected target from a local CLI or self-managed CI and downloads current vulnerability data. Semgrep CE can scan locally without a login; upload is a separate configured action. Supabase Security Advisor runs inside the Supabase project that already holds the database. ZAP sends traffic to the target, so store test credentials outside committed plans and protect the reports. The four open-source tools cost $0 in software licence terms; Supabase Security Advisor is project-dependent, so verify the current Supabase plan.
For a JavaScript app that exposes authenticated workflows, one practical open-source stack is Gitleaks for secret history, Trivy for dependencies and configuration, Semgrep CE for source rules, and ZAP against a staging URL. Use only the tools that match the code, infrastructure, and runtime surfaces you actually have. Add Supabase Security Advisor when Supabase is part of the stack. A dedicated commercial vibe-code scanner should be judged against the same fields: scan location, code retention, supported frameworks, authenticated roles, CI behavior, evidence export, false-negative method, and current price.
Authenticated scanning has to prove it stayed logged in
Checking a login box in a scanner configuration does not establish that the scan exercised authenticated routes. Sessions expire. Browser-based login can fail. A spider can remain on public pages while the report still looks busy.
Use two synthetic staging users with distinct records. Configure the allowed host and exclude email, payment, destructive, and third-party routes. Verify login with a response marker that appears only for an authenticated user. After the scan, inspect its discovered URLs and requests for both identities. If the report cannot show which user reached which route, it cannot support a cross-user authorization conclusion.
ZAP supports form, JSON, script, auto-detected, browser, and client-script authentication in its current Automation Framework. That capability makes authenticated testing possible. Your saved plan, test identities, and observed request history prove whether it worked for this app.
Read scanner findings as an evidence ladder
Finding counts mix weak and strong evidence. A result near the top of this ladder needs more verification than one near the bottom.
| Evidence level | What you know | Next check |
|---|---|---|
| Pattern candidate | Text or syntax matched a rule | Inspect the complete code path and rule assumptions |
| Configuration or component finding | A setting, object, package, and version meet known conditions | Confirm exposure, compensating controls, and reachable use |
| Static reachability | Source analysis found a path from entry point toward the risky operation | Reproduce it in the deployed environment with the intended identity |
| Runtime reproduction | A scoped request produced the unexpected behavior | Confirm repeatability, affected data or action, and cleanup |
| Exploit impact | An authorized test achieved a defined security consequence | Record the evidence safely, remediate, and retest |
| Business priority | The affected workflow, users, likelihood, owner, and recovery cost are known | Decide order, deadline, and accepted residual risk |
A clean report means the selected rules found no reportable match in the supplied paths. It says nothing about a file the scan excluded, a session that failed, an endpoint the crawler never discovered, or a rule the tool does not contain.
Where automated scanners lose the application’s intent
The fixed June and July 2026 AxonBuild research cohort illustrates four scanner blind spots worth testing manually, isolated in the table below. These counts describe those apps, not the general population of vibe-coded software.
| Pattern | Fixed cohort | Why scanners miss it | Behavior check |
|---|---|---|---|
| Cross-user or cross-tenant access | 7 of 21 third-party apps confirmed; 9 of 21 had an RLS gap | A query may be scoped while the tenant ID feeding it comes from an unsigned or otherwise untrusted session value | Sign in as user B and request a record created only for user A |
| Unauthenticated privileged endpoint | 11 of 21 | A valid 200 response and well-formed token or database action can look normal without the intended login requirement | Replay the request with no session and an invalid session |
| Server trusts a browser-supplied fact | 10 of 21 | Schema validation can prove a role, price, or owner ID has the right shape while leaving its authority unchecked | Change the field in the request and verify the server derives the trusted value itself |
| Live prompt injection | 8 of 14 apps with an AI surface | Static code sees the approval function but may not know untrusted text can steer the model around it | Use inert adversarial text in staging and verify tool calls remain bounded by server-side controls |
The unsigned-session example is especially deceptive. Every database query can contain a tenant condition and pass a superficial source review. If the server obtains that tenant from a cookie the visitor can rewrite, the condition faithfully enforces the attacker’s chosen workspace.
The sharpest version skips the cookie and goes straight at the database. A PostgreSQL SECURITY DEFINER function runs with the privileges of the function owner, not automatically the table owner. Whether row-level security applies depends on that role and the table. Superusers and roles with BYPASSRLS always bypass it. Table owners normally bypass it unless the table uses FORCE ROW LEVEL SECURITY, as PostgreSQL’s row-security documentation explains. One audited app had a broadly callable function that trusted a caller-supplied wallet ID:
-- Runs with the function owner's privileges. Check that role,
-- the table owner, and FORCE ROW LEVEL SECURITY before claiming bypass.
create function credit_wallet(p_wallet_id uuid, p_amount int)
returns void
language sql
security definer
as $$
update wallets set balance = balance + p_amount
where id = p_wallet_id;
-- p_wallet_id is taken on faith. Nothing here checks
-- that the caller owns this wallet.
$$;
grant execute on function credit_wallet to anon, authenticated;
A static RLS linter checks whether a policy exists on the wallets table. It may not establish which role owns the function, whether that role owns the table or has BYPASSRLS, or whether the table forces RLS. Those facts are required before calling the path an RLS bypass. The demonstrated bug remains: the function trusts p_wallet_id without checking that the caller owns the wallet, and it grants execution to anon and authenticated.
A scanner can confirm a risk exists in a vulnerability database. It has no way to confirm the risk still fires once someone actually tries it against your app.
The same uncertainty applies to dependency output. In 3 of the 21 third-party apps, scanners reported 33 to 44 advisories and source tracing found zero path from the application into the affected functions. Eight other apps had a publicly known critical that was reachable. Those observations support triage in both directions; they do not establish a universal false-positive rate. The full breakdown of that swing lives in the complete study across all 26 audits.
A practical scanner sequence for each change
- 01 Run secret-history, dependency, configuration, and static-code scans locally before the first baseline is accepted
- 02 Record each accepted result with tool version, ruleset or advisory database date, repository commit, file or URL, and the evidence level it reached
- 03 Put the same deterministic commands in CI and fail only on a documented policy, such as a new secret or a new finding above the chosen severity and exposure threshold
- 04 Run an authenticated dynamic scan against staging with synthetic users after routes or authorization behavior change
- 05 Manually exercise the highest-consequence cross-user, unauthenticated, payment, role, export, and AI-tool paths that rules cannot infer
- 06 Triage suppressions in source control with an owner and reason, then rerun the exact reproduction after a fix
Baselines are useful when they separate old accepted findings from a new regression. They become dangerous when every existing result is silently waived. A suppression needs the same context as a fix: why the finding is unreachable or accepted, who decided, and what change should reopen it.
When a scanner should hand off to another kind of review
Use a scanner when the decision is “what should I inspect first?” Move to a code or application audit when findings conflict, the control spans several services, or business consequence decides priority. The audit-selection guide covers that buying decision without treating tool output as proof.
A newer category of tool, the autonomous AI pentest agent, is starting to sell its way around this same triage problem. Active exploit validation still needs authorization, a defined target, test identities, allowed impact, recovery, and a report that labels what was actually reproduced.
The scanner stack should remain in CI after the immediate findings are fixed. The behavioral tests belong beside it. Together they cover far more than either one alone, while the full pillar-by-pillar ranking of where these apps actually fail provides the broader security map for deciding which workflows deserve the deepest checks.
Common questions about vibe coding security scanners
What is the best free vibe coding security scanner?
There is no single best tool across all evidence types. Gitleaks is focused on secrets, Trivy on components and configuration, Semgrep CE on source patterns, Supabase Security Advisor on Supabase database exposure, and ZAP on a running web target. The best free starting point is the combination that matches your stack and runs both locally and in CI.
Is it safe to upload my code to a scanner?
Read the exact scan path, retention policy, model-use policy, subprocess behavior, and deletion controls before uploading a repository. The tools above can run locally or inside infrastructure you control in the forms described. A local command can still expose data through CI artifacts, debug output, remote rules, or a misconfigured upload option, so inspect the configuration as well as the product label.
Is a clean security scan enough to launch?
A clean scan supports only the tested rules, revision, configuration, routes, accounts, and environment. Launch evidence also needs authorization tests with separate users, payment and data-integrity checks where relevant, recovery, monitoring, and proof that the deployed build matches the revision that passed.
Need this fixed in your own app?
New clients can start once with one agreed blocker for $99. We fix it within three business days once access works, and you pay after seeing it work.