Security for apps built with AI
Hack yourself
before someone
else does.
Emerald Red Team attacks your app the way real attackers do, safely, then gives you the fix as a prompt for your AI tool, a file, or a pull request. It flags lawsuit risks too.
Watch it work
From F to A, one fix at a time.
Every finding becomes a fix you can paste. Each re-scan proves it worked, and the seal fills in pillar by pillar.
leaky-lemonade.demo
Demo app we built to be vulnerable · 0 of 5 fixed
- CriticalSupabase service-role key in your JavaScript
- CriticalTable “orders” readable without logging in
- High/api/admin/users answers without a session
- HighFacebook Pixel fires before consent
- MediumNo Content-Security-Policy header
Illustration of a scan replay. Grades move as fixes land and the re-scan confirms them.
The problem
What breaks in vibe-coded apps
97.6%
of 1,072 vibe-coded sites had at least one vulnerability; 16.1% had a critical one.
400+
exposed secrets, including Supabase service-role keys, across 5,600+ vibe-coded apps.
~1.5M
API keys exposed at Moltbook after a Supabase key in client JavaScript met missing row-level security.
How it works
Connect. Verify. Attack. Fix.
01
Connect
Paste your URL. Optionally link GitHub, Supabase or Firebase so we can see the whole stack.
02
Verify
Prove you own it with a DNS record, a file or a meta tag. Nothing beyond a browser-level look happens until you do.
03
Attack (safely)
We run the attacks that actually hit AI-built apps: leaked keys, open tables, broken access, injection. Throttled, scoped and non-destructive.
04
Fix
Every finding comes with a prompt for your AI tool, a ready-to-paste file, or a pull request. Re-scan confirms it.
Coverage
15 modules. One rampart.
Mapped to the OWASP Top 10:2025 and the OWASP Top 10 for LLM Applications, plus the lawsuit risks scanners ignore.
- RECONDiscoveryMaps your stack, routes, JavaScript and API endpoints.
- SECRETSExposed keys & filesAPI keys in your JavaScript, .env files, .git folders, source maps.
- BAASSupabase & FirebaseOpen tables, missing RLS, public buckets, open Firebase rules.
- ACCESSAccess controlUnauthenticated APIs, IDOR, admin routes, CORS.
- AUTHLogin & sessionsRate limits, cookies, tokens, JWTs, password reset.
- INJECTInjectionSQL, XSS, SSRF, command and template injection with safe payloads.
- CONFIGConfig & TLSSecurity headers, TLS, email spoofing, takeovers.
- SUPPLYSupply chainVulnerable and hallucinated packages, CI workflows.
- CRYPTOCrypto & data protectionPassword hashing, random tokens, PII in logs.
- INTEGRITYIntegrity & errorsWebhook signatures, client-trusted prices, fail-open checks.
- LOGGINGLogging & alertingError monitoring and audit trails.
- ABUSEAbuse & denial of walletUnprotected AI endpoints, SMS/email relays, spam.
- LLMAI feature securityPrompt injection, data leakage, excessive agency.
- PRIVACYPersonal data exposurePII without auth, session replay, undisclosed sharing.
- LIABLawsuit riskPre-consent tracking, accessibility, legal pages, fake reviews.
Lawsuit risk
Security holes get you hacked. Pixels, inaccessible pages and fake reviews get you sued.
ERT-LIAB-005
Tracking pixels before consent
Meta Pixel, TikTok and Google tags firing before anyone says yes. The basis of most wiretap and privacy demand letters.
ERT-LIAB-009
Accessibility barriers
WCAG 2.2 AA failures that drive ADA website lawsuits: missing labels, contrast, keyboard traps.
ERT-LIAB-001
Missing legal pages
No privacy policy, terms, or opt-out link where state privacy laws and app stores require them.
ERT-LIAB-013
Fake urgency & reviews
Countdown timers that reset, unverifiable review widgets and other dark patterns regulators target.
Risk signal, not legal advice. Talk to a lawyer about your situation.
Fix it your way
A prompt, a file, or a pull request.
Fixes are written for the tool you actually use, scoped to change only what's broken.
Fix a security issue in this app. Do not change anything else. Problem: the "profiles" table in Supabase has Row Level Security turned off, so anyone with the public anon key can read every row. Do this: 1. Enable RLS on public.profiles. 2. Add a policy so users can only select and update their own row: using (auth.uid() = id) 3. Make sure no frontend code relies on reading other users' profiles. When you're done, list the SQL you ran.
In next.config.ts, add security headers for every route. Add an async headers() returning, for source "/(.*)": - Strict-Transport-Security: max-age=63072000; includeSubDomains; preload - X-Content-Type-Options: nosniff - Referrer-Policy: strict-origin-when-cross-origin - Permissions-Policy: camera=(), microphone=(), geolocation=() - X-Frame-Options: DENY Keep existing config. Don't add packages.
import type { NextConfig } from "next";
const securityHeaders = [
{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" },
{ key: "X-Content-Type-Options", value: "nosniff" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
{ key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" },
{ key: "X-Frame-Options", value: "DENY" },
];
const config: NextConfig = {
poweredByHeader: false,
async headers() {
return [{ source: "/(.*)", headers: securityHeaders }];
},
};
export default config;fix(security): enable RLS on profiles (#42)Opened by Emerald Red Team · ERT-BAAS-001 + alter table public.profiles enable row level security;+ create policy "own profile" on public.profiles+ for select using (auth.uid() = id);+ create policy "update own profile" on public.profiles+ for update using (auth.uid() = id); Verification: re-scan after merge confirms the tableno longer answers anonymous requests.
Safety model
What we never do
- Never scan sites you can't prove you own
- Never download your users' data
- Never store your secrets
- Never run destructive payloads
- Never keep hammering if your app starts erroring
Pricing
Start free. Upgrade when you launch.
Free
See what an attacker sees.
$0 forever
- 1 project, 1 verified web target
- Passive Quick Check (5/day)
- Weekly passive monitor
- Top 3 fix prompts
- 30 days of score history
Builder
For your first real launch.
$29 /month
- 3 projects
- 30 Standard scans/mo (authenticated + repo + backend)
- Daily passive monitoring
- Every fix prompt + Fix Pack
- Email alerts
Pro
Most popularContinuous red teaming.
$79 /month
- 10 projects
- 60 Deep scans/mo (injection, AI/LLM, write tests)
- Deploy-triggered scans
- Fix PRs on GitHub
- MCP, API & GitHub Action
- Slack, Discord, webhooks
- PDF reports + Trust Page
Agency
Every client app, one rampart.
$249 /month
- 50 projects
- Client workspaces + client viewers
- White-label reports & Trust Pages
- 5 seats included
- Everything in Pro
One-time
Launch Audit · $99
One Deep + Lawsuit-risk scan, a Launch Readiness Report PDF, and 30 days of re-tests while you fix. Fully refundable until the scan starts.
FAQ
Questions, answered.
Is this a pentest?
No. It's automated testing that catches the most common, most damaging issues. For high-risk apps we still recommend a human pentest.
Will scanning break my app?
The free check only reads what any visitor's browser can see. Deeper tests are throttled to 5 requests a second, use non-destructive payloads, and stop automatically if your app starts returning errors. Write tests are off by default and clean up after themselves.
Why do I have to verify ownership?
Because attacking a site you don't own is illegal and harmful. Verification keeps Emerald Red Team from being used against anyone else's app.
Do you see my users' data?
We're designed not to. Data-exposure checks count records instead of downloading them, and evidence is redacted before we store it. Discovered secrets are stored only as a fingerprint and a masked value.
Which builders do you support?
Anything with a URL. We have specific checks for Lovable, Bolt, Replit, Cursor, v0, Base44, Claude Code, Windsurf, Supabase, Firebase, Vercel and Netlify.
What does “lawsuit risk” mean?
Things that get small apps demand letters: tracking before consent, accessibility barriers, missing legal pages and dark patterns. They're risk signals, not legal advice.
Can my AI tool fix the issues?
Yes. Each finding includes a prompt written for your tool (Lovable, Cursor, Claude Code and more). Pro plans can open GitHub pull requests directly, and our MCP server lets agents pull findings themselves.
Does a good grade mean my app is secure?
No. Automated testing finds common and high-impact issues. It can't prove an app is secure and isn't a substitute for a professional penetration test.
Automated testing finds common and high-impact issues. It can't prove an app is secure and isn't a substitute for a professional penetration test.