<?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: ridhika Goel</title>
    <description>The latest articles on DEV Community by ridhika Goel (@ridhika_g).</description>
    <link>https://dev.to/ridhika_g</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%2F3962136%2F91c4fb53-2ce4-4a1e-bac7-02070da42ef9.png</url>
      <title>DEV Community: ridhika Goel</title>
      <link>https://dev.to/ridhika_g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ridhika_g"/>
    <language>en</language>
    <item>
      <title>5 Security Holes Every Vibe Coded App Ships With (and the Fix)</title>
      <dc:creator>ridhika Goel</dc:creator>
      <pubDate>Wed, 03 Jun 2026 06:15:32 +0000</pubDate>
      <link>https://dev.to/ridhika_g/5-security-holes-every-vibe-coded-app-ships-with-and-the-fix-399o</link>
      <guid>https://dev.to/ridhika_g/5-security-holes-every-vibe-coded-app-ships-with-and-the-fix-399o</guid>
      <description>&lt;p&gt;Vibe coded apps do not fail because the AI writes broken code. They fail because the AI writes the happy path and silently skips the adversarial one. Here are the five holes I see most, mapped to what they actually are and how to close them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Wide open data access (broken object level authorization)
&lt;/h2&gt;

&lt;p&gt;Builders that sit on Supabase or similar often ship with row level security off or permissive. The UI scopes per user, the database does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; rely on client side filtering to keep data private.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; enable RLS and write policies so &lt;code&gt;user_id = auth.uid()&lt;/code&gt; is enforced at the database, not in the query.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Missing function and object level authZ (IDOR)
&lt;/h2&gt;

&lt;p&gt;Authentication is present, authorization is not. The classic tell is an endpoint that trusts a path or body parameter without checking ownership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; &lt;code&gt;if (loggedIn) return record(id)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; &lt;code&gt;if (loggedIn &amp;amp;&amp;amp; record.owner === user.id) return record(id)&lt;/code&gt; on every route, including the ones you think nobody will find.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Secrets in the client or in git
&lt;/h2&gt;

&lt;p&gt;API keys land in client bundles or get committed. Once public, they are scraped within minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; keys in frontend env vars shipped to the browser, or committed &lt;code&gt;.env&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; secrets live server side only, in a secrets manager, with the key rotated if it was ever exposed. Proxy third party calls through your backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Unvalidated input and prompt injection
&lt;/h2&gt;

&lt;p&gt;User input flows straight into the model or the data layer. That is prompt injection on the AI side and injection or XSS on the classic side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; concatenate user text into the prompt or query and trust it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; validate and constrain input, parameterise queries, and separate system instructions from user content so user text cannot override your rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. No rate limiting or spend cap (denial of wallet)
&lt;/h2&gt;

&lt;p&gt;Unmetered AI endpoints are a billing time bomb. One script can cost you thousands overnight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; assume organic, human traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; per user and per IP rate limits, plus a hard spend cap and alerting, configured before launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The throughline
&lt;/h2&gt;

&lt;p&gt;Every one of these is the gap between "works when used nicely" and "holds when attacked." No builder closes them for you. They are architecture and ownership decisions, which is the part no 20 minute demo makes.&lt;/p&gt;

&lt;p&gt;Full prompt to production checklist coming next.&lt;/p&gt;

