Before you ship an AI / vibe-coded app
Short answer
Before sharing an AI-built app, spend 15 minutes on three things: make sure no secret or service_role key reached the browser or git, confirm auth is required where it should be, and verify every Supabase table has RLS with owner-scoped policies. Then scan the live URL from the outside.
AI builders get you 80% there fast. The last 20% — secrets, auth, and database rules — is where real users (and attackers) live. Use this before you share the link on X, Product Hunt, or Discord.
Minutes 0–5 — Secrets
- Search the repo and built JS for
service_role,sb_secret_, OpenAI/Anthropic keys, Stripe secret keys. - Anything privileged stays on a server / edge function — never in the browser bundle.
- Rotate anything that ever touched a commit or a public preview URL.
- Make sure
.envfiles and the.gitfolder are never in your deploy output, and that your host does not serve dotfiles. - Publishable keys (Stripe
pk_, Supabase anon /sb_publishable_, the Firebase webapiKey) are meant to be public. Secret and restricted keys (Stripesk_/rk_) are not.
Minutes 5–10 — Supabase / Firebase data
- Enable RLS on every table (see the RLS checklist).
- Confirm anon cannot
select *user PII. - Mark storage private unless the asset is intentionally public.
- On Firebase: no
allow read, write: if truein Firestore or Storage rules, no".read": trueat the Realtime Database root, and App Check on. - Run a free RLS Radar scan on your production URL (only if you own it).
Minutes 10–15 — Auth & product hygiene
- Test sign-up / sign-in / sign-out on a fresh profile.
- Block open redirects and verify email templates do not leak tokens in referrers.
- Turn off verbose debug logging in production, and decide on purpose whether production source maps should be public.
- Add basic security headers: Content-Security-Policy, Strict-Transport-Security, X-Frame-Options (or CSP
frame-ancestors), X-Content-Type-Options: nosniff. - Add a privacy note if you collect emails or trading / game / health-adjacent data.
Ship gate
You are ready to share the link when: no secret keys in the frontend, RLS on, storage intentional, and a passive scan shows no critical findings.
Run RLS Radar →Sources
- Supabase docs: API keys (checked 2026-10-16)
- Supabase docs: Row Level Security (checked 2026-10-16)
- Firebase docs: API keys (checked 2026-10-18)
- Stripe docs: API keys (checked 2026-10-18)
- MDN: Web security practical implementation guides (checked 2026-10-18)
Check your live app in seconds
Scan your appFree, read-only, permission-gated. Nothing stored.