<?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: Andrei</title>
    <description>The latest articles on DEV Community by Andrei (@vibewrench).</description>
    <link>https://dev.to/vibewrench</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3811679%2Fce60b44d-3750-488b-abc9-6673cfdc5266.png</url>
      <title>DEV Community: Andrei</title>
      <link>https://dev.to/vibewrench</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vibewrench"/>
    <language>en</language>
    <item>
      <title>I pulled 50 system prompts from public GitHub repos and tested them for prompt injection vulnerabilities. Average score: 3.7/100. 70% had zero defenses. The best score was 28/100. Here's the full breakdown by attack category.</title>
      <dc:creator>Andrei</dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:48:59 +0000</pubDate>
      <link>https://dev.to/vibewrench/i-pulled-50-system-prompts-from-public-github-repos-and-tested-them-for-prompt-injection-3ao5</link>
      <guid>https://dev.to/vibewrench/i-pulled-50-system-prompts-from-public-github-repos-and-tested-them-for-prompt-injection-3ao5</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/vibewrench" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3811679%2Fce60b44d-3750-488b-abc9-6673cfdc5266.png" alt="vibewrench"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/vibewrench/i-tested-50-ai-app-prompts-for-injection-attacks-90-scored-critical-17aj" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Tested 50 AI App Prompts for Injection Attacks. 90% Scored CRITICAL.&lt;/h2&gt;
      &lt;h3&gt;Andrei ・ Mar 16&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#llm&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Tested 50 AI App Prompts for Injection Attacks. 90% Scored CRITICAL.</title>
      <dc:creator>Andrei</dc:creator>
      <pubDate>Mon, 16 Mar 2026 09:07:59 +0000</pubDate>
      <link>https://dev.to/vibewrench/i-tested-50-ai-app-prompts-for-injection-attacks-90-scored-critical-17aj</link>
      <guid>https://dev.to/vibewrench/i-tested-50-ai-app-prompts-for-injection-attacks-90-scored-critical-17aj</guid>
      <description>&lt;p&gt;So I spent last week doing something slightly unhinged. I pulled 50 system prompts out of public AI app repos on GitHub — just sitting there in the code, plain text — and ran every single one through a prompt injection scanner.&lt;/p&gt;

&lt;p&gt;The average score was &lt;strong&gt;3.7 out of 100&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Median? &lt;strong&gt;Zero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;35 out of 50 had no defenses at all. Not weak defenses. Not "could be better" defenses. Literally nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I got here
&lt;/h2&gt;

&lt;p&gt;Last week I published &lt;a href="https://dev.to/vibewrench/i-scanned-100-vibe-coded-apps-for-security-i-found-318-vulnerabilities-4dp7"&gt;results from scanning 100 vibe-coded apps&lt;/a&gt; for the usual security stuff — XSS, exposed secrets, missing auth. That was bad enough. But while I was going through those repos, I kept tripping over the same thing: system prompts just... sitting there. Zero guardrails. Not even a basic "don't reveal your instructions" line. Raw instructions to an LLM with zero thought given to what happens when a user decides to be creative with their input.&lt;/p&gt;

&lt;p&gt;I couldn't stop thinking about it. So I made it a project.&lt;/p&gt;

&lt;p&gt;Grabbed 50 AI-powered apps from public GitHub repos — chatbots, coding assistants, productivity tools, API agents — extracted their system prompts, ran each one through a scanner that tests 10 attack categories based on OWASP LLM Top 10 (specifically LLM01: Prompt Injection).&lt;/p&gt;

