Shipping secret API keys to the browser
Environment variables starting with NEXT_PUBLIC_ in Next.js or VITE_ in Vite are embedded in the JS at build time. Put an OpenAI or Stripe key there and anyone can read it.
A pre-launch check for indie and AI-built apps
Checks your SSL certificate, security headers, cookies, email spoofing protection and API keys leaked in public JS, all in 1 to 2 seconds. Every problem comes back with a fix for Next.js and Vercel, plus a fix request you can hand to an AI agent.
$ target your-app.vercel.app
Example
3 items need action
Of everything visible from the outside, these are the settings indie sites most often miss and the ones most likely to cause real damage.
Searches the JS your site sends to browsers for secret API keys, using each provider's key format.
Checks that the site loads over HTTPS, the certificate is valid and not about to expire, and no outdated TLS is used.
Checks that http redirects to https and that HSTS tells browsers to always use HTTPS.
Checks for response headers that limit the damage from clickjacking and XSS.
Checks that cookies set by your top page carry the attributes that make them hard to steal.
Checks that receivers can recognize spoofed mail that claims to be from your domain.
Type a domain or URL and press "Scan". The first time, you need a free account.
Connection, certificate, headers, public JS, DNS and more are checked at once, and results stream in as each step finishes. Most sites are done in 1 to 2 seconds.
Copy the config for each item, or paste a fix request covering every problem into Claude Code or Codex.
AI-written code puts "it works" first, so where keys live and how data is protected often come later.
Environment variables starting with NEXT_PUBLIC_ in Next.js or VITE_ in Vite are embedded in the JS at build time. Put an OpenAI or Stripe key there and anyone can read it.
The Supabase anon key is meant to be public. Row level security (RLS) is the only thing protecting your data, so a table without it can be read and written by anyone. A leaked service_role key bypasses RLS entirely.
How to check Supabase RLSAnyone can scan a domain they do not own, so we only look at the same public information a browser sees when it opens the page.
User-Agent: ideavaluSecurityCheck/1.0 (+https://ideavalu.com/security-check)
Free security scanners differ in what they check and who they are built for. Pick the one that fits your goal.
| What it checks | Secrets in public JS | Fixes | Best for | |
|---|---|---|---|---|
| IDEAVALU check | SSL, headers, cookies, SPF/DMARC, public JS | Checked | Config for Next.js and Vercel, plus a fix request for AI agents | Indie and AI-built apps |
| Typical passive scanners | Some of SSL, headers and so on, depending on the tool | Usually not checked | Mostly general explanations | Company sites and CMS operators |
| Vulnerability scanners (ZAP and others) | Application weaknesses in forms, logins and more | Not covered | Research it yourself | Developers with a test environment (owner permission required) |
| Paid professional assessments | In-depth testing, partly by hand | Depends on scope | Delivered in a report | Production services handling payments or personal data |
For a tool-by-tool comparison, see Free website security scanners compared.
For every item we check: what the risk is, commands to check it yourself, and how to fix it on Next.js, Vercel and other hosts.
The scan only looks at public information a browser sees when it opens the top page (response headers, HTML, the JS it loads and public DNS). We never run port scans, exploit attempts or login attempts. Where secrets were found is shown only to the person who verified ownership of the domain.
To prevent mass scanning of other people's sites. Sign-up is free and takes seconds with a Google account. With an account you also get fixes, a fix request for AI agents and your scan history.
Seven steps run in parallel, so most sites finish in 1 to 2 seconds and even slow servers in a dozen or so. Results for a domain are saved for 24 hours and shown instantly during that time.
This is a passive check that uses only information anyone can see. A vulnerability scan sends attack-like requests to find application bugs such as SQL injection and XSS, and needs the site owner's permission. Combine this check with ZAP or a professional assessment as needed.
For the domain, we check email spoofing protection (SPF, DMARC), limits on certificate issuers (CAA), and the validity and expiry of the SSL certificate. DKIM, DNSSEC and MTA-STS are not checked.
The anon (publishable) key is meant for the browser, so we do not flag it. You do need RLS (row level security) so nobody can read other users' data. If a service_role or secret key reaches the browser, revoke it immediately.
Not necessarily. This checks settings visible from outside, so passing is no guarantee. Check your login and payment flows, database access control and dependency vulnerabilities separately.
No page publishes scan results. Secrets themselves are never stored; we keep only a masked string with the first and last few characters.
Our scanner identifies itself with the User-Agent "ideavaluSecurityCheck/1.0 (+https://ideavalu.com/security-check)". To opt out, send us your domain through the contact form.
Questions about the scanner? Reach us through the contact form (in Japanese; English messages are welcome).