AI-coded apps

    Bolt.new vs Lovable: which is safer to ship to production?

    A founder comparing two browser windows, one showing a Bolt.new project with Stripe environment variables in the front end and the other showing a Lovable Security view flagging a permissive Supabase row level security policy before App Store submission

    For a founder choosing between Bolt.new and Lovable to ship a payment bearing or auth gated app to App Store Connect or Google Play, the security defaults of each tool matter more than which one writes nicer Tailwind. The honest answer is that both ship code that needs hardening before submission, and the failure modes are similar enough that the right comparison is which builder makes it easier to catch the issue.

    Short answer

    Bolt.new and Lovable both generate web app code that frequently exposes secrets in the client bundle and ships permissive Supabase Row Level Security by default. Lovable now runs four automated security scanners covering RLS, database schema, code, and npm dependencies, per its security overview. Bolt.new offers no equivalent guided check inside its IDE. Neither tool produces a submission ready binary on its own.

    What you should know

    • Same threat model. Both tools target Supabase as the default backend, and both can put the service role key in the JavaScript bundle if asked to integrate Stripe or admin features.
    • Different guidance layer. Lovable scans RLS, schema, code, and dependencies before publish; Bolt.new ships the build and leaves the audit to the developer.
    • Stripe is the highest cost mistake. Stripe states the secret key belongs server side only and that embedding it in client applications is unsafe, per Stripe's keys best practices.
    • Public RLS audits agree. The 2025 dev.to review titled Is Lovable Actually Secure? I Checked the Supabase RLS on 50 Apps found that 89 percent of sampled apps had missing or permissive RLS and 34 percent shipped the service role key.
    • MASVS still applies to wrapped apps. A WebView or Capacitor wrapper around a Bolt.new or Lovable site does not exempt the build from MASVS-STORAGE, MASVS-NETWORK, or MASVS-AUTH controls.

    How does Bolt.new put your secrets at risk by default?

    Bolt.new generates Vite style web apps that store environment variables behind a VITE_ prefix. Anything prefixed VITE_ is inlined into the production JavaScript bundle by the Vite build, which means it ships to every browser that loads the page. When a Bolt.new prompt asks for a Stripe or OpenAI integration, the model commonly creates a fetch call directly from the client with the secret key wired in as a VITE_ variable.

    In practice this becomes a public credential the moment the site goes live. Stripe is direct on this point. Per Stripe's keys best practices, secret keys belong in the server environment only, and embedding them in applications is unsafe because anyone can unpack the app and read them. The fix on Bolt.new is to route the Stripe call through a Netlify Function (or an equivalent serverless endpoint) and only expose the publishable key to the front end.

    Bolt.new does not flag the issue at build time. A developer who relies on the visible UI alone will publish the key without a warning, and the cost of that mistake is open ended: the secret key can create charges, refunds, and customers against the connected Stripe account.

    How does Lovable handle Supabase RLS and the service role key?

    Lovable defaults to Supabase as its database and now ships four automated security scanners, per its security overview: an RLS analysis, a database schema check, a code security review, and an npm dependency audit. The scanners run when relevant files change, before publish, or on demand from the Security view. The RLS scanner is the most useful of the four, because Supabase's own default is permissive in a specific way. Per Supabase's Row Level Security documentation, enabling RLS with no policies blocks access through the anon key, but a single overly broad policy such as using (true) opens the table to every visitor.

    The scanner is not a guarantee. The dev.to audit Is Lovable Actually Secure? I Checked the Supabase RLS on 50 Apps reviewed 50 published Lovable apps and found roughly 89 percent with missing or permissive RLS and 34 percent with the service role key in the browser bundle. That gap exists because Lovable will accept a developer's prompt to "just make this work" without forcing them to fix the warning first.

    The service role key is the higher stakes mistake of the two. Supabase confirms in its RLS docs that the service role bypasses every policy, so a service key in the bundle hands an attacker the entire database.

    Which builder gives more security guidance in the UI?

    The Security view in Lovable is the clearest practical difference between the two tools today. It surfaces a list of detected issues, links the offending file, and writes a suggested fix into the chat. That does not make the resulting app safe; it shortens the loop between a warning existing in the code and the developer actually seeing it.

    Bolt.new does not currently expose a comparable scan inside the StackBlitz IDE that powers it. A Bolt.new developer who wants the same level of pre publish review has to run a third party audit. That can be a local tool such as gitleaks for secret scanning, an OWASP MASTG aligned scan of the compiled bundle (when wrapped for a store), or an external scanner.

    Here is how the two compare on the surface area that matters most for production submission:

    SurfaceBolt.new (default)Lovable (default)
    Secret in client bundleCommon when asked to integrate Stripe or LLMsDetected by code scanner; still possible to override
    Supabase RLS policyNo built in checkRLS scanner flags missing or permissive policies
    Service role key handlingNo warning in UICode scanner flags presence in the front end
    Dependency CVE scanNone inside the IDEnpm audit runs as part of dependency check
    Pre publish gateNoneSecurity view runs before publish
    Auditable code exportYes, via StackBlitz containerYes, via GitHub sync
    Server side executionNetlify Functions, manually configuredSupabase Edge Functions, native pattern

    This is a snapshot of defaults. Both tools allow a developer to add proper server side handling, rotate keys, and harden RLS. The question is what happens when no one writes those prompts.

    How do the two compare for App Store and Google Play submission?

    A web app wrapped for the store (typically through Capacitor or a similar shell) inherits the same compiled binary scrutiny as any native build. Apple's App Review reads the bundle, looks for hardcoded keys, and treats a webview only experience as a candidate for Guideline 4.2 (minimum functionality) review. Google Play applies its Data Safety form and target API requirements to the wrapped APK the same way.

    For both Bolt.new and Lovable apps, the practical pre submission checklist is the same:

    1. Verify no secret (Stripe, OpenAI, Anthropic, service role) is reachable from the front end bundle.
    2. Confirm every Supabase table has RLS enabled and at least one policy tighter than using (true).
    3. Move privileged calls into an Edge Function (Lovable) or a serverless function (Bolt.new).
    4. Cross check the App Privacy Nutrition Label or Play Data Safety form against the SDKs the project actually pulls in.
    5. Test the wrapped build on real devices, not only in the browser.

    The OWASP MAS Project's MASVS controls apply to the wrapped binary regardless of how the source was generated. MASVS-STORAGE, MASVS-NETWORK, and MASVS-AUTH are the three categories most likely to be triggered by a vibe coded app, because the failure modes all sit at the boundary between the client and the data layer.

    For builders who want an external automated read of the compiled APK, AAB, or IPA before submission, PTKD.com (https://ptkd.com) is one of the platforms focused specifically on pre submission scanning aligned with OWASP MASVS for no code and AI generated apps. Lovable's Security view covers the source code; a scan of the compiled binary covers what the store reviewer actually sees.

    What to watch out for

    The biggest myth in the Bolt.new vs Lovable comparison is that picking the safer tool replaces a security pass. Both products list this caveat in their own docs. Lovable's documentation states plainly that its scanners do not replace a thorough security review for sensitive apps. Bolt.new does not promise more.

    A second myth is that the service role key is fine because it sits behind environment variables. A VITE_ or NEXT_PUBLIC_ prefix is inlined at build time. A key reachable from the browser has been published. Supabase notes the service key bypasses RLS, which means a single leak hands over the database.

    A third pitfall is treating the security scanner as a green light. The dev.to RLS audit demonstrates that even apps published from a builder with an active scanner can ship with permissive policies, because the developer was free to ignore the warning. The scanner is a reminder, not a release gate, and the App Review reviewer or the store's automated checks remain the actual gate.

    Key takeaways

    • Bolt.new and Lovable share the same Supabase backed threat model, and the same three failure modes dominate: secrets in the bundle, permissive RLS, and service role keys leaking to the browser.
    • Lovable's built in scanners cover RLS, schema, code, and dependencies; Bolt.new currently exposes none of those inside its IDE.
    • A web app wrapped for the App Store or Google Play is judged as a compiled binary, which means MASVS-STORAGE, MASVS-NETWORK, and MASVS-AUTH controls still apply at submission.
    • For an independent automated check of the compiled APK, AAB, or IPA before submission, PTKD.com runs OWASP MAS aligned scans aimed at no code and AI generated builds.
    • Picking a builder does not replace a security pass. The developer's prompts and post generation review decide whether the build is safe to ship.
    • #bolt.new
    • #lovable
    • #supabase
    • #rls
    • #production security
    • #ai-coded apps

    Frequently asked questions

    Is Lovable safer than Bolt.new for shipping to the App Store?
    Lovable's built in scanners catch more issues before publish, but the published RLS audits show roughly 89 percent of sampled Lovable apps still ship with missing or permissive policies. The marginal safety advantage is real but small. A compiled binary going to App Store Connect or Google Play needs a separate scan against MASVS-STORAGE and MASVS-NETWORK no matter which builder produced the source.
    Does Bolt.new ever embed my Stripe secret key in the browser bundle?
    Yes, in practice. When a Bolt.new prompt asks for a Stripe integration, the generated code commonly stores the secret key behind a VITE_ prefix and calls Stripe directly from the client. The Vite build inlines anything prefixed VITE_ into the final JavaScript. Per Stripe's keys best practices, the secret key must live on the server only; any client placement is a leak.
    Can I trust Lovable's Security view to catch every issue?
    Lovable's documentation states that its scanners do not replace a thorough security review. The view detects common patterns such as missing RLS, service role keys in code, and known CVEs in dependencies, but a developer can override the warnings and publish anyway. Treat the view as a first pass, not a release gate, especially for fintech, health, or identity apps.
    Do OWASP MASVS controls apply to a webview wrapper around a Bolt.new or Lovable app?
    Yes. Once the web app is wrapped through Capacitor or a similar shell and submitted to the App Store or Google Play, the compiled binary is judged by store reviewers and static analyzers the same way a native build would be. MASVS-STORAGE, MASVS-NETWORK, and MASVS-AUTH all apply. The Apple App Review process does not exempt webview shells from binary level scrutiny.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free