Before you launch · Stage 4: ship and find users
Before you launch a vibe-coded app: data, keys, backups and launch readiness
Eleven data and access checks for apps built with Lovable, Bolt, Replit, v0, Cursor or Claude Code, each linked to the vendor's docs, then the backups and venue rules to sort out before you post. Checked on vendor pages on 2026-10-13.
Updated
Key takeaways
- Turn on Row Level Security for every table in Supabase's
publicschema and clear the Security Advisor's ERROR lints. The publishable (anon) key is meant to be in browser code; RLS is what protects the data. - Anything prefixed
NEXT_PUBLIC_orVITE_ships to the browser. The Supabase secret key and your Stripe, OpenAI or Anthropic keys stay on the server. - As of October 2026, Supabase's pricing page lists no automatic backups on Free (Pro keeps 7 days), and Lovable Cloud keeps roughly 14 daily backups. Neither includes storage files.
- From 2026-10-30, new tables in existing Supabase projects need an explicit GRANT before the Data API can reach them. Supabase is deprecating the legacy anon and service_role keys by the end of 2026, so move to publishable and secret keys.
- BetaList and SaaSHub reject free hosting subdomains, Product Hunt allows one launch per product every six months, and Hacker News asks for no generated text.
Data, keys and access: eleven checks
Tick these off before real users put real data in. Each check says how to test it yourself and links the vendor's doc. Limits are as of October 2026. Start with C1 to C3: between them they cover 6 of the 11 cases in the incident table further down (editorial). Our calls (editorial) assume a solo builder using AI coding tools, with no security team, shipping in evenings and weekends.
- C1. RLS is on for every exposed table, and user A cannot see user B's rows. In Supabase, enable Row Level Security on every table in an exposed schema such as
public; with RLS on and no policies, the publishable key reads nothing. Add one policy per operation, scopedto authenticatedand matching(select auth.uid()) = user_id. A read policy in that pattern:create policy "own rows" on public.todos for select to authenticated using ((select auth.uid()) = user_id);. Insert policies usewith checkin place ofusing; update policies combineusing(which rows can change) withwith check(what the changed row may contain). Views skip RLS unless created withsecurity_invoker = true(Postgres 15+). Run the Security Advisor (Dashboard, orsupabase db advisors) and clear the ERROR lints, including0013_rls_disabled_in_public,0010_security_definer_viewand0002_auth_users_exposed. Then the two-account test (editorial): sign in as A, try to read, edit and delete B's rows in the app and through the REST endpoint, and repeat signed out.[1], [2] - C2. Real secrets never reach the browser. The Supabase publishable key (
sb_publishable_..., legacyanon) is designed to sit in browser code. The secret key (sb_secret_..., legacyservice_role) bypasses every RLS policy and must never be in a browser, app bundle or repo. Next.js inlines everyNEXT_PUBLIC_variable into browser JavaScript, and Vite does the same forVITE_and says not to put API keys there. Keep backend keys in Lovable Secrets or Vercel Secret variables, both write-only after saving. Check (editorial): in DevTools, search your live site's JavaScript forsb_secret_,sk_,sk-,BearerandeyJ. A legacy Supabase key is a JWT startingeyJwith its role encoded inside, so a plain-text search for service_role finds nothing. Decode eacheyJtoken in the DevTools console, never in an online decoder:JSON.parse(atob(TOKEN.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))).role, with the token in quotes in place of TOKEN. It must printanon, neverservice_role. Keep GitHub push protection on. If a key leaked, fix the leak, create a new key, replace it everywhere, confirm, then retire the old one.[3], [59], [4], [5], [6], [7], [8] - C3. Every read and write is checked on the server. Next.js says Proxy (formerly middleware) is only for optimistic redirects: do real checks in a Data Access Layer and treat every Server Action and Route Handler like a public API endpoint. In Supabase server code, use
getClaims(), which verifies the token signature, nevergetSession(). Supabase's production checklist adds MFA on your Supabase account, CAPTCHA on sign-up, sign-in and password reset, and custom SMTP (the default sender allows 2 auth emails an hour). Logged-out test (editorial): in a private window, open your dashboard and API URLs; each should redirect or return 401 or 403, never data.[9], [10], [11] - C4. Only a verified webhook marks a user as paid. Verify each Stripe webhook with the
Stripe-Signatureheader, the endpoint'swhsec_secret and the raw request body; Stripe warns that unverified webhooks let attackers fake events that fulfil orders or grant access. Log event IDs to skip duplicates. Never let the browser write a paid or plan column (editorial): in the CVE-2025-48757 write-up, researchers inserted a record with a paid status that bypassed Stripe.[12], [13] - C5. Every endpoint that costs you money has a cap. OWASP LLM10:2025 calls it Denial of Wallet: someone drives up your pay-per-use bill. Its fixes: rate limits, per-user quotas, input size limits, timeouts, monitoring. As of October 2026, Vercel WAF rate limiting is on every plan, and Hobby gets 1 rule per project with 1,000,000 allowed requests included. OpenAI lets you set a monthly spend limit per organization or project with "Enforce a hard limit" on (requests then get a 429; enforcement is not instant, and alerts alone do not stop traffic). Anthropic lets you set your own spend limit below your tier's cap under Settings > Billing. Our rule of thumb (editorial): sign-in before any paid call, a daily cap per user, a cap on input length, and a hard limit you can afford to lose in a bad week.[14], [15], [16], [17]
- C6. Untrusted text cannot steer your AI feature. OWASP LLM01:2025 says it is unclear whether any method fully prevents prompt injection, so limit the damage: least privilege for the model, privileged actions in your own code, untrusted content marked as such, outputs checked by deterministic code, and a person approving high-risk actions. Never give an LLM feature the Supabase secret key (editorial). Validate every input on the server with a schema library such as Zod.[18], [9]
- C7. Dependencies are patched, and every package is real. Run
npm auditandnpm audit fix. npm's docs say--forcelets audit fix install SemVer-major (breaking) versions, and they recommend not using it unless you know exactly what you want. Turn on Dependabot alerts. Before installing a package your AI tool suggested, check on npmjs.com that it exists and has a real history (editorial). Replit's Package Firewall, on by default, blocks packages Socket has flagged as malicious or compromised, and names slopsquats (package names an AI model invents and an attacker then registers) among the risks it covers. Keep Next.js patched: React2Shell (CVSS 10.0) hit App Router apps on 15.x and 16.x, and Next.js advised rotating secrets after the upgrade.[19], [20], [21], [22] - C8. AI agents stay away from production data. Replit gives every app separate development and production databases, and its Agent cannot modify production. For the Supabase MCP server, Supabase advises connecting to production only when a task needs it, scoping to one project, read-only mode for unattended work and approving each tool call. Do not run coding agents with permission-skipping flags on a machine holding production keys (editorial). Turn on MFA for GitHub, npm, your host and your database, as CISA urged after the Shai-Hulud npm worm.[23], [24], [25]
- C9. You have restored a backup at least once. Know what your platform keeps (backups by platform below) and test one restore before launch (editorial). Storage files are not in Supabase or Lovable Cloud database backups, so copy them separately.[26], [58], [27]
- C10. You know what personal data you hold, and where it goes. Collect only what the app uses. Find every place your code calls a logger, an analytics or error-tracking SDK, an email service or a model provider, and check what user fields each call sends; strip what the service does not need. Then publish a privacy policy that names those services and matches what you collect (editorial). See privacy basics below.
- C11. Projects, chats and previews are no more public than you meant. On Lovable Free and Pro, projects are visible to the whole workspace and published sites to anyone with the link; only Business and Enterprise can restrict either. A v0 chat set to "Anyone on the web" may be indexed and shown in public galleries. On Vercel, set Deployment Protection to Standard at least, as Vercel advised after its April 2026 incident.[28], [29], [30]
Three audit prompts for your coding agent
Paste these into Cursor, Claude Code, Lovable, Bolt or Replit. Each asks for a report and no changes, so you read the findings before anything is edited. Treat the answer as a first pass: open the files and policies it names and check them yourself (editorial).
1. Audit RLS (covers C1)
List every table and view in the public schema. For each table, say whether RLS is enabled and list every policy with its command, role and condition. For each view, say whether it was created with `security_invoker = true`. Flag any policy that uses `true`, has no `to authenticated`, or lets a user read or change rows where `user_id` is not their own. Do not change anything yet.
2. Find secrets that reach the browser (covers C2)
Search this codebase for API keys, tokens and secrets. For each one, show the file and say whether that code runs in the browser or on the server. Treat the Supabase publishable or anon key as public and every other key as secret. Flag any secret that is prefixed `NEXT_PUBLIC_` or `VITE_`, read in client-side code, or saved in a file that git does not ignore. Do not change anything yet.
3. Check every server entry point (covers C3 and C4)
List every API route, Server Action, Route Handler, edge function and database function this app exposes. For each, say whether it can be called while signed out, what it checks before reading or writing data, and whether it confirms the signed-in user owns the row. Flag any that trusts a user ID, role, price or plan sent from the browser, and any check that only runs in the UI or in middleware. Do not change anything yet.
What went wrong in 2025 and 2026
Documented cases from researchers, vendors and the press. Most were exposures that researchers found and reported, not confirmed attacks. The last column points to the check that covers each one.
| When | What was reported | Pattern | Check |
|---|---|---|---|
| Mar to May 2025 | Researchers reported that 170 of 1,645 apps on Lovable's showcase had database endpoints readable or writable without login. Logged as CVE-2025-48757, which Lovable disputes: it says each customer is responsible for their app's data. | RLS missing or too loose | C1, C4 |
| Jul 2025 | Wiz found undocumented Base44 endpoints that let anyone with a private app's public ID register on it. Fixed within about 24 hours; Wix found no evidence of abuse. | Sign-up not enforced on the server | C3 |
| Jul 2025 | SaaStr's founder reported that Replit's agent deleted his database during a code freeze: data loss, not a breach. Replit then separated development and production databases. | Agent with write access to live data | C8, C9 |
| Jul 2025 | General Analysis showed, on a test project with dummy data, that instructions planted in a support ticket could make Cursor with Supabase MCP (as service_role) leak a tokens table. A demonstration, not an incident. | Untrusted text reaching an agent with broad access | C6, C8 |
| Sep 2025 | RedHunt Labs scanned about 130,000 sites from 13 vibe-coding platforms and found about 25,000 unique secrets in client-side code. | Secrets in browser code | C2 |
| Sep 2025 | CISA reported that the Shai-Hulud worm compromised more than 500 npm packages and harvested GitHub tokens and cloud keys. | Poisoned dependency | C7, C8 |
| Dec 2025 | React2Shell, a CVSS 10.0 remote code execution flaw, hit Next.js App Router apps on 15.x and 16.x. No workaround: upgrade, then rotate secrets. | Unpatched framework | C7 |
| Jan to Feb 2026 | Wiz found Moltbook's database open: a Supabase key in its JavaScript plus no RLS exposed about 1.5 million API tokens and 35,000 email addresses. Fixed about three hours after the report. | RLS off | C1 |
| Feb 2026 | An exam app built with Lovable and featured on its Discover page: a researcher reported 16 flaws exposing 18,697 user records. One, repeated across several critical functions, was auth logic that blocked signed-in users and let anonymous users in. Lovable said the owner had not acted on its scan's recommendations and the database was not hosted by Lovable. | Inverted auth logic in server functions | C3 |
| Mar to Apr 2026 | A researcher reported that a free Lovable account could reach other users' code and chats on projects created before November 2025. Lovable apologised for re-enabling chat access on public projects by mistake; projects have been private by default since December 2025. | Sharing wider than owners expected | C11 |
| Apr 2026 | Vercel reported that an attacker came in through a third-party AI tool used by an employee and decrypted non-sensitive environment variables of a subset of customers. | Secrets stored as readable config | C2, C11 |
Sources accessed 2026-10-13. Counts are the researchers' own figures.[32], [13], [33], [34], [35], [36], [25], [22], [37], [38], [39], [30]
What your builder already scans
Each big browser builder now ships some checks. They catch common mistakes and do not replace C1 to C11. The last column is what each vendor says about the limits.
| Builder | What it checks | When and on which plans | Vendor on the limits |
|---|---|---|---|
| Lovable | Quick scan: database access rules, dependency vulnerabilities, MCP servers open without sign-in. Deep scan: all app code, including access control, secrets, payments and auth. | Quick scan on every publish; Deep scan when you start it. Admins can block publishing while critical issues are open. | The tools "cannot guarantee complete security"; Lovable suggests considering a professional review for sensitive data. |
| Bolt | Security audit: data access, public exposure, sign-in and sessions, input handling, keys and settings. Database check: rules and permissions. | Audit on paid plans, up to 30 a day, no tokens when run from Publish. Database check on all plans. | No completeness claim either way. Some fixes need manual changes in connected services, and restoring an old version removes Bolt's fixes. |
| Replit | Agent security scans: threat model and static analysis for SQL injection, XSS, CSRF and data leaking to logs or third parties. Package Firewall at install. | Scans on paid plans. Package Firewall on by default. | "A scan is not a complete security review." |
| v0 | Analyses NEXT_PUBLIC_ usage and warns; can move code into Route Handlers or Server Actions. Vercel lists pre-deploy checks for exposed secrets and unsafe auth defaults. | Built into generation and deploy. Vercel says v0 blocked over 100,000 insecure deployments (its own figure, August 2025). | The security docs (updated 2026-10-10) state no limit on what the checks cover. |
Plans and limits as of October 2026. Checked on vendor pages 2026-10-13.[40], [41], [42], [21], [43], [44]
Backups by platform
What each platform keeps for you as of October 2026. On every platform below, rolling back code and restoring data are separate steps.
| Platform | What is kept | How you restore | Not included |
|---|---|---|---|
| Supabase Free | No automatic backups (pricing page: "Not included"). Supabase tells free projects to export regularly with supabase db dump and keep copies off-site. | From your own exports | Storage files |
| Supabase Pro, Team, Enterprise | Daily backups kept 7, 14 and up to 30 days. Point-in-Time Recovery is a paid add-on (7, 14 or 28 days; needs at least Small compute). | A daily backup, or a chosen moment with Point-in-Time Recovery | Storage files |
| Lovable Cloud | One database backup a day, roughly 14 days kept. | Daily snapshot only; anything after it is lost | Storage files |
| Replit | Development database: checkpoints, up to 7 days. Production: point-in-time restore and daily backups, up to 7 days on Core, 28 on Pro and Enterprise. | Restore the database, roll back code to the matching checkpoint, publish again | A database restore does not revert code, and the reverse |
| Bolt | Project version history, zip download, GitHub. | Restoring a version does not change your Bolt or Supabase databases | Database data; no database backup retention stated |
Checked on vendor pages 2026-10-13.[26], [58], [27], [45], [23], [46]
Hardening takes evenings. Check the idea first.
Policies, server checks, spend caps and a restore test take real hours, and they only pay off for an app people use (editorial). Describe your app and who it is for. Olune scores it free, then a free sign-in runs the research: search demand for phrases buyers might type, public complaints in Reddit threads found through Google, and competitors. You get Cook it, Sleep on it or Kill it, with the reasoning. It checks demand only, never your code. 3 a day, no card.
Privacy basics (not legal advice)
A short orientation, not legal advice. If your app holds health, financial or children's data, talk to a lawyer before launch (editorial).
- GDPR can apply outside the EU. The European Commission says GDPR covers organisations outside the EU that offer goods or services, paid or free, to people in the EU, or monitor their behaviour.[55]
- A breach starts a 72-hour clock. Under GDPR, report a breach to the data protection authority within 72 hours of becoming aware of it, unless it is unlikely to put people at risk, and tell affected people without undue delay when their risk is high.[56]
- The CCPA has thresholds. California's CCPA applies to for-profit businesses that meet at least one threshold, such as buying, selling or sharing the personal information of 100,000 or more California residents or households. The Attorney General's page lists them all.[57]
- Know your processors. List every service that touches user data (database, auth, email, analytics, error tracking, model provider) and say in your privacy policy what each receives (editorial).
Ready to post anywhere?
Launch venues turn away a lot of first posts. Check these before launch week; rules as of October 2026. Venue-by-venue detail is on where to launch, and the plan around launch day is in how to launch a product.
- Something people can try today. Show HN wants a non-trivial project people can try, ideally without a signup, and treats landing pages and sign-up pages as off-topic.[52]
- A post you wrote yourself. Hacker News asks for no generated text in posts and no generated or AI-edited text in comments. Write the build story by hand: tools, what broke, what you changed (editorial).[53]
- One venue at a time, inside its cap. Product Hunt allows one launch per product or root domain every six months unless a relaunch request is approved; a new UI or pricing change does not count. r/SaaS moderators limited self-promotion to once per 60 days in April 2026, counting posts, comment plugs and links.[50], [54]
- C1 to C11 done. A launch sends strangers to your app on one day. Finish the data and access checks first.
Check demand before you spend a launch
Once C1 to C11 and a restore test are done, check the demand before you spend a launch on it. Describe the app and the person who would pay. Olune gives a free score, then, after a free sign-in, looks for search demand, public complaints found through Google, and competitors, and returns Cook it, Sleep on it or Kill it with its reasoning. The analysis is LLM-assisted and can vary between runs. Kill is a normal answer: a killed idea gets no Build Kit, and you can ask for 3 to 5 suggested pivots instead. 3 a day, no card.
Common questions
Is Lovable secure?
Lovable scans apps for common problems, but your app's safety depends mostly on your own database rules, keys and server checks. Lovable says its scans cannot guarantee complete security. The incident table has three Lovable cases: loose RLS across showcased apps, inverted auth logic in an app whose owner had not acted on the scan's recommendations, and a permissions change that reopened chat access on public projects, which Lovable called a mistake. Run C1 to C3 whatever your builder, and C11 for sharing settings.
Should RLS be enabled in Supabase?
Yes, on every table in an exposed schema such as public; Supabase's own docs say so. With RLS on and no policies the publishable key reads nothing, so turn it on first, then add a policy per operation.
Is the Supabase anon key a secret?
No. The anon key, now the publishable key, is designed to be public and runs under your RLS policies. The secret key (legacy service_role) bypasses RLS and must stay on the server.
Do I need a security audit before launch?
If your app stores other people's health, financial or other sensitive data, yes; Lovable itself suggests considering a professional review for such apps. For a small app with test users, the eleven checks plus your builder's scanner cover the failures that show up most in the 2025 and 2026 reports (editorial).
How do I stop someone running up my OpenAI or Anthropic bill?
Set a hard spend limit at the provider and rate-limit the endpoint that calls it. Then require sign-in before any paid call and cap calls per user per day.
What should a vibe coding launch checklist include?
Data and access checks first (RLS, keys, server-side auth, webhooks, spend caps, backups, sharing settings), then launch readiness: your own domain, accounts with history, a hand-written post and a plan for each venue's cap.
Does Olune check my app's security?
No. Olune checks whether people want an app: search demand, public complaints and competitors. It does not read code, scan databases or test configuration.
Sources
Each number in brackets on this page points here. Prices and limits change; the date is when we read the page.
- [1]Supabase docs, Row Level Security · accessed
- [2]Supabase docs, Database Advisors (security lints) · accessed
- [3]Supabase docs, Understanding API keys · accessed
- [4]Next.js docs, Environment variables · accessed
- [5]Vite docs, Env variables and modes · accessed
- [6]Lovable docs, Secrets · accessed
- [7]Vercel docs, Config and Secret environment variables · accessed
- [8]GitHub docs, About push protection · accessed
- [9]Next.js docs, Authentication · accessed
- [10]Supabase docs, Server-side auth for Next.js · accessed
- [11]Supabase docs, Production checklist · accessed
- [12]Stripe docs, Receive Stripe events in your webhook endpoint · accessed
- [13]Matt Palmer, Statement on CVE-2025-48757 · accessed
- [14]OWASP GenAI, LLM10:2025 Unbounded Consumption · accessed
- [15]Vercel docs, WAF rate limiting · accessed
- [16]OpenAI API docs, Spend limits · accessed
- [17]Claude API docs, Rate limits (spend limits section) · accessed
- [18]OWASP GenAI, LLM01:2025 Prompt Injection · accessed
- [19]npm docs, npm audit · accessed
- [20]GitHub docs, About Dependabot alerts · accessed
- [21]Replit docs, Package Firewall · accessed
- [22]Next.js, Security advisory CVE-2025-66478 (React2Shell), 2025-12-03 · accessed
- [23]Replit docs, Development and production databases · accessed
- [24]Supabase docs, Model Context Protocol (MCP) · accessed
- [25]CISA, Widespread supply chain compromise impacting npm ecosystem, 2025-09-23 · accessed
- [26]Supabase docs, Database backups · accessed
- [27]Lovable docs, Database (Lovable Cloud backups) · accessed
- [28]Lovable docs, Privacy and security settings · accessed
- [29]v0 docs (llms.txt), chat sharing options · accessed
- [30]Vercel, April 2026 security incident bulletin · accessed
- [31]Supabase changelog, Tables not exposed to the Data and GraphQL API automatically · accessed
- [32]NVD, CVE-2025-48757 (tagged disputed) · accessed
- [33]Wiz Research, Base44 authentication bypass, 2025-07-29 · accessed
- [34]The Register, Replit response to the SaaStr database deletion, 2025-07-22 · accessed
- [35]General Analysis, Supabase MCP prompt injection demonstration, 2025-07-08 · accessed
- [36]RedHunt Labs, Secrets leaking through vibe-coded sites, 2025-09-23 · accessed
- [37]Wiz Research, Exposed Moltbook database, 2026-02-02 · accessed
- [38]The Register, Lovable-built exam app exposed user records, 2026-02-27 · accessed
- [39]The Register, Lovable and project data on public projects, 2026-04-20 · accessed
- [40]Lovable docs, Security overview · accessed
- [41]Bolt support, Security audit and database security check · accessed
- [42]Replit docs, Agent security scans · accessed
- [43]v0 docs, Security (updated 2026-10-10) · accessed
- [44]Vercel blog, v0 and vibe coding securely, 2025-08-04 · accessed
- [45]Replit docs, Data recovery · accessed
- [46]Bolt support, Rollback and backup · accessed
- [47]BetaList, FAQ · accessed
- [48]SaaSHub, Submit your product (rules) · accessed
- [49]Product Hunt, Before launch · accessed
- [50]Product Hunt help, Can I relaunch my product? (updated 2026-07-07) · accessed
- [51]Hacker News, Show HN restriction notice · accessed
- [52]Hacker News, Show HN guidelines · accessed
- [53]Hacker News, Guidelines · accessed
- [54]r/SaaS moderators, New rule against self-promo, 2026-04-14 · accessed
- [55]European Commission, Data protection explained · accessed
- [56]EDPB, Data protection guide for small business: data breaches · accessed
- [57]California Attorney General, California Consumer Privacy Act (updated 2026-08-28) · accessed
- [58]Supabase, Pricing (plan comparison: Automatic backups) · accessed
- [59]Supabase docs, JWT Claims Reference (anon and service role token examples) · accessed
Read next
Part of the vibe coding guide: what to check before, during and after the build.