<?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: shan kulkarni</title>
    <description>The latest articles on DEV Community by shan kulkarni (@shan_kulkarni).</description>
    <link>https://dev.to/shan_kulkarni</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%2F3924534%2F49ed1fed-df7a-472c-9c6e-9723e3acf375.jpg</url>
      <title>DEV Community: shan kulkarni</title>
      <link>https://dev.to/shan_kulkarni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shan_kulkarni"/>
    <language>en</language>
    <item>
      <title>Hello, world</title>
      <dc:creator>shan kulkarni</dc:creator>
      <pubDate>Tue, 12 May 2026 10:36:51 +0000</pubDate>
      <link>https://dev.to/shan_kulkarni/hello-world-lnd</link>
      <guid>https://dev.to/shan_kulkarni/hello-world-lnd</guid>
      <description>&lt;p&gt;I learned most of what I know from people who had no reason to share it but did anyway. A blog post from some engineer explaining exactly the bug I'd been stuck on. A Stack Overflow answer that saved me an afternoon. Source code I could read and actually learn from.&lt;/p&gt;

&lt;p&gt;That's the whole reason I'm doing this.&lt;/p&gt;

&lt;p&gt;I've spent over a decade building things - web, mobile, SaaS, backends that had to hold up under real load, and more recently AI. A lot of that knowledge just sits in my head, or in Slack threads from three jobs ago that nobody's going back to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm writing
&lt;/h2&gt;

&lt;p&gt;Free, public writing by other engineers is how I got here. No course, no bootcamp - mostly just people who decided their knowledge was worth putting on the internet. I'm not where I am without that.&lt;/p&gt;

&lt;p&gt;So I'm putting mine out there too. If something I write saves someone a few hours on a problem I've already solved, that's a good enough reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'll cover
&lt;/h2&gt;

&lt;p&gt;Ten years across a lot of different terrain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web and mobile product development&lt;/li&gt;
&lt;li&gt;SaaS - building it, scaling it, keeping it alive&lt;/li&gt;
&lt;li&gt;Backend systems and what happens when they break under load&lt;/li&gt;
&lt;li&gt;AI integrations - what's actually useful and what isn't&lt;/li&gt;
&lt;li&gt;The stuff that doesn't fit neatly anywhere: decisions, tradeoffs, hiring, the unglamorous parts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real version. Not the retelling where everything worked out.&lt;/p&gt;

&lt;h2&gt;
  
  
  How often
&lt;/h2&gt;

&lt;p&gt;When I have something worth saying. Not on a schedule.&lt;/p&gt;




&lt;p&gt;If you want to follow along, there's an &lt;a href="///rss.xml"&gt;RSS feed&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>meta</category>
      <category>writing</category>
    </item>
    <item>
      <title>Your AI-generated code works. It's probably not production ready.</title>
      <dc:creator>shan kulkarni</dc:creator>
      <pubDate>Tue, 12 May 2026 10:10:49 +0000</pubDate>
      <link>https://dev.to/shan_kulkarni/your-ai-generated-code-works-its-probably-not-production-ready-2lbd</link>
      <guid>https://dev.to/shan_kulkarni/your-ai-generated-code-works-its-probably-not-production-ready-2lbd</guid>
      <description>&lt;p&gt;Shipping features with Claude Code or Cursor is fast now. Getting that code to hold up in production is a separate problem entirely. AI reduces implementation time. It does not produce production engineering.&lt;/p&gt;

&lt;p&gt;I went through 8 AI-generated production apps. They all had roughly the same issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase RLS misconfigured&lt;/li&gt;
&lt;li&gt;secrets sitting in the codebase&lt;/li&gt;
&lt;li&gt;no rate limiting, no caching&lt;/li&gt;
&lt;li&gt;bad data structures&lt;/li&gt;
&lt;li&gt;components re-rendering constantly&lt;/li&gt;
&lt;li&gt;AI features open to prompt injection and RAG attacks&lt;/li&gt;
&lt;li&gt;basically no tests around anything important&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of them worked. Hardly any were production ready.&lt;/p&gt;

&lt;p&gt;A year ago, writing code was the bottleneck. Now it's reviewing and hardening what got generated. That's a different skill, and most teams aren't there yet.&lt;/p&gt;