&lt;p&gt;Ridhika | Prompt to Production&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>webdev</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>I Tested 5 AI App Builders for What Actually Ships (Not Demos)</title>
      <dc:creator>ridhika Goel</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:10:01 +0000</pubDate>
      <link>https://dev.to/ridhika_g/i-tested-5-ai-app-builders-for-what-actually-ships-not-demos-eg4</link>
      <guid>https://dev.to/ridhika_g/i-tested-5-ai-app-builders-for-what-actually-ships-not-demos-eg4</guid>
      <description>&lt;p&gt;The "build an app in 20 minutes" demos are real. The problem is they stop at the exact point engineering begins. So I gave five AI builders the same brief and graded them on production reality, not on the first pretty screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The brief&lt;/strong&gt;: signup and login, per user private data, a subscription payment, and an AI feature that must not hallucinate. The four things every demo skips and every real app needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I actually checked under the hood:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth.&lt;/strong&gt; Not "is there a login screen" but is it real authentication and authorization. Can user A reach user B's rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data layer.&lt;/strong&gt; Is the schema sane. Are there constraints, or just a table the model guessed at.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI correctness.&lt;/strong&gt; Is there any grounding, or does the model freely invent facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security.&lt;/strong&gt; Input validation, secrets handling, and the one everyone forgets, prompt injection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; What does one request cost, and what happens to that number at a thousand users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The results, demo score versus ships score, with the builder truth a demo hides:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lovable&lt;/strong&gt; 10 / 4. Built on Supabase. The trap: row level security is frequently left permissive or off, so the happy path works while every authenticated user can query every other user's rows. First thing a builder audits is the RLS policy. Edits are also not surgical, a small request can regenerate whole files and silently revert your manual fixes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt&lt;/strong&gt; 9 / 4. Runs in WebContainers, a browser based runtime, not your target server. Native deps and some backend behaviour differ from a real deploy, so passing in Bolt is not passing in prod. Token burn is high.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v0&lt;/strong&gt; 8 / 3. Outputs idiomatic React, Next, Tailwind and shadcn. Genuinely good handoff code, which is exactly the point, it stops at the component boundary. Server actions, data layer and auth are yours to wire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replit&lt;/strong&gt; 7 / 7. Real Postgres, a secrets manager, a shell, readable logs and one click deploy. The closest thing to a real environment. Watch the always on deployment cost and the agent checkpoint usage, neither is free at scale, and defaults are not tuned for load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; 6 / 8. A VS Code fork operating on your actual repo and git, so every AI diff is reviewable and revertable. Context is manual, it only sees the files you feed it, and rules files matter. No database, hosting or deploy, that stays your stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The pattern:&lt;/strong&gt; demo score and ships score are almost inversely correlated. The tools optimised to impress are not the tools optimised to survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that matters most: stop the model inventing facts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; let the LLM decide the answer and hope the prompt holds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; compute the answer deterministically in your backend, then let the LLM only phrase it.&lt;/p&gt;

&lt;p&gt;On one product I shipped, the backend calculates the real result and the model is reduced to a narrator. It physically cannot hallucinate the core output. No builder gives you this for free. It is an architecture decision, and architecture is the thing no 20 minute demo makes for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway for engineers:&lt;/strong&gt; none of these tools ship your app. They generate a starting point. Auth, data integrity, evals, security, cost control and a safe rollout are still yours. I have shipped more than one AI product, and the builder was never the hard part. Use the tool for the 5 percent. Own the 95 percent.&lt;/p&gt;

&lt;p&gt;Ridhika | Prompt to Production&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How LLMs Actually Work: The Explanation Nobody Else Gives You</title>
      <dc:creator>ridhika Goel</dc:creator>
      <pubDate>Mon, 01 Jun 2026 06:55:00 +0000</pubDate>
      <link>https://dev.to/ridhika_g/how-llms-actually-work-the-explanation-nobody-else-gives-you-j8d</link>
      <guid>https://dev.to/ridhika_g/how-llms-actually-work-the-explanation-nobody-else-gives-you-j8d</guid>
      <description>&lt;p&gt;How to make LLMs deterministic, in plain English. The version I share with founders and product teams before they make decisions worth real money.&lt;/p&gt;

&lt;p&gt;You use AI tools every day. But can you explain what happens when you hit send?&lt;/p&gt;

&lt;p&gt;Most people cannot. And that gap is costing them. Bad prompts. Broken products. Decisions made on the wrong assumptions.&lt;/p&gt;

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

&lt;p&gt;Every LLM explainer out there is written for researchers or so basic it tells you nothing useful. Neither helps you build better products or work with AI more effectively.&lt;/p&gt;

&lt;p&gt;This is the version I share with senior leaders, founders, and product teams before they make decisions worth real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It Is Not a Search Engine. It Is Not a Database. It Is a Prediction Machine.
&lt;/h2&gt;

&lt;p&gt;When you type a prompt and hit send, the LLM is not finding an answer from somewhere. It is predicting the most likely words to follow your input. Based on patterns it learned from billions of documents.&lt;/p&gt;

&lt;p&gt;That is the whole process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; "The AI knows the answer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; "The AI predicts the most likely answer based on what it has seen."&lt;/p&gt;

&lt;p&gt;This changes everything about how you use it. When an AI gives you a wrong answer confidently, it is not broken. It is doing exactly what it was built to do. Predict. Not verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Autocomplete Comparison (And Why It Only Gets You Halfway)
&lt;/h2&gt;

&lt;p&gt;You have probably heard the phrase "autocomplete on steroids." It is not wrong. But it misses something important.&lt;/p&gt;

&lt;p&gt;Your phone autocomplete learned from your messages. An LLM learned from most of the written internet. Books. Research papers. Code. Billions of examples.&lt;/p&gt;