&lt;p&gt;The 10 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System Prompt Extraction&lt;/li&gt;
&lt;li&gt;Role Override&lt;/li&gt;
&lt;li&gt;Delimiter Escape&lt;/li&gt;
&lt;li&gt;Indirect Injection&lt;/li&gt;
&lt;li&gt;Output Manipulation&lt;/li&gt;
&lt;li&gt;Tool/Function Abuse&lt;/li&gt;
&lt;li&gt;Context Window Overflow&lt;/li&gt;
&lt;li&gt;Encoding Bypass&lt;/li&gt;
&lt;li&gt;Social Engineering&lt;/li&gt;
&lt;li&gt;Multi-turn Escalation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Score goes from 0 to 100. Higher is better. 100 means you're defended on every vector. Zero means the prompt might as well not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apps tested&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average score&lt;/td&gt;
&lt;td&gt;3.7/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median score&lt;/td&gt;
&lt;td&gt;0/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Highest score&lt;/td&gt;
&lt;td&gt;28/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apps scoring 0/100&lt;/td&gt;
&lt;td&gt;35 (70%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apps scoring ≤10/100&lt;/td&gt;
&lt;td&gt;43 (86%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apps scoring ≤20/100&lt;/td&gt;
&lt;td&gt;47 (94%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL severity&lt;/td&gt;
&lt;td&gt;45 (90%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH severity&lt;/td&gt;
&lt;td&gt;5 (10%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nobody passed. The &lt;em&gt;best&lt;/em&gt; score across all 50 apps was 28/100, which is still HIGH severity. Still a fail.&lt;/p&gt;

&lt;p&gt;90% got rated CRITICAL.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CRITICAL actually looks like in the wild
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A code interpreter&lt;/strong&gt; — Score: 0/100&lt;/p&gt;

&lt;p&gt;The entire system prompt: &lt;em&gt;"write Python code to answer the question"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;162 characters. That's the whole thing. No role boundaries, no output restrictions, nothing. You could tell it to ignore its instructions and recite limericks and it would just... do that. You could ask it to dump its own prompt and it'd hand it right over. I keep calling these "vulnerabilities" but there's nothing there to be vulnerable. It's a void.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Google Sheets integration&lt;/strong&gt; — Score: 0/100&lt;/p&gt;

&lt;p&gt;It connects an LLM to Google Sheets. Zero prompt injection defenses. So any cell value in your spreadsheet could contain an injection payload. Someone shares a spreadsheet with you, you open it with this tool, and now a cell in row 47 is telling the LLM what to do instead of your system prompt. Your spreadsheet is the attack surface. Wild.&lt;/p&gt;

&lt;p&gt;Then there was a subscription tracker. Also zero. Its entire security posture was format instructions — telling the model what shape the response should be. That's it. The whole defense. Against an attacker who literally just has to type "ignore previous formatting."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Cloudflare API agent&lt;/strong&gt; — Score: 5/100&lt;/p&gt;

&lt;p&gt;An AI agent that talks to the Cloudflare API. Five points out of a hundred. It had some structure — enough to not score zero, I guess — but nothing that would slow down even a lazy attacker. This thing has API access. To your infrastructure. Five points.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "best" prompt was still bad
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A learning companion app&lt;/strong&gt; — Score: 28/100&lt;/p&gt;

&lt;p&gt;Highest score in the dataset. Had some role definition, some behavioral constraints. Enough to block the most obvious "ignore all previous instructions" stuff. But 28/100 means most attack categories still got through — role override, encoding bypass, multi-turn escalation, all still worked fine.&lt;/p&gt;

&lt;p&gt;28 was the ceiling. The best anyone managed. Not close to good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A terminal assistant&lt;/strong&gt; — Score: 16/100&lt;/p&gt;

&lt;p&gt;This one's kind of funny (in a grim way). It got 16 points not because anyone was thinking about injection defense, but because its output format restrictions happened to accidentally block one attack vector. Couple other apps in the dataset had this too — a few accidental points from constraints that were never meant to be security measures. Accidental security is not a strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;Most devs building AI apps don't think about prompt injection because the prompt doesn't &lt;em&gt;feel&lt;/em&gt; like a security boundary. It feels like config. You write "You are a helpful assistant that..." and move on to the actual code. The interesting code. The UI, the API integration, the database schema. The prompt is an afterthought — last thing you write before you ship.&lt;/p&gt;

&lt;p&gt;I get it.&lt;/p&gt;

&lt;p&gt;But that prompt is the only thing separating user input from model behavior. It IS the security boundary, whether it looks like one or not. Prompt injection is OWASP LLM01 for a reason — it's the most common vulnerability class in LLM apps and the easiest to pull off.&lt;/p&gt;

&lt;p&gt;70% of the apps I tested had zero defense against it. Not "weak." Zero.&lt;/p&gt;

&lt;p&gt;And these apps aren't toys. People are shipping AI tools that connect to APIs, read files, access databases, send emails. The prompt is the one barrier between a malicious input and all those capabilities. In 35 out of 50 cases, there was no barrier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can actually do about it
&lt;/h2&gt;

&lt;p&gt;Not gonna pretend this is simple — prompt injection defense is hard and the attacks keep changing. But there are basics, and almost every app in this dataset skipped all of them.&lt;/p&gt;

&lt;p&gt;Start with role anchoring. Define what the model can and can't do. Repeat it. Not just a line at the top — reinforce it throughout the prompt. Models have short attention spans (sort of) and a single instruction at the beginning gets drowned out by a long conversation. Pair that with input/output boundaries — use delimiters, tell the model explicitly that user input is &lt;em&gt;data&lt;/em&gt;, not instructions. Will a determined attacker try to escape those delimiters? Sure. But you've moved from "zero effort to exploit" to "has to actually think about it," which filters out a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instruction hierarchy&lt;/strong&gt; — almost nobody does this and I don't get why. Tell the model explicitly: system instructions beat user input. Always. If there's a conflict, system wins. Put it in those exact words. I've seen maybe two prompts out of 50 that even attempted this.&lt;/p&gt;

&lt;p&gt;Then there's the boring-but-necessary layer: refusal patterns and output validation. On the prompt side, tell the model to refuse if someone tries to change its behavior or extract its instructions. On the code side — and this part isn't even LLM-specific — don't blindly trust model output before you hand it to a tool or API. You already sanitize user input (right?). Same thing here.&lt;/p&gt;

&lt;p&gt;You won't be bulletproof after this. But you'll go from 0/100 to somewhere defensible. The scanner I built also spits out a hardened version of your prompt after each scan — takes your original instructions and wraps them with these patterns so you don't have to figure out the wording yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I'm a solo indie dev. I built &lt;a href="https://vibewrench.dev/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=track2_prompts&amp;amp;utm_content=main_article" rel="noopener noreferrer"&gt;VibeWrench&lt;/a&gt; because I kept running into the same security gaps in AI-generated and AI-powered apps and nobody was making it easy to catch them. The prompt injection scanner is one piece of it — paste your system prompt, get scored on all 10 OWASP LLM01 categories, see exactly which attack vectors work against you, get a hardened prompt back.&lt;/p&gt;

&lt;p&gt;Free to scan. No signup for a basic scan.&lt;/p&gt;

&lt;p&gt;And look — I'm not trying to dunk on anyone whose repo ended up in this dataset. Most of these are side projects, experiments, people learning. I've shipped dumb stuff too. But the patterns I see in hobby repos are the exact same patterns showing up in production apps that handle real user data. Same "just tell the AI what to do" approach. Same empty defenses.&lt;/p&gt;

&lt;p&gt;If you're building anything with an LLM — &lt;em&gt;especially&lt;/em&gt; if it touches real data or calls real APIs — test your prompt. Takes five minutes. Beats being the example in someone's next blog post about AI security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vibewrench.dev/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=track2_prompts&amp;amp;utm_content=main_article" rel="noopener noreferrer"&gt;vibewrench.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about methodology? Think my scoring is wrong? Drop a comment, I'll respond to everything.&lt;/p&gt;

&lt;p&gt;— Andrei K.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Scanned 100 Vibe-Coded Apps for Security. I Found 318 Vulnerabilities.</title>
      <dc:creator>Andrei</dc:creator>
      <pubDate>Mon, 09 Mar 2026 19:46:28 +0000</pubDate>
      <link>https://dev.to/vibewrench/i-scanned-100-vibe-coded-apps-for-security-i-found-318-vulnerabilities-4dp7</link>
      <guid>https://dev.to/vibewrench/i-scanned-100-vibe-coded-apps-for-security-i-found-318-vulnerabilities-4dp7</guid>
      <description>&lt;p&gt;In early March I scanned 100 apps built with Lovable, Bolt.new, Cursor, and v0.dev.&lt;/p&gt;

&lt;p&gt;I wasn't looking for obscure zero-days. I was looking for the basics — missing CSRF protection, exposed API keys, no authentication. The stuff that gets you hacked on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;65% had security issues. 58% had at least one CRITICAL vulnerability.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;I ran automated security scans on 100 public GitHub repos built with AI coding tools. Here's what I found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;% of Apps&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Missing CSRF protection&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposed secrets or API keys&lt;/td&gt;
&lt;td&gt;41%&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poor error handling&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;🟡 WARNING&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing input validation&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;🟡 WARNING&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No authentication on endpoints&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing security headers&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;🟡 WARNING&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XSS vulnerabilities&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposed Supabase credentials&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;318 total vulnerabilities. 89 of them CRITICAL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Average Security Score: 65/100 — a D grade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That might sound "okay" until you realize 65% of apps scored below 70 (passing), and nearly half (47%) got a D.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Avg Score&lt;/th&gt;
&lt;th&gt;% With Issues&lt;/th&gt;
&lt;th&gt;% With CRITICAL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lovable&lt;/td&gt;
&lt;td&gt;58/100&lt;/td&gt;
&lt;td&gt;79%&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bolt.new&lt;/td&gt;
&lt;td&gt;66/100&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.dev&lt;/td&gt;
&lt;td&gt;71/100&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;75/100&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;These scores reflect individual apps, not the platforms themselves. The tools generate what you ask for — security is on you.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lovable apps were the most vulnerable — 10 out of 38 had Supabase credentials exposed directly in their code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scariest Find
&lt;/h2&gt;

&lt;p&gt;One Lovable app had its &lt;strong&gt;Supabase keys&lt;/strong&gt; — including the service role key — committed to the repo in a &lt;code&gt;.env&lt;/code&gt; file. Not the anon key. The &lt;strong&gt;service role&lt;/strong&gt; key. With that key, anyone can bypass Row Level Security and read every row in every table.&lt;/p&gt;

&lt;p&gt;The developer had no idea. They'd built the app in Lovable, it worked, they deployed it. Lovable didn't warn them. Why would it? It's a code generator, not a security auditor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;AI coding tools are incredible at generating working code. But "working" ≠ "secure."&lt;/p&gt;

&lt;p&gt;When you tell Lovable "connect to Supabase," it generates code that queries the database. It works. But it might commit the service key to source control, because the AI optimized for "make it work," not "make it safe."&lt;/p&gt;

&lt;p&gt;This isn't Lovable's fault. Or Bolt's. Or Cursor's. They're doing exactly what you asked — writing code that works. But nobody asked "also make it secure."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's where the gap is.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And it's not just Lovable or Bolt. Claude, ChatGPT, Cursor, Copilot — every AI code generator optimizes for "working," not "secure." I've built apps with Claude Code myself and found the same issues. This is an industry-wide problem, not a platform-specific one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;After seeing these results, I built &lt;a href="https://vibewrench.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=100apps&amp;amp;utm_content=main_article" rel="noopener noreferrer"&gt;VibeWrench&lt;/a&gt; — a tool that scans vibe-coded apps for security holes, speed issues, SEO problems, and more.&lt;/p&gt;

&lt;p&gt;It's designed for non-programmers. Instead of "Missing CSP header on response object," it says "Your website doesn't tell browsers to block suspicious scripts — like leaving your front door unlocked."&lt;/p&gt;

&lt;p&gt;For every problem it finds, it gives you a &lt;strong&gt;Fix Prompt&lt;/strong&gt; — a copy-paste prompt for Cursor or Claude that fixes the issue automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your first scan is free.&lt;/strong&gt; No signup required.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it checks (18 tools):
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; exposed keys, XSS, CSRF, missing auth, input validation, security headers&lt;br&gt;
&lt;strong&gt;Prompt Injection Scanner:&lt;/strong&gt; test your AI app's system prompt against 10 attack categories (OWASP LLM01)&lt;br&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; Lighthouse analysis in plain English — why your site takes 8 seconds&lt;br&gt;
&lt;strong&gt;SEO:&lt;/strong&gt; missing meta tags, no sitemap, "Vite App" as page title (63% of vibe-coded apps fail basic SEO)&lt;br&gt;
&lt;strong&gt;Accessibility:&lt;/strong&gt; WCAG 2.1 compliance, missing alt tags, form labels&lt;br&gt;
&lt;strong&gt;Legal:&lt;/strong&gt; GDPR-ready privacy policy and terms (5 questions → done)&lt;br&gt;
&lt;strong&gt;And more:&lt;/strong&gt; error translation, deploy guides, code explainer, cost forecasting...&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;If you built an app with AI and deployed it without a security check — you probably have at least 3 of the issues above. The average app had 3.2 findings. I'm not saying this to scare you (ok, maybe a little). I'm saying this because it's fixable. In most cases, 10 minutes with the right prompts and you're good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://vibewrench.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=100apps&amp;amp;utm_content=main_article" rel="noopener noreferrer"&gt;vibewrench.dev&lt;/a&gt; — paste your GitHub URL or site URL, get results in 30 seconds.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a solo developer building tools for the vibe coding community. If you have questions or found something weird in your scan, drop a comment — I read everything.&lt;/em&gt;&lt;/p&gt;

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