&lt;p&gt;The reason this keeps happening: AI is excellent at extending local patterns. It's much worse at understanding long-term system boundaries, scaling behavior, and operational risk. It generates code that looks right in isolation and breaks under real conditions.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fgxp0ybq3j5oy75y1ifqd.png" class="article-body-image-wrapper"&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%2Farticles%2Fgxp0ybq3j5oy75y1ifqd.png" alt="Production review flow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Six things I look at before calling AI-generated code production ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;This is where things go quietly wrong. The code compiles, tests pass, and then someone finds a misconfigured auth check six months later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth flows: does every protected route actually verify the session? Are role checks on the server, not just the client?&lt;/li&gt;
&lt;li&gt;Exposed secrets: API keys in frontend code, &lt;code&gt;.env&lt;/code&gt; values hardcoded as fallbacks, secrets logged during error handling&lt;/li&gt;
&lt;li&gt;Injection risks: SQL, command, and path injection in any user-controlled inputs&lt;/li&gt;
&lt;li&gt;LLM prompt injection: if your app passes user input into an AI prompt, can a user rewrite what the AI does?&lt;/li&gt;
&lt;li&gt;RAG document injection: can a user upload a document that manipulates your AI's behavior?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quality
&lt;/h2&gt;

&lt;p&gt;Happy path works fine. The edges are where it falls apart.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dead code and unused imports — AI generates confidently, including things it never wires up&lt;/li&gt;
&lt;li&gt;Weak typing: &lt;code&gt;any&lt;/code&gt; used to paper over uncertainty, missing null checks, unsafe type assertions&lt;/li&gt;
&lt;li&gt;Anti-patterns: misused hooks, unnecessary useEffects, logic in the wrong layer&lt;/li&gt;
&lt;li&gt;Architecture drift: after 50 prompts, does the codebase still follow the same conventions it started with?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;AI-generated code tends to duplicate logic instead of abstracting correctly, miss caching layers entirely, and generate DB access patterns that work fine in development and fall apart under load.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow queries: missing indexes, N+1 patterns, fetching more columns than the page needs&lt;/li&gt;
&lt;li&gt;Cold starts: heavy dependencies, unoptimized bundles, serverless functions loading too much on init&lt;/li&gt;
&lt;li&gt;Render cascades: components re-rendering on every state change because nothing is memoized&lt;/li&gt;
&lt;li&gt;Heavy bundles: entire libraries pulled in at the top level when one function was needed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Compliance
&lt;/h2&gt;

&lt;p&gt;Some of this is stack-specific. PII handling isn't.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment flows: are Stripe webhooks handled correctly? Any card data stored that shouldn't be?&lt;/li&gt;
&lt;li&gt;App Store: are in-app purchases routed right? Anything that'll get the app rejected on review?&lt;/li&gt;
&lt;li&gt;Data handling: GDPR basics — deletion, consent, data residency for EU users&lt;/li&gt;
&lt;li&gt;PII and external APIs: are you sending user data to an AI API you haven't agreed to share it with?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;There are usually tests. They usually test the wrong things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical paths: auth, payments, data writes — the flows that actually hurt users when they fail&lt;/li&gt;
&lt;li&gt;Are tests checking behavior, or just that the function runs without throwing?&lt;/li&gt;
&lt;li&gt;Are edge cases there, or just the happy path the AI was given in the prompt?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Observability
&lt;/h2&gt;

&lt;p&gt;Most AI-generated codebases have none. Everything's fine locally. Then it breaks in production and there's nothing to look at.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error tracking: are exceptions being captured, or swallowed silently?&lt;/li&gt;
&lt;li&gt;Logging: structured and useful, or just &lt;code&gt;console.log&lt;/code&gt; statements scattered around?&lt;/li&gt;
&lt;li&gt;Alerting: do you find out when something breaks, or do users tell you?&lt;/li&gt;
&lt;li&gt;Tracing: for AI calls and external APIs, can you follow a request end to end?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Most teams are treating code generation and code review as the same problem. They're not. The faster teams ship with AI, the faster review debt accumulates — and most teams have no process for it yet.&lt;/p&gt;

&lt;p&gt;That's why I built Vibe Audit. It runs this audit automatically across your codebase and surfaces production risks before they become incidents. &lt;a href="https://github.com/Shankulkarni/vibe-audit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ran it on a real app. This is what came back.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fvc3wm4hrtdltckp1rcoj.png" class="article-body-image-wrapper"&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%2Farticles%2Fvc3wm4hrtdltckp1rcoj.png" alt="Vibe Audit sample report" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>security</category>
      <category>codereview</category>
    </item>
  </channel>
</rss>
