Repo scan vs URL scan: which one does your app need?
A URL scanner looks at your live site from the outside, like a visitor would. A repo scan reads your source code and its history. In security jargon that's DAST (dynamic testing) and SAST (static analysis). Each one sees things the other can't, and vibe-coded apps often have bugs right in those gaps. Here's what a repo scan vs URL scan catches, with sources.
QUICK CHECKLIST
- Headers and cookies checked with a URL scanner on your own domain
- No exposed files (.env, .git, source maps) on the live site
- Every API route and server action checked for a login in the code
- Git history searched for keys, and every key found rotated
- Supabase migrations read for open policies
- Live database checked with the Supabase Security Advisor
- Logged-out test with your own anon key and a second account
What a URL scanner sees
OWASP describes these tools as scanners that test web applications "normally from the outside" for problems like cross-site scripting, SQL injection, path traversal and insecure server configuration. You give them a URL, and they see what the internet sees:
- Security headers, cookie flags, HTTPS redirects and TLS. Mozilla's HTTP Observatory grades the headers and cookies.
- Files that shouldn't be public, such as
/.env,/.git/or source maps. - Keys inside the JavaScript bundle, for example a secret in a
VITE_orNEXT_PUBLIC_variable. - Some scanners made for AI app builders also call your Supabase API with the anon key from your frontend and report tables that answer.
A URL scan reflects the live state. A policy someone changed in the Supabase dashboard shows up here and never in the repo.
What only the code shows
A URL scanner can only test what it finds. Many of the bugs we see in AI-built apps are on paths a crawler rarely reaches or can't judge from outside:
- Server actions and API routes without a login check. A crawler usually can't discover or meaningfully test a Next.js server action, and from outside a missing ownership check looks like a working app. See server actions are public endpoints.
- Keys in git history. A key deleted from the code is still in old commits. GitHub's docs say to revoke or rotate a leaked secret as the first step. Rewriting history is a separate step with its own side effects. A URL scan never sees the history.
- Policies that let any account edit any row. A logged-out scan sees nothing wrong, because you need a second account to notice. The migration shows it in one line, see Supabase delete policies.
- Security definer functions and views that skip RLS, plus roles read from user_metadata.
Where a repo scan is blind
OWASP lists the weak spots of static analysis plainly: high numbers of false positives, and it is "frequently unable to find configuration issues, since they are not represented in the code." Both apply to us.
- Tables, policies and buckets made in the Supabase dashboard aren't in the repo.
- Hosting settings, headers added by your host and DNS aren't in the repo either.
- Some flags are on purpose. In our sample of 99 public Bolt repos, 14 projects had a
(true)write policy. In 4 of them it was used mainly for public forms like orders and contact messages, where an open insert is the point (method and numbers). - A repo scan flags code to read, not confirmed exploits.
Repo scan vs URL scan side by side
| URL scan (DAST) | Repo scan (SAST) | |
|---|---|---|
| Headers, TLS, cookies | Yes | No, unless set in code |
| Exposed files, source maps | Yes | Partly (sees what would be published) |
| Secret in the JS bundle | Yes | Yes, and the file and line |
| Secret in git history | No | Yes (how far back depends on the tool) |
| Server route without a login check | Only routes it finds | Yes, every route in the code |
| Any account can edit any row | Rarely (needs two accounts) | Yes, from the policy |
| Policies changed in the dashboard | Yes, if the table is reachable | No |
| Fake dependency names (slopsquatting) | No | Only if the tool checks package names (we do) |
| Proof it's exploitable | Sometimes, when the tool reproduces the issue | No, it points at code to read |
Typical coverage. Individual tools vary, so read what yours checks.
How to use both before launch
Check your live site from outside
Run Mozilla's HTTP Observatory on your domain for headers and cookies. If you want more, run ZAP's baseline scan against your own site.
Check the live database
Open the Supabase Security Advisor. Supabase's docs warn that some findings may be intentional, so check each against what you meant.
Read the code
Run a repo scan, or work through the vibe coding security checklist by hand: auth in every route, ownership checks, keys in history, policies in migrations.
Test with two accounts
Sign in as user A, copy a request, and replay it as user B and logged out. This catches missing ownership checks that neither scanner is likely to flag.
Fix prompt you can paste
We're about to launch. 1) List every API route and server action and say which ones check the login and the owner of the record. 2) List every Supabase policy in supabase/migrations that uses (true) or only checks for a login. 3) Search the code for secrets in VITE_ or NEXT_PUBLIC_ variables. 4) Tell me which settings live outside the repo (headers, dashboard policies, buckets) so I can check them on the live site. File and line for each finding, smallest fix first.
How Leakcade checks this
Leakcade is a repo scan. We read a public GitHub repo as text, run gitleaks over the last 50 commits, Semgrep, OSV-Scanner for known vulnerable packages, our own Supabase, payment and server-action checks, and an AI review. We never run your app or send requests to your site, so headers, hosting and dashboard settings are out of scope. Pair the report with a URL scan and the Supabase Security Advisor. Building in Lovable? Its built-in scan also reviews your database rules, see Lovable security scan vs Leakcade.
Headers and dashboard settings: check those with the tools above.
Sources
- OWASP: Source code analysis tools (strengths and weaknesses of SAST)
- OWASP: Vulnerability scanning tools (DAST)
- ZAP: Baseline scan
- MDN: HTTP Observatory tests and scoring
- GitHub Docs: Removing sensitive data from a repository
- Supabase docs: Database advisors
FAQ
What's the difference between SAST and DAST?
SAST (static analysis) reads source code without running it. DAST tests the running app from outside by sending requests. A repo scan is SAST, a URL scanner is DAST.
Is a URL security scanner enough for a vibe-coded app?
Usually not. It sees headers, exposed files and keys in the bundle, but not server routes it can't find, keys in git history, or policies that let one account edit another's data.
Can a repo scan see my Supabase dashboard settings?
No. Tables, policies and buckets made in the dashboard aren't in the repo. Check them with the Supabase Security Advisor or a logged-out test.
Is it legal to scan any website with a URL scanner?
Only scan sites you own or have permission to test. Active scans send attack-like requests.
Want a second pair of eyes?
We review your whole repo and write a fix prompt for every finding. $19, report within an hour.
Check my repoLeakcade is an automated check. It can miss vulnerabilities and is not a substitute for a professional security audit or pentest. Provided as is. You stay responsible for your code. Where the law allows, our liability is limited to what you paid ($19). Terms