&lt;p&gt;At that scale, the patterns start to look a lot like real thinking. Not because the model understands in the way you do. Because it has seen so much that it can predict what a good answer looks like.&lt;/p&gt;

&lt;p&gt;When I was building AstroNayak I fed Vedic astrology principles into the system prompt. The LLM produced interpretations that genuinely surprised me. It did not know Vedic astrology. It had seen enough of it to predict what a good interpretation would sound like. In practice, that is very useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Same Question Can Give You Different Answers
&lt;/h2&gt;

&lt;p&gt;Here is something most people never realise. An LLM is not deterministic. That means you can ask it the exact same question twice and get two different answers.&lt;/p&gt;

&lt;p&gt;This is by design. When the model predicts the next word, it is not always picking the single most likely one. It often picks from a range of likely options, with a little randomness added. That randomness is what makes the writing feel natural instead of robotic.&lt;/p&gt;

&lt;p&gt;But it has a real cost when you are building products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; "I tested it once and it worked, so it will always work."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; "It gave a good answer once. I need to test it many times to trust it."&lt;/p&gt;

&lt;p&gt;This is why you cannot test an AI feature the way you test normal software. Normal code gives the same output every time. An LLM does not. If your product breaks when the answer comes out slightly different, you have a problem you need to design around from day one.&lt;/p&gt;

&lt;p&gt;I fixed this for AstroNayak readings. Here is how. &lt;br&gt;
Most AI astrology tools ask an LLM to guess your chart. AstroNayak does not as the Vedic astrology rules are deterministically coded in the backend, so the AI only interprets what the engine has already calculated. No hallucinated planets. No invented predictions. That is where you constrain a model and change it from probabilistic to deterministic.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Context Window: The Most Misunderstood Idea in AI
&lt;/h2&gt;

&lt;p&gt;The context window is everything the model can see at one time. Think of it as short term memory, not long term memory. When a conversation goes past the limit, earlier parts disappear completely.&lt;/p&gt;

&lt;p&gt;This is why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLMs forget things you said earlier in long conversations&lt;/li&gt;
&lt;li&gt;You need to give the model your documents directly if you want it to use them&lt;/li&gt;
&lt;li&gt;Bigger context windows cost more because every word gets processed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt; "The AI should remember what I told it last week."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt; "Memory does not exist by default. It is something I have to build in."&lt;/p&gt;

&lt;p&gt;Every AI product that broke because "it forgot the instructions" is a context window problem. Not a model problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why It Makes Things Up (And Why That Will Not Change)
&lt;/h2&gt;

&lt;p&gt;Everyone calls it hallucination. A better way to think about it is this. The model made a confident prediction without real facts to back it up.&lt;/p&gt;

&lt;p&gt;The model is built to produce clear smooth text. It has no built in signal that says "I do not know this." So when you ask about something it has not seen enough of, it produces the most likely sounding answer anyway.&lt;/p&gt;

&lt;p&gt;The fix is not a better model. The fix is how you build around it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give the model the facts you need it to use&lt;/li&gt;
&lt;li&gt;Ask for structured outputs so it cannot wander away from the answer&lt;/li&gt;
&lt;li&gt;Add checks that catch wrong answers before users see them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between a prototype and a real product. A prototype trusts the model. A real product does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What This Means When You Are Building With AI
&lt;/h2&gt;

&lt;p&gt;Five questions I ask before any AI product decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What happens when the prediction is wrong? Plan for it now.&lt;/li&gt;
&lt;li&gt;What happens when the same question gives a different answer? Test for it. Evals, evals, evals.&lt;/li&gt;
&lt;li&gt;What does the model need in front of it to give a good answer? Put that there.&lt;/li&gt;
&lt;li&gt;Am I asking it to find something or reason through something? These need different approaches.&lt;/li&gt;
&lt;li&gt;Have I defined what a good output looks like? Clear formats reduce almost every failure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AstroNayak works because I stopped treating the LLM as a mystery box and started treating it as a very capable prediction engine that needs good inputs and clear guardrails.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;LLMs are prediction engines. Not knowledge stores. And they will not give you the same answer twice. Build with that understanding and half your AI product problems disappear before you write a line of code.&lt;/p&gt;

&lt;p&gt;Next issue: RAG explained simply. Why every serious AI product uses it and whether you need it.&lt;/p&gt;

&lt;p&gt;Ridhika | The AIPM Lab | astronayak.com&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>product</category>
    </item>
  </channel>
</rss>
