<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Banker</title>
    <description>The latest articles on DEV Community by John Banker (@getvibekits).</description>
    <link>https://dev.to/getvibekits</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4195209%2F673a0dfb-67d5-46aa-9068-1ed467fbdc63.png</url>
      <title>DEV Community: John Banker</title>
      <link>https://dev.to/getvibekits</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/getvibekits"/>
    <language>en</language>
    <item>
      <title>A 12-point security checklist for vibe-coded apps (with prompts you can paste)</title>
      <dc:creator>John Banker</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:13:13 +0000</pubDate>
      <link>https://dev.to/getvibekits/a-12-point-security-checklist-for-vibe-coded-apps-with-prompts-you-can-paste-508p</link>
      <guid>https://dev.to/getvibekits/a-12-point-security-checklist-for-vibe-coded-apps-with-prompts-you-can-paste-508p</guid>
      <description>&lt;p&gt;I'm a dad in north Georgia, building apps with AI coding tools and learning as I go. The scariest thing I've learned is that an app can &lt;em&gt;work&lt;/em&gt; perfectly and still let anybody read everybody's data.&lt;/p&gt;

&lt;p&gt;Most security problems in AI-built apps are the same handful: tables anyone can read, secret keys in the front end, routes that don't check who's asking, and prices the browser can change. Here's the checklist I run before I publish anything. Each check has a prompt you can paste into Lovable, Bolt, Base44, Cursor or Claude Code to check it for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a beginner checklist, not a professional audit. If your app takes payments or stores sensitive data, pay a human to look at it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Run the built-in scan first.&lt;/strong&gt; Lovable runs a quick security scan on publish and offers a deeper scan, and Base44 has a security scan too. Both vendors' docs say the scans don't replace reviewing your own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-shot review prompt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before I publish, do a security review of this app. Don't change anything yet.
Check: row-level security / data permissions on every table, secret keys in front-end code, storage bucket access, server-side user checks on every route, where prices and "paid" status are set, rate limits on anything that sends email or calls a paid API, and what error messages show.
List each problem as Critical, Warning or Info, with a one-sentence fix. Then wait for me to pick what to fix first.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The 12 checks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Every table has row-level security.&lt;/strong&gt; With Supabase (and Lovable Cloud, which is built on it), the key in your front end is public. RLS is what stops one user from reading everyone's rows. In Base44, data permissions do the same job.&lt;br&gt;
&lt;code&gt;List every table and whether row-level security is on, with its policies in plain English. Flag any table where a user could read or change another user's rows.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No secret keys in front-end code.&lt;/strong&gt; Anything with a &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;, &lt;code&gt;VITE_&lt;/code&gt; or &lt;code&gt;EXPO_PUBLIC_&lt;/code&gt; prefix ships to every visitor's browser. Service-role keys, Stripe secret keys and AI API keys must stay on the server.&lt;br&gt;
&lt;code&gt;Search the front-end code and environment variables for secret keys (service role, Stripe secret, OpenAI or other API keys). Tell me each one you find and where it should move.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;.env&lt;/code&gt; is in &lt;code&gt;.gitignore&lt;/code&gt;, and leaked keys get replaced.&lt;/strong&gt; If a key was ever committed, deleting the file isn't enough. It's still in git history, so rotate the key.&lt;br&gt;
&lt;code&gt;Check that .env is listed in .gitignore and search the git history for committed keys. Don't rewrite history; just tell me which keys to rotate.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The server checks who the user is on every request.&lt;/strong&gt; Hiding a button isn't security. Never trust a user id sent from the browser.&lt;br&gt;
&lt;code&gt;For every API route or edge function, tell me whether it checks the logged-in user on the server and whether it trusts any id sent from the browser.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Prices come from the server, and payment is confirmed by webhook.&lt;/strong&gt; If the browser sends the price, someone will send $0. If "paid" gets set when a user opens &lt;code&gt;/success&lt;/code&gt;, anyone can open that URL.&lt;br&gt;
&lt;code&gt;Show me where the checkout price is set and where a user gets marked as paid. Both must happen on the server, and paid status must come from the payment provider's webhook.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. File storage is private.&lt;/strong&gt; Public buckets are easy to create by accident.&lt;br&gt;
&lt;code&gt;List every storage bucket, whether it's public or private, and who can read and upload files in each.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Login is solid.&lt;/strong&gt; Use the platform's built-in auth, and turn on email confirmation and leaked-password protection where they exist.&lt;br&gt;
&lt;code&gt;Review sign-up, log-in and password reset. Is email confirmation on? Is leaked-password protection on? Can a logged-out user reach any private page?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Anything that costs you money is rate-limited.&lt;/strong&gt; Endpoints that send email or SMS, or call a paid AI API, can be hammered by a bot.&lt;br&gt;
&lt;code&gt;List every endpoint that sends email/SMS or calls a paid API, and whether it requires login and has a rate limit.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. User input is checked before it's used.&lt;/strong&gt; Validate it (for example with zod) before it reaches a query, file path, email or AI prompt.&lt;br&gt;
&lt;code&gt;Find every place user input reaches a database query, file path, email or AI prompt, and tell me whether it's validated first.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Dependencies have no known holes.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Run npm audit (or the platform's dependency check) and summarize anything high or critical, with the smallest safe upgrade for each.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Errors don't spill secrets.&lt;/strong&gt; Show users a friendly message and log the details privately.&lt;br&gt;
&lt;code&gt;Check what a user sees when something fails. Make sure no stack traces, SQL errors or keys are shown on screen or returned by the API.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. You can undo.&lt;/strong&gt; Version history in your builder, commits in git, and a database backup.&lt;br&gt;
&lt;code&gt;Tell me how I'd roll back the app and the database to yesterday's version if something went wrong after launch.&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Stop it happening in the first place
&lt;/h2&gt;

&lt;p&gt;Put these lines in your rules file (AGENTS.md, CLAUDE.md, a Cursor rule, or Lovable/Bolt Project Knowledge) so the AI builds it safely the first time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Security rules
- Every new table gets row-level security with explicit policies in the same change. Users only see their own rows unless I say otherwise.
- Secret keys live only in server-side environment variables or the platform's Secrets. Never in front-end code, never with a NEXT_PUBLIC_, VITE_ or EXPO_PUBLIC_ prefix, never in git.
- Every API route or function checks the logged-in user on the server. Never trust a user id from the browser.
- Prices are set on the server. A user is marked as paid only by the payment provider's webhook.
- Storage buckets are private unless I ask for public.
- Validate all user input before it reaches a query, file path, email or AI prompt.
- Ask before changing auth, payments, permissions or the database structure.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What did I miss? If you've been bitten by something that isn't on this list, tell me in the comments and I'll add it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I wrote this up on my own site, VibeKits, where it has the sources (Lovable, Base44, Supabase, Next.js and Stripe docs) and stack-specific versions: &lt;a href="https://getvibekits.com/rules/vibe-coding-security-checklist/" rel="noopener noreferrer"&gt;https://getvibekits.com/rules/vibe-coding-security-checklist/&lt;/a&gt; . It's free, with no signup. I also sell a few build kits there, but nothing above needs them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
