Security check for v0 apps
Any variable named NEXT_PUBLIC_ ends up in the browser. Paste your Vercel URL: we find what a visitor can see and give you a prompt v0 can use to fix it.
First scan is free, no signup and no code access. By scanning you confirm you own this site or are authorized to test it, and agree to the Terms and Privacy Policy.

One key needs rotating before launch.
Built with v0 · Next.js · Vercel
Passive external check; application logic (SQLi, IDOR) is not tested.
A generated component needs a key and fails. Renaming the variable to NEXT_PUBLIC_… makes the error go away, and puts the key in client JavaScript.
Vercel does not add a Content-Security-Policy. Without one, a single injected script can do anything on your page.
When Supabase is called from the browser, its access rules carry all the weight, exactly as in a frontend-only app.
Where generated Next.js apps slip most often. Public checks run on every scan; Verified ones after you prove the domain is yours.
Payment, email and AI provider keys inlined into client chunks. About 40 key patterns, Stripe secret keys included
Public
Vercel does not add one by default. We check CSP, HSTS, framing and referrer policies and weak CSP values
Public
Production maps that publish your original source, and any keys inside them
Public
Whether the tables your app references answer without login, using the anon key from your bundle. One row requested, never stored
After you verify
How it works
No code, no login, no setup. The first scan takes about a minute.
Each issue is explained by its consequence, in plain English, ranked by severity.
Copy the fix prompt for the issue and paste it into v0.
Verify your domain for free to unlock the deeper checks, then rescan to see the issue gone.
Free first scan. No signup, no code access.
01The chunksPublic
Next.js writes every NEXT_PUBLIC_ variable into the JavaScript chunks it sends to the browser. We download those chunks like any visitor.
/_next/static/chunks/app/page-5d1e.js
const url = "https://kwp.supabase.co"const anon = "eyJhbGciOiJIUzI1NiIs…"const stripe = "sk_live_51N…"fetch(url + "/rest/v1/leads", …)
02The keysPublic
The Supabase anon key is fine there. A Stripe secret key is not: anyone can copy it from the chunk.
Report
03The tablesVerified
After you verify the domain (free), we ask each table the bundle names for one row with that public key. We keep the status and column names, never the values.
Verified check
GET /rest/v1/leads?select=*&limit=1200 OK · 1 row[{ "id": "•••", "email": "•••", "company": "•••"}]
Values hidden. We store the status and column names only.
04The fixPublic
Each finding comes with a prompt that says what to move where. Paste it into v0, redeploy, rescan.
Fix prompt for v0
Move Stripe calls into a route handler that reads STRIPE_SECRET_KEY on the server, and remove NEXT_PUBLIC_STRIPE_SECRET_KEY. Then enable Row Level Security on the Supabase table "leads" with no policy for the anon role.
Example data. Values in the table check are hidden.
Inside the report
Every issue comes with a prompt written for the tool you build with. Paste it into v0, redeploy, and rescan to see the finding gone.
v0 security guideCritical
A live Stripe secret key in a client chunk lets anyone create charges and read your customers.
Found in /_next/static/chunks/app/checkout/page-81c2.js
This Next.js app exposes the Stripe secret key through NEXT_PUBLIC_STRIPE_SECRET_KEY. I have rolled the key in Stripe. Move checkout session creation into a route handler at app/api/checkout/route.ts that reads STRIPE_SECRET_KEY on the server, update the checkout page to call it, and make sure no NEXT_PUBLIC_ variable holds a secret.
Compared
| What | Shypset | Reading the code yourself | Manual pentest |
|---|---|---|---|
| Where it looks | Your live site, from outside | Your repository | Your app, by a security tester |
| Headers, TLS, DNS, email | Checked on every scan | Only if you know to look | Usually covered |
| What actually got deployed | The running site | Only the source | The running app |
| Logged-in logic (IDOR, per-user rules) | Not tested | If you read for it | Yes |
| Cost and time | First scan free, about a minute | Hours of your own time | Quoted per project, days to weeks |
Not a pentest replacement before a big deal. A minute-long check of what is visible from outside, before you launch.
A scan takes about a minute. Table and file checks run after free domain verification.
Your first scan is free, no signup needed. Upgrade when you want the full report and fix prompts for every issue.
For your first check before launch
$0/ month
For founders shipping AI-built apps
$15/ month
Billed monthly, $180 a year
For agencies and freelancers. Coming soon
Soon
$9 one-time
One domain for 30 days: the full report and every fix prompt, plus 3 rescans. The public report and badge are not included.
No. Next.js writes them into the JavaScript sent to every visitor. Use them only for values that are public by design.
Yes, if the preview is public. Vercel protects previews by default; scan your production URL or turn protection off for that deployment.
The first scan is free, with no signup and no code access. A free account gives you 3 scans a month. The full report and a fix prompt for every issue come with Pro or a one-time $9 Launch Pass.
Without verification we only read what any visitor’s browser can, plus public records such as DNS. Deeper checks, like asking your database tables for a row, run only after you verify that the domain is yours. Verification is free.
No. It is a passive external check: it does not log in and does not test application logic such as SQL injection or IDOR. A clean report means nothing is visible from outside.
We check what it left open.Paste a URL and get the report in about a minute. First scan is free, no signup and no code access.
Real people read every message. Tell us what you need and we will answer by email.
Prefer email? Write to info@softdoes.com.