<?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>Why Country/State/City Pickers Are Weirdly Hard</title>
      <dc:creator>shan kulkarni</dc:creator>
      <pubDate>Sat, 23 May 2026 04:21:40 +0000</pubDate>
      <link>https://dev.to/shan_kulkarni/why-countrystatecity-pickers-are-weirdly-hard-1ci1</link>
      <guid>https://dev.to/shan_kulkarni/why-countrystatecity-pickers-are-weirdly-hard-1ci1</guid>
      <description>&lt;p&gt;Every time I see this on a wireframe, I lie to myself.&lt;/p&gt;

&lt;p&gt;"Yeah, that's easy."&lt;/p&gt;

&lt;p&gt;Three dropdowns. Country → State → City.&lt;/p&gt;

&lt;p&gt;Then three days disappear.&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%2Fshankulkarni.com%2Fimages%2Fblog%2Fcountry-state-city-picker%2Fpicker.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%2Fshankulkarni.com%2Fimages%2Fblog%2Fcountry-state-city-picker%2Fpicker.png" alt="Country state city picker" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  It starts innocent
&lt;/h2&gt;

&lt;p&gt;Select a country, load states, select a state, load cities.&lt;/p&gt;

&lt;p&gt;Then: Singapore has no states. Some countries call them provinces. Some APIs return empty arrays. A handful aren't in the dataset at all depending on which source you're pulling from.&lt;/p&gt;

&lt;p&gt;Product wants search because nobody scrolls 195 countries on mobile. Then keyboard nav. Loading states. Error handling for when the city call fails mid-form. Caching so you're not hammering the API on every keystroke.&lt;/p&gt;

&lt;p&gt;None of it is hard. It just keeps accumulating. By the third project you're copy-pasting code from your last one and hoping nothing changed. By the fifth you're a little angry.&lt;/p&gt;




&lt;h2&gt;
  
  
  The data is the actual problem
&lt;/h2&gt;

&lt;p&gt;Country and city names feel stable until you work with them. Turkey officially became Türkiye in 2022. Cities get renamed. The Philippines has over 1,600 municipalities and that number moves. Some datasets recognize Kosovo. Others don't.&lt;/p&gt;

&lt;p&gt;Most npm packages I tried were one of two things: a component sitting on a JSON file nobody had touched in two years, or solid current data with no UI layer at all.&lt;/p&gt;

&lt;p&gt;Five rebuilds in, I stopped pretending this was handled.&lt;/p&gt;




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

&lt;p&gt;I built &lt;code&gt;react-country-state-city-picker&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cascading logic, search, loading states, countries without states, keyboard nav, caching, dark/light mode. There's a single &lt;code&gt;&amp;lt;CountryStateCityPicker&amp;gt;&lt;/code&gt; if you want the whole thing wired up, individual pickers if you only need one level, and headless hooks if you want your own UI. No dependencies outside React 18.&lt;/p&gt;

&lt;p&gt;I wasn't trying to build something clever. I wanted a picker I could install and not think about again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-country-state-city-picker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryStateCityPicker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-country-state-city-picker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ShippingForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CountryStateCityPicker&lt;/span&gt;
      &lt;span class="na"&gt;onCountryChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onStateChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onCityChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the basic setup. Individual pickers and custom render props are there if you need them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;MIT licensed, on GitHub: &lt;a href="https://github.com/Shankulkarni/react-country-state-city-picker" rel="noopener noreferrer"&gt;react-country-state-city-picker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've rebuilt this before, you know what it's worth.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://shankulkarni.com/blog/country-state-city-picker" rel="noopener noreferrer"&gt;shankulkarni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>react</category>
      <category>frontend</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Stop Paying Twice for Claude: Use Your Subscription Like an API</title>
      <dc:creator>shan kulkarni</dc:creator>
      <pubDate>Fri, 15 May 2026 13:58:21 +0000</pubDate>
      <link>https://dev.to/shan_kulkarni/stop-paying-twice-for-claude-use-your-subscription-like-an-api-1nd8</link>
      <guid>https://dev.to/shan_kulkarni/stop-paying-twice-for-claude-use-your-subscription-like-an-api-1nd8</guid>
      <description>&lt;p&gt;A lot of developers are doing this without realizing it: paying for Claude Pro/Max and separately buying Anthropic API credits for small automation work. For production systems, that split makes sense. For a PR review bot, release note generation, or a few scheduled AI workflows, it usually doesn't.&lt;/p&gt;

&lt;p&gt;A GitHub bot with 12 runs per day does not need enterprise AI infrastructure.&lt;/p&gt;

&lt;p&gt;Anthropic supports OAuth tokens for Claude Code workflows, which means some automation tools can authenticate using your existing Claude subscription instead of a separate API billing account. Starting June 15, Claude subscriptions also include separate monthly Agent SDK credits specifically for this kind of automation usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's included in your plan
&lt;/h2&gt;

&lt;p&gt;Anthropic is adding &lt;a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan" rel="noopener noreferrer"&gt;official Agent SDK credits&lt;/a&gt; to Claude subscriptions on June 15:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Monthly credit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 5x&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 20x&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This covers Claude Agent SDK usage, the &lt;code&gt;claude -p&lt;/code&gt; command, Claude Code GitHub Actions, and third-party apps authenticated through the Agent SDK. Credits refresh monthly and don't roll over.&lt;/p&gt;

&lt;p&gt;If you exceed the monthly credit, usage spills over to standard API rates — but only if you've enabled extra usage on your account.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this covers
&lt;/h2&gt;

&lt;p&gt;Small developer workflows: GitHub Actions, n8n agents, local coding helpers, repo automation, CI scripts, cron jobs, personal tooling. Not production infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Install Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude setup-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command opens a browser-based Claude authentication flow and stores credentials locally for Claude Code workflows.&lt;/p&gt;

&lt;p&gt;You'll get something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sk-ant-oat01-xxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is different from a standard Anthropic API key (&lt;code&gt;sk-ant-api03-xxxx&lt;/code&gt;). The OAuth token ties to your subscription rather than a separate billing account.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Anthropic's GitHub Action supports &lt;code&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/code&gt; directly, so your workflow draws from your monthly Agent SDK credit instead of a separate API account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's enough for most lightweight coding workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  n8n and other tools
&lt;/h2&gt;

&lt;p&gt;Some community tools and wrappers already support Claude OAuth tokens directly. Others still expect standard Anthropic API keys, so compatibility depends heavily on the ecosystem you're using.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use this vs. the API
&lt;/h2&gt;

&lt;p&gt;Subscription OAuth makes sense for personal projects, prototypes, developer tooling, and anything low-volume. Switch to the official API when you're building something customer-facing, need predictable throughput, or running at any real scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Credits are per-user — there's no pooling across a team. A Pro plan's $20 goes fast if your agent is tool-heavy. This is usage credit, not unlimited access. OAuth token support is patchy across frameworks, so you'll hit compatibility issues depending on what you're building on.&lt;/p&gt;

&lt;p&gt;Anthropic is already separating consumer subscription usage from large-scale automation. Treat this as a lightweight developer workflow feature, not stable backend infrastructure. Don't build critical business systems around it.&lt;/p&gt;




&lt;p&gt;Most developers optimize for scale before they even have usage.&lt;/p&gt;

&lt;p&gt;Use the subscription you're already paying for. Move to API billing when your workload actually earns it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://shankulkarni.com/blog/stop-paying-twice-for-claude" rel="noopener noreferrer"&gt;shankulkarni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>devools</category>
      <category>automation</category>
      <category>github</category>
    </item>
    <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>
