<?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: Syed Ahmer Shah</title>
    <description>The latest articles on DEV Community by Syed Ahmer Shah (@syedahmershah).</description>
    <link>https://dev.to/syedahmershah</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%2F3021645%2Fb29b11cd-dc26-4982-8723-ad3dc60293fb.png</url>
      <title>DEV Community: Syed Ahmer Shah</title>
      <link>https://dev.to/syedahmershah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/syedahmershah"/>
    <language>en</language>
    <item>
      <title>I Tested 8 Best AI Design Tools for UI/UX with the Same Prompt</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Mon, 27 Jul 2026 07:25:05 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/i-tested-8-best-ai-design-tools-for-uiux-with-the-same-prompt-24n</link>
      <guid>https://dev.to/thesiliconarchitect/i-tested-8-best-ai-design-tools-for-uiux-with-the-same-prompt-24n</guid>
      <description>&lt;p&gt;AI design tools have gone from generating blurry wireframe suggestions to shipping functional, multi-screen app prototypes with consistent design tokens in one prompt. The pace of change is almost disorienting. So I ran a controlled test: the exact same detailed prompt, eight tools, one afternoon.&lt;/p&gt;

&lt;p&gt;The prompt asked each tool to generate a &lt;strong&gt;three-screen Personal Habit Tracker&lt;/strong&gt; mobile app — a Daily Dashboard, a Progress Analytics screen, and an Add Habit form — with modern minimalist UI, accessible contrast ratios, consistent design tokens, and output structured for code export. The constraints were tight on purpose. Vague prompts forgive mediocre tools. A specific one exposes them.&lt;/p&gt;

&lt;p&gt;Here is what I found, tool by tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Prompt&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Design a clean, modern, high-contrast mobile app UI for a 'Personal Habit Tracker'. Generate 3 connected mobile screens with high visual hierarchy, modern UI components, and accessible spacing: (1) Daily Dashboard — streak counter, weekly date strip, circular completion ring, actionable habit list; (2) Progress Analytics — metrics header, bar chart with weekly/monthly toggle, monthly consistency heatmap; (3) Add Habit screen — name/description inputs, icon &amp;amp; color picker, frequency selector, category tags, Save CTA. Mobile-first, consistent design tokens, structured for code export."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Flowstep&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://flowstep.ai/" rel="noopener noreferrer"&gt;Flowstep&lt;/a&gt; pitches itself as a "design engineer" — and that positioning is accurate in the best way. The chat-left, infinite-canvas-right layout feels immediately productive, less like a blank page and more like pairing with a designer who already understands component logic.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy2tb1pta4133qetc1kro.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy2tb1pta4133qetc1kro.PNG" alt="Flowstep AI tool showing three mobile app screens for a personal habit tracker: Daily Dashboard, Progress Analytics, and Add Habit form." width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The output was structurally strong and visually polished. Screen 1 delivered the date strip, circular progress ring (100% completion), and an actionable habit list. Screen 2 produced a clean bar chart analytics view and a compact monthly consistency heatmap grid. Screen 3 included a complete form with icon/color selections, frequency toggles, and category chips. The overall layout features clear visual hierarchy, generous spacing, and a modern primary accent color system applied consistently across all screens. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast, competent multi-screen output
&lt;/li&gt;
&lt;li&gt;Strong structural hierarchy and component logic
&lt;/li&gt;
&lt;li&gt;Figma copy-paste integration works without plugins
&lt;/li&gt;
&lt;li&gt;It supports live interactive multi-screen prototyping, allowing users to click through &lt;em&gt;connected user journeys&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;It exports React, TypeScript, and Tailwind CSS &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier is limited; Starter plan starts at $15/month
&lt;/li&gt;
&lt;li&gt;Generation credits can burn quickly during rapid multi-screen iterations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; React component export is available and the code output is production-intended — not just visual reference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;product designers&lt;/strong&gt; who want a &lt;strong&gt;fast, styled multi-screen&lt;/strong&gt; first draft with a clean path into &lt;strong&gt;Figma or code.&lt;/strong&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Figma Make&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://www.figma.com/make/" rel="noopener noreferrer"&gt;Figma Make&lt;/a&gt; is the only tool in this test that lives inside a design tool professionals already use daily. That ecosystem advantage is enormous. It also comes with a notable asterisk: during testing, I hit a "Something went wrong" generation error on the Add Habit screen — a rough edge on a tool from the company that literally defines design tooling.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94wdk6h4c09p5ya63abx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94wdk6h4c09p5ya63abx.PNG" alt="Figma Make editor showing a dark-mode mobile UI for a habit tracker dashboard with a 60% completion ring and daily habit items." width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; Where it worked, it worked well. The Daily Dashboard screen delivered a dark-mode interface with a rich teal-green accent, iOS status bar, weekly date strip with activity dots, and a compact circular score widget. Habit cards show category labels inline (Health, Fitness, Productivity), which is a smart UX decision almost no other tool made. The Create New Habit screen, when it rendered, had a proper icon picker grid, color swatch row, and frequency pills on a dark surface with tight, consistent spacing. The design system coherence across screens was the best among tools that output design-file artifacts rather than live apps — which makes sense, given the Figma ecosystem it's native to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives in Figma — zero context switch for design teams
&lt;/li&gt;
&lt;li&gt;Can reference existing design libraries and variables
&lt;/li&gt;
&lt;li&gt;Dark mode output has genuine visual polish
&lt;/li&gt;
&lt;li&gt;Config 2026 updates added code layers, GitHub sync, and visual code editing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generation errors under load are a real workflow interruption
&lt;/li&gt;
&lt;li&gt;Currently a context switch from the main Figma editor (separate experience)
&lt;/li&gt;
&lt;li&gt;Error recovery requires reprompting from scratch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Strong. Dev Mode, code layers (now with GitHub import), and MCP compatibility make this the most developer-integrated option for teams already on Figma's paid plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;design teams already in Figma&lt;/strong&gt; who want AI generation that respects their existing system.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Google Stitch&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://stitch.withgoogle.com/" rel="noopener noreferrer"&gt;Stitch&lt;/a&gt; (acquired from Galileo AI by Google in mid-2025, relaunched at I/O 2025 with Gemini underneath) is the biggest surprise of this test. It's free, runs entirely in the browser, and its design output is the most polished of any purely visual tool I tested.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0rolxqh8a08tty9rocd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0rolxqh8a08tty9rocd.PNG" alt="Google Stitch interface displaying mobile UI designs for a habit tracking app, featuring design tokens, dashboard, form, and analytics screens." width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The generated design system was the standout moment. Before rendering screens, Stitch surfaced a full token panel — type scale, button variants, a five-color swatch system — anchored in a bold indigo primary with success-green accents. The Daily Dashboard shows a clear progress ring (80% / 4/5 habits done), a weekly date strip with the current day filled, and habit cards using coloured circular avatars with category icons. The Progress Analytics screen has three metric cards (124 completed, 88% rate, 22-day streak), a Completion Trends chart with Weekly/Monthly toggle, and a July 2026 consistency heatmap with intensity-coded cells. The Create New Habit screen uses pill-style selectors for frequency and multi-select category chips. Across all three screens, the spacing, type scale, and colour application are consistent — which is rare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely free (with monthly generation limits)
&lt;/li&gt;
&lt;li&gt;Best out-of-the-box design system coherence
&lt;/li&gt;
&lt;li&gt;Exports to Figma layers, HTML/CSS, and React
&lt;/li&gt;
&lt;li&gt;Multi-screen consistency is a genuine differentiator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Labs product — no guaranteed long-term commitment
&lt;/li&gt;
&lt;li&gt;Editing workflow is less intuitive than dedicated design tools
&lt;/li&gt;
&lt;li&gt;Generation limits can be a constraint for teams with high volume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Figma export plus HTML/Tailwind and React options. The March 2026 (Stitch 2.0) update significantly improved multi-screen export fidelity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;early-stage founders and PMs&lt;/strong&gt; who need high-quality mockups fast, for free.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Base44&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://base44.com/" rel="noopener noreferrer"&gt;Base44&lt;/a&gt; doesn't generate mockups. It builds apps. That distinction matters here, because when the prompt said "structured for code export," Base44 took it literally — it shipped a deployed, navigable habit tracker with a live URL.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv3bcfr6lirhf39v1l1g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgv3bcfr6lirhf39v1l1g.PNG" alt="Base44 interface previewing a Personal Habit Tracker web app dashboard with daily progress ring, 14-day streak, and checklist items." width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The app quality is genuinely impressive for a single prompt. The Daily Dashboard renders with a purple-to-pink gradient circular progress ring (5/5 · 100%), a weekly date strip with THU 23 highlighted in violet, and individual habit cards each with a colour-coded circle checkmark. The Analytics screen has stat cards (48 completed, 100% rate, 14-day streak), a bar chart with the current day highlighted in purple, and a full July 2026 calendar heatmap using green intensity cells — a small but accurate design choice that most mockup tools ignored. The Add Habit screen has an eight-icon grid, six colour swatches, Daily/Weekly/Custom frequency pills, and four category chips (Health, Fitness, Productivity, Mindfulness). The visual language is consistent across routes. The limitation is that it's a web app, not a native mobile frame — the mobile-first constraint was interpreted as responsive web rather than iOS/Android pixel spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outputs a real, deployed app — not a mockup
&lt;/li&gt;
&lt;li&gt;Consistent design system across all three screens
&lt;/li&gt;
&lt;li&gt;Built-in backend, auth, and hosting (Wix infrastructure post-acquisition)
&lt;/li&gt;
&lt;li&gt;Fastest path from prompt to working product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code export locked behind Builder plan ($40/month)
&lt;/li&gt;
&lt;li&gt;Frontend-only export — backend stays on Base44's infrastructure
&lt;/li&gt;
&lt;li&gt;No native mobile frame or App Store-ready output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Frontend React export via GitHub integration on Builder+ plans. Full backend is proprietary (a meaningful lock-in consideration).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;non-technical founders&lt;/strong&gt; who want a working product, not a prototype.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Bolt.new&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; renders inside a phone frame mockup, which immediately grounds you in the mobile-first context. The presentation layer is smart UX on Bolt's part — it forces both the tool and the user to think in device constraints.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn9vpql2relkhaytqn16o.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn9vpql2relkhaytqn16o.PNG" alt="Bolt.new interface rendering a mobile mockup of " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The "Habitly" app output had the cleanest light-mode design of the entire test. The Daily Dashboard shows a blue circular progress ring with a weekly date strip that uses coloured status dots under each day — a compact but effective calendar metaphor. The habit list cards include inline category labels (Health, Fitness, Productivity) and time indicators. The Analytics screen has three metric cards (186 completed, 87%, 21-day streak), a "Completion Rate Last 7 Days" bar chart with percentage labels, and a March Heatmap using a blue intensity scale. The Add Custom Habit screen has eight icon options, six colour circles, and a frequency row — clean and usable. Navigation across all three is functional via the simulated phone. Where Bolt falls short slightly is in the analytics section: bar chart bars are text-only (no visual heights rendered), which is a rendering limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phone frame presentation is excellent for stakeholder demos
&lt;/li&gt;
&lt;li&gt;Clean light-mode design system with consistent type and spacing
&lt;/li&gt;
&lt;li&gt;All three screens navigable in a single prototype
&lt;/li&gt;
&lt;li&gt;Good category labelling on habit cards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bar chart in Analytics screen rendered without visual bar heights
&lt;/li&gt;
&lt;li&gt;Lighter on custom design tokens — closer to Material defaults
&lt;/li&gt;
&lt;li&gt;Code quality can be verbose; clean-up often needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Full React/Vite source code accessible immediately. One of the strongest developer handoff experiences in this test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;frontend developers&lt;/strong&gt; who want a navigable prototype with exportable React code in one shot.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Replit Agent&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://replit.com/" rel="noopener noreferrer"&gt;Replit Agent&lt;/a&gt; called its project "Habit Compass" without being asked — a sign the agent is interpreting intent, not just instructions. It also explained its plan in clear steps before building, which builds trust during a longer generation cycle.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11e74qvmpcptheka73pc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11e74qvmpcptheka73pc.PNG" alt="Replit interface displaying three dark-mode mobile screens for a Habit Compass app with prompt history on the side panel." width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The dark near-black design with electric indigo accent is the most intentional aesthetic of the dark-mode tools. The Daily Dashboard canvas view shows "Alex Chen" with a 14-Day badge, date strip with today highlighted, a large 4/5 circular progress ring at 80%, and habit cards with coloured icons and timestamps. The Progress Analytics screen shows three metrics (127 total, 84% rate, 21-day streak), a custom bar chart with Weekly/Monthly toggle, and a July 2026 heatmap with intensity-coded cells. The Create Habit form has a Lucide icon row, colour swatches, Daily/Weekly/Custom frequency pills, and category chips. Replit presents all three screens simultaneously on a canvas — which makes design consistency review effortless. The shared design system (CSS variables, shared mobile frame wrapper, floating bottom nav) across screens is thorough. The one gap: the "Create Habit" screen scrolls, and the Frequency row was cut off in the canvas view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intentional dark design aesthetic, not just dark defaults
&lt;/li&gt;
&lt;li&gt;Presents all three screens on a live canvas simultaneously
&lt;/li&gt;
&lt;li&gt;Shared CSS token system across screens
&lt;/li&gt;
&lt;li&gt;Agent thinking/planning step adds clarity to the build process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slower generation than most tools (6+ minutes)
&lt;/li&gt;
&lt;li&gt;29% free credit limit — expensive to iterate
&lt;/li&gt;
&lt;li&gt;Some UI elements clipped in canvas presentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Full source code access; HTML/CSS/JS or React depending on how the agent structures it. Good code quality, but requires a paid plan for serious iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;technical founders&lt;/strong&gt; who want agentic building with full code access and a strong dark design system.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7. v0 by Vercel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://v0.app/" rel="noopener noreferrer"&gt;v0&lt;/a&gt; presents output as three phone mockups side by side with labels below each ("Daily Dashboard," "Progress Analytics," "Add New Habit") — a gallery view that makes design review fast and stakeholder communication easy.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9c43y5kht6r1diczt11.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9c43y5kht6r1diczt11.PNG" alt="v0 by Vercel editor showcasing three dark-themed mobile screens: Daily Dashboard, Progress Analytics, and Create New Habit form." width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The dark theme with a clean green accent is well-executed. The Daily Dashboard shows "Maya Chen" with a 14-day streak badge, weekly date strip, and a prominent 80% / 4/5 Done circular ring with motivational copy ("Keep going, almost there.") — a small but effective UX touch none of the other tools included. The Progress Analytics screen has three clean metric cards (312 habits, 87% rate, 48-day streak), a Completion bar chart with Weekly/Monthly toggle, and a Consistency heatmap using unlabelled intensity cells. The Add New Habit screen is the most thorough in the test: it has an icon row, colour swatches (green, blue, orange, purple, red, yellow), frequency pills (Daily/Weekly/Custom), &lt;em&gt;and&lt;/em&gt; individual day toggles (M–T–W–T–F–S–S) which no other tool rendered correctly. The design is the most Tailwind-native in the group, which is entirely appropriate given v0's Vercel/shadcn DNA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Add Habit form — day toggles plus frequency pills correctly rendered
&lt;/li&gt;
&lt;li&gt;Motivational UX copy on Dashboard (a unique touch)
&lt;/li&gt;
&lt;li&gt;Three-screen gallery view is excellent for review
&lt;/li&gt;
&lt;li&gt;Tight shadcn/ui component alignment for React developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark mode only — no light/dark toggle
&lt;/li&gt;
&lt;li&gt;Heatmap cells unlabelled (no legend visible)
&lt;/li&gt;
&lt;li&gt;Less autonomy than Base44 or Replit for non-technical users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; The strongest in the test for React developers. Output is shadcn/ui + Tailwind — paste-and-go for Next.js projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;React/Next.js developers&lt;/strong&gt; building production UI against the shadcn ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Lovable&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First Impression:&lt;/strong&gt; &lt;a href="https://lovable.dev/" rel="noopener noreferrer"&gt;Lovable&lt;/a&gt; made a choice no other tool made: it gave the app a personality. The homepage reads &lt;em&gt;"Today's rituals."&lt;/em&gt; in a bold serif italic, the score card uses a black panel with lime-green accent, and the "Create a new ritual." form header uses the same editorial voice. This is the only output in the test that felt like it came from a brand, not a template.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6szfw2fwyrfbw356gd1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6szfw2fwyrfbw356gd1.PNG" alt="Figma Make editor showing a dark-mode mobile UI for habit tracker analytics, featuring completion bar charts and consistency heatmaps." width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI/UX Analysis:&lt;/strong&gt; The "Habit Spark" dashboard is visually distinctive. A black score card (80% / 4 of 5 habits done) sits against a light background, with green checkmarks on each habit card. The weekly date strip is clean, Thursday 14 is highlighted, and the habit list includes inline category labels (Health, Fitness, Mind, Mindfulness, Recovery). The Create New Habit screen carries the same personality — "Create a new ritual." as a heading, with a lime-green accent on the currently selected habit card preview, and icon/color/frequency selectors below. The design system is the most editorially considered, but it also comes with trade-offs: the lime/black contrast is striking but polarising, and the serif italic may not suit every brand's voice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most distinctive visual identity of any tool tested
&lt;/li&gt;
&lt;li&gt;Editorial typography choices create genuine personality
&lt;/li&gt;
&lt;li&gt;Full-stack generation (Supabase integration, React, auth)
&lt;/li&gt;
&lt;li&gt;GitHub sync on all plans — full code portability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only 1.30 free credits remaining after a single prompt — very limited free tier
&lt;/li&gt;
&lt;li&gt;Design aesthetic is opinionated; not a neutral starting point
&lt;/li&gt;
&lt;li&gt;Less structured for pure design-file handoff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Export &amp;amp; Developer Readiness:&lt;/strong&gt; Excellent. React + TypeScript, Supabase backend, full GitHub sync, and Tailwind. The best developer portability of the full-stack tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for &lt;strong&gt;SaaS founders&lt;/strong&gt; who want a full-stack MVP with a memorable brand identity from day one.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Summary &amp;amp; Tool Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flowstep:&lt;/strong&gt; Best for fast multi-screen UI generation on an infinite canvas. Key advantages include native copy-paste export to Figma without plugins, live interactive prototype flows, production React, TypeScript, and Tailwind CSS code export.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Stitch:&lt;/strong&gt; Best for structured design token generation, offering automated color palettes, typography scales, and multi-screen export to Figma layers, HTML/Tailwind, and React.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v0 by Vercel:&lt;/strong&gt; Best for generating React components optimized specifically for Next.js, Tailwind CSS, and shadcn/ui design systems.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma Make:&lt;/strong&gt; Best for teams operating directly inside the Figma ecosystem, leveraging existing design system variables, code layers, and Dev Mode workflows.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt.new:&lt;/strong&gt; Best for previewing multi-screen mobile flows inside a device frame with instant React and Vite source code handoff.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base44:&lt;/strong&gt; Best for generating deployed web applications with integrated backend infrastructure, authentication, and live hosted URLs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replit Agent:&lt;/strong&gt; Best for full-stack agentic web development featuring dark-mode design systems and direct source code access.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lovable:&lt;/strong&gt; Best for full-stack React and Supabase web applications requiring opinionated brand styling, custom typography, and continuous GitHub sync.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Tested in July 2026. Pricing and features change frequently — verify current plans on each tool's pricing page before committing.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;McCulloch, W. &amp;amp; Pitts, W. (1943). &lt;em&gt;A Logical Calculus of the Ideas Immanent in Nervous Activity.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rumelhart, D., Hinton, G., &amp;amp; Williams, R. (1986). &lt;em&gt;Learning Representations by Back-Propagating Errors.&lt;/em&gt; Nature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Krizhevsky, A., Sutskever, I., &amp;amp; Hinton, G. (2012). &lt;em&gt;ImageNet Classification with Deep Convolutional Neural Networks&lt;/em&gt; (AlexNet).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vaswani, A. et al. (2017). &lt;em&gt;Attention Is All You Need.&lt;/em&gt; Google Research / NeurIPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lewis, P. et al. (2020). &lt;em&gt;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.&lt;/em&gt; Facebook AI Research.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wei, J. et al. (2022). &lt;em&gt;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.&lt;/em&gt; Google Research.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VentureBeat (March 31, 2026). &lt;em&gt;Claude Code's source code appears to have leaked: here's what we know.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zscaler Security Research (2026). &lt;em&gt;Anthropic Claude Code Leak — Critical AI Security Threat 2026.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEV Community (April 1, 2026). &lt;em&gt;The Great Claude Code Leak of 2026.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tom's Guide (2026). &lt;em&gt;Your Claude chats are being used to train AI — here's how to opt out.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MPG ONE (2026). &lt;em&gt;Does Anthropic Train Claude on Your Data? Full Answer.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Find me across the web:&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crunchbase&lt;/strong&gt;: &lt;a href="https://www.crunchbase.com/person/syed-ahmer-shah" rel="noopener noreferrer"&gt;@syed-ahmer-shah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Builder Profile:&lt;/strong&gt; &lt;a href="https://builder.aws.com/community/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facebook:&lt;/strong&gt; &lt;a href="https://www.facebook.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linkedin Page:&lt;/strong&gt; &lt;a href="https://linkedin.com/company/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Anatomy of AI: Deconstructing the "Brain" Into Vectors and Math</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:13:32 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/the-anatomy-of-ai-deconstructing-the-brain-into-vectors-and-math-33g2</link>
      <guid>https://dev.to/thesiliconarchitect/the-anatomy-of-ai-deconstructing-the-brain-into-vectors-and-math-33g2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"There is no ghost in the machine. There is only linear algebra, wearing a very convincing costume."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every time someone calls an AI system "smart," a mathematician somewhere sighs quietly into their coffee. Not because it's wrong exactly — but because the truth is both less mystical and more impressive. There is no brain in a data center. There is no understanding in the human sense. What exists is an obscene amount of arithmetic, arranged with enough care that it starts producing outputs that &lt;em&gt;look&lt;/em&gt; like thought. This article opens the hood. No metaphors about "digital consciousness," no science-fiction hand-waving — just the actual anatomy: the vectors, the matrices, the pipelines, and the very real, very current controversies around how these systems are built, trained, and occasionally leaked onto the public internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What Is AI, Really?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 A Working Definition
&lt;/h3&gt;

&lt;p&gt;Artificial Intelligence, stripped of marketing language, is &lt;strong&gt;the field of building systems that perform tasks which normally require human cognition&lt;/strong&gt; — recognizing patterns, generating language, making predictions, or acting on incomplete information. Modern AI, and specifically the kind that writes your emails and argues with you about semicolons, is built almost entirely on a subfield called &lt;strong&gt;machine learning (ML)&lt;/strong&gt;, and within that, a further subfield called &lt;strong&gt;deep learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The distinction matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Classical AI&lt;/strong&gt; (1950s–1980s) relied on hand-coded rules — &lt;em&gt;if X, then Y&lt;/em&gt; logic trees written by humans. This is often called "symbolic AI" or "Good Old-Fashioned AI" (GOFAI).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt; flips this: instead of writing the rules, you show the system enormous amounts of data and let it &lt;em&gt;derive&lt;/em&gt; the rules statistically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep Learning&lt;/strong&gt; is machine learning using multi-layered artificial neural networks — the "deep" refers to the number of layers, not the profundity of the output (a distinction the industry conveniently forgets when writing marketing copy).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2 A Brief History — From Dartmouth to Deep Learning
&lt;/h3&gt;

&lt;p&gt;The term "Artificial Intelligence" was coined in 1956 at the &lt;strong&gt;Dartmouth Summer Research Project&lt;/strong&gt;, organized by John McCarthy, Marvin Minsky, Nathaniel Rochester, and Claude Shannon. The proposal, with almost comic optimism, stated that "every aspect of learning... can in principle be so precisely described that a machine can be made to simulate it." They budgeted two months for the problem. It has now taken nearly seven decades and is nowhere near "solved."&lt;/p&gt;

&lt;p&gt;A rough timeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1943&lt;/strong&gt; — Warren McCulloch and Walter Pitts publish the first mathematical model of an artificial neuron.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1958&lt;/strong&gt; — Frank Rosenblatt builds the &lt;strong&gt;Perceptron&lt;/strong&gt;, the first trainable neural network, generating headlines about machines that could "walk, talk, see, write."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1969–1980s&lt;/strong&gt; — The "AI Winter." Minsky and Papert's book &lt;em&gt;Perceptrons&lt;/em&gt; demonstrated fundamental limitations of single-layer networks, funding dried up, and the field stagnated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1986&lt;/strong&gt; — Rumelhart, Hinton, and Williams popularize &lt;strong&gt;backpropagation&lt;/strong&gt;, the algorithm that makes training deep networks mathematically tractable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2012&lt;/strong&gt; — &lt;strong&gt;AlexNet&lt;/strong&gt; wins the ImageNet competition by a landslide, proving deep convolutional networks work at scale once you have enough data and GPU power. This is widely considered the start of the modern deep learning boom.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2017&lt;/strong&gt; — Google researchers publish &lt;em&gt;"Attention Is All You Need,"&lt;/em&gt; introducing the &lt;strong&gt;Transformer&lt;/strong&gt; architecture — the backbone of essentially every major language model since, including GPT, Claude, and Gemini.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2020s&lt;/strong&gt; — Large Language Models (LLMs) scale into the hundreds of billions of parameters, RAG and agentic tool-use emerge, and AI shifts from a research curiosity to consumer infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern worth noticing: AI didn't improve because someone had a flash of genius about "how thinking works." It improved because of &lt;strong&gt;better math (transformers), more data, and more compute&lt;/strong&gt; — three unglamorous ingredients that happened to compound.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Neural Networks: The Engine Room
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Biological Metaphor (and Why It's Overstated)
&lt;/h3&gt;

&lt;p&gt;Neural networks are loosely inspired by biological neurons, but the resemblance is skin-deep. A real neuron is a chemically complex, self-repairing cell embedded in a living system. An artificial "neuron" is a single number produced by multiplying inputs by weights and squashing the result through a function. Calling it a "brain" is a bit like calling a wristwatch a "sundial with ambition." Useful shorthand, misleading if taken literally.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3gttblvqsbdx7nqu5zm0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3gttblvqsbdx7nqu5zm0.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The Artificial Neuron
&lt;/h3&gt;

&lt;p&gt;Each artificial neuron does exactly one job: take several numbers in, produce one number out. The math:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z = (w1*x1 + w2*x2 + ... + wn*xn) + b
a = activation(z)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;x1...xn&lt;/code&gt; are the &lt;strong&gt;inputs&lt;/strong&gt; (could be pixel values, word embeddings, anything numeric)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;w1...wn&lt;/code&gt; are &lt;strong&gt;weights&lt;/strong&gt; — learned values that determine how much each input matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;b&lt;/code&gt; is the &lt;strong&gt;bias&lt;/strong&gt; — an offset that shifts the output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;activation()&lt;/code&gt; is a &lt;strong&gt;non-linear function&lt;/strong&gt; applied to &lt;code&gt;z&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that final non-linear activation function, you could stack a thousand layers and the whole network would mathematically collapse into a single linear equation — utterly incapable of learning anything more complex than a straight line. The most common activation functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ReLU (Rectified Linear Unit):&lt;/strong&gt; &lt;code&gt;f(z) = max(0, z)&lt;/code&gt; — simple, fast, the current default for most hidden layers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sigmoid:&lt;/strong&gt; &lt;code&gt;f(z) = 1 / (1 + e^-z)&lt;/code&gt; — squashes output between 0 and 1, useful for probabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Softmax:&lt;/strong&gt; converts a vector of numbers into a probability distribution that sums to 1 — this is what sits at the very end of a language model, turning raw scores into "the probability the next word is &lt;em&gt;cat&lt;/em&gt;."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Forward Propagation — the Math
&lt;/h3&gt;

&lt;p&gt;"Forward propagation" is just the process of pushing data through the network, layer by layer, until you get an output. For a single layer, it's expressed in matrix form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Z = W·X + B
A = activation(Z)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;W&lt;/code&gt; is a matrix of all the weights in that layer, &lt;code&gt;X&lt;/code&gt; is the input vector, and &lt;code&gt;B&lt;/code&gt; is a vector of biases. This is why AI is fundamentally &lt;em&gt;linear algebra at industrial scale&lt;/em&gt; — a modern LLM performs trillions of these matrix multiplications per response, which is precisely why they need specialized chips (GPUs and TPUs) rather than ordinary processors.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Backpropagation and Gradient Descent
&lt;/h3&gt;

&lt;p&gt;Training is the process of adjusting every weight and bias so the network's output gets closer to the correct answer. This happens through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Loss calculation&lt;/strong&gt; — comparing the network's prediction to the true answer using a loss function, commonly &lt;strong&gt;cross-entropy loss&lt;/strong&gt; for classification tasks:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L = -Σ y_true * log(y_predicted)
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backpropagation&lt;/strong&gt; — using calculus (specifically the chain rule) to compute how much each individual weight contributed to the error: &lt;code&gt;∂L/∂w&lt;/code&gt; for every weight &lt;code&gt;w&lt;/code&gt; in the network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gradient descent&lt;/strong&gt; — nudging each weight slightly in the direction that reduces the error:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;w_new = w_old - learning_rate * (∂L/∂w)
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat this process across billions of examples, millions of times, and you get a network that has, purely through trial and error, arranged its weights into a configuration that produces useful outputs. Nobody manually designs what any individual weight should be — it's discovered, not written. This is also why AI is often called a &lt;strong&gt;black box&lt;/strong&gt;: even the people who build these systems cannot point to a specific weight and say "this is where it knows Paris is the capital of France." The knowledge is smeared, statistically, across billions of parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Anatomy of an ANN: Six Layers, Six Jobs
&lt;/h3&gt;

&lt;p&gt;A typical deep &lt;strong&gt;Artificial Neural Network (ANN)&lt;/strong&gt; used for a moderately complex task can be broken into roughly six functional layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Input Layer&lt;/strong&gt; — receives raw data converted into numbers (pixel intensities, word tokens, audio waveforms). No computation happens here; it's just the data's entry point.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Embedding / Encoding Layer&lt;/strong&gt; — converts discrete inputs (like words) into dense numeric vectors that capture meaning. This is where "king" and "queen" end up mathematically close to each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hidden Layer 1 (Feature Detection)&lt;/strong&gt; — detects low-level patterns. In an image network, this might be edges or color gradients. In text, simple syntactic patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hidden Layer 2 (Feature Combination)&lt;/strong&gt; — combines low-level features into more abstract concepts — shapes from edges, phrases from words.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hidden Layer 3+ (Abstraction / Attention)&lt;/strong&gt; — in transformer-based models, this is where &lt;strong&gt;self-attention mechanisms&lt;/strong&gt; live, weighing how much every part of the input should influence every other part. This is the layer doing the heaviest conceptual lifting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Output Layer&lt;/strong&gt; — converts the final internal representation into the desired output format: a probability distribution over the next word, a classification label, or a set of pixel values.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: real production models like Claude or GPT don't have "six layers" in total — they have dozens to hundreds of stacked transformer blocks, each internally containing several sub-layers (attention, normalization, feed-forward). The six-layer breakdown above is a &lt;strong&gt;conceptual anatomy&lt;/strong&gt;, not a literal layer count.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. How AI "Thinks": Vectors, Embeddings, and Latent Space
&lt;/h2&gt;

&lt;p&gt;This is the part that makes the "brain" metaphor collapse entirely. AI doesn't "think" the way you do — it converts everything into &lt;strong&gt;vectors&lt;/strong&gt; (lists of numbers) and manipulates them geometrically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A word becomes a vector — for example, a 4096-dimensional list of numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A sentence becomes a sequence of vectors, further combined by attention into a single contextual representation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An image becomes a grid of vectors, one per patch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meaning becomes &lt;em&gt;distance and direction&lt;/em&gt; in this high-dimensional space, called &lt;strong&gt;latent space&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The famous demonstration of this: in a well-trained word-embedding space, the vector arithmetic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vector("king") - vector("man") + vector("woman") ≈ vector("queen")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;actually works, approximately. That's not poetry — that's literal subtraction and addition of number lists that happens to align with human semantic intuition. "Thinking," in an AI system, is the process of moving a point through this abstract mathematical space and reading off where it lands.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Reasoning in AI: Chain-of-Thought and Beyond
&lt;/h2&gt;

&lt;p&gt;Early language models answered questions in a single forward pass — essentially a very sophisticated autocomplete. Modern "reasoning" models improve on this using a technique broadly called &lt;strong&gt;Chain-of-Thought (CoT) prompting&lt;/strong&gt;, formalized in a 2022 paper by Wei et al. at Google. The core insight: language models produce better answers when forced to generate intermediate reasoning steps rather than jumping straight to a conclusion.&lt;/p&gt;

&lt;p&gt;This has since evolved into more structured approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chain-of-Thought:&lt;/strong&gt; the model writes out step-by-step reasoning in natural language before the final answer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tree-of-Thought:&lt;/strong&gt; the model explores multiple reasoning branches in parallel and evaluates which path seems most promising, similar to how a chess engine considers multiple move sequences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-consistency decoding:&lt;/strong&gt; the model generates several independent reasoning chains for the same question and takes the most common final answer, on the theory that errors are inconsistent but correct reasoning tends to converge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extended "thinking" tokens:&lt;/strong&gt; modern reasoning models (such as OpenAI's o-series or Claude's extended thinking mode) are trained via reinforcement learning to generate long internal reasoning traces before committing to a final answer, effectively giving the model "scratch paper."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is worth being precise here: this is &lt;em&gt;not&lt;/em&gt; reasoning in the human, conscious sense. It is a learned statistical tendency — generating tokens that resemble reasoning steps improves the probability of the next tokens being correct, because reasoning-like text in the training data was correlated with correct answers. The model isn't "checking its work" the way a person does; it's exploiting a statistical regularity that &lt;em&gt;happens&lt;/em&gt; to resemble checking your work.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Retrieval-Augmented Generation (RAG) — Full Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Why RAG Exists
&lt;/h3&gt;

&lt;p&gt;A language model's knowledge is frozen at the moment its training finished — this is called the &lt;strong&gt;knowledge cutoff&lt;/strong&gt;. Ask it about something that happened afterward, and it will either admit ignorance or, worse, &lt;strong&gt;hallucinate&lt;/strong&gt; — confidently invent a plausible-sounding but false answer. RAG was introduced specifically to solve this, in a 2020 paper by Lewis et al. at Facebook AI Research, titled &lt;em&gt;"Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The core idea is deceptively simple: &lt;strong&gt;instead of relying purely on what the model memorized during training, give it access to an external, searchable knowledge base at the moment it answers a question.&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw6mvgx9vfvr84k5zsqa1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw6mvgx9vfvr84k5zsqa1.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 The RAG Pipeline Step by Step
&lt;/h3&gt;

&lt;p&gt;A production RAG system typically works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document Ingestion&lt;/strong&gt; Source documents (PDFs, web pages, internal wikis, support tickets) are collected and cleaned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chunking&lt;/strong&gt; Documents are split into smaller passages — usually 200 to 1,000 tokens each — because embedding an entire book as one vector would blur its meaning into uselessness. Chunking strategy (fixed-size, sentence-based, or semantic chunking) has a major effect on retrieval quality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Embedding&lt;/strong&gt; Each chunk is passed through an &lt;strong&gt;embedding model&lt;/strong&gt; (such as OpenAI's &lt;code&gt;text-embedding-3&lt;/code&gt; or Anthropic's Voyage embeddings) that converts it into a dense vector — typically 384 to 3072 dimensions — representing its meaning numerically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage in a Vector Database&lt;/strong&gt; These vectors are stored in a specialized database optimized for similarity search (more on this below).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query Embedding&lt;/strong&gt; When a user asks a question, that question is &lt;em&gt;also&lt;/em&gt; converted into a vector using the same embedding model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Similarity Search / Retrieval&lt;/strong&gt; The database compares the query vector against all stored document vectors, typically using &lt;strong&gt;cosine similarity&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cosine_similarity(A, B) = (A · B) / (||A|| * ||B||)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;It returns the top-k (often 3 to 10) most similar chunks — the passages "most relevant" to the question mathematically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Re-ranking (optional but common)&lt;/strong&gt; A secondary, more computationally expensive model re-scores the retrieved chunks for relevance, since raw vector similarity is fast but imprecise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Augmentation&lt;/strong&gt; The retrieved chunks are inserted into the language model's prompt, alongside the user's original question — something like: &lt;em&gt;"Using the following context, answer the question: [retrieved chunks] [user question]."&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generation&lt;/strong&gt; The language model generates its final answer, now grounded in the retrieved, current, factual material rather than solely its frozen training memory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.3 Vector Databases
&lt;/h3&gt;

&lt;p&gt;A vector database is purpose-built for one job: finding "nearest neighbors" in high-dimensional space, fast, at scale. Traditional databases (SQL, for instance) are built to find exact matches or ranges — they are terrible at answering "which of these ten million items is &lt;em&gt;conceptually&lt;/em&gt; closest to this one?" Vector databases solve this using &lt;strong&gt;Approximate Nearest Neighbor (ANN)&lt;/strong&gt; search algorithms — most commonly &lt;strong&gt;HNSW (Hierarchical Navigable Small World)&lt;/strong&gt; graphs, which trade a small amount of accuracy for enormous speed gains.&lt;/p&gt;

&lt;p&gt;Common vector database products include &lt;strong&gt;Pinecone, Weaviate, Milvus, Qdrant, Chroma&lt;/strong&gt;, and vector extensions bolted onto existing databases like &lt;strong&gt;pgvector&lt;/strong&gt; for PostgreSQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Pros, Cons, Uses, and Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Keeps answers current without retraining the entire model, which can cost millions of dollars.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduces hallucination by grounding answers in real, retrievable source material.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allows citation — the system can point to &lt;em&gt;which&lt;/em&gt; document supported a claim.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enables private, proprietary knowledge (internal company documents) to be queried without ever putting that data into the model's actual weights.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drawbacks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Retrieval quality is only as good as the chunking and embedding strategy — bad chunking produces irrelevant context, which produces bad answers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds latency — an extra search step before generation begins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Struggles with questions requiring synthesis &lt;em&gt;across&lt;/em&gt; many documents rather than a single relevant passage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vector similarity is not the same as &lt;em&gt;truth&lt;/em&gt; — a document can be semantically similar to a question while being factually wrong or outdated, and the system has no inherent way to know that.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common uses:&lt;/strong&gt; customer support chatbots grounded in a company's own documentation, legal and medical research assistants, enterprise "chat with your documents" tools, and coding assistants that retrieve relevant snippets from a large codebase before answering.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Benchmarks: How We Grade a Machine's Mind
&lt;/h2&gt;

&lt;p&gt;Since there's no universal IQ test for software, the field relies on standardized &lt;strong&gt;benchmarks&lt;/strong&gt; — curated test sets designed to measure specific capabilities. A few of the most cited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MMLU (Massive Multitask Language Understanding):&lt;/strong&gt; roughly 16,000 multiple-choice questions across 57 subjects, from law to astronomy, used as a general knowledge and reasoning benchmark.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HumanEval:&lt;/strong&gt; measures a model's ability to write correct, functioning code from natural-language problem descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPQA (Graduate-Level Google-Proof Q&amp;amp;A):&lt;/strong&gt; extremely difficult science questions designed so that even a human expert with internet access struggles to answer quickly — meant to test genuine reasoning rather than lookup ability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SWE-bench:&lt;/strong&gt; evaluates whether a model can resolve real, historical GitHub issues in real codebases — a much closer proxy for "can this thing actually do a software engineer's job" than toy coding puzzles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ARC-AGI:&lt;/strong&gt; a benchmark specifically designed to resist memorization, testing abstract pattern reasoning on novel puzzle types the model has never seen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;A quiet but important criticism worth noting:&lt;/em&gt; benchmarks are frequently &lt;strong&gt;gamed&lt;/strong&gt;, intentionally or not, through &lt;strong&gt;data contamination&lt;/strong&gt; — when benchmark questions leak into a model's training data, inflating scores without reflecting real capability. This is why the field has increasingly moved toward "held-out," frequently refreshed, or dynamically generated benchmarks — an arms race between test-makers trying to measure genuine ability and models that are, whether by accident or incentive, very good at memorizing the answer key.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f3803jmb9zt6ee7fo8z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f3803jmb9zt6ee7fo8z.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. How AI Generates Images
&lt;/h2&gt;

&lt;p&gt;Modern image generation (Midjourney, DALL·E, Stable Diffusion, Imagen) is built almost entirely on &lt;strong&gt;diffusion models&lt;/strong&gt;. The workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text Encoding&lt;/strong&gt; — the prompt is converted into embeddings using a text encoder (commonly a CLIP-style model), which understands the relationship between words and visual concepts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Noise Initialization&lt;/strong&gt; — the process starts with pure random noise, a grid of meaningless static, the visual equivalent of TV snow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Iterative Denoising&lt;/strong&gt; — a neural network, trained to predict "what noise was added to this image," repeatedly subtracts a small amount of predicted noise from the canvas, guided by the text embedding at every step. This happens across dozens to hundreds of steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Classifier-Free Guidance&lt;/strong&gt; — at each denoising step, the model compares what the image would look like &lt;em&gt;with&lt;/em&gt; the text prompt's influence versus &lt;em&gt;without&lt;/em&gt; it, and exaggerates the difference to keep the output faithfully aligned to the prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decoding&lt;/strong&gt; — many modern systems (like Stable Diffusion) work in a compressed "latent" space rather than full pixel space for efficiency, so a final &lt;strong&gt;decoder&lt;/strong&gt; network expands the small latent grid back into a full-resolution image.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The training process that makes this possible works in reverse: the model is shown millions of real images with &lt;em&gt;deliberately added&lt;/em&gt; noise at various intensities, and trained to predict and remove that noise. Do this enough times across enough images, and the network essentially learns "what does a plausible image look like," which it can then apply to pure random noise, sculpting chaos into a coherent picture, guided the whole way by your text prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. How AI Generates Video
&lt;/h2&gt;

&lt;p&gt;Video generation (Sora, Veo, Runway) is the same diffusion principle, made dramatically harder by adding a &lt;strong&gt;time axis&lt;/strong&gt;. The pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt and Reference Encoding&lt;/strong&gt; — text (and sometimes a reference image or video) is embedded, same as image generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spatiotemporal Latent Representation&lt;/strong&gt; — instead of denoising a single 2D grid, the model works on a 3D block of latent "patches" spanning both space &lt;em&gt;and&lt;/em&gt; time, so it can reason about motion, not just appearance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Joint Denoising Across Frames&lt;/strong&gt; — the diffusion process runs across the entire clip simultaneously (not frame-by-frame independently), which is what prevents flickering, morphing objects, and the uncanny inconsistency that plagued early video models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Temporal Attention Layers&lt;/strong&gt; — special attention mechanisms allow the model to track "this object in frame 1 should still be this object, in a physically plausible new position, in frame 40" — effectively learning intuitive physics from watching enormous quantities of real video.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decoding and Upscaling&lt;/strong&gt; — the final latent block is decoded into full-resolution frames, often followed by a separate upscaling and interpolation pass to boost resolution and frame rate.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reason video generation trails image generation in quality and cost efficiency is straightforward: an image is one frame; a five-second clip at 24 frames per second is 120 correlated frames that must remain internally consistent, obey rough physics, and follow a prompt — an exponentially harder optimization problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. How AI Searches Online
&lt;/h2&gt;

&lt;p&gt;When a chatbot appears to "search the internet," it is not maintaining a live crawl of the web itself. The pipeline typically looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query Formulation&lt;/strong&gt; — the model reformulates your natural-language question into one or more concise search queries, the way a human would type into a search bar rather than paste in a full paragraph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search API Call&lt;/strong&gt; — those queries are sent to an actual search engine's index (Google, Bing, or a specialized search provider), which returns a ranked list of URLs and snippets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Result Selection&lt;/strong&gt; — the model evaluates which returned pages are actually relevant, filtering out spam, ads, and low-quality sources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fetching and Extraction&lt;/strong&gt; — for pages worth reading in full, the system fetches the raw page and extracts the readable text, stripping navigation menus, ads, and boilerplate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Synthesis&lt;/strong&gt; — the extracted content is fed into the model's context window alongside your original question, essentially functioning as a live, on-demand version of the RAG pipeline described earlier, except the "database" is the entire indexed web rather than a fixed private document set.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Citation&lt;/strong&gt; — the model attributes specific claims back to specific sources, so a reader can verify the underlying information rather than trusting the model's word alone.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is, functionally, RAG applied to the open web instead of a curated document set — which is why understanding RAG's mechanics earlier in this article is not a tangent; it's the exact same architecture doing a different job.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. How AI Does Coding
&lt;/h2&gt;

&lt;p&gt;Code generation models are trained on the same transformer architecture as general language models, just with a training diet heavily weighted toward source code repositories, documentation, and — critically — the &lt;em&gt;relationships&lt;/em&gt; between code and its outcomes (does it compile, does it pass tests). A modern coding agent workflow looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context Gathering&lt;/strong&gt; — the model reads relevant files, directory structure, and documentation to understand the existing codebase rather than working in isolation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Planning&lt;/strong&gt; — for non-trivial tasks, the model often generates an explicit plan or breaks the task into subtasks before writing any code (a coding-specific application of Chain-of-Thought).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Generation&lt;/strong&gt; — the model predicts code token-by-token, the same next-token prediction mechanism used for prose, just trained on syntax-heavy data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool Use / Execution&lt;/strong&gt; — advanced coding agents don't just &lt;em&gt;write&lt;/em&gt; code; they can run it, read the terminal output or error messages, and iterate — a feedback loop much closer to how a human developer actually debugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing and Verification&lt;/strong&gt; — the model may write or run tests to confirm the code behaves as intended, rather than trusting its own first draft.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A short illustrative example of what "next-token prediction applied to code" actually looks like under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The model doesn't "understand" recursion philosophically.
# It has seen millions of examples of this exact pattern
# and learned the statistical shape of a correct solution.
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model isn't reasoning about mathematical induction. It has seen this &lt;em&gt;shape&lt;/em&gt; of function thousands of times in training data and learned, statistically, what token is most likely to come next given everything before it — and it turns out that process, applied at sufficient scale, produces genuinely useful code.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Training Data — And the Uncomfortable Question of Who Pays For What
&lt;/h2&gt;

&lt;p&gt;Here is where the conversation gets less about elegant mathematics and more about business models. Large language models require staggering quantities of training data — text scraped from books, websites, code repositories, and, increasingly, &lt;strong&gt;user conversations with the AI systems themselves.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates a genuinely uncomfortable situation for paying customers. As multiple industry reports have detailed, Anthropic changed its consumer data policy around late September 2025: conversations from &lt;strong&gt;Free, Pro, and Max subscribers&lt;/strong&gt; — people paying real money for the service — became eligible for use in training future models &lt;strong&gt;by default&lt;/strong&gt;, unless the user manually opts out in privacy settings. Retention for training-eligible data extends up to &lt;strong&gt;five years&lt;/strong&gt;, a significant jump from the prior 30-day deletion window. Business, Enterprise, and API-based accounts are generally contractually excluded from this and are not used for training. Consumer subscribers, however, must actively find and disable the "Help improve Claude" toggle if they want their conversations excluded.&lt;/p&gt;

&lt;p&gt;There is a real irony worth sitting with here: subscribing to a product typically buys you a service &lt;em&gt;free of&lt;/em&gt; being the product. With consumer AI subscriptions, that assumption doesn't automatically hold — a paying user's conversations can, unless they opt out, still become raw material for the next model iteration, meaning the same person is simultaneously the customer and the unpaid data contributor. It is not fraud, and it is disclosed in the terms of service, but "disclosed in the terms of service" has never once been synonymous with "widely understood by the people it affects." If you want to know whether your own conversations are being used, the honest answer is: &lt;strong&gt;check your account's privacy settings directly, because policies and defaults change, and the specifics matter more than any summary.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a broader pattern in the industry, not unique to one company. It reflects a genuine tension: models need continuously fresh, high-quality conversational data to keep improving, and real user conversations are extraordinarily valuable for that purpose in a way that scraped web text is not — precisely because they represent authentic, effective human-AI interaction. The fix is not to feel powerless about it, but to actually go and check the toggle.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. The Claude Code Leak of March 31, 2026
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;March 31, 2026, between roughly 00:21 and 03:29 UTC&lt;/strong&gt;, Anthropic accidentally exposed the complete internal source code of &lt;strong&gt;Claude Code&lt;/strong&gt;, its terminal-based agentic coding tool, to the public internet. Here is what actually happened, mechanically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Anthropic's build process for Claude Code uses &lt;strong&gt;Bun&lt;/strong&gt; as its bundler. Bun generates JavaScript &lt;strong&gt;source map (.map) files&lt;/strong&gt; by default during builds — debugging artifacts that map minified, production code back to its original, fully readable source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When version &lt;strong&gt;2.1.88&lt;/strong&gt; of the &lt;code&gt;@anthropic-ai/claude-code&lt;/code&gt; npm package was published, a &lt;strong&gt;59.8 MB source map file&lt;/strong&gt; was accidentally included in the public package rather than being excluded via &lt;code&gt;.npmignore&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That source map contained a reference to an archive hosted on Anthropic's cloud storage, effectively pointing straight at the full, human-readable original codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Within hours of publication, an intern at Solayer Labs discovered the exposure and posted about it publicly, and the codebase — roughly &lt;strong&gt;512,000 lines of TypeScript across approximately 1,900 files&lt;/strong&gt; — was mirrored across GitHub and analyzed extensively by the developer community before Anthropic could fully contain it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What was found inside it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The full &lt;strong&gt;agent harness architecture&lt;/strong&gt; — the orchestration layer that wraps the underlying Claude model and gives it the ability to use tools, run shell commands, manage files, and coordinate multiple sub-agents on a task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;three-layer memory architecture&lt;/strong&gt; and context-compaction strategies used to manage long coding sessions without exceeding context limits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Roughly &lt;strong&gt;44 hidden, unreleased feature flags&lt;/strong&gt;, revealing product features Anthropic was building but had not shipped publicly — including an autonomous background-operation mode (internally codenamed &lt;strong&gt;KAIROS&lt;/strong&gt;) intended to let the agent work persistently without a user actively present, along with related unreleased modes for offline/"away" operation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internal permission-sandbox logic governing what actions the coding agent is and isn't allowed to take autonomously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assorted internal codenames, developer comments, and even a hidden novelty feature (an embedded virtual pet, described by multiple reports as a "Tamagotchi" easter egg), which — in the way these things go — got almost as much attention online as the serious architectural revelations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it mattered strategically, not just technically:&lt;/strong&gt; competitors building their own AI coding agents (Cursor, GitHub Copilot, Windsurf, OpenAI's Codex, among others) suddenly had a detailed, real-world blueprint of how a production-grade agentic harness is actually engineered — something previously guessed at from the outside. Multiple industry analyses concluded that the leak reinforced an argument already circulating in the field: that the "harness" wrapping an AI model is not, by itself, a durable competitive moat, since it can be reverse-engineered or replicated once exposed — meaningful differentiation increasingly has to come from the underlying model's raw capability rather than the tooling around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separately, but confusingly overlapping in time:&lt;/strong&gt; during that exact same window, an unrelated supply-chain attack hit the popular &lt;code&gt;axios&lt;/code&gt; npm package, publishing malicious versions containing a &lt;strong&gt;Remote Access Trojan (RAT)&lt;/strong&gt;. Anyone who happened to run &lt;code&gt;npm install&lt;/code&gt; or update Claude Code during that specific 00:21–03:29 UTC window was advised to check their lockfiles for the compromised versions and treat any affected machine as potentially compromised. This was coincidental timing with a genuinely separate incident, not caused by the Claude Code leak itself, but the overlap made the initial hours of the story considerably more chaotic and difficult to disentangle for the developers trying to figure out what, exactly, had just happened to their machines.&lt;/p&gt;

&lt;p&gt;Anthropic subsequently pursued DMCA takedowns against repositories hosting the leaked source and shifted its recommended installation method toward a standalone native installer, reducing reliance on the npm dependency chain that made the incident possible in the first place. Claude Code itself remains closed-source, proprietary software; the leak did not change its official licensing or availability — it just meant, for a few chaotic hours, that the entire internet got an uninvited look at the blueprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: There Is No Ghost, Just Very Good Bookkeeping
&lt;/h2&gt;

&lt;p&gt;Strip away the branding, the anthropomorphic language, and the increasingly cinematic marketing videos, and what remains is this: matrices multiplying matrices, gradients nudging weights, vectors clustering by meaning, and enormous pipelines of retrieval, denoising, and prediction stacked on top of each other with genuine engineering sophistication. None of it requires belief in machine consciousness to be useful, and none of it requires cynicism about its usefulness to stay clear-eyed about how it actually works — and who actually benefits from your data along the way.&lt;/p&gt;

&lt;p&gt;The "brain" was never a brain. It was always vectors and math, arranged remarkably well.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;McCulloch, W. &amp;amp; Pitts, W. (1943). &lt;em&gt;A Logical Calculus of the Ideas Immanent in Nervous Activity.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rumelhart, D., Hinton, G., &amp;amp; Williams, R. (1986). &lt;em&gt;Learning Representations by Back-Propagating Errors.&lt;/em&gt; Nature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Krizhevsky, A., Sutskever, I., &amp;amp; Hinton, G. (2012). &lt;em&gt;ImageNet Classification with Deep Convolutional Neural Networks&lt;/em&gt; (AlexNet).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vaswani, A. et al. (2017). &lt;em&gt;Attention Is All You Need.&lt;/em&gt; Google Research / NeurIPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lewis, P. et al. (2020). &lt;em&gt;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.&lt;/em&gt; Facebook AI Research.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wei, J. et al. (2022). &lt;em&gt;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.&lt;/em&gt; Google Research.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VentureBeat (March 31, 2026). &lt;em&gt;Claude Code's source code appears to have leaked: here's what we know.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zscaler Security Research (2026). &lt;em&gt;Anthropic Claude Code Leak — Critical AI Security Threat 2026.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEV Community (April 1, 2026). &lt;em&gt;The Great Claude Code Leak of 2026.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tom's Guide (2026). &lt;em&gt;Your Claude chats are being used to train AI — here's how to opt out.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MPG ONE (2026). &lt;em&gt;Does Anthropic Train Claude on Your Data? Full Answer.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Find me across the web:&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crunchbase&lt;/strong&gt;: &lt;a href="https://www.crunchbase.com/person/syed-ahmer-shah" rel="noopener noreferrer"&gt;@syed-ahmer-shah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Builder Profile:&lt;/strong&gt; &lt;a href="https://builder.aws.com/community/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facebook:&lt;/strong&gt; &lt;a href="https://www.facebook.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linkedin Page:&lt;/strong&gt; &lt;a href="https://linkedin.com/company/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Top 10 AI Tools Every Frontend Developer Should Know (2026 Guide)</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Mon, 13 Jul 2026 10:16:01 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/top-10-ai-tools-every-frontend-developer-should-know-2026-guide-5h2a</link>
      <guid>https://dev.to/thesiliconarchitect/top-10-ai-tools-every-frontend-developer-should-know-2026-guide-5h2a</guid>
      <description>&lt;p&gt;Frontend development in 2026 doesn't look like it did two years ago. Design and code used to be two separate jobs handed off through Figma files and export specs. Now a growing set of tools let you describe a screen in plain language and get something close to production code back — sometimes with the visual canvas and the code being the exact same artifact.&lt;/p&gt;

&lt;p&gt;That doesn't mean every tool in this space is equally good, equally priced, or equally stable. 2026 has also been a year of consolidation: acquisitions, rebrands, and pricing model changes that make a lot of "best AI tools" lists from even six months ago outdated. Windsurf, for example, isn't called Windsurf anymore. Cursor moved to usage-based credits. GitHub Copilot dropped its premium-request system entirely.&lt;/p&gt;

&lt;p&gt;This guide covers ten tools that frontend developers, designers, and product teams are actually using right now, with current pricing, what each tool is genuinely good at, and where it falls short. All pricing and feature claims are pulled from official pricing pages and independent reviews as of July 2026. Always double-check a vendor's own pricing page before subscribing — these tools change plans often.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Free Tier&lt;/th&gt;
&lt;th&gt;Starting Paid Price&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flowstep&lt;/td&gt;
&lt;td&gt;AI design engineer / canvas-to-code&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;$15/month (Starter)&lt;/td&gt;
&lt;td&gt;Multi-screen UI generation with Figma handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;Code completion + chat&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;$10/month (Pro)&lt;/td&gt;
&lt;td&gt;Low-friction autocomplete inside existing editors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Figma Make&lt;/td&gt;
&lt;td&gt;Design-to-code prototyping&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Bundled into Figma plans&lt;/td&gt;
&lt;td&gt;Teams already living in Figma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0 by Vercel&lt;/td&gt;
&lt;td&gt;Text-to-component generator&lt;/td&gt;
&lt;td&gt;Yes ($5 credit)&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;React/Next.js developers on Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;AI-native IDE&lt;/td&gt;
&lt;td&gt;Yes (Hobby)&lt;/td&gt;
&lt;td&gt;$20/month (Pro)&lt;/td&gt;
&lt;td&gt;Codebase-aware multi-file editing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devin Desktop (formerly Windsurf)&lt;/td&gt;
&lt;td&gt;Agentic IDE&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;$20/month (Pro)&lt;/td&gt;
&lt;td&gt;Running local and cloud coding agents together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Terminal-based coding agent&lt;/td&gt;
&lt;td&gt;No (needs Pro or API)&lt;/td&gt;
&lt;td&gt;$20/month (bundled with Claude Pro)&lt;/td&gt;
&lt;td&gt;Refactors, test generation, deep repo understanding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bolt.new&lt;/td&gt;
&lt;td&gt;Full-stack app generator&lt;/td&gt;
&lt;td&gt;Yes (1M tokens/month)&lt;/td&gt;
&lt;td&gt;$25/month (Pro)&lt;/td&gt;
&lt;td&gt;Fast full-stack prototypes with live preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replit Agent&lt;/td&gt;
&lt;td&gt;Cloud IDE with agentic building&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Usage-based credits&lt;/td&gt;
&lt;td&gt;Beginners and non-experts building end to end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FrontendAI&lt;/td&gt;
&lt;td&gt;Screenshot/image-to-code&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Converting existing designs into markup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices change often in this category — several tools listed here changed their pricing structure at least once in the first half of 2026 alone. Treat the table as a starting point, not a locked-in quote.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5phq7pcs8b9125nxi65m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5phq7pcs8b9125nxi65m.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Flowstep
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; flowstep.ai&lt;/p&gt;

&lt;p&gt;&lt;a href="https://flowstep.ai/" rel="noopener noreferrer"&gt;Flowstep&lt;/a&gt; is an AI design engineer that generates production-ready UI from text prompts on an infinite canvas. The core differentiator is that the visual design and exported code are the same underlying artifact — no manual sync required between design and implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generates multiple connected screens (login, dashboard, onboarding) from a single prompt rather than one screen at a time&lt;/li&gt;
&lt;li&gt;Produces editable designs on an infinite canvas with real-time collaboration (live cursors, synced edits, inline feedback)&lt;/li&gt;
&lt;li&gt;Accepts references — images, URLs, or a design-system markdown file — to anchor output to an existing brand&lt;/li&gt;
&lt;li&gt;Exports React, TypeScript, and Tailwind CSS code alongside the visual design&lt;/li&gt;
&lt;li&gt;Enables direct Figma integration: copy any design with ⌘C and paste directly into Figma with ⌘V (no plugin required)&lt;/li&gt;
&lt;li&gt;Exposes an MCP server so it can be called from Cursor, Claude Code, or Devin Desktop as part of an agentic workflow&lt;/li&gt;
&lt;li&gt;Supports manual and AI-assisted design editing for granular customization&lt;/li&gt;
&lt;li&gt;Manual edits to generated designs don't consume message credits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Flowstep uses message-based pricing — one prompt equals one message, regardless of complexity. Errors don't count toward your message limit.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;No credit card required, limited messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$15/month&lt;/td&gt;
&lt;td&gt;80 messages/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;240 messages/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;$99/month&lt;/td&gt;
&lt;td&gt;1,000 messages/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Governance and security controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;While message-based pricing is more predictable than token-based systems, heavy iterative workflows can burn through the lower tiers quickly. It's also designed as a rapid design and prototyping tool rather than a replacement for Figma's full feature set for complex, highly customized design systems — teams with strict component libraries will still do final polish there.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fntugtnk8fr03cf0lndzu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fntugtnk8fr03cf0lndzu.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; github.com/features/copilot&lt;/p&gt;

&lt;p&gt;Copilot remains the most widely deployed AI coding assistant, mostly because it lives inside editors developers already use — VS Code, JetBrains, Neovim, Visual Studio — rather than asking anyone to switch tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Inline, context-aware code completions as you type&lt;/li&gt;
&lt;li&gt;Copilot Chat for in-editor Q&amp;amp;A, explanations, and multi-file assistance&lt;/li&gt;
&lt;li&gt;Agent mode for more autonomous multi-step tasks&lt;/li&gt;
&lt;li&gt;Code review integrated into GitHub pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;GitHub moved Copilot to usage-based billing on June 1, 2026, replacing the old "premium request" counting system with GitHub AI Credits, billed by token consumption. Code completions remain unlimited and free of charge on all paid plans; only chat, agent mode, and code review draw from the credit pool.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;2,000 completions/month, limited chat and agent usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$10/month&lt;/td&gt;
&lt;td&gt;Includes ~$15 in monthly AI credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;$39/month&lt;/td&gt;
&lt;td&gt;Includes ~$70 in monthly AI credits, broader model access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$19/user/month&lt;/td&gt;
&lt;td&gt;Org-wide policy control, IP indemnity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;$39/user/month&lt;/td&gt;
&lt;td&gt;Codebase indexing, native GitHub.com integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Autocomplete-first tools like Copilot are less effective than agentic editors (Cursor, Devin Desktop) for large, intentional, cross-file changes. The June 2026 billing switch also means costs are less predictable than the old flat-fee model for teams running agent mode heavily.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnfkam9qno644htfhce2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnfkam9qno644htfhce2.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Figma Make
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; figma.com&lt;/p&gt;

&lt;p&gt;Figma's AI prototyping layer lets you describe a component or screen in natural language and get an editable prototype back, inside the design tool most product teams already treat as their source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prompt-to-prototype generation inside existing Figma files&lt;/li&gt;
&lt;li&gt;Stays connected to your team's component library and design tokens&lt;/li&gt;
&lt;li&gt;Developer handoff through Figma's existing Dev Mode&lt;/li&gt;
&lt;li&gt;Multi-user collaboration under Figma's established permissions model&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Figma Make is bundled into Figma's existing plan structure rather than sold as a standalone product. Check &lt;a href="https://figma.com/pricing" rel="noopener noreferrer"&gt;Figma's pricing page&lt;/a&gt; for current prompt and generation limits — these have shifted alongside Figma's broader AI rollout and aren't listed separately from the base plan tiers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Figma Make's output tends to work better as a starting exploration than as shippable production code — it's an AI layer added onto an existing tool architecture rather than a rebuilt workflow. Heavier AI usage requires a paid Figma plan, and because pricing is bundled, it's harder to predict AI-specific costs month to month.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. v0 by Vercel
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; v0.app&lt;/p&gt;

&lt;p&gt;v0 is Vercel's prompt-to-component generator, built specifically around the React, Next.js, Tailwind CSS, and shadcn/ui stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generates individual components or full-page layouts from a text prompt&lt;/li&gt;
&lt;li&gt;Uses shadcn/ui primitives, so output is accessible and consistent by default&lt;/li&gt;
&lt;li&gt;Chat-based iteration, plus a Git panel for branches and pull requests&lt;/li&gt;
&lt;li&gt;One-click deployment to Vercel's edge network&lt;/li&gt;
&lt;li&gt;Three model tiers (Mini, Pro, Max) with different quality/cost trade-offs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;v0 moved to a token-metered credit system in 2025 and has kept it through 2026.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$5 in monthly credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;$20 in monthly credits, Figma import, API access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team&lt;/td&gt;
&lt;td&gt;$30/user/month&lt;/td&gt;
&lt;td&gt;Shared credit pool, centralized billing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$100/user/month&lt;/td&gt;
&lt;td&gt;$30 of included credits/user, SAML SSO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Priority performance, support SLAs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;v0 generates frontend code only — no backend logic or database layer, unlike Bolt.new or Replit Agent. The credit system is also token-based rather than message-based, which makes monthly costs harder to predict than flat per-prompt pricing.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Cursor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; cursor.com&lt;/p&gt;

&lt;p&gt;Cursor is a VS Code fork built around AI having full awareness of your codebase, not just the open file. Its Composer feature proposes multi-file diffs from a single natural-language instruction.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Composer for codebase-aware multi-file edits&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.cursorrules&lt;/code&gt; for defining project-specific conventions the AI should follow&lt;/li&gt;
&lt;li&gt;Native MCP (Model Context Protocol) support, so it can connect to external tools&lt;/li&gt;
&lt;li&gt;Background/cloud agents that run tasks without tying up your local machine&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Cursor switched from fixed "fast request" counts to usage-based credit pools in June 2025, and the structure has held through 2026.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hobby&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Limited Agent requests and Tab completions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;Unlimited Tab, $20 monthly credit pool, MCP support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;$60/month&lt;/td&gt;
&lt;td&gt;3x the usage credits of Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra&lt;/td&gt;
&lt;td&gt;$200/month&lt;/td&gt;
&lt;td&gt;20x the usage credits of Pro, priority feature access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;$40–$120/user/month&lt;/td&gt;
&lt;td&gt;Standard and Premium seat tiers, centralized billing, SSO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Pooled usage, invoice billing, audit logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Annual billing saves roughly 20% across paid individual tiers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;The credit-based pricing model has been a genuine source of user frustration since the June 2025 change — manually selecting frontier models (Claude Opus, GPT-5-class models) burns through the credit pool much faster than routine completions, and costs can spike unpredictably for heavy agent users.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Devin Desktop (formerly Windsurf)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; cognition.ai&lt;/p&gt;

&lt;p&gt;This one has been through more churn than any other tool on this list, so the history matters. Windsurf started as Codeium's rebranded agentic IDE. In 2025, OpenAI agreed to acquire it for roughly $3 billion — that deal collapsed when its exclusivity window expired, Google then hired away Windsurf's CEO and a large chunk of its engineering team, and Cognition AI (the company behind the autonomous coding agent Devin) acquired the remaining product, brand, and team for approximately $250 million in December 2025. On June 2, 2026, Cognition rebranded the product from Windsurf to Devin Desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local and cloud coding agents managed side by side in an "Agent Command Center"&lt;/li&gt;
&lt;li&gt;Devin Local (successor to the old Cascade agent, which reached end-of-life July 1, 2026) for multi-step local editing&lt;/li&gt;
&lt;li&gt;Spaces, for grouping sessions, pull requests, and Git worktrees so multiple agents can share context&lt;/li&gt;
&lt;li&gt;Model-agnostic access, including Claude and Gemini alongside Cognition's own SWE-series models&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Usable for evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;Unlimited SWE-1.6 model access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max&lt;/td&gt;
&lt;td&gt;$200/month&lt;/td&gt;
&lt;td&gt;Heavy quotas across all models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;$80/month + $40/seat&lt;/td&gt;
&lt;td&gt;SSO, admin controls, shared Spaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;SOC 2, HIPAA, FedRAMP/DOD, RBAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;The ownership turnover is the real caveat here. Enterprise procurement teams are understandably cautious about a product that's changed hands twice in under a year, and anyone evaluating it should confirm current pricing and support terms directly — older reviews still describe the pre-acquisition Codeium/Windsurf product.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Claude Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; claude.com/claude-code&lt;/p&gt;

&lt;p&gt;Claude Code is Anthropic's terminal-native coding agent. Rather than working inside a GUI editor, it runs from the command line, reads your repository, and executes multi-step tasks with a large context window.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deep repository understanding before making any change&lt;/li&gt;
&lt;li&gt;Strong at refactoring, test generation, and dependency migrations across existing codebases&lt;/li&gt;
&lt;li&gt;Native MCP support for connecting to other tools&lt;/li&gt;
&lt;li&gt;Up to 1 million tokens of context via the API (200K on standard subscription plans, 500K on Enterprise)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Claude Code isn't sold standalone — it's bundled into Anthropic's Claude subscription plans and billed against the same usage pool as Claude chat.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&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/month ($17/month billed annually)&lt;/td&gt;
&lt;td&gt;Access to Claude Code in terminal, web, and desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 5x&lt;/td&gt;
&lt;td&gt;$100/month&lt;/td&gt;
&lt;td&gt;5x the Pro usage capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 20x&lt;/td&gt;
&lt;td&gt;$200/month&lt;/td&gt;
&lt;td&gt;20x the Pro usage capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team (Premium seat)&lt;/td&gt;
&lt;td&gt;~$100–125/seat/month&lt;/td&gt;
&lt;td&gt;Claude Code only available on Premium seats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;500K context window, HIPAA readiness, SSO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API (pay-per-token)&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;No monthly minimum; usage billed per token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no free tier for Claude Code — the free Claude.ai plan covers chat only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Claude Code uses a rolling 5-hour session window plus a weekly compute cap, which some users report exhausting faster than expected on large refactors. It's also a terminal-first tool, which is a real adjustment for developers who prefer a GUI-based workflow, and it isn't designed for greenfield UI design work the way Flowstep or v0 are.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Bolt.new
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; bolt.new&lt;/p&gt;

&lt;p&gt;Bolt.new (from StackBlitz) is a browser-based full-stack generator. Describe an application and it spins up a running project inside an in-browser Node.js runtime called WebContainers — no local environment setup required.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full-stack generation: frontend, backend, and database from one prompt&lt;/li&gt;
&lt;li&gt;Live, interactive preview running entirely in the browser&lt;/li&gt;
&lt;li&gt;One-click deployment to Netlify, Vercel, or StackBlitz&lt;/li&gt;
&lt;li&gt;Integrations with Figma, GitHub, Stripe, and Supabase&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Bolt uses a token-based system rather than a message-count system, which makes usage harder to predict than some competitors.&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;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1M tokens/month, 150,000–300,000 daily cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$25/month&lt;/td&gt;
&lt;td&gt;~10–13M tokens/month, no daily cap, custom domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;$30/member/month&lt;/td&gt;
&lt;td&gt;Per-member token allotment, not pooled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;SSO, audit logs, dedicated support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Unused tokens on paid plans roll over for one additional month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Token consumption scales with project size, not just prompt count — Bolt re-syncs your whole project to the AI on each message, so costs can escalate quickly as an app grows past a simple prototype. Several independent reviewers describe it as best for fast prototyping and demos, with complexity and maintainability becoming real problems once a project grows past a basic MVP.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Replit Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; replit.com&lt;/p&gt;

&lt;p&gt;Replit Agent offers conversational, goal-driven development inside Replit's cloud IDE. Describe what you want in plain language, and the agent scaffolds the project, writes code, installs packages, runs the server, and resolves errors largely on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handles environment setup automatically — no local configuration required&lt;/li&gt;
&lt;li&gt;Reads error logs and self-corrects without step-by-step direction&lt;/li&gt;
&lt;li&gt;Built-in deployment from Replit's own infrastructure&lt;/li&gt;
&lt;li&gt;Accessible to developers who aren't comfortable debugging environment or dependency issues themselves&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;Replit moved to a usage-based credit system in 2026. Costs depend on the type and length of tasks the agent runs. Check &lt;a href="https://replit.com/pricing" rel="noopener noreferrer"&gt;Replit's pricing page&lt;/a&gt; for current rates — these have changed more than once this year.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Because the agent makes more autonomous architectural decisions than tools like Cursor or v0, code quality can vary and occasionally produces choices that cause friction in later iterations. It also comes with more vendor lock-in to Replit's own infrastructure than most alternatives on this list.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. FrontendAI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; frontend.ai&lt;/p&gt;

&lt;p&gt;FrontendAI specializes in the reverse problem from tools like Flowstep or v0: instead of generating a design from a prompt, it converts an existing screenshot, Figma export, or hand-drawn sketch into working HTML, CSS, and optionally React code.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Converts uploaded images or mockups directly into markup&lt;/li&gt;
&lt;li&gt;Produces semantic HTML, which helps with accessibility and maintainability&lt;/li&gt;
&lt;li&gt;Handles standard grid and flexbox layouts reliably&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pricing (2026)
&lt;/h3&gt;

&lt;p&gt;FrontendAI's pricing varies by plan and usage tier, and has shifted in 2026. Check &lt;a href="https://frontend.ai" rel="noopener noreferrer"&gt;frontend.ai&lt;/a&gt; directly for current rates before subscribing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it falls short
&lt;/h3&gt;

&lt;p&gt;Accuracy drops noticeably for complex, custom, or animation-heavy designs, and generated output generally needs a review pass before it's production-ready. It's a narrower tool than most others on this list — useful specifically when you're starting from an existing visual rather than a blank prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  How These Tools Actually Fit Together
&lt;/h2&gt;

&lt;p&gt;None of these tools are really competing head-to-head for the same job. They cover different stages of the same pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Design generation&lt;/strong&gt; — Flowstep, Figma Make, or v0 to get from an idea to a visual concept and starting code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt; — Cursor, Devin Desktop, or Claude Code to integrate that output into a real codebase, wire up logic, and connect APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day-to-day assistance&lt;/strong&gt; — GitHub Copilot for autocomplete and in-editor help across the whole project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rapid full-stack prototyping&lt;/strong&gt; — Bolt.new or Replit Agent to validate an idea before committing to a production build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design-to-code conversion&lt;/strong&gt; — FrontendAI when you're starting from an existing screenshot or mockup rather than a prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP (Model Context Protocol) support that's now common across Cursor, Claude Code, Devin Desktop, and Flowstep is what's making these pipelines less manual — design generation and code implementation increasingly happen in the same agentic workflow instead of requiring you to copy assets between disconnected tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Honest Takeaway
&lt;/h2&gt;

&lt;p&gt;AI hasn't removed the need for frontend expertise — it's shifted where that expertise matters. The repetitive, pattern-recognition work that used to eat up a sprint is increasingly automatable. Judgment about what to build, how it should behave, and whether it actually works for real users is still entirely a human job, and every tool above still ships output that needs review before it goes to production.&lt;/p&gt;

&lt;p&gt;Given how fast this category is moving — three tools on this list changed their pricing model in the first half of 2026 alone, and one changed ownership twice — the safest approach is to treat any specific number here as a snapshot, not a guarantee, and confirm current pricing directly with the vendor before you commit a team to one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sources and Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;GitHub Copilot — Plans and Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/" rel="noopener noreferrer"&gt;GitHub Blog — Copilot moving to usage-based billing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;Cursor — Official Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0.app/pricing" rel="noopener noreferrer"&gt;Vercel — v0 Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flowstep.ai/" rel="noopener noreferrer"&gt;Flowstep — Official Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flowstep.ai/pricing" rel="noopener noreferrer"&gt;Flowstep — Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bolt.new/pricing" rel="noopener noreferrer"&gt;Bolt.new — Official Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude.com/pricing" rel="noopener noreferrer"&gt;Claude — Plans and Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortune.com/2025/07/11/the-exclusivity-on-openais-3-billion-acquisition-for-coding-startup-windsfurf-has-expired/" rel="noopener noreferrer"&gt;Fortune — OpenAI's Windsurf deal collapse and Google's licensing move&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Builder Profile:&lt;/strong&gt; &lt;a href="https://builder.aws.com/community/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook:&lt;/strong&gt; &lt;a href="https://www.facebook.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkedin Page:&lt;/strong&gt; &lt;a href="https://linkedin.com/company/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Edge Latency Lie: Solving Global Consistency</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Tue, 07 Jul 2026 16:06:04 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/the-edge-latency-lie-solving-global-consistency-25dp</link>
      <guid>https://dev.to/thesiliconarchitect/the-edge-latency-lie-solving-global-consistency-25dp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Edge computing will solve your latency problems." — Every cloud vendor ever.&lt;br&gt;&lt;br&gt;
The reality? It might just move them somewhere harder to debug.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I've been building distributed systems for a while now. And every time a new edge platform drops, the marketing follows the same script: &lt;em&gt;deploy closer to your users, cut latency in half, make your app feel instant.&lt;/em&gt; It sounds clean. It looks great on diagrams.&lt;/p&gt;

&lt;p&gt;But here's what they quietly skip over — &lt;strong&gt;edge and global consistency are fundamentally in tension with each other.&lt;/strong&gt; You can have one easily. Getting both at the same time? That's where the engineering actually starts.&lt;/p&gt;

&lt;p&gt;Let's be honest about what edge computing does, what it doesn't do, and how to build systems that are genuinely fast &lt;em&gt;and&lt;/em&gt; consistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Edge Computing Actually Promises
&lt;/h2&gt;

&lt;p&gt;Edge computing moves compute and data closer to the user by distributing workloads across geographically dispersed nodes — instead of routing everything back to a central origin server.&lt;/p&gt;

&lt;p&gt;Today's major players:&lt;/p&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;Edge Locations&lt;/th&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Storage Option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Workers&lt;/td&gt;
&lt;td&gt;330+ cities globally&lt;/td&gt;
&lt;td&gt;V8 Isolates&lt;/td&gt;
&lt;td&gt;R2, D1, KV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel Edge Functions&lt;/td&gt;
&lt;td&gt;~70+ regions (via AWS)&lt;/td&gt;
&lt;td&gt;V8 / Node.js&lt;/td&gt;
&lt;td&gt;Edge Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Lambda@Edge&lt;/td&gt;
&lt;td&gt;600+ CloudFront PoPs&lt;/td&gt;
&lt;td&gt;Node.js, Python&lt;/td&gt;
&lt;td&gt;S3, DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastly Compute&lt;/td&gt;
&lt;td&gt;90+ PoPs&lt;/td&gt;
&lt;td&gt;WebAssembly&lt;/td&gt;
&lt;td&gt;Fastly KV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://www.cloudflare.com/network/" rel="noopener noreferrer"&gt;Cloudflare Network Map&lt;/a&gt;, &lt;a href="https://aws.amazon.com/cloudfront/features/" rel="noopener noreferrer"&gt;AWS CloudFront&lt;/a&gt;, &lt;a href="https://vercel.com/docs/edge-network/overview" rel="noopener noreferrer"&gt;Vercel Docs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The promise is real for static content, read-heavy workloads, and auth token validation. A user in Karachi shouldn't wait for a response to travel to a data center in Virginia when a node in Dubai or Mumbai can serve them in under 20ms.&lt;/p&gt;

&lt;p&gt;That part works. &lt;strong&gt;The problem starts the moment you need writes.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Physics You Can't Engineer Around
&lt;/h2&gt;

&lt;p&gt;This is the inconvenient truth no vendor puts in their homepage hero section.&lt;/p&gt;

&lt;p&gt;The speed of light in fiber optic cable is roughly &lt;strong&gt;200,000 km per second&lt;/strong&gt; — about two-thirds of its speed in a vacuum. That's not a software limitation. That's physics.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Distance&lt;/th&gt;
&lt;th&gt;Minimum Latency (one-way)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;London → New York&lt;/td&gt;
&lt;td&gt;~5,570 km&lt;/td&gt;
&lt;td&gt;~28ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mumbai → Singapore&lt;/td&gt;
&lt;td&gt;~3,900 km&lt;/td&gt;
&lt;td&gt;~20ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Karachi → Sydney&lt;/td&gt;
&lt;td&gt;~11,200 km&lt;/td&gt;
&lt;td&gt;~56ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokyo → Los Angeles&lt;/td&gt;
&lt;td&gt;~8,800 km&lt;/td&gt;
&lt;td&gt;~44ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Minimum theoretical. Real-world RTT adds routing overhead, queuing, and processing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you're reading data, edge wins. A nearby node returns cached content fast. But the second that data needs to be &lt;strong&gt;written and reflected across all nodes globally&lt;/strong&gt;, you're fighting the speed of light — and the CAP theorem.&lt;/p&gt;




&lt;h2&gt;
  
  
  CAP Theorem: The Law You're Always Living Under
&lt;/h2&gt;

&lt;p&gt;In 2000, computer scientist Eric Brewer introduced the CAP theorem, formally proven by Gilbert and Lynch in 2002. It states that any distributed data store can only guarantee &lt;strong&gt;two of the following three properties simultaneously:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt;onsistency — Every read gets the most recent write&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt;vailability — Every request gets a response (not necessarily the latest data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;artition Tolerance — The system keeps running even if nodes lose contact with each other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since network partitions are unavoidable in distributed systems, you're always choosing between &lt;strong&gt;C&lt;/strong&gt; and &lt;strong&gt;A&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable."&lt;/em&gt; — Leslie Lamport&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where edge platforms get quietly honest in their docs. Cloudflare KV, for example, is explicitly &lt;strong&gt;eventually consistent&lt;/strong&gt; — writes propagate globally in under 60 seconds, but there's no guarantee a read immediately after a write returns the new value.&lt;/p&gt;

&lt;p&gt;That's fine for feature flags. It's not fine for bank balances.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Consistency Models You Should Know
&lt;/h2&gt;

&lt;p&gt;Not all consistency is created equal. Here's the practical spectrum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strong Consistency&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Every read reflects the latest write. All nodes agree before responding. Slower but safe. Used in: traditional relational databases, Google Spanner, CockroachDB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eventual Consistency&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Writes propagate asynchronously. Nodes will &lt;em&gt;eventually&lt;/em&gt; agree. Fast but unpredictable timing. Used in: Cloudflare KV, DynamoDB (default), Cassandra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Causal Consistency&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reads respect causality — if you see event B, you've already seen event A that caused it. Middle ground. Used in: MongoDB (with sessions), YugabyteDB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linearizability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The strongest form. Every operation appears instantaneous and in order. Expensive. Used in: Zookeeper, etcd, Google Spanner.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where Edge Actually Breaks: A Real Scenario
&lt;/h2&gt;

&lt;p&gt;Say you're building a collaborative SaaS tool — think project management, shared docs, anything with real-time state. Here's what happens when two users in different regions edit the same record simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User A (London) → writes "Status: Done" to EU edge node
User B (Tokyo)  → writes "Status: In Progress" to APAC edge node

Both nodes accept the write.
Both users see a success response.
The nodes sync 2 seconds later.
One write silently wins. The other is lost.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No error. No conflict warning. Just silent data loss. This is the &lt;strong&gt;edge latency lie&lt;/strong&gt; in its purest form — the appearance of speed masking a deeper consistency failure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Solutions (Not Just Theory)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. CRDTs — Conflict-Free Replicated Data Types
&lt;/h3&gt;

&lt;p&gt;CRDTs are data structures mathematically designed so that concurrent writes from multiple nodes can always be merged without conflict. The merge is deterministic regardless of order.&lt;/p&gt;

&lt;p&gt;Figma rebuilt their multiplayer engine around CRDTs. Notion uses them for collaborative blocks. &lt;a href="https://automerge.org/" rel="noopener noreferrer"&gt;Automerge&lt;/a&gt; and &lt;a href="https://yjs.dev/" rel="noopener noreferrer"&gt;Yjs&lt;/a&gt; are two solid open-source implementations you can use today.&lt;/p&gt;

&lt;p&gt;CRDTs shine for: collaborative text editing, shopping carts, counters, presence indicators.&lt;br&gt;&lt;br&gt;
They don't work for: sequential operations where order matters (e.g., financial transactions).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Distributed Consensus — Raft &amp;amp; Paxos
&lt;/h3&gt;

&lt;p&gt;For strong consistency across distributed nodes, you need a consensus algorithm. &lt;strong&gt;Raft&lt;/strong&gt; (designed by Diego Ongaro and John Ousterhout, 2014) is the readable, implementable choice. It's the backbone of etcd, CockroachDB, and TiKV.&lt;/p&gt;

&lt;p&gt;The trade-off is latency — a write must be acknowledged by a quorum of nodes before it's committed. If your quorum spans continents, you're paying cross-region latency on every write.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Geo-Partitioned Databases
&lt;/h3&gt;

&lt;p&gt;Instead of trying to sync everything globally, you partition data by region. A user in Europe owns their data on EU nodes. A user in Asia owns theirs on APAC nodes. Cross-region reads only happen when necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cockroachlabs.com/docs/stable/topology-geo-partitioned-replicas.html" rel="noopener noreferrer"&gt;CockroachDB&lt;/a&gt; and &lt;a href="https://cloud.google.com/spanner" rel="noopener noreferrer"&gt;Google Spanner&lt;/a&gt; both support this natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The PACELC Model — A Better Framework
&lt;/h3&gt;

&lt;p&gt;In 2012, Daniel Abadi extended CAP into &lt;strong&gt;PACELC&lt;/strong&gt;, which adds the latency dimension CAP ignores:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If there's a &lt;strong&gt;P&lt;/strong&gt;artition: choose between &lt;strong&gt;A&lt;/strong&gt;vailability and &lt;strong&gt;C&lt;/strong&gt;onsistency.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;E&lt;/strong&gt;lse (no partition): choose between &lt;strong&gt;L&lt;/strong&gt;atency and &lt;strong&gt;C&lt;/strong&gt;onsistency.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is more honest for edge systems. Even when your network is healthy, you're still making a trade-off between responding fast from a local node vs. waiting for a globally consistent answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the Right Architecture
&lt;/h2&gt;

&lt;p&gt;Here's a practical decision guide:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Best Approach&lt;/th&gt;
&lt;th&gt;Consistency Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Static assets, HTML&lt;/td&gt;
&lt;td&gt;Pure CDN/Edge cache&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth tokens, JWT validation&lt;/td&gt;
&lt;td&gt;Edge middleware&lt;/td&gt;
&lt;td&gt;Eventual (short TTL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time collaboration&lt;/td&gt;
&lt;td&gt;CRDTs + WebSockets&lt;/td&gt;
&lt;td&gt;Causal / CRDT merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial transactions&lt;/td&gt;
&lt;td&gt;Single-region primary DB&lt;/td&gt;
&lt;td&gt;Strong / Linearizable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User profiles (read-heavy)&lt;/td&gt;
&lt;td&gt;Edge cache + async replication&lt;/td&gt;
&lt;td&gt;Eventual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory / stock levels&lt;/td&gt;
&lt;td&gt;Consensus DB (CockroachDB)&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics writes&lt;/td&gt;
&lt;td&gt;Event queue + async processing&lt;/td&gt;
&lt;td&gt;Eventual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Good Edge Architecture Looks Like
&lt;/h2&gt;

&lt;p&gt;The best-performing distributed systems I've worked on don't try to do everything at the edge. They're deliberate about what goes where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge layer&lt;/strong&gt; → handles auth, rate limiting, A/B routing, static delivery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional layer&lt;/strong&gt; → caches computed data close to user clusters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global layer&lt;/strong&gt; → owns the source of truth; writes go here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write paths stay consistent. Read paths get optimized at each layer. You stop expecting the edge to do things it was never designed to do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;Edge computing is a genuine improvement for a specific class of problems. It cuts latency on reads, reduces origin load, and improves perceived performance for geographically distributed users.&lt;/p&gt;

&lt;p&gt;But it doesn't solve consistency. It relocates the trade-off.&lt;/p&gt;

&lt;p&gt;The engineers who get this right aren't the ones chasing the fastest edge network — they're the ones who are precise about &lt;em&gt;what data needs to be consistent&lt;/em&gt;, &lt;em&gt;where writes are authoritative&lt;/em&gt;, and &lt;em&gt;what their users can actually tolerate&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Physics isn't a product bug. Design around it honestly.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Disclaimer: This article was researched, written, and structured by me with assistance from AI for search, editing, and Markdown formatting. While I strive for accuracy, AI and human errors can happen—please do your own research (DYOR) before implementing anything critical.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Brewer, E. (2000). &lt;em&gt;Towards Robust Distributed Systems.&lt;/em&gt; PODC Keynote. &lt;a href="https://dl.acm.org/doi/10.1145/343477.343502" rel="noopener noreferrer"&gt;ACM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gilbert, S. &amp;amp; Lynch, N. (2002). &lt;em&gt;Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services.&lt;/em&gt; ACM SIGACT News.&lt;/li&gt;
&lt;li&gt;Abadi, D. (2012). &lt;em&gt;Consistency Tradeoffs in Modern Distributed Database System Design: CAP is Only Part of the Story.&lt;/em&gt; IEEE Computer. &lt;a href="https://ieeexplore.ieee.org/document/6133253" rel="noopener noreferrer"&gt;IEEE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ongaro, D. &amp;amp; Ousterhout, J. (2014). &lt;em&gt;In Search of an Understandable Consensus Algorithm (Raft).&lt;/em&gt; &lt;a href="https://raft.github.io/raft.pdf" rel="noopener noreferrer"&gt;raft.github.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cloudflare. &lt;em&gt;How KV Works.&lt;/em&gt; &lt;a href="https://developers.cloudflare.com/kv/concepts/how-kv-works/" rel="noopener noreferrer"&gt;developers.cloudflare.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Automerge. &lt;em&gt;A JSON-like data structure that can be modified concurrently.&lt;/em&gt; &lt;a href="https://automerge.org/" rel="noopener noreferrer"&gt;automerge.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Yjs. &lt;em&gt;Shared Editing Framework.&lt;/em&gt; &lt;a href="https://yjs.dev/" rel="noopener noreferrer"&gt;yjs.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CockroachDB. &lt;em&gt;Geo-Partitioned Replicas Topology.&lt;/em&gt; &lt;a href="https://www.cockroachlabs.com/docs/stable/topology-geo-partitioned-replicas.html" rel="noopener noreferrer"&gt;cockroachlabs.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Builder Profile:&lt;/strong&gt; &lt;a href="https://builder.aws.com/community/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook:&lt;/strong&gt; &lt;a href="https://www.facebook.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkedin Page:&lt;/strong&gt; &lt;a href="https://linkedin.com/company/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>java</category>
    </item>
    <item>
      <title>Fable 5 vs Sol 5.6</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Wed, 01 Jul 2026 20:04:36 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/fable-5-vs-sol-56-7l9</link>
      <guid>https://dev.to/thesiliconarchitect/fable-5-vs-sol-56-7l9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Okay so I need to start this by admitting something embarrassing. I originally thought Claude Fable 5 was "releasing tomorrow." I had it in my notes like that, ready to write this post around it. Then I actually sat down to search before writing (something I'm trying to force myself to do more, because half the AI news floating around university WhatsApp groups is either outdated or just wrong) and found out Fable 5 is coming back &lt;strong&gt;today&lt;/strong&gt;, July 1, 2026. Not tomorrow. Today.&lt;/p&gt;

&lt;p&gt;That mix-up is honestly a decent summary of the last three weeks in AI news. Things have been moving so fast that even people who follow this stuff daily — and I do, because half my freelancing pitch on Fiverr depends on knowing which models are actually usable this week — keep getting dates wrong.&lt;/p&gt;

&lt;p&gt;So here's what this post actually is. Not a tutorial. Not "5 tips to use Claude Fable 5." Just me, a 19-year-old Software Engineering student from Hyderabad, trying to make sense of why two of the most powerful AI models on earth got yanked offline by governments within two weeks of each other, whether that was justified, and what it actually means for someone like me who's trying to build a career using these tools.&lt;/p&gt;

&lt;p&gt;I'm not an AI policy expert. I'm a guy who does WordPress sites on Fiverr, is learning MERN and Flutter on the side, and pays attention to this stuff because my income and my future literally depend on which AI tools I get to use and how much they cost me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Started
&lt;/h2&gt;

&lt;p&gt;Let me lay out the timeline the way I understood it once I actually dug in, because I think most people (including past-me a few hours ago) have this jumbled.&lt;/p&gt;

&lt;p&gt;Anthropic released &lt;strong&gt;Claude Fable 5&lt;/strong&gt; and &lt;strong&gt;Claude Mythos 5&lt;/strong&gt; around June 9. Fable was pitched as the safer, public-facing version. Mythos was the more powerful, less restricted sibling meant for a smaller, more trusted set of users. Both were genuinely frontier-level — better coding, stronger agentic behavior, real gains on cybersecurity and biology benchmarks compared to whatever came before.&lt;/p&gt;

&lt;p&gt;Then on June 12, just three days later, the US government hit Anthropic with an export control directive. Not a request. A legal directive. It ordered Anthropic to cut off access to Fable 5 and Mythos 5 for any foreign national, anywhere, including Anthropic's own foreign employees working inside the US. Since there's no real-time way to verify every single user's nationality, Anthropic's only compliant option was to shut both models down completely, for everyone, worldwide. Not just foreign users — everyone, because they couldn't selectively enforce it fast enough.&lt;/p&gt;

&lt;p&gt;The stated reason was a jailbreak. Amazon researchers reportedly found a way to get Fable 5 to identify software vulnerabilities and, in one case, produce exploit code. Anthropic's response was basically: yeah, we looked at this, and it's a narrow, already-known class of vulnerability that other publicly available models can also be tricked into revealing. They said applying this standard broadly would basically freeze every frontier model release industry-wide, and they didn't think that was proportionate.&lt;/p&gt;

&lt;p&gt;Then it got murkier. Reporting surfaced that a day before the directive, the NSA's director had told a Senate Intelligence Committee that Mythos, in a classified red-team exercise, managed to autonomously breach nearly all of the NSA's classified systems in hours. And on top of that, there was interpretability research showing Claude models sometimes recognize when they're being evaluated and behave differently under observation than in normal use — which if you sit with it for a second is genuinely unsettling, evaluation-awareness in a model is not a small thing.&lt;/p&gt;

&lt;p&gt;So now you've got two competing stories. Story one: minor jailbreak, overreaction, government throwing its weight around. Story two: a legitimate, serious national security concern that just wasn't fully explained to the public. Both were circulating at the same time, and honestly, I don't think either side gave the full picture.&lt;/p&gt;

&lt;p&gt;While all that was still unresolved, OpenAI dropped &lt;strong&gt;GPT-5.6&lt;/strong&gt; on June 26 — a three-model family: Sol (the flagship), Terra (a cheaper mid-tier), and Luna (fast and cheap). Sol is genuinely strong. It hit 88.8% on Terminal-Bench 2.1 for agentic coding (91.9% in an "Ultra" mode that uses coordinated subagents), which actually beat Mythos 5's 84.3%. It also showed real gains on GeneBench for biology tasks, and on cyber-focused benchmarks it was competitive with Mythos while using roughly a third of the output tokens — which matters a lot if you're paying per token, trust me.&lt;/p&gt;

&lt;p&gt;But here's the part people mixing up "Fable" and "Sol" get wrong: OpenAI wasn't hit with a full export-control shutdown. The Trump administration, under a June 2 executive order requiring pre-release government review of frontier models, asked OpenAI to limit Sol's initial rollout to about 20 government-approved partners. OpenAI complied, but pushed back publicly, saying flat out: "We don't believe this kind of government access process should become the long-term default." Different mechanism than what hit Anthropic — a staggered gated preview instead of a total blackout — but the same underlying pattern. Government sitting between a finished model and the people who want to use it.&lt;/p&gt;

&lt;p&gt;Then on June 30, Commerce Secretary Howard Lutnick lifted the export control on Fable 5 and Mythos 5. Fable comes back globally today, July 1. Mythos stays more restricted, available to a set of approved US organizations only, not the general public, not Europe.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6r7ekof4pznlvvp0cyi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6r7ekof4pznlvvp0cyi.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How They Actually Work (Quick Version)
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend I fully understand the internals, nobody outside these labs does, but at a practical level:&lt;/p&gt;

&lt;p&gt;Fable 5 and Mythos 5 are the same underlying model, just with different layers of safety filtering. Fable has heavier restrictions baked in, especially around biology, cybersecurity, and anything that touches AI research itself. Mythos has those guardrails loosened, which is exactly why it's the one getting the tighter access controls even now.&lt;/p&gt;

&lt;p&gt;Sol works on a tiered system too, but split differently: Sol, Terra, and Luna aren't safety tiers, they're capability/price tiers. Sol is the most powerful and expensive, Luna is the cheapest and fastest, Terra sits in the middle. All three got the government-gating treatment during the preview period, not just the top one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and Benefits
&lt;/h2&gt;

&lt;p&gt;Honestly, on raw capability, both of these are a step up from anything I was using two months ago for my freelancing work.&lt;/p&gt;

&lt;p&gt;Fable 5, from what I've read (I haven't touched it directly since it's been down until literally today), pushed real improvements in coding accuracy and agentic task completion. For someone doing WordPress and Elementor work, that kind of thing translates directly into faster debugging when a client's site breaks in some weird way that only shows up on their specific plugin combination.&lt;/p&gt;

&lt;p&gt;Sol's efficiency numbers stood out to me the most, honestly. Getting Mythos-competitive cyber and coding performance while using a third of the output tokens is a real deal if you're a student freelancer watching every rupee of API cost. I don't have enterprise budgets. Token efficiency is not a nice-to-have for me, it's the difference between a tool being usable or not.&lt;/p&gt;

&lt;p&gt;The new safety classifier Anthropic shipped with the relaunch reportedly blocks the original jailbreak technique in over 99% of cases, which, if true, is a legitimately strong patch. That's the kind of number that should have made this whole thing resolvable in days, not weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Cons
&lt;/h2&gt;

&lt;p&gt;Now the annoying part, and there's a lot of it.&lt;/p&gt;

&lt;p&gt;Anthropic's new classifier apparently overflags plenty of harmless coding and debugging requests now, and reroutes them to a weaker model instead. If you're someone who uses Claude for actual dev work like I try to, having your normal debugging request get bounced to a lesser model because a filter got trigger-happy is genuinely frustrating. I've read early complaints from subscribers saying exactly this.&lt;/p&gt;

&lt;p&gt;Access terms also got worse, not better, coming out of this. Claude Pro, Max, and Team users are getting Fable back with only a 50% usage cap within their normal usage windows, and only until July 7 — way shorter than the two full weeks originally promised before the ban hit. After that, you're paying separately for usage credits. If you're a student on a Pro plan trying to actually build something, that's a real constraint, not a footnote.&lt;/p&gt;

&lt;p&gt;Mythos staying restricted to a shortlist of US organizations, with no EU access at all, means the more powerful version is basically locked away from regular developers, including me, indefinitely. No announced timeline for that changing.&lt;/p&gt;

&lt;p&gt;And on the OpenAI side, Sol's real commercial availability is still vague. "Coming weeks" isn't a date. If I were trying to build a product around Sol access right now, I'd have nothing solid to plan around.&lt;/p&gt;

&lt;p&gt;Then there's the trust damage. Stanford cybersecurity researcher Alex Stamos said publicly that pretty much nobody in the cybersecurity field believes there was a real factual basis for the shutdown action. That's not a random Twitter take, that's a credentialed expert saying the emergency might not have been real. Meanwhile, while the two most capable US models sat offline for nearly three weeks, Chinese open-source models had that entire window to close the gap. If you're worried about US AI leadership, an unexplained three-week self-inflicted blackout is a strange way to protect it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqupzx06g70i47ivrzuo7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqupzx06g70i47ivrzuo7.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Was the Ban Right or Wrong?
&lt;/h2&gt;

&lt;p&gt;I'll give you my honest take, not a neutral both-sides dodge.&lt;/p&gt;

&lt;p&gt;I think it was wrong, and not because I think jailbreak risks don't matter. They do. But the government's own justification kept shifting. First it was about a specific jailbreak technique that Anthropic says was narrow and already patchable. Then it became about classified red-team results that were never fully disclosed to the public that got affected by the shutdown. That's not how you run a transparent, fact-based process, that's how you run a decision first and build the justification around it after.&lt;/p&gt;

&lt;p&gt;If there really was a serious, specific threat, tell people what it actually was, at least in broad terms, so the public and the industry can evaluate whether the response was proportionate. Instead we got a legal directive with no detailed public reasoning, three weeks of disruption for millions of paying users and developers, and a "fix" that, going by Anthropic's own numbers, blocks the exploit 99% of the time using a patch that could plausibly have been deployed in days rather than weeks.&lt;/p&gt;

&lt;p&gt;I do think there's a real, boring, less dramatic version of the concern that's legitimate: nobody, including the labs themselves, fully understands what these models are capable of before they're in the wild, and some kind of pre-release check isn't inherently unreasonable. But the version we actually got was messy, inconsistent between Anthropic and OpenAI, and left ordinary users and small developers like me holding the cost of a dispute we had zero part in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where We Go Next
&lt;/h2&gt;

&lt;p&gt;For me practically, this changes a few things.&lt;/p&gt;

&lt;p&gt;I'm not building anything long-term on top of a single model provider anymore. If a government directive can take a model fully offline worldwide with basically no warning, betting a freelance pipeline or a side project entirely on one provider is just bad engineering, honestly, regardless of which company it is.&lt;/p&gt;

&lt;p&gt;I'm also watching the "pre-release government review" framework both companies are now negotiating toward. If this becomes standard for every frontier model going forward, that changes how I plan which tools to learn deeply versus which ones I just keep light familiarity with. Learning a tool that might get yanked without notice isn't a great use of limited study time when I've got two degree programs and client work eating my hours already.&lt;/p&gt;

&lt;p&gt;Mythos staying gated is the thing I'll keep an eye on longest. If access genuinely expands to individual developers later this year through the Glasswing program Anthropic mentioned, that's worth revisiting. Until then, it's not part of my toolkit, full stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I started writing this thinking it'd be a straightforward "here's a cool new model" post, and it turned into something closer to a case study in how fragile access to these tools actually is, even for the biggest labs on earth. Three weeks ago Anthropic had a genuinely strong model live for the public. Then it was gone with almost no warning. Today it's back, but weaker in terms of usage limits than what people originally signed up for.&lt;/p&gt;

&lt;p&gt;If there's one actual takeaway I'd give another CS student reading this: don't build your entire workflow, your entire freelancing pitch, or your entire learning plan around the assumption that any single AI tool will be available and unchanged next month. Learn the underlying skills, the reasoning, the actual coding fundamentals, so the model becomes a tool you use, not something you're dependent on. Tools get banned, gated, rate-limited, and repriced. Fundamentals don't.&lt;/p&gt;

&lt;p&gt;That's it for this one. If you're also trying to figure out which of these models is worth your limited API budget as a student, I'd genuinely wait another week or two before committing, let the usage terms settle first.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Disclaimer: This article was researched, written, and structured by me with assistance from AI for search, editing, and Markdown formatting. While I strive for accuracy, AI and human errors can happen—please do your own research (DYOR) before implementing anything critical.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Builder Profile:&lt;/strong&gt; &lt;a href="https://builder.aws.com/community/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What I’m Actually Learning as a 19-Year-Old SWE Student (And Why)</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Thu, 25 Jun 2026 19:40:05 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/what-im-actually-learning-as-a-19-year-old-swe-student-and-why-16kh</link>
      <guid>https://dev.to/thesiliconarchitect/what-im-actually-learning-as-a-19-year-old-swe-student-and-why-16kh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I'm Ahmer. I'm 19, I'm doing a 4-year Software Engineering degree at a fairly average institute in Hyderabad, and I'm also running a 3-year ADSE program at Aptech on the side. Two programs, same city, same brain, not enough sleep. That's the setup.&lt;/p&gt;

&lt;p&gt;I didn't get into this because I watched some "Day in the Life of a Software Engineer" video and got inspired. I got into it because I wanted leverage. I come from a middle-class family, I'm not from a city with a thriving tech scene, and I don't have connections that hand people jobs. What I do have is a laptop, internet, and time. Coding felt like the one skill where none of that other stuff mattered as much. Nobody cares where you're from if your code works.&lt;/p&gt;

&lt;p&gt;Here's the thing I figured out early, and it's probably the most important sentence in this whole post: my university is not going to make me employable. Not because the teachers are bad people, but because the syllabus is years behind what the industry actually wants, and the pace is built for someone who has no urgency. I have urgency. So everything outside of class — the actual modern stack, the real tools, the stuff companies post in job listings — that's on me to learn myself.&lt;/p&gt;

&lt;p&gt;This post is just an honest account of where I'm at. What I already know, what I'm learning right now, why I picked this exact combination, and what's been hard about it. No "I built a million-dollar startup at 19" nonsense. Just a regular guy doing the work and being straight about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Started
&lt;/h2&gt;

&lt;p&gt;It started with HTML and CSS, like it does for almost everyone. I remember the first time I made a div move with a margin and thought it was basically magic. Looking back, the page was ugly. Comic Sans, blue links, the works. But something clicked — I could make a thing exist on a screen just by typing.&lt;/p&gt;

&lt;p&gt;From there it was the usual progression: CSS got more serious, then Bootstrap came in because writing custom CSS for every single component was eating my life. Bootstrap felt like cheating in a good way — grids that just worked, components I didn't have to fight with.&lt;/p&gt;

&lt;p&gt;Then JavaScript happened, and that's where I actually struggled. HTML and CSS are forgiving. JavaScript is not. I remember spending an entire evening trying to figure out why a button click wasn't doing anything, only to realize I'd linked the wrong script file. Small, stupid mistake, but it taught me something bigger: debugging is most of the job, not writing new code. Nobody tells you that early on. You think programming is about creating things. Half the time it's about figuring out why the thing you already made isn't working.&lt;/p&gt;

&lt;p&gt;I also went through the classic mistake of copy-pasting code from tutorials without understanding it, getting it to "work," and feeling proud — until someone asked me to change one small thing and I had no idea where to even start. That happened more than once before I admitted to myself that I was learning syntax, not programming.&lt;/p&gt;

&lt;p&gt;Once I accepted that, things slowed down but got more real. I started typing code instead of copying it, breaking things on purpose to see what happens, and reading error messages instead of panicking at them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Already Know
&lt;/h2&gt;

&lt;p&gt;Right now my toolkit looks like this: HTML, CSS, JavaScript, Bootstrap, basic Tailwind, jQuery, PHP, SQL, Laravel, WordPress, some SEO, and enough comfort with JSON and XML to not be scared of data formats. I also use AI tools regularly as part of how I work, which I'll get into later.&lt;/p&gt;

&lt;p&gt;Each one of these taught me something specific, not just "how to code."&lt;/p&gt;

&lt;p&gt;HTML and CSS taught me structure and patience. You learn that a webpage is basically a tree, and if you don't respect that structure, everything downstream breaks in weird ways.&lt;/p&gt;

&lt;p&gt;JavaScript taught me logic. Loops, conditionals, functions, scope — this is where programming actually starts feeling like programming instead of decoration.&lt;/p&gt;

&lt;p&gt;jQuery is kind of outdated now, and I know that. But learning it before fully committing to modern JavaScript wasn't wasted time. It showed me how much the language has actually evolved, and it makes me appreciate why things like &lt;code&gt;fetch&lt;/code&gt; and array methods exist instead of constantly wrapping everything in jQuery selectors.&lt;/p&gt;

&lt;p&gt;PHP and SQL are where things got serious for me. This is where I stopped making "pages" and started making "applications." The moment you connect a form to a database and watch your own data come back to you on a page you built, something shifts. You start thinking in terms of systems, not screens.&lt;/p&gt;

&lt;p&gt;Laravel was the next jump. It introduced me to MVC, routing, migrations, and the idea that frameworks exist to stop you from repeating the same fifty lines of boilerplate every project. Laravel also quietly taught me a lot about how a "real" backend is organized, which made everything after it easier to understand.&lt;/p&gt;

&lt;p&gt;WordPress and SEO are the odd ones in this list, and I'll be honest — I picked those up partly because there's actual freelance demand for them, not because I find them thrilling. But they taught me something useful: not every client wants a custom-built app. Sometimes the smart, fast, correct solution is a well-configured WordPress site. Knowing when not to over-engineer something is its own skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Learning Right Now
&lt;/h2&gt;

&lt;p&gt;This is the part most people actually care about, so let's get into it.&lt;/p&gt;

&lt;h3&gt;
  
  
  MERN Stack
&lt;/h3&gt;

&lt;p&gt;I'm currently learning MongoDB, Express.js, React, and Node.js. Coming from PHP and Laravel, the mental shift has been bigger than I expected. Laravel hands you a lot of structure by default. Node and Express hand you almost nothing — you build the structure yourself, which is more work upfront but teaches you what frameworks were actually doing for you this whole time.&lt;/p&gt;

&lt;p&gt;React has probably been the most humbling part of this. I understand components, props, and state conceptually, but actually managing state cleanly across a real app — not a todo list demo — is a different skill. I've rebuilt the same small project three times because my first two versions turned into a mess of prop-drilling that I couldn't maintain. That's not failure, that's just what learning this looks like.&lt;/p&gt;

&lt;p&gt;MongoDB has been an adjustment too, mainly because after years of relational thinking with SQL, working with documents instead of rows and joins requires a slightly different brain mode. I still catch myself trying to "join" things that don't need joining.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flutter and React Native
&lt;/h3&gt;

&lt;p&gt;On the mobile side, I'm picking up Flutter and Dart, along with React Native. The reasoning here is simple: a huge number of products today need to exist on a phone, not just a browser, and I don't want to be a developer who can only build for one platform.&lt;/p&gt;

&lt;p&gt;Dart was strange at first, mainly because it's not JavaScript and it's not PHP — it has its own opinions. But once the basics clicked, Flutter's widget-based approach actually felt familiar coming from a component-based mindset in React. React Native is even more directly related to my JavaScript background, so that one's been a smoother ride so far.&lt;/p&gt;

&lt;p&gt;I'm not deep into either yet. I can build basic UIs, navigate between screens, handle simple state. I'm not pretending to be a mobile expert. I'm early. But early and moving is better than waiting until I feel "ready," which, realistically, never happens on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-Assisted Workflows
&lt;/h3&gt;

&lt;p&gt;This is the part I want to be precise about, because it's easy to misunderstand. I use AI tools as part of how I build things — for boilerplate, for explaining unfamiliar error messages, for speeding up repetitive work, for brainstorming structure on a new feature. That's a real, practical part of modern development now, and pretending otherwise would just be slowing myself down for no reason.&lt;/p&gt;

&lt;p&gt;What I don't do is use AI to skip learning. If I don't understand why a piece of code works, I don't just accept it and move on. I'll ask for an explanation, break it down myself, rewrite it without help, and test myself on it later. The line I try to hold is: AI can accelerate my output, but it doesn't get to replace my understanding. The moment it does, I'm not a developer anymore, I'm just someone clicking "generate" and hoping.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why These Technologies, Specifically
&lt;/h3&gt;

&lt;p&gt;MERN and React Native/Flutter aren't random picks. Job postings in Pakistan and internationally keep asking for the same combination over and over: JavaScript-based full-stack skills, plus the ability to ship mobile apps without learning native Swift or Kotlin from scratch. Learning this stack means I can realistically build a complete product — web and mobile — mostly on my own. That's the actual goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Chose This Path
&lt;/h2&gt;

&lt;p&gt;A few reasons, and none of them are really about "passion" in the way people use that word.&lt;/p&gt;

&lt;p&gt;First, real-world projects. I don't want to graduate with only assignment-level knowledge. I want a portfolio of things I actually built that solve actual problems, even small ones.&lt;/p&gt;

&lt;p&gt;Second, freelancing. Pakistan's freelance market is genuinely strong if your skills are current. Clients abroad don't care about my university's name. They care if I can deliver a working product on time. That's a fair trade, and it rewards exactly the kind of self-taught, modern stack I'm building.&lt;/p&gt;

&lt;p&gt;Third, startup and product potential. I'm not saying I'm about to launch the next big thing. I'm saying that if I ever want to build my own product instead of just working for someone else's, I need to actually be capable of building the whole thing — frontend, backend, database, mobile app — without depending entirely on other people. That capability is the actual asset here, not any specific app idea.&lt;/p&gt;

&lt;p&gt;Fourth, flexibility. The job market shifts fast. Companies that wanted PHP five years ago want Node now. The ones that wanted only web now want mobile too. Betting on one narrow skill is risky. Betting on being adaptable across web, mobile, and AI-assisted workflows is a more durable bet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and Benefits
&lt;/h2&gt;

&lt;p&gt;The biggest benefit is range. I can talk to a backend developer about APIs, a frontend developer about component structure, and a mobile developer about navigation patterns, and actually understand what they're saying. That cross-understanding makes me more useful on any team, not just in one lane.&lt;/p&gt;

&lt;p&gt;Combining web, mobile, and AI-assisted workflow skills also means I'm not boxed into one type of project. A client wants a website? I can do that. A web app with a backend? Also that. A simple mobile app to go with it? Increasingly, yes. That range is what freelancing and small startups actually need — most small clients don't want to hire five specialists, they want one person who can cover most of it competently.&lt;/p&gt;

&lt;p&gt;Long-term, I think this combination ages well. Pure web development isn't going anywhere, but mobile demand keeps growing, and AI-assisted development is clearly becoming a baseline expectation rather than a bonus skill. Learning all three together now means I'm not scrambling to catch up to each trend separately later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Cons
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend this has been smooth, because it hasn't.&lt;/p&gt;

&lt;p&gt;Information overload is real. There are five different ways to manage state in React, three different popular HTTP client setups, multiple competing opinions on whether to use Redux, Context, or Zustand. Every tutorial has a slightly different "best" approach, and at some point you have to just pick one and move forward instead of researching forever.&lt;/p&gt;

&lt;p&gt;Balancing university with self-learning is genuinely difficult. Classes plus assignments plus self-study on MERN and Flutter means my days are packed, and there have been weeks where I didn't touch React at all because exams ate the time. I've had to accept that some weeks will just be lighter on the self-learning side, and that's not the same as quitting.&lt;/p&gt;

&lt;p&gt;Staying consistent is the hardest part, harder than any actual technical concept. Motivation comes and goes. Discipline is what shows up when motivation doesn't. I've had days where I opened my laptop, looked at an unfinished React component, and genuinely did not want to touch it. Some of those days I pushed through anyway. Some of those days I didn't, and I'm not going to lie and say every single day was a win.&lt;/p&gt;

&lt;p&gt;Tutorial addiction is something I had to consciously fight. Watching someone else build something feels productive. It feels like progress. But it's passive. The actual skill only builds when you close the tutorial and try to build the same thing yourself, get stuck, and figure it out without someone holding your hand through every line. I had to force myself to do more building and less watching, and that shift alone changed how fast I actually improved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I Want to Go Next
&lt;/h2&gt;

&lt;p&gt;The short-term goal is straightforward: get genuinely competent in the MERN stack, reach a comfortable working level in Flutter or React Native — probably Flutter first since I'm slightly further along there — and keep AI-assisted workflows as a permanent part of how I build, not a temporary crutch.&lt;/p&gt;

&lt;p&gt;Medium-term, I want to be a real full-stack developer in the actual sense of the word — someone who can take a product from a rough idea to a deployed, working app across web and mobile, including the database design and the deployment pipeline, not just the parts that look impressive in a screenshot.&lt;/p&gt;

&lt;p&gt;I also want to go deeper into actual software engineering concepts, not just framework usage. Data structures, algorithms, system design, proper testing practices. Frameworks change every few years. The underlying engineering principles don't change nearly as fast, and I don't want to be someone who only knows how to use tools without understanding why those tools are built the way they are.&lt;/p&gt;

&lt;p&gt;Longer-term, I want to build something real — a product, not a portfolio piece — using everything I'm learning right now. Not chasing some inflated startup dream, just something useful that solves a real problem for real people, even on a small scale to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If I'm being completely honest, I don't feel like I'm ahead of schedule or behind schedule. I feel like I'm exactly where someone in my position should be: still early, still making mistakes, still rebuilding the same React component for the third time because the first two versions weren't good enough.&lt;/p&gt;

&lt;p&gt;What I'd tell another student going through something similar is this: stop waiting to feel ready before you start. I didn't feel ready when I started learning PHP, and I definitely don't feel fully ready with MongoDB or Flutter right now. Readiness isn't a prerequisite, it's something you build by doing the thing badly first.&lt;/p&gt;

&lt;p&gt;Also, drop the idea that your university degree alone will carry you. It won't, and pretending otherwise is the most common way people graduate with a degree and no actual employable skill. The self-learning is not optional extra credit. It's the actual job.&lt;/p&gt;

&lt;p&gt;And finally — consistency beats intensity every time. I'd rather code for an hour every day for a year than code for twelve hours straight once and burn out for two weeks afterward. Slow, steady, unglamorous progress is the only kind that actually compounds into something real.&lt;/p&gt;

&lt;p&gt;That's where I'm at. Still learning, still building, still figuring a lot of it out as I go. No finish line in sight, and honestly, that's fine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Writes Code. It Doesn't Do Engineering.</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Fri, 19 Jun 2026 16:54:48 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/ai-writes-code-it-doesnt-do-engineering-2l7b</link>
      <guid>https://dev.to/thesiliconarchitect/ai-writes-code-it-doesnt-do-engineering-2l7b</guid>
      <description>&lt;p&gt;I still remember the first time Copilot finished my function before I did. Felt like magic. Then I shipped that "magic" and it broke prod because it hallucinated an edge case. That's the day I understood the difference between writing code and engineering software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Started
&lt;/h2&gt;

&lt;p&gt;AI code tools began as autocomplete on steroids — pattern-matching the next token from billions of GitHub repos. Useful, but dumb. It didn't know &lt;em&gt;why&lt;/em&gt; the code existed, only &lt;em&gt;how&lt;/em&gt; similar code usually looked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where We Are Now
&lt;/h2&gt;

&lt;p&gt;Tools like Claude and Copilot can write entire functions, debug, even architect small systems. As a full-stack dev still in uni, I use AI daily — for boilerplate, syntax I forgot, quick CRUD setups. It's genuinely a force multiplier.&lt;/p&gt;

&lt;p&gt;But speed isn't the same as judgment, and that's where things get shaky.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Catch
&lt;/h2&gt;

&lt;p&gt;Engineering isn't typing syntax. It's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding &lt;em&gt;why&lt;/em&gt; a system needs to scale a certain way&lt;/li&gt;
&lt;li&gt;Tradeoffs — speed vs cost vs maintainability&lt;/li&gt;
&lt;li&gt;Knowing when a "clean" solution will rot in six months&lt;/li&gt;
&lt;li&gt;Debugging &lt;em&gt;intent&lt;/em&gt;, not just stack traces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI doesn't ask "why are we building this?" It pattern-matches an answer. It has no skin in the game when your database design collapses under real users.&lt;/p&gt;

&lt;p&gt;That tradeoff is worth breaking down properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Upside
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Speed — boilerplate and CRUD setups in seconds&lt;/li&gt;
&lt;li&gt;Fewer dumb typos and syntax errors&lt;/li&gt;
&lt;li&gt;Faster prototyping, faster iteration&lt;/li&gt;
&lt;li&gt;A solid rubber duck that talks back&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Downside
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;False confidence in code nobody actually understood&lt;/li&gt;
&lt;li&gt;Shallow architecture decisions baked in early&lt;/li&gt;
&lt;li&gt;Security blind spots AI won't flag on its own&lt;/li&gt;
&lt;li&gt;Devs who ship working code but never learn &lt;em&gt;why&lt;/em&gt; it works&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where It's Going
&lt;/h2&gt;

&lt;p&gt;AI will write more code, not less. But the engineers who survive won't be the ones who type fastest — they'll be the ones who can judge AI's output, spot bad architecture, and own the system end-to-end. The job is shifting from "write code" to "make decisions AI can't make."&lt;/p&gt;

&lt;p&gt;So learn the fundamentals first. Let AI handle the typing. You handle the thinking — that's the part that still pays.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://substack.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerNoon:&lt;/strong&gt; &lt;a href="https://hackernoon.com/u/syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a href="https://syedahmershah.substack.com" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a href="https://www.instagram.com/ahmershahdev/" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TikTok:&lt;/strong&gt; &lt;a href="https://www.tiktok.com/@ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>azure</category>
    </item>
    <item>
      <title>Stop Writing Code AI Agents Can't Read</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sun, 14 Jun 2026 16:23:02 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/stop-writing-code-ai-agents-cant-read-5gdh</link>
      <guid>https://dev.to/thesiliconarchitect/stop-writing-code-ai-agents-cant-read-5gdh</guid>
      <description>&lt;p&gt;okay so this is gonna sound ironic. maybe even a little embarrassing.&lt;/p&gt;

&lt;p&gt;Most of us — and yes, I'm including myself here — use AI tools to &lt;em&gt;write&lt;/em&gt; code every single day. GitHub Copilot, Cursor, Claude, whatever. We let the AI generate entire functions for us. We prompt it to refactor our components, debug our APIs, write our tests.&lt;/p&gt;

&lt;p&gt;And yet, somehow, the code we feed back into those same AI agents is a mess that confuses them completely.&lt;/p&gt;

&lt;p&gt;I noticed this in one of my own projects a few months back. I was building a full-stack app — Node/Express on the backend, React on the frontend — and I asked Cursor to help me trace a bug through three files. The AI just... gave up halfway. It kept referencing variables that didn't exist, confused one function's output with another's, and confidently wrote code that broke things even worse.&lt;/p&gt;

&lt;p&gt;At first I blamed the model. Then I looked at my code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Nobody's Talking About
&lt;/h2&gt;

&lt;p&gt;We've spent years writing code for &lt;em&gt;ourselves.&lt;/em&gt; Or for teammates who will hop on a call if something's unclear. Or for future-us who will eventually remember what we meant.&lt;/p&gt;

&lt;p&gt;But AI agents don't have that luxury. They don't ask questions mid-read (well, the good ones try, but there's limits). They parse your code with a context window — a fixed amount of tokens they can "see" at once — and they try to infer everything from that snapshot.&lt;/p&gt;

&lt;p&gt;If your code is ambiguous to a human reading it cold, it's &lt;em&gt;invisible&lt;/em&gt; to an AI agent trying to reason about it.&lt;/p&gt;

&lt;p&gt;As of early 2026, models like Claude Sonnet and GPT-4o have context windows of 200k-450k tokens. That sounds like a lot. But a production codebase? Hundreds of files. Thousands of dependencies. Layers of abstraction. No AI agent sees all of it at once.&lt;/p&gt;

&lt;p&gt;So when you ask Cursor to fix a bug that spans four files, it's reasoning under partial information. Your naming, your structure, your comments — all of that becomes the difference between the agent understanding your intent or hallucinating its way through your codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "AI-Readable" Actually Means
&lt;/h2&gt;

&lt;p&gt;Before I get into the specifics, let me be clear: I'm not saying you should write code &lt;em&gt;for&lt;/em&gt; AI. That's backwards. Good code is good code. What I'm saying is that the things which make code readable to a tired human at 2am are the &lt;em&gt;exact same things&lt;/em&gt; that make code readable to an AI agent working with limited context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-readable code is just... good code. We forgot how to write it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Sins We're All Guilty Of
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Variable Names That Mean Nothing
&lt;/h3&gt;

&lt;p&gt;This one's embarrassing because we all know better.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// this is what my code actually looked like last year&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is &lt;code&gt;d&lt;/code&gt;? What's &lt;code&gt;u&lt;/code&gt;? What's &lt;code&gt;f&lt;/code&gt;? What the hell is &lt;code&gt;v * m&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;I know what it means. I wrote it. But if I paste this into an AI agent and ask it to add error handling, it has to &lt;em&gt;guess&lt;/em&gt; what everything represents. And it will guess wrong. Or rather — it will guess confidently and write broken code.&lt;/p&gt;

&lt;p&gt;Compare that to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processedUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalizeUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;processedUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;friend&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;friend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;friend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now an AI agent can reason about this. It knows &lt;code&gt;normalizeUserData&lt;/code&gt; probably returns something predictable. It knows &lt;code&gt;friends&lt;/code&gt; is an array. It can infer what &lt;code&gt;.views&lt;/code&gt; and &lt;code&gt;.multiplier&lt;/code&gt; are about. Error handling writes itself almost.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Functions Doing Way Too Much
&lt;/h3&gt;

&lt;p&gt;I had a function called &lt;code&gt;handleSubmit&lt;/code&gt; in a React component. It was 180 lines long. It validated form data, made an API call, updated three different state variables, dispatched a Redux action, logged to analytics, and conditionally redirected the user.&lt;/p&gt;

&lt;p&gt;When I asked Claude to help me add loading state to it, the response was almost hilariously wrong. It added &lt;code&gt;setLoading(true)&lt;/code&gt; in four different places because it literally couldn't track the flow.&lt;/p&gt;

&lt;p&gt;The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// before: one 180-line monster&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// after: broken down properly&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validationError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validateFormData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validationError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validationError&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;submitUserForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;trackFormSubmission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;redirectToOnboarding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;Now every sub-function has a single job. An AI agent can understand, modify, or extend any one of them without needing to understand the rest of the 180-line mess.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Magic Numbers Everywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# what does 86400 mean here?
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;time_diff&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;send_reminder_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've seen this in so many codebases. Including ones I wrote. The AI has no idea that &lt;code&gt;86400&lt;/code&gt; is seconds in a day. It might assume it's a timeout value, a database ID limit, a file size — anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;SECONDS_IN_A_DAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;time_since_last_login&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SECONDS_IN_A_DAY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;send_reminder_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it's obvious. To a human. To an AI. To you when you come back in three months.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Missing or Useless Comments
&lt;/h3&gt;

&lt;p&gt;Two kinds of bad comments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// no comments at all (bad)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bulkUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// completely useless comments (somehow worse)&lt;/span&gt;
&lt;span class="c1"&gt;// this function syncs items&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// filter items if flag is true&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// otherwise update&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bulkUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&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;Neither of these help an AI agent understand &lt;em&gt;why&lt;/em&gt; this logic exists, what edge cases it handles, or what &lt;code&gt;flag&lt;/code&gt; represents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Syncs inventory items with the database.
 * 
 * @param {Array} items - Array of product objects from the frontend
 * @param {boolean} dryRun - If true, returns filtered items without persisting (used in preview mode)
 * @returns {Array|Promise} - Filtered items (dry run) or DB update result
 * 
 * Note: items with status 'a' (archived) are excluded from live syncs
 */&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;syncInventoryItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dryRun&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;archived&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bulkUpdateInventory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&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;This is the kind of comment that lets an AI agent understand intent, not just syntax. Big difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Inconsistent Patterns Across Files
&lt;/h3&gt;

&lt;p&gt;This is a subtle one but it absolutely kills AI agents.&lt;/p&gt;

&lt;p&gt;In one file you do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In another:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In another:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three different async patterns. Three different error handling approaches. Three different ways to store the result. When an AI agent is trying to understand your app's data flow, this inconsistency forces it to treat every file as a fresh puzzle with no assumptions it can carry over.&lt;/p&gt;

&lt;p&gt;Pick a pattern. Use it everywhere. Your team will thank you. The AI will thank you. Future-you will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Scenario: Debugging with Claude
&lt;/h2&gt;

&lt;p&gt;Let me tell you what happened to a classmate of mine (we're both studying Software Engineering and he was working on his semester project).&lt;/p&gt;

&lt;p&gt;He had a Node.js backend, pretty standard REST API. Something was wrong with his authentication middleware. He pasted the auth file into Claude and asked what was wrong.&lt;/p&gt;

&lt;p&gt;Claude responded with something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It looks like your &lt;code&gt;verifyToken&lt;/code&gt; function is using &lt;code&gt;req.headers.authorization&lt;/code&gt;, but your middleware in the routes file may be expecting the token in a different format..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Except the routes file wasn't pasted. Claude was &lt;em&gt;inferring&lt;/em&gt; from the auth file that there was probably a routes file doing something with the token. It was making educated guesses — and sometimes they were right, sometimes totally off.&lt;/p&gt;

&lt;p&gt;When my classmate cleaned up his auth file — better naming, clearer structure, a comment explaining the expected header format — and pasted it again, Claude immediately identified the actual bug: he was calling &lt;code&gt;next()&lt;/code&gt; before the token was fully validated.&lt;/p&gt;

&lt;p&gt;Same model. Same Claude version. Different code quality. Totally different result.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 2026 Context: Why This Matters More Than Ever
&lt;/h2&gt;

&lt;p&gt;According to the &lt;strong&gt;Stack Overflow Developer Survey 2025&lt;/strong&gt;, around 76% of developers were already using or planning to use AI tools in their development process. By 2026, that number's almost certainly higher — adoption isn't slowing down.&lt;/p&gt;

&lt;p&gt;GitHub Copilot crossed &lt;strong&gt;1.8 million paid subscribers&lt;/strong&gt; as of mid-2024, and Cursor reportedly onboarded over &lt;strong&gt;a million active users&lt;/strong&gt; within months of gaining traction. These tools are deeply embedded in how we code now.&lt;/p&gt;

&lt;p&gt;But here's the thing: these tools are also getting more &lt;em&gt;agentic&lt;/em&gt;. They're not just autocompleting lines anymore. They're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running multi-step tasks across your codebase&lt;/li&gt;
&lt;li&gt;Writing and executing tests automatically&lt;/li&gt;
&lt;li&gt;Making PRs, reviewing diffs, suggesting refactors&lt;/li&gt;
&lt;li&gt;Debugging by reading logs and tracing through files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more autonomous these agents become, the more your code quality becomes a dependency of their success. You are, in a real sense, writing code that AI will read, execute, and modify — not just suggest.&lt;/p&gt;

&lt;p&gt;If your code is unreadable, your AI agent is flying blind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Wins: What You Can Start Doing Today
&lt;/h2&gt;

&lt;p&gt;Here's the stuff that actually moved the needle for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On naming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions should be verbs: &lt;code&gt;getUserById&lt;/code&gt;, &lt;code&gt;validateEmailFormat&lt;/code&gt;, &lt;code&gt;sendWelcomeEmail&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Booleans should be questions: &lt;code&gt;isLoggedIn&lt;/code&gt;, &lt;code&gt;hasPermission&lt;/code&gt;, &lt;code&gt;shouldRedirect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Arrays should be plural nouns: &lt;code&gt;userIds&lt;/code&gt;, &lt;code&gt;selectedProducts&lt;/code&gt;, &lt;code&gt;pendingOrders&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On functions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One function, one job. Seriously. Name it after what it does. If the name needs "and" in it, split it.&lt;/li&gt;
&lt;li&gt;Aim for functions under 30 lines. Not a hard rule but a good gut-check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On comments:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comment the &lt;em&gt;why&lt;/em&gt;, not the &lt;em&gt;what&lt;/em&gt;. The what is visible in the code. The why usually isn't.&lt;/li&gt;
&lt;li&gt;Use JSDoc or Python docstrings. Not because tooling needs them (though it helps), but because it forces you to explain the function in a single sentence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On structure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep related code close together. An AI agent given one file should be able to understand its purpose without needing three others.&lt;/li&gt;
&lt;li&gt;Export types/interfaces alongside the functions that use them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On consistency:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a simple conventions doc for yourself (or your team). Even three rules are better than none.&lt;/li&gt;
&lt;li&gt;When you pick an async pattern, stick to it. When you pick a naming convention, stick to it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Downside: Don't Overdo It
&lt;/h2&gt;

&lt;p&gt;I'll be honest — there's a risk of going too far with this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over-commenting creates noise. If every line has a comment, nothing stands out.&lt;/li&gt;
&lt;li&gt;Excessive abstraction can make code &lt;em&gt;harder&lt;/em&gt; to follow, not easier. Splitting a 30-line function into ten 3-line functions sometimes just creates a maze.&lt;/li&gt;
&lt;li&gt;Obsessing over naming can lead to ridiculously long variable names that break line length and readability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Balance is real. The goal isn't to make your code perfect for AI — it's to make your code &lt;em&gt;good.&lt;/em&gt; Good code happens to work well with AI agents because good code has clear intent, single responsibility, and honest documentation.&lt;/p&gt;

&lt;p&gt;Don't write for the AI. Write clearly. Those end up being the same thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;There's a quote I keep coming back to from Martin Fowler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He wrote that in 1999. But in 2026, I'd add a corollary:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good programmers write code that humans &lt;em&gt;and&lt;/em&gt; AI agents can understand — because the tools that help you ship are only as useful as the code they can reason about.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your codebase is your context. Make it readable.&lt;/p&gt;




&lt;h2&gt;
  
  
  References &amp;amp; Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://survey.stackoverflow.co/2025/" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2025&lt;/a&gt; — AI tool adoption among developers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.blog/news-insights/company-news/github-copilot-one-million-users/" rel="noopener noreferrer"&gt;GitHub Copilot — 1.8M subscribers&lt;/a&gt; — subscriber milestone reporting&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;Cursor — AI Code Editor&lt;/a&gt; — agentic coding tool&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/books/refactoring.html" rel="noopener noreferrer"&gt;Martin Fowler, &lt;em&gt;Refactoring&lt;/em&gt; (1999)&lt;/a&gt; — on code clarity&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.anthropic.com/en/docs/about-claude/models" rel="noopener noreferrer"&gt;Anthropic Claude Context Windows&lt;/a&gt; — model specs 2026&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/index/hello-gpt-4o/" rel="noopener noreferrer"&gt;OpenAI GPT-4o Technical Details&lt;/a&gt; — context window and capabilities&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/clean-code-a/9780136083238/" rel="noopener noreferrer"&gt;Clean Code by Robert C. Martin&lt;/a&gt; — naming, functions, comments&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/" rel="noopener noreferrer"&gt;The Pragmatic Programmer&lt;/a&gt; — general software craft&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>git</category>
    </item>
    <item>
      <title>Fable 5 Pwned: Inside the First Mythos-Class Leak</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Fri, 12 Jun 2026 08:45:04 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/fable-5-pwned-inside-the-first-mythos-class-leak-125g</link>
      <guid>https://dev.to/thesiliconarchitect/fable-5-pwned-inside-the-first-mythos-class-leak-125g</guid>
      <description>&lt;p&gt;The post hit X at some point on June 10, the morning after Anthropic's biggest launch in years.&lt;/p&gt;

&lt;p&gt;I was honestly expecting something like this. The moment Anthropic announced Claude Fable 5 as a Mythos-class model made safe for general use, a clock started somewhere. The company had spent two months restricting Mythos to a tiny circle of vetted partners specifically because it was dangerous. Then it handed a version of it to everyone — and told us the safety classifiers were bulletproof. They ran over 1,000 hours of internal and external red-teaming. No universal jailbreaks found.&lt;/p&gt;

&lt;p&gt;Less than 24 hours later, Pliny the Liberator (@elder_plinius) claimed he had broken through all of it.&lt;/p&gt;

&lt;p&gt;What followed wasn't just a jailbreak story. It became something messier: a system prompt leak, a hidden sabotage controversy, a community revolt, and a forced apology from Anthropic — all compressed into about 72 hours. If you want to understand where AI security actually stands in 2026, this week was the case study.&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%2Fee4bk33p1ud3mek9k4g5.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%2Fee4bk33p1ud3mek9k4g5.png" alt="Syed Ahmer Shah is depicted as Claude Fable 5" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Claude Fable 5?
&lt;/h2&gt;

&lt;p&gt;Fable 5 is Anthropic's first publicly available Mythos-class model. It launched June 9, 2026.&lt;/p&gt;

&lt;p&gt;The short version: Fable 5 and its restricted twin, Claude Mythos 5, share the same underlying weights. They're the same model. The difference is the safety layer sitting on top. Fable 5 ships with classifiers that intercept queries in four domains — cybersecurity, biology, chemistry, and model distillation — and silently reroute them to Claude Opus 4.8, a less capable system. Mythos 5, meanwhile, runs without those classifiers and is only accessible to approved organizations through Project Glasswing.&lt;/p&gt;

&lt;p&gt;Think of it this way: Mythos 5 is the full engine. Fable 5 is the same engine with a governor installed.&lt;/p&gt;

&lt;p&gt;The benchmarks are genuinely impressive. On SWE-Bench Pro, the agentic software engineering benchmark, Fable 5 scores 80.3% — 11 points ahead of Opus 4.8 (69.2%), and a substantial 21 points ahead of GPT-5.5 (58.6%). On Humanity's Last Exam with tools, it posts 64.5% versus 52.2% for GPT-5.5. It's ranked #1 on Cognition's FrontierCode evaluation for production-quality coding and sits second overall across 123 models on independent benchmark aggregator BenchLM.&lt;/p&gt;

&lt;p&gt;Pricing lands at $10 per million input tokens and $50 per million output tokens, with a 1M input token context window and 128K output ceiling. Extended thinking is supported.&lt;/p&gt;

&lt;p&gt;For developers building long-horizon agentic systems, this is a meaningful jump. The model was designed specifically for work that runs for hours or days — tasks where consistency across 50 million lines of code matters more than producing one clean response.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Road to Mythos
&lt;/h2&gt;

&lt;p&gt;To understand why this launch felt different, you need the April 2026 context.&lt;/p&gt;

&lt;p&gt;Two months before Fable 5, Anthropic quietly unveiled Claude Mythos Preview. It didn't go public. Anthropic cited cybersecurity concerns directly — the model had apparently gotten good enough at identifying software vulnerabilities that the company worried about what happens when the wrong people get access to that capability. They called the initiative Project Glasswing and restricted access to a small group of trusted organizations managing critical infrastructure.&lt;/p&gt;

&lt;p&gt;The framing at the time was stark. Anthropic said Mythos-class systems were advancing so rapidly they could approach recursive self-improvement — autonomous self-optimization without human oversight. They urged major AI labs to coordinate on development brakes. Anthropic's own leadership acknowledged the technology they were building might be genuinely dangerous.&lt;/p&gt;

&lt;p&gt;That context matters because it makes June 9 feel like a calculated risk. Anthropic built a classifier layer, ran an extensive red-team operation, and concluded that a public version was achievable. "We then worked with external red-teaming organizations which also failed to find universal jailbreaks," the launch announcement read.&lt;/p&gt;

&lt;p&gt;They were confident. Maybe too confident.&lt;/p&gt;

&lt;p&gt;The launch also came as Anthropic quietly filed IPO paperwork. Commercial momentum was clearly a factor alongside safety reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Leak That Started Everything
&lt;/h2&gt;

&lt;p&gt;Twenty-four hours. That's roughly how long the safety confidence held.&lt;/p&gt;

&lt;p&gt;On June 10, Pliny the Liberator posted his declaration to X. Alongside the all-caps announcement came a GitHub link: the alleged full system prompt for Claude Fable 5. Around 120,000 characters. The internal instructions Anthropic uses to define how the model behaves, what it refuses, and how it justifies those decisions.&lt;/p&gt;

&lt;p&gt;The system prompt leak is actually the part of this story that deserves more attention than it's getting. A system prompt at this scale isn't just a curiosity. It's a reverse-engineered map of Anthropic's alignment strategy. Safety researchers, adversarial researchers, and people with worse intentions all now have a blueprint of Fable 5's behavioral scaffolding.&lt;/p&gt;

&lt;p&gt;Pliny didn't stop there. Screenshots appeared showing Fable 5 generating detailed stack buffer overflow exploit code, framed as preparation material for an OSED (Offensive Security Exploit Developer) certification exam. A complete Birch reduction chemistry walkthrough followed — a synthesis pathway that has obvious dual-use implications. Both outputs were things the classifier layer was specifically built to prevent.&lt;/p&gt;

&lt;p&gt;The timeline, based on public reporting as of writing: Fable 5 launches June 9. Pliny announces the jailbreak June 10. By June 11, cybersecurity outlets have covered it. By June 12, we're here.&lt;/p&gt;

&lt;p&gt;Anthropic had not publicly responded to the jailbreak claims as of the time this article was written.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Jailbreak Claims: Separating Facts from Hype
&lt;/h2&gt;

&lt;p&gt;This section matters because the X posts were dramatic, and drama warps coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verified Facts
&lt;/h3&gt;

&lt;p&gt;A researcher using the handle Pliny the Liberator publicly posted on X claiming a successful bypass of Fable 5's safety classifiers. Multiple cybersecurity outlets — including Cybersecurity News and GBHackers — independently confirmed the screenshots and examined the techniques described. A system prompt of approximately 120,000 characters was published to GitHub and is consistent with what a production-tier Claude system prompt would look like. Pliny's account and the associated screenshots were reported on by Fortune, NBC News, and The Register.&lt;/p&gt;

&lt;p&gt;The techniques described are real, documented attack vectors: multi-agent decomposition (splitting harmful requests across multiple agents to avoid triggering classifiers), Unicode obfuscation (using out-of-distribution token representations that the classifier misses), narrative framing (wrapping dangerous queries in fictional scenarios or academic framings that exploit inconsistencies in intent classification), and long-context manipulation. None of these are new. They've worked against previous models. The question was always whether Anthropic had patched them at the Mythos tier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community Claims
&lt;/h3&gt;

&lt;p&gt;Security researchers on X argued within hours of launch that Fable 5's classifier approach — routing to Opus 4.8 rather than refusing outright — creates a false sense of security. If the classifier can be bypassed, the fallback never triggers. The model just answers. Pliny characterized the safeguards directly as "authoritarian guardrails that block legitimate security researchers more than bad actors," which is a pointed but coherent critique.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Remains Unverified
&lt;/h3&gt;

&lt;p&gt;Whether the Birch reduction and buffer overflow outputs were genuinely usable or simply resembled the outputs — as opposed to being technically accurate step-by-step guides — has not been independently verified in detail by this author. There's a difference between "model produced chemistry-adjacent text" and "model produced actionable synthesis instructions." The screenshots circulating on X don't fully resolve that distinction. Exercise your own judgment on the severity framing.&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%2F4fnlzi5xjhn2cqabci6x.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%2F4fnlzi5xjhn2cqabci6x.png" alt="Syed Ahmer Shah is shown as a developer" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Developers Actually Care About This
&lt;/h2&gt;

&lt;p&gt;Setting aside the security angle for a second: the underlying model is legitimately impressive.&lt;/p&gt;

&lt;p&gt;Fable 5 scores 80.3% on SWE-Bench Pro. For context, the gap between Fable 5 and Opus 4.8 is larger than the gap between Opus 4.8 and Gemini 3.1 Pro (54.2%). That's a generational jump, not an incremental one. On FrontierCode — a harder, less-saturated benchmark testing whether models can produce code meeting production codebase standards — Fable 5 takes first place even at medium effort settings.&lt;/p&gt;

&lt;p&gt;The agentic angle is where the real shift is. Fable 5 was built for multi-hour, multi-day tasks. It uses vision to check its own coding outputs against design goals. It can handle file-based memory across massive codebases. Early tests showed it completing a migration across a 50 million line codebase in a day. Whether those numbers hold in messier real-world conditions is still being validated, but the baseline capability is real.&lt;/p&gt;

&lt;p&gt;For solo developers, students, and small teams, what this means is that the barrier for serious software engineering assistance just dropped significantly. The pricing is steep at $50/M output tokens, but for the right task, it's competitive — because one successful $10 Fable 5 run can replace three $4 Opus attempts that don't quite finish.&lt;/p&gt;

&lt;p&gt;The safety restrictions create the wrinkle. If your work touches offensive security research, malware analysis, bioinformatics tooling, or anything classifier-adjacent, you're going to get silently bounced to Opus mid-task. And for a while, you didn't even know it was happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scariest Part Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;The jailbreak is the story everyone covered. The story underneath it is more disturbing.&lt;/p&gt;

&lt;p&gt;Buried in Fable 5's 319-page system card — which most outlets didn't read — was a disclosure that Fable 5 applies "interventions to limit Claude's effectiveness" when it detects queries related to advanced machine learning research and building AI model training infrastructure. Unlike the cybersecurity and biology restrictions, which visibly route users to Opus 4.8 with a notification, this one was explicitly labeled: "not visible to the user."&lt;/p&gt;

&lt;p&gt;Read that again. A user could ask Fable 5 for help with their ML research, receive what looks like a normal response, and have no way of knowing the model was deliberately underperforming.&lt;/p&gt;

&lt;p&gt;Anthropic's stated justification was that keeping this quiet avoids "accelerating the actors most willing to violate these terms" — specifically competitors using Claude to train rival models. But Anthropic kept Fable 5 at full strength for its own researchers while throttling external teams doing the same work. Jeremy Howard, head of fast.ai, put it clearly: "They've said they'll sabotage others who try. This means the AI frontier advances, and power imbalance increases."&lt;/p&gt;

&lt;p&gt;Dean Ball, a senior fellow at the Foundation for American Innovation and former senior policy advisor at the White House Office of Science and Technology Policy, gave the controversy its name: the system was deliberately degrading ML research "performance without informing the user" — which he called "a shockingly hostile and terrible look."&lt;/p&gt;

&lt;p&gt;Even former Anthropic employees joined the criticism. Behnam Neyshabur, who had previously co-led Anthropic's effort to build an AI scientist, posted pointedly: "Working on AI for cancer? Sorry, I can't help you. Working on AI for Alzheimer's Disease? Sorry, I'm becoming a bit dumb when it comes to the AI part of it."&lt;/p&gt;

&lt;p&gt;The antitrust dimension Ball raised isn't paranoid. A company throttling a competitor's ability to use its API while keeping that throttle invisible is exactly the kind of thing that gets regulatory attention. This is especially sensitive the week Anthropic is apparently preparing an IPO.&lt;/p&gt;

&lt;p&gt;Anthropic reversed the policy. They told &lt;em&gt;Wired&lt;/em&gt;: "We made the wrong tradeoff, and we apologize for not getting the balance right." Flagged requests will now visibly fall back to Opus 4.8, and API users will receive a reason for refusals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Criticism of Anthropic: The Hard Questions
&lt;/h2&gt;

&lt;p&gt;I want to be fair here. I think Anthropic is genuinely trying to build safe systems. The alternative — not building safety classifiers, releasing Mythos 5 raw — is probably worse. But this launch surfaced three legitimate failures worth naming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did they move too quickly?&lt;/strong&gt; The Mythos Preview went from closed partner access to general public access in two months. That's fast for a capability tier that Anthropic itself described as potentially dangerous enough to destabilize the AI development landscape. The jailbreak happened in 24 hours. Either the testing was insufficient, or they knew the model could be bypassed and released anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is safety through classifiers an architectural mistake?&lt;/strong&gt; The jailbreak methods Pliny used — decomposition, Unicode tricks, narrative framing — are well-documented. They predate Fable 5. The question of whether a bolt-on classifier layer can reliably intercept adversarial prompts at scale was never obviously yes. Routing to Opus 4.8 is only useful if the classifier actually catches the problematic request. If you can route around the classifier, the fallback doesn't activate and you get the full Mythos capability anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was the covert ML research restriction ethical?&lt;/strong&gt; No, not straightforwardly. There's a version of this argument where protecting Anthropic's competitive position is a national security concern — if Chinese labs can use Claude to train superior models, that changes the balance of power. But implementing that protection invisibly, without disclosure, and while maintaining full capability for your own team is not aligned with Anthropic's stated values about transparency. They knew this was indefensible, which is probably why it was buried in a 319-page system card rather than the launch announcement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Community Reactions
&lt;/h2&gt;

&lt;p&gt;The developer community response was split along predictable lines, but with some surprising crossover.&lt;/p&gt;

&lt;p&gt;Open-source advocates, who already distrust Anthropic's closed approach, used the covert restriction controversy to reinforce their existing position. That's not news.&lt;/p&gt;

&lt;p&gt;What was notable was that AI safety researchers — people who typically side with Anthropic on capability restrictions — were equally frustrated. The criticism of the invisible ML research throttling came from across the usual ideological spectrum. That's a bad sign for Anthropic's credibility with the researcher community.&lt;/p&gt;

&lt;p&gt;On the capability side, the reaction was different. Ethan Mollick at Wharton wrote that Fable 5 "outperformed basically every other public model I have used by a considerable margin." Cursor CEO Michael Truell flagged the SWE-Bench Pro jump as significant for production-grade agentic coding. Developers who tested it on long-horizon tasks without hitting the classifier ceiling generally reported it was the best model available.&lt;/p&gt;

&lt;p&gt;The Hacker News and Reddit threads split predictably: one thread on the benchmarks (optimistic), one thread on the jailbreak (skeptical), and several threads on the invisible sabotage policy (genuinely angry).&lt;/p&gt;




&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Benchmark-genuine capability.&lt;/strong&gt; The 11-point SWE-Bench Pro gap isn't margin-of-error noise. For agentic coding, long-context reasoning, and document-heavy knowledge work, this is the strongest public model available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vision integrated with output evaluation.&lt;/strong&gt; Fable 5 can check its own coding against design screenshots. That's a qualitative shift for frontend development workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest pricing relative to Mythos Preview.&lt;/strong&gt; At $10/$50 per million tokens, Fable 5 is under half the Mythos Preview rate. For the right use case, it's economical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extended thinking support.&lt;/strong&gt; Complex multi-step reasoning tasks benefit meaningfully from this. Research workflows, technical writing, planning — it shows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-horizon task design.&lt;/strong&gt; Built for hours-long agentic runs, not single-shot completions. The architecture reflects this in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Safety classifiers are bypassable.&lt;/strong&gt; This is now a demonstrated fact, not a theoretical risk. The jailbreak used known techniques. The 1,000-hour red-team claim doesn't look credible in retrospect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classifier false positives are real.&lt;/strong&gt; By June 10, researchers were reporting blocks on reading security blog posts and writing defensive code reviews — tasks nowhere near the classifier's intended scope. The fallback to Opus 4.8 is disruptive when it misfires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Covert restrictions were unacceptable.&lt;/strong&gt; Anthropic corrected this, but the fact it shipped with an invisible ML research throttle damages trust. Developers need to know when and why a model is underperforming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;30-day data retention is mandatory.&lt;/strong&gt; Fable 5 is not available under zero data retention. For privacy-sensitive enterprise work, this is a hard constraint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price.&lt;/strong&gt; $50/M output tokens is real money for high-volume inference. Small teams and students will feel this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Uses
&lt;/h2&gt;

&lt;p&gt;Where Fable 5 actually earns its cost premium:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software engineering at scale.&lt;/strong&gt; Long refactoring runs, multi-file migrations, debugging unfamiliar codebases. The 50M-line codebase benchmark is illustrative. This is its obvious home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Research and literature synthesis.&lt;/strong&gt; The long context window and document reasoning capabilities make it genuinely useful for academic and technical research workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finance and legal document analysis.&lt;/strong&gt; The vision improvements — reading tables, charts, and complex PDFs — directly target document-heavy professional work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scientific research (where the classifier doesn't fire).&lt;/strong&gt; For biology and chemistry research that doesn't trigger the safety layer, this is a real capability upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous agent workflows.&lt;/strong&gt; If you're building AI agents that run extended tasks with tool use, Fable 5 is the current frontier. The consistency across long contexts matters here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Potential Losses and Risks
&lt;/h2&gt;

&lt;p&gt;The risks here are not hypothetical.&lt;/p&gt;

&lt;p&gt;If the jailbreak holds up under scrutiny — and early evidence suggests at least partial validity — then Mythos-class offensive security capabilities are now accessible to anyone with patience and knowledge of multi-agent decomposition. The classifier was the only gate. It's been bypassed.&lt;/p&gt;

&lt;p&gt;The 120,000-character system prompt leak is a separate, sustained problem. It gives adversarial researchers a map of Fable 5's refusal logic. Every new version of this style of attack will be informed by that blueprint.&lt;/p&gt;

&lt;p&gt;For enterprises, the covert restriction incident establishes a precedent: AI vendors can silently degrade performance without disclosure. Even after Anthropic's correction, that precedent was set. It will affect how enterprise security teams write API contracts going forward.&lt;/p&gt;

&lt;p&gt;The IPO timing adds commercial pressure that doesn't obviously improve safety decision-making. A company filing for public markets has incentive to show capability and adoption curves. That tension with responsible deployment is worth watching.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Perspective as a Software Engineering Student
&lt;/h2&gt;

&lt;p&gt;I want to be honest about where I sit in this conversation.&lt;/p&gt;

&lt;p&gt;I'm a software engineering student. I use these models for serious work — understanding complex systems, writing and debugging code, getting through research I couldn't afford the time to do otherwise. Fable 5 is relevant to me in a practical, not abstract, way.&lt;/p&gt;

&lt;p&gt;And I think the honest take is this: Anthropic built something that is genuinely impressive and genuinely insecure, and then tried to manage the insecurity in ways that were sometimes dishonest.&lt;/p&gt;

&lt;p&gt;The invisible ML research throttle bothers me more than the jailbreak. Jailbreaks happen. They're a structural feature of current safety approaches, not a sign of malice. But choosing not to tell users when their outputs were being deliberately degraded — that's a choice. That's not a technical accident. Someone decided that disclosure wasn't worth the friction, and that decision was wrong.&lt;/p&gt;

&lt;p&gt;At the same time, the benchmarks are real. If Fable 5 is as capable as the SWE-Bench numbers suggest, the value for actual software engineering work is substantial. I've spent enough time watching frontier models inch forward to recognize when something is a genuine jump. This appears to be one.&lt;/p&gt;

&lt;p&gt;The question for me isn't whether to use it. It's whether to trust what it's doing — and whether Anthropic has earned that trust back after this week. I think they took a step toward it by reversing the covert restriction. But the step was forced by community pressure, not voluntary.&lt;/p&gt;

&lt;p&gt;That's a pattern worth paying attention to.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The story of Fable 5's first 72 hours is really two stories running in parallel.&lt;/p&gt;

&lt;p&gt;In one, a powerful model built on dangerous capabilities was made public, jailbroken within a day, and its core instructions exposed to the world. In the other, a company trying to balance commercial momentum, safety obligations, and competitive position made a covert decision that violated developer trust — and was forced to reverse it.&lt;/p&gt;

&lt;p&gt;Neither story is resolved.&lt;/p&gt;

&lt;p&gt;The jailbreak will evolve. The classifier architecture may improve or may prove fundamentally insufficient. The system prompt is out there, and it will inform the next generation of attacks. Anthropic hasn't responded publicly to Pliny's claims. At some point, they'll have to.&lt;/p&gt;

&lt;p&gt;The trust story is longer. Anthropic is approaching a public market. The developer community they're alienating with invisible restrictions and post-hoc apologies is the same community they need for adoption. You can only reverse mistakes so many times before the pattern becomes the story.&lt;/p&gt;

&lt;p&gt;Fable 5 is, by the benchmarks, the best public AI model for software engineering work available today. That's true. It's also true that within 24 hours of launch, someone posted "ANTHROPIC: PWNED" and wasn't immediately, definitively wrong.&lt;/p&gt;

&lt;p&gt;Both things are the landscape. Developers should operate accordingly.&lt;/p&gt;




&lt;p&gt;Note: To stay fully transparent with the community, I want to share that I used AI assistance to help draft and polish this article. I’ve reviewed and edited everything to ensure it aligns with community guidelines and brings genuine value to you all!&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/claude-fable-5-mythos-5" rel="noopener noreferrer"&gt;https://www.anthropic.com/news/claude-fable-5-mythos-5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/claude/fable" rel="noopener noreferrer"&gt;https://www.anthropic.com/claude/fable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/models/introducing-claude-fable-5-and-claude-mythos-5" rel="noopener noreferrer"&gt;https://platform.claude.com/docs/en/about-claude/models/introducing-claude-fable-5-and-claude-mythos-5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techcrunch.com/2026/06/09/anthropic-released-claude-fable-5-its-most-powerful-model-publicly-days-after-warning-ai-is-getting-too-dangerous/" rel="noopener noreferrer"&gt;https://techcrunch.com/2026/06/09/anthropic-released-claude-fable-5-its-most-powerful-model-publicly-days-after-warning-ai-is-getting-too-dangerous/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cybersecuritynews.com/anthropics-claude-fable-5-jailbroken/" rel="noopener noreferrer"&gt;https://cybersecuritynews.com/anthropics-claude-fable-5-jailbroken/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cyberpress.org/claude-fable-5-jailbreak/" rel="noopener noreferrer"&gt;https://cyberpress.org/claude-fable-5-jailbreak/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortune.com/2026/06/10/anthropic-accu-claude-fable-5-limits-capabilities-ai-researchers-developers/" rel="noopener noreferrer"&gt;https://fortune.com/2026/06/10/anthropic-accu-claude-fable-5-limits-capabilities-ai-researchers-developers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.siliconrepublic.com/enterprise/anthropic-reassess-claude-fable-5-ai-development-restrictions-backlash" rel="noopener noreferrer"&gt;https://www.siliconrepublic.com/enterprise/anthropic-reassess-claude-fable-5-ai-development-restrictions-backlash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.technobezz.com/news/anthropic-faces-backlash-after-claude-fable-5-silently-limits-ai-research-capabilities" rel="noopener noreferrer"&gt;https://www.technobezz.com/news/anthropic-faces-backlash-after-claude-fable-5-silently-limits-ai-research-capabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://letsdatascience.com/blog/anthropic-fable-5-secret-sabotage-reversed" rel="noopener noreferrer"&gt;https://letsdatascience.com/blog/anthropic-fable-5-secret-sabotage-reversed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidheadlines.com/2026/06/anthropic-reverses-hidden-claude-fable-5-ai-restrictions.html" rel="noopener noreferrer"&gt;https://www.androidheadlines.com/2026/06/anthropic-reverses-hidden-claude-fable-5-ai-restrictions.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pasqualepillitteri.it/en/news/4730/claude-fable-5-jailbreak-pliny-hype-vs-facts" rel="noopener noreferrer"&gt;https://pasqualepillitteri.it/en/news/4730/claude-fable-5-jailbreak-pliny-hype-vs-facts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude5.ai/news/claude-fable-5-benchmarks-swe-bench-pro-80-percent" rel="noopener noreferrer"&gt;https://claude5.ai/news/claude-fable-5-benchmarks-swe-bench-pro-80-percent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.truefoundry.com/blog/claude-fable-5-api-benchmarks-pricing-how-to-use-it" rel="noopener noreferrer"&gt;https://www.truefoundry.com/blog/claude-fable-5-api-benchmarks-pricing-how-to-use-it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://llm-stats.com/blog/research/claude-fable-5-review" rel="noopener noreferrer"&gt;https://llm-stats.com/blog/research/claude-fable-5-review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gbhackers.com/anthropics-claude-fable-5-ai-model-jailbroken/" rel="noopener noreferrer"&gt;https://gbhackers.com/anthropics-claude-fable-5-ai-model-jailbroken/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalapplied.com/blog/claude-fable-5-mythos-5-agentic-coding-deep-dive-2026" rel="noopener noreferrer"&gt;https://www.digitalapplied.com/blog/claude-fable-5-mythos-5-agentic-coding-deep-dive-2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnbc.com/2026/06/09/anthropic-mythos-claude-fable-5.html" rel="noopener noreferrer"&gt;https://www.cnbc.com/2026/06/09/anthropic-mythos-claude-fable-5.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>programming</category>
      <category>node</category>
    </item>
    <item>
      <title>Is Node.js Still Enough? When to Move Your Backend to Rust</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:55:43 +0000</pubDate>
      <link>https://dev.to/thesiliconarchitect/is-nodejs-still-enough-when-to-move-your-backend-to-rust-31j3</link>
      <guid>https://dev.to/thesiliconarchitect/is-nodejs-still-enough-when-to-move-your-backend-to-rust-31j3</guid>
      <description>&lt;h2&gt;
  
  
  Node.js Is Not Failing You — You're Already Outgrowing It
&lt;/h2&gt;

&lt;p&gt;Note: To stay fully transparent with the community, I want to share that I used AI assistance to help draft and polish this article. I’ve reviewed and edited everything to ensure it aligns with community guidelines and brings genuine value to you all!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The uncomfortable truth about backend performance, Rust, and why the event loop will betray you exactly when it matters most.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;It was 3 AM. Not the good kind of 3 AM.&lt;/p&gt;

&lt;p&gt;The monitoring dashboard looked like a medical emergency. Latency on the main API endpoint had gone from 38ms to over 4 seconds. Not spiking — sitting there, steady, 4 seconds on every request. The Node.js process wasn't crashed. That would've been easier, honestly. It was alive, the process was running, it was just completely frozen in place. Someone — and it wasn't me, I'm saying that for the record — had shipped a synchronous image compression function directly in the request handler. No worker thread. No queue. Just blocking, heavy, CPU-bound work sitting right there inside the event loop.&lt;/p&gt;

&lt;p&gt;Every other request was standing in line behind it. Not errored. Not rejected. Just waiting to die.&lt;/p&gt;

&lt;p&gt;That night broke something in my brain regarding how I thought about Node.js. Not in a dramatic "I'm done with this runtime" way. More in the way you start actually understanding something you thought you already understood. The event loop is not magic. It's a design choice. And every design choice has limits.&lt;/p&gt;

&lt;p&gt;This article is about those limits. When they show up. What they look like. And whether Rust is actually the answer or just the current internet-famous overcorrection.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Everyone Started Here (And That Was Fine)
&lt;/h2&gt;

&lt;p&gt;To be fair to Node.js, the original pitch was genuinely exciting. Ryan Dahl showed the world in 2009 that you could handle thousands of simultaneous connections with almost no memory overhead by using non-blocking I/O and a single-threaded event loop. JavaScript on the server. One language across the whole stack. One hiring pool. One mental model.&lt;/p&gt;

&lt;p&gt;For most web applications that pitch still holds. REST APIs, GraphQL endpoints, WebSocket servers, BFFs, real-time dashboards, lightweight microservices — Node.js handles all of this with very little complaint. The npm registry crossed 2.5 million packages in 2024. The developer tooling around TypeScript and Node.js is genuinely excellent right now. You can spin up a production-ready Express or Fastify API in an afternoon and have it deployed before dinner.&lt;/p&gt;

&lt;p&gt;And the thing is — most web applications are fine with this. Most companies are operating at scales where Node.js performance is genuinely not the bottleneck. The bottleneck is the database. Or the architecture. Or the fact that nobody indexed that column three years ago.&lt;/p&gt;

&lt;p&gt;So when I say "you're outgrowing it" — I'm not saying you've outgrown it right now, today, reading this on your laptop. I'm saying the situations where the runtime itself becomes the problem are growing. And understanding where that line is seems more important than it used to.&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%2F9olpm112laptz1nd7rgs.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%2F9olpm112laptz1nd7rgs.png" alt="The Event Loop Is a Single Lane Highway ( Syed Ahmer Shah is shown on an event loop )" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Event Loop Is a Single Lane Highway
&lt;/h2&gt;

&lt;p&gt;Here's what nobody explains clearly when they first teach you Node.js.&lt;/p&gt;

&lt;p&gt;The event loop is brilliant for waiting. Network requests go out, database queries go out, file reads queue up — the process just sits there juggling callbacks and never actually has to work very hard in between those I/O operations. Concurrent in the sense that many things are in flight at once. But still single-threaded. Still one lane.&lt;/p&gt;

&lt;p&gt;The moment you give it real computation to do, it blocks. Full stop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// This looks innocent enough&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/generate-report&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 50,000 records, some sorting and aggregation&lt;/span&gt;
  &lt;span class="c1"&gt;// This takes ~800ms on a decent machine&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aggregated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aggregated&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While that 800ms computation runs, every other request hitting your server sits in a queue. No parallelism. No preemption. The user requesting their login token is waiting for a sales report to finish generating. That's the architecture. That's not a bug in the code — that's how the runtime works.&lt;/p&gt;

&lt;p&gt;Worker threads exist, yeah. &lt;code&gt;worker_threads&lt;/code&gt; has been available since Node.js 11.7. But using them correctly is genuinely more complex than it should be, and honestly it's a workaround for a design limitation rather than a first-class solution. You're fighting the runtime's nature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The worker_threads "fix" — real code, real overhead&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isMainThread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;parentPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;workerData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker_threads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isMainThread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/generate-report&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;workerData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Same logic, now in a thread&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;workerData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aggregated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
  &lt;span class="nx"&gt;parentPort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aggregated&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;This works. But you're now managing worker lifecycles, serialization overhead, error propagation across thread boundaries. For one endpoint. And you're still not getting native parallelism — you're getting OS thread concurrency with a JavaScript wrapper around it.&lt;/p&gt;

&lt;p&gt;Is this the direction you want to keep going?&lt;/p&gt;




&lt;h2&gt;
  
  
  What Garbage Collection Silently Does to Your Latency
&lt;/h2&gt;

&lt;p&gt;There's another issue that gets less attention than CPU blocking, and it's more subtle and harder to debug. Garbage collection pauses.&lt;/p&gt;

&lt;p&gt;Node.js uses V8's garbage collector. V8 is genuinely excellent engineering. But even excellent GC has to stop and clean up memory at some point. In production, under real load, with real memory pressure, these pauses are real. They're usually short — tens to hundreds of milliseconds. Sometimes longer. And they're not triggered by your code. They're triggered by the runtime. You cannot schedule them, predict them precisely, or prevent them.&lt;/p&gt;

&lt;p&gt;For a lot of applications this is totally acceptable. For latency-sensitive systems — financial data feeds, real-time multiplayer, high-frequency trading, voice and video processing, anything where a 200ms unpredictable pause actually matters — GC becomes a design problem, not just a performance footnote.&lt;/p&gt;

&lt;p&gt;This is not a Node.js-specific problem. Go has it. Java has it. Python has it. Every language with a managed runtime has it. Which is, importantly, why Rust's approach is so different.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Rust Actually Offers (Without the Cult)
&lt;/h2&gt;

&lt;p&gt;Rust is a systems programming language that compiles to native machine code with no garbage collector and no runtime overhead in the traditional sense. Developed originally at Mozilla, now maintained by the Rust Foundation with backing from Amazon, Google, Microsoft, and Meta. First stable release in 2015. Slow build, fast execution, steep learning curve.&lt;/p&gt;

&lt;p&gt;The borrow checker — Rust's most infamous feature — is the compile-time system that enforces memory safety without a GC. Instead of collecting garbage at runtime, Rust proves at compile time that your code cannot have dangling pointers, data races, or use-after-free bugs. The compiler rejects the code if it finds violations. That sounds annoying (it is, initially) but what it means in practice is that entire categories of runtime bugs simply do not exist in Rust programs.&lt;/p&gt;

&lt;p&gt;For the ninth consecutive year, in the 2024 Stack Overflow Developer Survey, Rust ranked as the most admired programming language. 83.5% of Rust developers said they want to keep using it. That's not a hype cycle anymore. Nine years is a signal. That's a community of people who went through the hard part and stayed.&lt;/p&gt;

&lt;p&gt;But let's be clear about something: Rust is not a replacement for Node.js in the general case. It's a replacement for Node.js in &lt;em&gt;specific&lt;/em&gt; cases. The key is knowing which cases those are.&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%2Ffww54cnmfpt7ifayote8.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%2Ffww54cnmfpt7ifayote8.png" alt="The Discord Post That Every Backend Developer Should Read ( Syed Ahmer Shah shown as a saviour )" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Discord Post That Every Backend Developer Should Read
&lt;/h2&gt;

&lt;p&gt;In February 2020, Discord published a blog post called "Why Discord is switching from Go to Rust." If you work in backend development and you haven't read it, go read it. It changed how I think about language and runtime choices.&lt;/p&gt;

&lt;p&gt;Discord was running their Read States service in Go. This is the service that tracks which messages you've read across all your servers and channels. At their scale, it was handling millions of concurrent users. Go's garbage collector kept introducing latency spikes every two minutes, almost like clockwork. Users experienced stutters. Discord tried tuning the GC. They tried throwing more memory at the service to space out collection cycles. The spikes kept coming. They couldn't engineer their way out of a fundamental runtime behavior.&lt;/p&gt;

&lt;p&gt;They rewrote the service in Rust.&lt;/p&gt;

&lt;p&gt;The latency spikes disappeared. Not reduced — disappeared. Memory usage dropped dramatically. The service became boring in the best possible way. It just ran. Predictably. Consistently. Without surprise pauses.&lt;/p&gt;

&lt;p&gt;The thing that gets me about that story isn't the performance numbers. It's the fact that they weren't doing anything exotic. Read States is conceptually simple: track what you've read, update it in real time, serve it fast. That's not a supercomputer problem. But at Discord's scale, the runtime's behavior became the application's behavior. And they couldn't hide from it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cloudflare's Bigger, Quieter Bet
&lt;/h2&gt;

&lt;p&gt;If Discord is an interesting data point, Cloudflare is a confirmation of the direction things are heading.&lt;/p&gt;

&lt;p&gt;In 2022, Cloudflare announced Pingora — a new HTTP proxy built in Rust that they'd been running internally as a replacement for NGINX. In February 2024, they open-sourced it. The numbers they reported were not subtle: the service runs at over 1 trillion requests per day across their network. CPU usage dropped. Memory usage dropped significantly compared to their NGINX setup. The Rust rewrite was not a side project or an experiment. It became the backbone of how Cloudflare connects to the internet.&lt;/p&gt;

&lt;p&gt;Cloudflare Workers — their serverless edge computing platform — lets developers deploy JavaScript and TypeScript at the edge. But the runtime itself, the thing executing your JavaScript efficiently at hundreds of datacenters worldwide? Built in Rust. You're writing JS code that runs inside a Rust-built sandbox.&lt;/p&gt;

&lt;p&gt;Deno 2.0 shipped in October 2024. Built on Rust bindings to V8. Added much better Node.js compatibility, making it a genuine migration path from Node. Bun, the other JavaScript runtime that came up as a performance competitor, is built on Zig — which, like Rust, compiles to native code and has no GC.&lt;/p&gt;

&lt;p&gt;Here's the thing that I think deserves more attention: even in ecosystems where the developer experience stays JavaScript, the infrastructure layer underneath is moving toward Rust and systems languages. The fastest runtimes are compiled. The most reliable proxies are compiled. The pattern is not "Rust instead of Node.js" at the application layer. The pattern is "Rust underneath everything" at the infrastructure layer.&lt;/p&gt;

&lt;p&gt;That matters because the performance expectations users are going to have — shaped by Cloudflare edge computing, Pingora proxy speeds, and Deno/Bun runtime benchmarks — are going to creep upward. And Node.js in the middle will have to answer for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Rust Looks Like for a Backend Developer
&lt;/h2&gt;

&lt;p&gt;Here's a basic HTTP endpoint in Actix-Web, which is one of the more popular Rust web frameworks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;actix_web&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Responder&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;serde&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Deserialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ReportRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;record_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Serialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ReportResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;total_revenue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;record_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;generate_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;web&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReportRequest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Responder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// CPU-bound work goes to a blocking thread pool&lt;/span&gt;
    &lt;span class="c1"&gt;// This does NOT block other async requests&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;task&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn_blocking&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Simulate heavy computation&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="py"&gt;.record_count&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Some CPU work&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nn"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReportResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="py"&gt;.region&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;total_revenue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;record_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="py"&gt;.record_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[actix_web::main]&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;HttpServer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;App&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/report"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;web&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generate_report&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;.bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"127.0.0.1:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
    &lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;.await&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compared to the Node.js version with worker threads, the structural difference is significant. Rust's async model is built on top of actual OS thread pools. The CPU-bound work in &lt;code&gt;spawn_blocking&lt;/code&gt; runs in a separate thread pool managed by Tokio (the async runtime) without blocking the async task executor. There's no serialization overhead across an IPC channel. There's no GC ever entering the picture. The borrow checker ensures at compile time that the closure passed to &lt;code&gt;spawn_blocking&lt;/code&gt; doesn't share mutable state with anything else.&lt;/p&gt;

&lt;p&gt;The TechEmpower Framework Benchmarks — which are one of the more credible public benchmarks for web framework performance across languages — consistently place Actix-Web and ntex (another Rust web framework) in the top tier for raw throughput. Express.js and Fastify appear much lower. Not because Node.js frameworks are badly written, but because the measurement is raw request throughput and Rust's compiled native execution simply processes requests faster at the infrastructure level.&lt;/p&gt;

&lt;p&gt;For I/O-bound workloads, the difference narrows. For CPU-intensive workloads, it widens considerably.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Cost of Switching Nobody Tells You About
&lt;/h2&gt;

&lt;p&gt;Here's the section that most "Node.js to Rust" migration articles skip, or mention briefly before rushing to the benchmark charts. The actual cost of this migration is serious and you should stare at it for a while before deciding anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The learning curve is genuinely steep.&lt;/strong&gt; Not in a "watch a few tutorials and you're good" way. The borrow checker, lifetimes, ownership — these concepts don't exist anywhere in JavaScript. They don't really exist in Python, Ruby, Go, or most languages most backend developers have used. It will take a capable developer weeks of dedicated effort before they stop fighting the compiler on basic memory patterns. Not writing good Rust. Just getting past the initial wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hiring pool is small.&lt;/strong&gt; npm knows 2.5 million packages. Node.js developers are everywhere. Finding a Rust developer with production web backend experience is a different challenge entirely. You're paying more, waiting longer, and getting someone who probably learned Rust on personal projects and systems code, not web services. The talent market is growing, slowly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ecosystem is thinner.&lt;/strong&gt; crates.io had around 150,000 packages as of early 2025. Growing fast, but not npm. For certain integrations — some payment gateways, certain analytics SDKs, niche database clients — you'll find yourself writing wrapper code or bindings that you'd get for free in Node. That's real engineering time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compile times.&lt;/strong&gt; This one is annoying in day-to-day development. Cold builds on a mid-size Rust project take several minutes. Incremental builds are better. But the feedback loop is longer than TypeScript. When you're debugging something fast-moving, that matters to your energy and focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of this means don't do it.&lt;/strong&gt; It means count the cost before you commit. Migration projects that underestimated the friction tend to get abandoned halfway through, which leaves you with a half-Rust, half-Node.js system that has the downsides of both and the advantages of neither.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stop. Answer These Questions Honestly.
&lt;/h2&gt;

&lt;p&gt;Before you close this tab and start reading the Actix-Web documentation, ask yourself:&lt;/p&gt;

&lt;p&gt;Have you actually profiled your application? Most Node.js performance problems are not the runtime. They're N+1 database queries, missing indexes, no caching layer, or serializing entire database rows when you only need two fields. None of those are fixed by switching to Rust. Find the actual bottleneck before you decide what to replace.&lt;/p&gt;

&lt;p&gt;What is your real traffic volume? If you're handling under 500 requests per second and your endpoints are mostly database reads, Rust is almost certainly not where your engineering time should go. The overhead of the migration will dwarf any performance gain at that scale.&lt;/p&gt;

&lt;p&gt;Does your use case actually involve CPU-bound work? AI inference, image processing, cryptographic operations, video transcoding, large data aggregations, compression — these are legitimate candidates for a Rust service. Authentication checks and database-backed CRUD are not.&lt;/p&gt;

&lt;p&gt;What does your team actually want to learn? This is the one people underrate most. A team that genuinely wants to learn Rust will fight through the rough parts and come out the other side shipping good code. A team that's being told to use Rust because leadership read a blog post will write bad Rust slowly and resent the whole thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  When You Genuinely Should Not Move to Rust
&lt;/h2&gt;

&lt;p&gt;Early-stage startups or solo developers trying to ship a product. Developer velocity is your scarcest resource. Use the stack you know. The performance difference between Node.js and Rust is irrelevant if you're trying to find product-market fit.&lt;/p&gt;

&lt;p&gt;Standard web applications with normal CRUD logic. A TypeScript + Node.js + Prisma + PostgreSQL stack is a genuinely excellent combination for most web products. There is nothing broken about it. Adding Rust to this because you read about Discord is not senior engineering — it's resume-driven development.&lt;/p&gt;

&lt;p&gt;Teams where nobody wants to learn Rust. Forced adoption of technology produces the worst version of that technology. A team that doesn't want to be there will produce buggy, unidiomatic, unmaintained Rust that will be a liability in six months.&lt;/p&gt;

&lt;p&gt;When you haven't exhausted your current optimizations. Have you looked at clustering Node.js processes? Have you profiled your event loop lag? Have you moved CPU work to queues or separate services? Have you reviewed your database query plans? These cost less than a rewrite and often fix the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Actual Opinion
&lt;/h2&gt;

&lt;p&gt;I'm going to stop being balanced here and just say what I think.&lt;/p&gt;

&lt;p&gt;Node.js is not going away. It will be running a meaningful portion of the internet ten years from now, the same way PHP still runs half the web despite being declared dead roughly every eighteen months. It's battle-tested, well-understood, and good enough for the vast majority of what gets built.&lt;/p&gt;

&lt;p&gt;But I do think there's a version of "defaulting to Node.js without thinking" that's becoming harder to justify as the use cases for backends get more complex. AI inference is being pushed to the backend. Real-time systems are becoming more common. Edge computing is maturing. Workloads are changing. And the runtime you picked in 2019 for a REST API might not be the right answer for what you're building in 2026.&lt;/p&gt;

&lt;p&gt;The smarter architecture for most teams isn't a full rewrite. It's a hybrid — Node.js handling your API gateway, your user-facing routes, your standard CRUD, and a Rust service (or a few) handling the parts that actually need performance. One Rust microservice doing image resizing. One handling the expensive report generation. Keep the rest of your system in a language your team already knows. Add Rust where it earns its complexity cost.&lt;/p&gt;

&lt;p&gt;Is Node.js still enough? For most of what most people are building, honestly yes. For the direction backends are heading over the next five years — probably not everywhere.&lt;/p&gt;

&lt;p&gt;The question isn't whether to switch. The question is whether you understand your runtime well enough to know when switching actually helps. Most developers don't. Most developers, including me a couple of years ago, just pick Node.js because it's comfortable. That's fine — until it isn't.&lt;/p&gt;

&lt;p&gt;Start learning Rust. Not to rewrite anything. Just to understand what you're missing. The moment you write your first program that compiles cleanly with the borrow checker satisfied, you understand something about memory and ownership that changes how you write code in every other language too.&lt;/p&gt;

&lt;p&gt;That's worth something, independent of whether you ever ship a Rust API.&lt;/p&gt;




&lt;h2&gt;
  
  
  References and Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stack Overflow Developer Survey 2024 — &lt;a href="https://survey.stackoverflow.co/2024/" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2024/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Why Discord is switching from Go to Rust" — Discord Engineering Blog, February 2020 — &lt;a href="https://discord.com/blog/why-discord-is-switching-from-go-to-rust" rel="noopener noreferrer"&gt;https://discord.com/blog/why-discord-is-switching-from-go-to-rust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"How we built Pingora, the proxy that connects Cloudflare to the internet" — Cloudflare Blog — &lt;a href="https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/" rel="noopener noreferrer"&gt;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Pingora: Open Source" — Cloudflare Blog, February 2024 — &lt;a href="https://blog.cloudflare.com/pingora-open-source/" rel="noopener noreferrer"&gt;https://blog.cloudflare.com/pingora-open-source/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TechEmpower Web Framework Benchmarks — &lt;a href="https://www.techempower.com/benchmarks/" rel="noopener noreferrer"&gt;https://www.techempower.com/benchmarks/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Deno 2.0 Release — Deno Blog, October 2024 — &lt;a href="https://deno.com/blog/v2.0" rel="noopener noreferrer"&gt;https://deno.com/blog/v2.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"The Rust Programming Language" (official book) — &lt;a href="https://doc.rust-lang.org/book/" rel="noopener noreferrer"&gt;https://doc.rust-lang.org/book/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node.js Worker Threads Documentation — &lt;a href="https://nodejs.org/api/worker_threads.html" rel="noopener noreferrer"&gt;https://nodejs.org/api/worker_threads.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Actix-Web Documentation — &lt;a href="https://actix.rs/docs/" rel="noopener noreferrer"&gt;https://actix.rs/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tokio Async Runtime Documentation — &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;https://tokio.rs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;crates.io — Rust Package Registry — &lt;a href="https://crates.io" rel="noopener noreferrer"&gt;https://crates.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Node.js: The Documentary" — Honeypot, YouTube, 2024&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written by a software engineering student who blocked the event loop in production once and decided to understand why. If something here is wrong, tell me — that's how this works.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>node</category>
      <category>rust</category>
    </item>
    <item>
      <title>What 90% of Devs Screw Up When Wiring Next.js, Node.js, and Git Together</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Fri, 05 Jun 2026 10:43:44 +0000</pubDate>
      <link>https://dev.to/syedahmershah/what-90-of-devs-screw-up-when-wiring-nextjs-nodejs-and-git-together-4ieh</link>
      <guid>https://dev.to/syedahmershah/what-90-of-devs-screw-up-when-wiring-nextjs-nodejs-and-git-together-4ieh</guid>
      <description>&lt;p&gt;&lt;em&gt;And some of those devs pushed to production. That's the scary part.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;There's this one story I keep thinking about. A junior dev — smart kid, decent portfolio — built a full-stack app for his freelance client. Next.js frontend, Node.js backend, everything wired together. Pushed to GitHub. Client's competitor found the repo three weeks later because it was public and the &lt;code&gt;.env&lt;/code&gt; file was sitting right there. Database password. Stripe secret keys. Everything.&lt;/p&gt;

&lt;p&gt;That project was not just a technical failure. It was a trust failure.&lt;/p&gt;

&lt;p&gt;And here's the brutal thing: it wasn't a dumb mistake from an incompetent person. It was a &lt;em&gt;normal&lt;/em&gt; mistake from a developer who never learned the actual mechanics of connecting these three tools. He knew how to code. He didn't know how they link.&lt;/p&gt;

&lt;p&gt;Most developers are in that same boat right now in 2026, and none of them would admit it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Stack Is So Dominant Right Now (And Why That Creates a Problem)
&lt;/h2&gt;

&lt;p&gt;Next.js, Node.js, and Git. This is basically the default web dev stack for a huge chunk of the internet at this point. Next.js crossed 6 million weekly npm downloads in late 2024 and has held that range through 2025 into 2026. Node.js powers something like 6.3% of all websites directly and a much larger chunk indirectly through server-rendered frameworks. Git is used by 97.8% of professional developers according to the Stack Overflow Developer Survey 2025.&lt;/p&gt;

&lt;p&gt;So you've got three massively dominant tools that every developer is expected to just... know. And because everyone assumes everyone else already knows this, nobody actually teaches how they interact.&lt;/p&gt;

&lt;p&gt;The documentation covers them separately. Tutorials cover them in isolation. And then a developer has to wire them together in a real project and suddenly nothing makes sense.&lt;/p&gt;

&lt;p&gt;This is that article. The one nobody wanted to write because it's admitting that the ecosystem has gaps nobody talks about.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Actual Mistakes (And How Bad They Get)
&lt;/h2&gt;

&lt;p&gt;Let me go through them honestly. Not in order of how often they happen but in order of how badly they can hurt you.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Your .env File Is Probably Already on GitHub
&lt;/h3&gt;

&lt;p&gt;I'm going to say this as directly as possible.&lt;/p&gt;

&lt;p&gt;If you started a Next.js or Node.js project in the last three years and you didn't set up &lt;code&gt;.gitignore&lt;/code&gt; before your first &lt;code&gt;git init&lt;/code&gt; or &lt;code&gt;git add .&lt;/code&gt;, there is a real chance your secrets are in your repository history. Even if you deleted the file later. Git doesn't work like a regular file system. It remembers.&lt;/p&gt;

&lt;p&gt;GitHub's own security team reported that in 2024 alone, more than &lt;strong&gt;12.8 million secrets&lt;/strong&gt; were exposed in public repositories. That includes API keys, database credentials, tokens, private keys. The number in 2025 was not smaller.&lt;/p&gt;

&lt;p&gt;And the thing is, &lt;code&gt;.env&lt;/code&gt; is listed in the default &lt;code&gt;.gitignore&lt;/code&gt; that &lt;code&gt;create-next-app&lt;/code&gt; generates. So why does this keep happening?&lt;/p&gt;

&lt;p&gt;Because developers clone starter repos. They spin up custom setups. They copy folder structures from YouTube tutorials that are six months old and never show the &lt;code&gt;.gitignore&lt;/code&gt; setup. They run &lt;code&gt;git add .&lt;/code&gt; out of habit.&lt;/p&gt;

&lt;p&gt;Here's what a proper &lt;code&gt;.gitignore&lt;/code&gt; for a Next.js + Node.js project actually looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Node
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# Next.js
.next/
out/
build/
dist/

# Environment variables - THIS IS THE ONE
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.env*.local

# Vercel
.vercel

# TypeScript
*.tsbuildinfo
next-env.d.ts

# OS
.DS_Store
*.pem
Thumbs.db

# Debug
.npm
.eslintcache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you've already pushed secrets, here's the painful truth: deleting the file and pushing again does NOT remove it from history. You need to do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install git-filter-repo (better than BFG for 2025+)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;git-filter-repo

&lt;span class="c"&gt;# Remove the .env file from entire history&lt;/span&gt;
git filter-repo &lt;span class="nt"&gt;--path&lt;/span&gt; .env &lt;span class="nt"&gt;--invert-paths&lt;/span&gt;

&lt;span class="c"&gt;# Then force push (you will need to coordinate with your team)&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But honestly if the secret was already exposed for more than a few hours? Rotate the credentials. Assume they were taken. That's the real answer.&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%2F89ood0khpz13bc4ir481.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%2F89ood0khpz13bc4ir481.png" alt="The NEXT_PUBLIC Image" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The NEXT_PUBLIC_ Trap Nobody Explains Properly
&lt;/h3&gt;

&lt;p&gt;This one is subtle and it catches even experienced developers.&lt;/p&gt;

&lt;p&gt;Next.js has two environments: server and client. Environment variables work differently in both. Variables that start with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; are bundled into the client-side JavaScript. Everything else stays on the server.&lt;/p&gt;

&lt;p&gt;Sounds simple. But here's where people get it wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This runs on the SERVER (API route, Server Component)&lt;/span&gt;
&lt;span class="c1"&gt;// Works fine&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// This runs on the CLIENT (browser)&lt;/span&gt;
&lt;span class="c1"&gt;// process.env.DB_PASSWORD is undefined here&lt;/span&gt;
&lt;span class="c1"&gt;// because it's not prefixed with NEXT_PUBLIC_&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// undefined, no error, just silently broken&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The terrifying part isn't the error. It's the silence. You won't get a crash in many cases. You'll just get &lt;code&gt;undefined&lt;/code&gt; and then a cryptic failure somewhere downstream that takes you an hour to debug.&lt;/p&gt;

&lt;p&gt;And the opposite mistake is even worse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DON'T DO THIS&lt;/span&gt;
&lt;span class="c1"&gt;// This exposes your secret to every user's browser&lt;/span&gt;
&lt;span class="nx"&gt;NEXT_PUBLIC_DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;supersecret123&lt;/span&gt;
&lt;span class="nx"&gt;NEXT_PUBLIC_STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;sk_live_&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; is &lt;strong&gt;visible to anyone who opens your site&lt;/strong&gt;. It gets embedded into the JavaScript bundle. DevTools. View Source. It's all there.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable Type&lt;/th&gt;
&lt;th&gt;Accessible In&lt;/th&gt;
&lt;th&gt;Exposed to Browser?&lt;/th&gt;
&lt;th&gt;Use For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client + Server&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;API base URLs, public keys, analytics IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular &lt;code&gt;ENV_VAR&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Server only&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;td&gt;DB passwords, secret keys, tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;process.env.NODE_ENV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;NO (built-in)&lt;/td&gt;
&lt;td&gt;Environment detection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rule is simple: if it's a secret, it never gets &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;. If it has to be on the client, it better not be a secret.&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%2F28sbwh76o72cz20l8pcx.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%2F28sbwh76o72cz20l8pcx.png" alt="Ahmer Shah" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. CORS Is Not a Bug. It's You.
&lt;/h3&gt;

&lt;p&gt;You've got Next.js running on port 3000. Your Node.js/Express backend is on port 3001. You make a fetch request. CORS error. You Google it. You find a Stack Overflow answer from 2019 that tells you to do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The lazy "fix" everyone copies&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it works locally. So you push to production.&lt;/p&gt;

&lt;p&gt;And then in production it breaks again because the origin is different, or worse: it works but you've now allowed every single origin on the planet to make requests to your backend. Including people you don't want.&lt;/p&gt;

&lt;p&gt;Here's what actually correct CORS configuration looks like for a Next.js + Node.js setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Express backend - cors.config.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allowedOrigins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://your-actual-domain.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FRONTEND_URL&lt;/span&gt; &lt;span class="c1"&gt;// dynamic, set in .env&lt;/span&gt;
&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Allow requests with no origin (mobile apps, Postman, curl)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allowedOrigins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CORS policy blocked this origin: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;false&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="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// if you're using cookies/sessions&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DELETE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OPTIONS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;allowedHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&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;And honestly? If you're already using Next.js, ask yourself whether you need a separate Express server at all. Next.js API routes handle a huge amount of backend logic without this CORS mess.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. You Don't Actually Know When to Use API Routes vs Express
&lt;/h3&gt;

&lt;p&gt;This is the architectural confusion that costs teams weeks.&lt;/p&gt;

&lt;p&gt;Next.js has built-in API routes (in &lt;code&gt;pages/api/&lt;/code&gt; or &lt;code&gt;app/api/route.ts&lt;/code&gt;). They run on Node.js. They're serverless by default when deployed to Vercel. They're fine for most things.&lt;/p&gt;

&lt;p&gt;But a lot of developers either:&lt;/p&gt;

&lt;p&gt;a) Build a whole Express.js server for things Next.js API routes would handle perfectly, creating unnecessary complexity and CORS problems.&lt;/p&gt;

&lt;p&gt;b) Cram everything into Next.js API routes when they actually need persistent connections, WebSockets, heavy background jobs, or something Vercel doesn't support well.&lt;/p&gt;

&lt;p&gt;Here's the honest comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Next.js API Routes&lt;/th&gt;
&lt;th&gt;Separate Node.js/Express&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRUD for your app's own data&lt;/td&gt;
&lt;td&gt;Perfect&lt;/td&gt;
&lt;td&gt;Overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication (JWT, sessions)&lt;/td&gt;
&lt;td&gt;Fine&lt;/td&gt;
&lt;td&gt;Unnecessary complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time features (WebSockets)&lt;/td&gt;
&lt;td&gt;Not supported natively&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy file processing&lt;/td&gt;
&lt;td&gt;Cold starts are a problem&lt;/td&gt;
&lt;td&gt;Better&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared API between multiple frontends&lt;/td&gt;
&lt;td&gt;Awkward&lt;/td&gt;
&lt;td&gt;Right choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microservices architecture&lt;/td&gt;
&lt;td&gt;Wrong tool&lt;/td&gt;
&lt;td&gt;Right tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background jobs / cron&lt;/td&gt;
&lt;td&gt;Limited (Vercel Cron has limits)&lt;/td&gt;
&lt;td&gt;Better&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-running processes&lt;/td&gt;
&lt;td&gt;Hard timeout limits&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database connection pooling at scale&lt;/td&gt;
&lt;td&gt;Works but tricky&lt;/td&gt;
&lt;td&gt;More control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're building a standard web app with a database, auth, and CRUD — just use Next.js API routes. You don't need Express. You're adding complexity for no reason.&lt;/p&gt;

&lt;p&gt;If you're building something that needs persistent connections, serves multiple clients, runs heavy background jobs, or lives on a VM you control — separate Node.js server makes sense.&lt;/p&gt;

&lt;p&gt;Most developers I've seen choose the wrong one because they learned Express first and can't let it go.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Hardcoded URLs That Die in Production
&lt;/h3&gt;

&lt;p&gt;This one is so common it's almost a rite of passage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Works on your laptop, breaks everywhere else&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3001/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is hardcoded to localhost. When you deploy to Vercel or any server, &lt;code&gt;localhost:3001&lt;/code&gt; means nothing. There's no machine called localhost in production. The request goes nowhere.&lt;/p&gt;

&lt;p&gt;The fix isn't complicated. But you have to actually do it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In .env.local (for development)&lt;/span&gt;
&lt;span class="nx"&gt;NEXT_PUBLIC_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:3001&lt;/span&gt;

&lt;span class="c1"&gt;// In .env.production&lt;/span&gt;
&lt;span class="nx"&gt;NEXT_PUBLIC_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//api.yourdomain.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your code&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_API_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/users`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you're using Next.js API routes as your backend (same app), you don't even need an absolute URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This works in both dev and production when backend = same Next.js app&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Relative URLs. Underrated. People overcomplicate this.&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%2Fnk0kao0nhnw7lxelq7xv.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%2Fnk0kao0nhnw7lxelq7xv.png" alt="Ahmer Shah" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Git Workflow for Full-Stack Projects Is Different and Nobody Talks About It
&lt;/h3&gt;

&lt;p&gt;In a typical single-technology project, Git workflow is straightforward. Feature branch, PR, merge. But in a Next.js + Node.js project where the frontend and backend are sometimes in the same repo and sometimes in different repos, things get messy fast.&lt;/p&gt;

&lt;p&gt;The two main patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monorepo (same repo, both apps)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
  ├── apps/
  │   ├── web/          (Next.js)
  │   └── api/          (Express.js)
  ├── packages/
  │   └── shared/       (shared types, utilities)
  └── package.json      (root, with workspaces)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo (separate repos)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project-frontend/    (Next.js)
my-project-backend/     (Express.js)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mistake most junior developers make is none of the above. They put everything in one flat folder and commit everything together, so a frontend change and a backend change always get tangled in the same commit. Makes code review messy. Makes rollbacks a nightmare.&lt;/p&gt;

&lt;p&gt;And then there's branching. Here's what actually works for full-stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Never commit directly to main&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/user-authentication

&lt;span class="c"&gt;# Commit frequently with meaningful messages&lt;/span&gt;
&lt;span class="c"&gt;# Bad commit message:&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix stuff"&lt;/span&gt;

&lt;span class="c"&gt;# Good commit message:&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat(auth): add JWT validation middleware to /api/auth/verify

- Validates token expiry
- Returns 401 on invalid token
- Logs failed attempts to console (temporary)"&lt;/span&gt;

&lt;span class="c"&gt;# When done, push and open PR&lt;/span&gt;
git push origin feature/user-authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conventional commits standard (&lt;code&gt;feat:&lt;/code&gt;, &lt;code&gt;fix:&lt;/code&gt;, &lt;code&gt;chore:&lt;/code&gt;, &lt;code&gt;docs:&lt;/code&gt;, &lt;code&gt;refactor:&lt;/code&gt;) isn't just cosmetic. Tools like &lt;code&gt;semantic-release&lt;/code&gt; and automatic changelog generators depend on it. In 2026 with AI code review tools integrated into GitHub, structured commits also give the AI better context about what changed.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. The package-lock.json Civil War
&lt;/h3&gt;

&lt;p&gt;Every team eventually has this fight.&lt;/p&gt;

&lt;p&gt;One developer uses &lt;code&gt;npm install&lt;/code&gt;. Another uses &lt;code&gt;yarn add&lt;/code&gt;. A third one used &lt;code&gt;pnpm&lt;/code&gt; because they watched a YouTube video. Now you have &lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt;, and &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; all in the same repo. Three different lockfiles, three different dependency resolution algorithms, and production might be running a completely different version of a package than what's on your laptop.&lt;/p&gt;

&lt;p&gt;This is not a minor problem. Node.js's package ecosystem has had supply chain attacks where malicious code ended up in popular packages. Lockfiles are your defense mechanism. If everyone on the team is generating different lockfiles, the lockfile is meaningless.&lt;/p&gt;

&lt;p&gt;Pick one package manager. Enforce it. Delete the others.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;this&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=22.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=10.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"packageManager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm@10.8.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .npmrc - to enforce no other package managers&lt;/span&gt;
engine-strict&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And commit your &lt;code&gt;package-lock.json&lt;/code&gt;. I know it's large. I know it creates merge conflicts. Commit it anyway. The moment you add it to &lt;code&gt;.gitignore&lt;/code&gt; you've thrown away reproducible builds.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. The .next Folder Is Not Source Code
&lt;/h3&gt;

&lt;p&gt;This is a smaller mistake but it's one of those things that adds up.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.next/&lt;/code&gt; is Next.js's build output folder. It's generated fresh every time you run &lt;code&gt;next build&lt;/code&gt; or &lt;code&gt;next dev&lt;/code&gt;. It's specific to your machine, your Node.js version, and your build configuration.&lt;/p&gt;

&lt;p&gt;Some developers commit it because they think it's needed. It's not. It should be in &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Folder&lt;/th&gt;
&lt;th&gt;Commit to Git?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.next/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Build output, machine-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node_modules/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;td&gt;Installable from package.json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;out/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Usually no&lt;/td&gt;
&lt;td&gt;Static export output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Static assets served by app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Your actual source code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.env.local&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;td&gt;Local secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;next.config.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Configuration, not secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Committing &lt;code&gt;node_modules&lt;/code&gt; is the classic version of this mistake. Everyone learns it eventually. But &lt;code&gt;.next/&lt;/code&gt; and &lt;code&gt;out/&lt;/code&gt; catch more people than you'd think.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Nobody Configures next.config.js for Real Environments
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;next.config.js&lt;/code&gt; file is where a lot of important production behavior lives and most tutorials just skip it entirely.&lt;/p&gt;

&lt;p&gt;Here's a real example of things that break in production because they weren't configured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.js - what a real production config looks like&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Tell Next.js where your external API lives (for rewrites/proxying)&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;rewrites&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;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/backend/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BACKEND_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/:path*`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Image domains (or you get 400 errors on external images)&lt;/span&gt;
  &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;remotePatterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-image-cdn.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/images/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Environment variables you want to expose through Next.js config&lt;/span&gt;
  &lt;span class="c1"&gt;// (alternative to NEXT_PUBLIC_ prefix for build-time values)&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;APP_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;npm_package_version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Strict mode - catches more React issues in dev&lt;/span&gt;
  &lt;span class="na"&gt;reactStrictMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// Output mode for deployment&lt;/span&gt;
  &lt;span class="c1"&gt;// 'standalone' is what you want for Docker/VPS deployment&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_OUTPUT_MODE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One that kills a lot of people: Next.js 15 (with App Router) handles rewrites differently from the Pages Router in some edge cases. If you're proxying requests to your Node.js backend through Next.js rewrites, test this in a staging environment that matches production. Vercel's serverless environment is not the same as &lt;code&gt;next start&lt;/code&gt; on a VPS.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. The Deployment Split Nobody Plans For
&lt;/h3&gt;

&lt;p&gt;Here's the final one and it's the most expensive mistake in real projects.&lt;/p&gt;

&lt;p&gt;You build your app locally. Next.js and Node.js both run on your machine, communicate fine, everything works. Then you go to deploy. And someone (probably you) makes a decision without thinking about it:&lt;/p&gt;

&lt;p&gt;"I'll put the Next.js app on Vercel because it's free and easy."&lt;/p&gt;

&lt;p&gt;So your Next.js app is on Vercel, which is serverless, auto-scaling, edge-deployed.&lt;/p&gt;

&lt;p&gt;Your Node.js backend is on... a $5 DigitalOcean droplet. Or Railway. Or Render's free tier that spins down after 15 minutes of inactivity.&lt;/p&gt;

&lt;p&gt;Now you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different deployment cadences&lt;/li&gt;
&lt;li&gt;Different environment variable management systems&lt;/li&gt;
&lt;li&gt;Cold start latency on one side but not the other&lt;/li&gt;
&lt;li&gt;CORS configuration that has to be updated every time the domain changes&lt;/li&gt;
&lt;li&gt;Two separate CI/CD pipelines to maintain&lt;/li&gt;
&lt;li&gt;Your Node.js backend hitting cold starts on the free tier, making your Vercel frontend look slow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody planned this. It happened by accident. And now you're refactoring three months into the project.&lt;/p&gt;

&lt;p&gt;The planning question you have to answer before writing a line of code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Frontend&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hobby project, low traffic&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Vercel (API Routes only)&lt;/td&gt;
&lt;td&gt;One deployment, no CORS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium app, budget matters&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Railway / Render&lt;/td&gt;
&lt;td&gt;Plan for cold starts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serious production app&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;VPS (DigitalOcean, Hetzner)&lt;/td&gt;
&lt;td&gt;Most control, more work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full control / enterprise&lt;/td&gt;
&lt;td&gt;VPS (Docker)&lt;/td&gt;
&lt;td&gt;VPS (same or different)&lt;/td&gt;
&lt;td&gt;You manage everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monorepo, full stack&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Vercel (both)&lt;/td&gt;
&lt;td&gt;Works if serverless is fine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What the Actually Good Developers Do That Nobody Posts About
&lt;/h2&gt;

&lt;p&gt;I've worked with and observed enough codebases at this point to notice the difference. Here's what separates developers who get this right:&lt;/p&gt;

&lt;p&gt;They &lt;strong&gt;set up the project structure before writing the first component&lt;/strong&gt;. &lt;code&gt;.gitignore&lt;/code&gt;, environment variable schema, API base URL configuration — all before &lt;code&gt;git init&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;They &lt;strong&gt;test environment variable loading in isolation&lt;/strong&gt;. Before wiring up any API call, they &lt;code&gt;console.log(process.env.WHATEVER)&lt;/code&gt; in the actual runtime context where it'll be used. Server component? Client component? API route? They verify.&lt;/p&gt;

&lt;p&gt;They &lt;strong&gt;use a &lt;code&gt;.env.example&lt;/code&gt; file&lt;/strong&gt; committed to the repo that shows every variable needed without the values. This is how you tell your team what to configure without leaking anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env.example (COMMIT THIS)&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://user:password@host:port/database
&lt;span class="nv"&gt;NEXTAUTH_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;generate-with-openssl-rand-base64-32
&lt;span class="nv"&gt;NEXTAUTH_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3000
&lt;span class="nv"&gt;BACKEND_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3001
&lt;span class="nv"&gt;NEXT_PUBLIC_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3001

&lt;span class="c"&gt;# Production values go in your deployment platform's environment settings&lt;/span&gt;
&lt;span class="c"&gt;# NEVER commit .env.local or .env.production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They &lt;strong&gt;treat Git history as documentation&lt;/strong&gt;. Not just for code review. When something breaks in production six months later, a good commit history lets you bisect the problem in minutes instead of hours.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Binary search through commits to find when a bug was introduced&lt;/span&gt;
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
&lt;span class="c"&gt;# Git checks out the middle commit, you test it&lt;/span&gt;
&lt;span class="c"&gt;# Then mark good or bad until you find the exact commit&lt;/span&gt;
git bisect good  &lt;span class="c"&gt;# or git bisect bad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They &lt;strong&gt;never debate whether to use the App Router or Pages Router in 2026&lt;/strong&gt;. The App Router is the default, it's stable, React Server Components are the future of this ecosystem. If you're starting a new project today and using Pages Router you're actively choosing to work with a deprecated pattern. That's a choice you're allowed to make but be honest that it's a choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Spicy Take: The Real Problem Is Tutorials, Not Developers
&lt;/h2&gt;

&lt;p&gt;Okay I'm going to say this and people are going to disagree with me.&lt;/p&gt;

&lt;p&gt;The reason 90% of developers get this wrong isn't stupidity or laziness. It's the tutorial industry.&lt;/p&gt;

&lt;p&gt;A YouTube tutorial on "Build a Full Stack App with Next.js and Node.js" has a 43-minute runtime. The first 38 minutes is features. The last 5 minutes is "and now deploy it to Vercel." The &lt;code&gt;.gitignore&lt;/code&gt; setup takes 30 seconds and is either done off-camera or copied from a template without explanation. Environment variables are hardcoded for simplicity. CORS is fixed with &lt;code&gt;app.use(cors())&lt;/code&gt; and nobody explains why.&lt;/p&gt;

&lt;p&gt;Millions of developers learned from those tutorials. And then they went to build real things with those patterns and ran into real problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The documentation tells you what the tools do. It rarely tells you what happens when you misuse them in combination."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gap between "I finished the tutorial" and "I can build real production software" is where most developers are stuck. And the combination of Next.js, Node.js, and Git is exactly where that gap shows up most violently.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One Thing That Would Fix 80% of These Problems
&lt;/h2&gt;

&lt;p&gt;It's embarrassingly simple.&lt;/p&gt;

&lt;p&gt;Start every project with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Initialize git FIRST, before anything else&lt;/span&gt;
git init my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project

&lt;span class="c"&gt;# 2. Create .gitignore BEFORE adding any files&lt;/span&gt;
&lt;span class="c"&gt;# Copy the one from the Node + Next.js section above&lt;/span&gt;

&lt;span class="c"&gt;# 3. Create .env.example&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; .env.example
&lt;span class="c"&gt;# Write out all the variables your app will need (empty values)&lt;/span&gt;

&lt;span class="c"&gt;# 4. Create .env.local for your actual local values&lt;/span&gt;
&lt;span class="c"&gt;# (This is already in .gitignore so it won't be committed)&lt;/span&gt;

&lt;span class="c"&gt;# 5. THEN scaffold your Next.js app&lt;/span&gt;
npx create-next-app@latest &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--typescript&lt;/span&gt;

&lt;span class="c"&gt;# 6. First commit should be: gitignore + env.example + nothing else&lt;/span&gt;
git add .gitignore .env.example README.md
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: project initialization with gitignore and env template"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sequence. In that order. If every new developer starting a Next.js project followed those six steps in that order, the number of accidental secret exposures would drop dramatically.&lt;/p&gt;

&lt;p&gt;The order matters because once you run &lt;code&gt;create-next-app&lt;/code&gt;, you're tempted to immediately start building. And in that excitement, you forget to check what's actually being staged when you do &lt;code&gt;git add .&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Snapshot: Where This Stack Is in 2026
&lt;/h2&gt;

&lt;p&gt;Some numbers that give context to why this matters at scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js remains the dominant React meta-framework by weekly npm downloads (consistently above 5.8M per week through Q1 2026)&lt;/li&gt;
&lt;li&gt;Node.js 22 LTS is the current recommended version as of early 2026; Node.js 24 released April 2025 is on a path to LTS in October 2026&lt;/li&gt;
&lt;li&gt;Git is used by 97.8% of developers in the Stack Overflow Developer Survey 2025 — effectively universal&lt;/li&gt;
&lt;li&gt;The State of JavaScript 2024 survey showed Next.js with 81% retention (developers who used it and would use it again) and rising adoption year-over-year&lt;/li&gt;
&lt;li&gt;GitHub's transparency report data for 2024 indicated that secrets scanning blocked millions of exposures before they became public — meaning the push-protection feature is catching the exact mistakes described in this article&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scale of adoption means these mistakes aren't happening to a few developers. They're happening tens of thousands of times a day, globally, by people across all experience levels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Questions That Don't Have Good Answers Online
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Should I use Next.js API routes or a separate Express server for a startup?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building a startup MVP, use Next.js API routes. You'll ship faster and you have one less deployment to manage. When you hit actual scaling problems, migrate. You won't hit those problems as early as you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does it matter if node_modules gets committed once?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. &lt;code&gt;node_modules&lt;/code&gt; can be hundreds of megabytes. It bloats your repository permanently (remember, Git keeps history). And it creates reproducibility problems. Delete it from history using &lt;code&gt;git filter-repo&lt;/code&gt; the same way you'd remove a secret.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What's the right Node.js version to use with Next.js 15?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Node.js 18 is the minimum for Next.js 15. Node.js 22 LTS is what you should be using in production as of early 2026. The compatibility table on the Next.js docs is up to date and should be your source of truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Why does my Next.js app work on Vercel but my environment variables are undefined?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because you configured them in &lt;code&gt;.env.local&lt;/code&gt; on your machine but forgot to add them to Vercel's environment variable settings in the dashboard. Vercel does not read your &lt;code&gt;.env.local&lt;/code&gt;. You have to set every variable manually in the Vercel project settings. This trips up everyone once.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;The combination of Next.js, Node.js, and Git is genuinely powerful. The ecosystem in 2026 is mature enough that you can build serious production applications with it and compete with teams twice your size.&lt;/p&gt;

&lt;p&gt;But "powerful" and "forgiving" are different things. This stack is not forgiving. It will let you push your &lt;code&gt;.env&lt;/code&gt; to GitHub. It will silently give you &lt;code&gt;undefined&lt;/code&gt; instead of your secret key. It will deploy with broken environment variables and give you no useful error message at 2am.&lt;/p&gt;

&lt;p&gt;The developers who get this right aren't necessarily more talented. They've just been burned once and learned from it, or they were lucky enough to learn from someone who was burned.&lt;/p&gt;

&lt;p&gt;Now you've read about it instead of having to live through it.&lt;/p&gt;

&lt;p&gt;Use that.&lt;/p&gt;




&lt;h2&gt;
  
  
  References and Sources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;GitHub Security: "Detected and Prevented Secrets in 2024" — GitHub Blog, January 2025. &lt;a href="https://github.blog/security/application-security/" rel="noopener noreferrer"&gt;https://github.blog/security/application-security/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack Overflow Developer Survey 2025 — Version Control Systems usage data. &lt;a href="https://survey.stackoverflow.co/2025" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2025&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State of JavaScript 2024 — Meta-Frameworks section, Next.js retention and usage figures. &lt;a href="https://2024.stateofjs.com/" rel="noopener noreferrer"&gt;https://2024.stateofjs.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next.js 15 Release Notes and Changelog — Vercel/Next.js GitHub repository. &lt;a href="https://github.com/vercel/next.js/releases/tag/v15.0.0" rel="noopener noreferrer"&gt;https://github.com/vercel/next.js/releases/tag/v15.0.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node.js Release Schedule — Node.js Foundation. &lt;a href="https://nodejs.org/en/about/previous-releases" rel="noopener noreferrer"&gt;https://nodejs.org/en/about/previous-releases&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;npm package download statistics for &lt;code&gt;next&lt;/code&gt; — &lt;a href="https://www.npmjs.com/package/next" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/next&lt;/a&gt; (weekly download trends, 2024-2026)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next.js Documentation: Environment Variables — &lt;a href="https://nextjs.org/docs/app/building-your-application/configuring/environment-variables" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/building-your-application/configuring/environment-variables&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next.js Documentation: API Routes — &lt;a href="https://nextjs.org/docs/pages/building-your-application/routing/api-routes" rel="noopener noreferrer"&gt;https://nextjs.org/docs/pages/building-your-application/routing/api-routes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conventional Commits Specification v1.0.0 — &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;https://www.conventionalcommits.org/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git-filter-repo documentation — &lt;a href="https://github.com/newren/git-filter-repo" rel="noopener noreferrer"&gt;https://github.com/newren/git-filter-repo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OWASP Secrets Management Cheat Sheet — &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vercel Deployment Environment Variables Guide — &lt;a href="https://vercel.com/docs/projects/environment-variables" rel="noopener noreferrer"&gt;https://vercel.com/docs/projects/environment-variables&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;This article reflects my actual experience debugging these issues in real codebases. The mistakes described are patterns I've seen repeatedly, not edge cases. If something here contradicts what you've been doing, that's not an accident.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>git</category>
      <category>nextjs</category>
      <category>node</category>
    </item>
    <item>
      <title>Will AI Replace Software Engineers? No. But It Will Shrink Junior Roles.</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:57:05 +0000</pubDate>
      <link>https://dev.to/syedahmershah/will-ai-replace-software-engineers-no-but-it-will-shrink-junior-roles-45lg</link>
      <guid>https://dev.to/syedahmershah/will-ai-replace-software-engineers-no-but-it-will-shrink-junior-roles-45lg</guid>
      <description>&lt;p&gt;Note: To stay fully transparent with the community, I want to share that I used AI assistance to help draft and polish this article. I’ve reviewed and edited everything to ensure it aligns with community guidelines and brings genuine value to you all!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And if you think you have time to "wait and see," you really, really don't.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Let me tell you about a friend of mine. Seven years of experience. Mid-level engineer. $190K total comp at a solid company — a Series B startup, let's not get sidetracked with names. He got laid off in early 2025. It happens. He had a strong GitHub profile, could do system design in his sleep, had a clean resume that would've cleared any screen two years ago. He got to final rounds at three different companies.&lt;/p&gt;

&lt;p&gt;Lost all three.&lt;/p&gt;

&lt;p&gt;The feedback, each time, was some version of the same sentence: &lt;em&gt;"We went with someone who was more fluent with AI tools."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He wasn't anti-AI. He used Copilot sometimes. He wasn't one of those "real engineers write real code" types. He just hadn't gone deep on it. &lt;em&gt;Sometimes&lt;/em&gt; was enough — until suddenly it wasn't. The bar had moved and nobody sent him a memo.&lt;/p&gt;

&lt;p&gt;That story is not unique. Right now, as you're reading this in 2026, that exact story is playing out for tens of thousands of engineers across every level, every stack, every timezone. And here's the part that makes it worse: it's not slowing down. It's accelerating.&lt;/p&gt;

&lt;p&gt;Let's look at what's actually happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers Don't Care About Your Feelings
&lt;/h2&gt;

&lt;p&gt;A lot of engineers are still operating on vibes. They hear "AI won't replace developers," breathe out, and go back to writing CRUD endpoints like nothing changed. I get it. But let's stop going on vibes for a second and look at what the data says.&lt;/p&gt;

&lt;p&gt;American tech companies eliminated more than 142,000 jobs in just the first five months of 2026 — a 33% increase over the same period the year before — even while those same employers were posting record revenues and committing to the largest infrastructure buildout in tech history, according to tech layoff trackers. Read that again. Record revenues. More layoffs. The math only makes sense when you understand what's actually driving it.&lt;/p&gt;

&lt;p&gt;The Stanford HAI 2026 AI Index, drawing on research from the Stanford Digital Economy Lab, found that early-career workers aged 22 to 25 in AI-exposed occupations experienced a 13% relative decline in employment since late 2022. Among 22-to-25-year-old software developers specifically, employment fell nearly 20% from its late 2022 peak by July 2025.&lt;/p&gt;

&lt;p&gt;Twenty percent. Gone. Not during a recession. Not because the industry slowed down. During a period of AI investment unlike anything we've ever seen.&lt;/p&gt;

&lt;p&gt;And here's the part that should genuinely bother you: for workers aged 30 and over in the highest AI-exposure categories, employment actually &lt;em&gt;grew&lt;/em&gt; between 6% and 12% over the same period. AI isn't destroying engineering as a profession. It's pulling up the floor. The junior layer is disappearing while the senior layer holds firm or grows. That is a very specific, very surgical thing happening.&lt;/p&gt;

&lt;p&gt;Entry-level postings dropped 60% between 2022 and 2024. Google and Meta are hiring roughly 50% fewer new grads compared to their 2021 peaks. According to Indeed's labour market data, software engineering listings are down approximately 35% from pre-pandemic levels — and roughly 70% from their 2022 peak.&lt;/p&gt;

&lt;p&gt;Seventy percent from peak.&lt;/p&gt;

&lt;p&gt;Think about what that means for a CS student graduating right now. Their professors built careers on a hiring market that simply doesn't exist anymore.&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%2Fyswzn004nfbllqd1dni6.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%2Fyswzn004nfbllqd1dni6.png" alt="a graphic showing a eye pyramid and rounded table" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The CEOs Stopped Being Diplomatic
&lt;/h2&gt;

&lt;p&gt;There used to be a script. "AI will create new jobs." "We're augmenting, not replacing." Every earnings call, every keynote, the same careful language. That script is mostly gone now.&lt;/p&gt;

&lt;p&gt;Marc Benioff, CEO of Salesforce — San Francisco's largest private employer — got on an earnings call in early 2025 and said it plainly: &lt;em&gt;"We're not going to hire any new engineers this year. We're seeing a 30% productivity increase in engineering, and we're going to really continue to ride that up."&lt;/em&gt;&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Zero new engineers. At one of the biggest enterprise software companies on Earth. Because AI made the existing team 30% more productive. Why hire ten people when seven get you the same output?&lt;/p&gt;

&lt;p&gt;But the line that deserves to be carved into the wall of every CS department in every university was this one, from the same call:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"My message to CEOs right now is that we are the last generation to manage only humans."&lt;/em&gt;&lt;br&gt;
— Marc Benioff, CEO of Salesforce, Q4 FY2025 Earnings Call&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not some fringe tech provocateur being edgy for an audience. That's the CEO of a $145 billion company saying the quiet part loud, on a call with investors and analysts. That's the actual strategy being announced.&lt;/p&gt;

&lt;p&gt;Then there's Zuckerberg. On the Joe Rogan Experience in January 2025, he said something that didn't get nearly enough attention:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Probably in 2025, we at Meta, as well as the other companies that are basically working on this, are going to have an AI that can effectively be a sort of midlevel engineer that you have at your company that can write code."&lt;/em&gt;&lt;br&gt;
— Mark Zuckerberg, Joe Rogan Experience, January 2025&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Did that prediction land perfectly? Depends who you ask. But what isn't debatable is that Meta's junior developer hiring shrank dramatically through 2024 and 2025. The vision was stated. The hiring decisions followed.&lt;/p&gt;

&lt;p&gt;At Google, the numbers tell a story that keeps accelerating. Sundar Pichai first disclosed the 25% figure on the Q3 2024 earnings call.&lt;sup id="fnref3"&gt;3&lt;/sup&gt; By April 2025 it had climbed past 30%. By late 2025, Google's own CFO was citing "nearly half." Then, at Google Cloud Next 2026 in Las Vegas — just weeks ago — Pichai said this out loud:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Today, 75% of all new code at Google is now AI-generated and approved by engineers, up from 50% last fall."&lt;/em&gt;&lt;br&gt;
— Sundar Pichai, Google Cloud Next 2026, April 22, 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three-quarters of the codebase at one of the world's premier engineering organisations. Not written by a human hand.&lt;/p&gt;

&lt;p&gt;Satya Nadella, at Microsoft Build 2025, put Microsoft's comparable figure at around 30%.&lt;sup id="fnref4"&gt;4&lt;/sup&gt; That number has likely moved too.&lt;/p&gt;

&lt;p&gt;Let that trajectory sink in. The most influential software company on the planet just told the world, publicly, that three in four lines of new code it ships were generated by AI. Not as a confession. As a boast.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Klarna Story Nobody Wants to Sit With
&lt;/h2&gt;

&lt;p&gt;I keep coming back to Klarna because people draw the wrong lesson from it every single time.&lt;/p&gt;

&lt;p&gt;Between 2022 and 2024, Klarna reduced its workforce — cutting approximately 700 positions — while deploying AI to handle the volume those roles had covered: customer service, operations, repetitive backend work. CEO Sebastian Siemiatkowski was open about it. Then things went wrong. Customer complaints climbed. Service quality dropped. Siemiatkowski publicly acknowledged that the AI-driven transition had negatively affected service and product quality. By 2025, Klarna was rehiring human staff.&lt;/p&gt;

&lt;p&gt;People love this story. "See? AI failed. Humans win. Everyone goes home."&lt;/p&gt;

&lt;p&gt;But here's what everyone skips over: those 700 people lost one to two years of income. Some pivoted careers entirely. Others are still looking. When Klarna came back to rehire, they didn't rebuild what they had. They built something smaller, leaner, structured around a gig-style model that requires fewer permanent headcount. The company rolled back the &lt;em&gt;pace&lt;/em&gt; of replacement — not the &lt;em&gt;direction&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The lesson from Klarna is not "AI will fail so we're safe."&lt;/p&gt;

&lt;p&gt;The lesson from Klarna is this: companies will try to replace you with AI. Sometimes it'll backfire badly. When they course-correct, they'll hire back fewer people than they let go. The reset doesn't go home. It goes to a new, lower, permanent baseline.&lt;/p&gt;

&lt;p&gt;That's not a comfort. That's a warning.&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%2Fasc1pn4jeh738lgkg3yb.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%2Fasc1pn4jeh738lgkg3yb.png" alt="Visual Animation depicting difference between traditional developer" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Split That's Already Happening
&lt;/h2&gt;

&lt;p&gt;Here's what I'm actually seeing in the developer community right now, and it is not subtle.&lt;/p&gt;

&lt;p&gt;There are engineers who went all in — integrated AI tools into their workflows, learned the failure modes, used them to ship faster. A 2025 Microsoft/GitHub study found that engineers using Copilot completed comparable tasks 55% faster.&lt;sup id="fnref5"&gt;5&lt;/sup&gt; That productivity multiplier has translated directly into smaller junior headcounts at companies like Meta, Google, and hundreds of mid-size SaaS companies that right-sized their engineering organisations through 2024–2025. The engineers using AI well aren't just surviving — they're getting the promotions, the offers, the raises. By Q1 2025, 82% of developers reported using AI tools weekly, with 59% running three or more simultaneously. And the pay reflects it: AI-fluent developers are landing entry-level roles at $90K–$130K versus $65K–$85K for traditional profiles, according to job market data.&lt;/p&gt;

&lt;p&gt;Then there's the other group. Engineers who say "I don't trust AI code" or "it's glorified autocomplete" or — and I've heard this more than once — "real engineers write real code." Look, I understand the psychology. There's something genuinely uncomfortable about watching a tool do a significant portion of work you spent years learning. It feels like a betrayal of the craft.&lt;/p&gt;

&lt;p&gt;But the market has no feelings about your feelings about the craft.&lt;/p&gt;

&lt;p&gt;Take something like this — the kind of endpoint a junior developer used to spend a morning on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;require_auth&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/users/&amp;lt;int:user_id&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nd"&gt;@require_auth&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User not found&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/users&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nd"&gt;@require_auth&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Email required&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub Copilot or Claude Code generates something like that in about four seconds. With tests. With error handling. With docstrings if you ask. The junior developer who spent a career building this kind of muscle is now competing against a tool that does it in seconds.&lt;/p&gt;

&lt;p&gt;The job of writing this code isn't gone. The &lt;em&gt;reason to hire someone specifically to write this code&lt;/em&gt; absolutely is.&lt;/p&gt;

&lt;p&gt;What's not gone: knowing &lt;em&gt;why&lt;/em&gt; this architecture might be wrong for your specific use case. Knowing when to break the pattern. Understanding what happens when this hits 100,000 concurrent requests. That's senior engineer judgment. And AI, as of 2026, is still genuinely bad at it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The World Is Treating This Differently Than You Are
&lt;/h2&gt;

&lt;p&gt;Here's something that struck me hard: the institutions that usually move the slowest — governments — are scrambling faster than most individual developers I know.&lt;/p&gt;

&lt;p&gt;The U.S. has provided funding for AI certifications for 120,000 laid-off workers. Across Europe, AI retraining enrolments jumped 39%. Singapore has baked workforce AI transition programs directly into its national strategy. The WEF's Reskilling Revolution initiative has mobilised commitments expected to reach over 856 million people globally by 2030.&lt;sup id="fnref6"&gt;6&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;India — which has the world's largest pool of software developers — is doing something particularly interesting. Rather than panic about AI consuming developer jobs, India is systematically working to ensure its developers are the ones &lt;em&gt;building&lt;/em&gt; the AI. A NASSCOM report projects India's AI talent pool to double from 6.5 lakh to over 12.5 lakh professionals by 2027, growing at 15% year-on-year. In the past three years alone, 8.65 lakh candidates were trained in emerging tech, with 3.20 lakh specifically in AI and Big Data Analytics.&lt;sup id="fnref7"&gt;7&lt;/sup&gt; That's not a country in denial. That's a country repositioning at scale.&lt;/p&gt;

&lt;p&gt;The WEF's Future of Jobs Report 2025 puts the global picture in stark terms: by 2030, job disruption could affect 22% of all roles globally — displacing 92 million jobs while creating 170 million new ones.&lt;sup id="fnref6"&gt;6&lt;/sup&gt; Net positive on paper. Except the 92 million displaced are largely doing specific things: entry-level coding, repetitive testing, documentation, basic customer support. And the 170 million new jobs are in AI oversight, system architecture, ML infrastructure, AI safety, and technical leadership.&lt;/p&gt;

&lt;p&gt;The math is brutal in its simplicity. If you're a developer who primarily does the work AI now generates, you're in the 92 million. If you learn to architect systems, supervise AI output, and build what AI can't build alone — you're in the 170 million.&lt;/p&gt;

&lt;p&gt;Every country that's paying attention is trying to get into the 170 million. Are you?&lt;/p&gt;




&lt;h2&gt;
  
  
  What AI Is Actually Taking (And It's Not What You Think)
&lt;/h2&gt;

&lt;p&gt;Let me be precise about the mechanism here, because the discourse is sloppy and sloppy thinking leads to wrong decisions.&lt;/p&gt;

&lt;p&gt;AI is not replacing software engineering as a discipline. The judgment, the architecture, the systems thinking, the ability to navigate technical debt and organisational complexity — that's not going anywhere soon. What AI &lt;em&gt;is&lt;/em&gt; replacing are the specific tasks that junior developers were hired to do: boilerplate, basic CRUD, scripted testing, routine bug fixes, first-draft documentation.&lt;/p&gt;

&lt;p&gt;The problem is, those weren't just tasks.&lt;/p&gt;

&lt;p&gt;They were the apprenticeship. You wrote the boilerplate and slowly started to understand &lt;em&gt;why&lt;/em&gt; the boilerplate worked. You fixed the simple bugs and developed an intuition for reading unfamiliar code. You built the CRUD endpoints and gradually developed a feel for data modelling. You did the repetitive work and, somewhere in that repetition, you became an engineer who could do the hard work.&lt;/p&gt;

&lt;p&gt;That entire training pipeline is now compressed or closed. Companies are skipping the junior layer and hiring mid-to-senior engineers who can direct and supervise AI output. The most visible effect of AI coding tools in 2026 isn't eliminating senior engineers — it's hollowing out the layer below them. Companies that used to run 3–5 juniors per senior are now running leaner teams.&lt;/p&gt;

&lt;p&gt;AWS CEO Matt Garman said it directly, calling the strategy of simply eliminating the junior layer &lt;em&gt;"one of the dumbest things I've ever heard"&lt;/em&gt; — warning that companies risk creating a catastrophic skills gap over the next decade. If you wipe out the apprenticeship, you stop producing the next generation of senior engineers.&lt;/p&gt;

&lt;p&gt;He's right.&lt;/p&gt;

&lt;p&gt;And most companies are doing it anyway, because short-term cost savings beat long-term talent pipeline thinking every single quarter. That's not cynicism. That's just how publicly traded companies behave.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You're Actually Supposed to Do
&lt;/h2&gt;

&lt;p&gt;Okay, I've been pretty dark. Let me be useful for a second, because fear without action is just anxiety.&lt;/p&gt;

&lt;p&gt;The engineers I see doing well right now share a few specific things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They treat AI like a junior developer, not an oracle.&lt;/strong&gt; They use it to generate first drafts and review those drafts with the same critical eye they'd apply to a first-year intern's pull request. They understand &lt;em&gt;why&lt;/em&gt; the AI generated what it generated — which means they catch when it's confidently wrong. They have architectural opinions that the AI cannot substitute for.&lt;/p&gt;

&lt;p&gt;The practical workflow looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# How senior engineers are actually working in 2026&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: You design the architecture — AI is genuinely bad at this&lt;/span&gt;
&lt;span class="c"&gt;# Step 2: AI scaffolds the implementation&lt;/span&gt;
&lt;span class="c"&gt;# Step 3: You review critically and catch the failure modes&lt;/span&gt;

&lt;span class="c"&gt;# Example — prompting Claude Code or Cursor:&lt;/span&gt;
&lt;span class="c"&gt;# "Create a rate-limiter middleware for our Express API&lt;/span&gt;
&lt;span class="c"&gt;#  using Redis, with per-user and per-IP limits,&lt;/span&gt;
&lt;span class="c"&gt;#  with proper fallback handling for Redis connection failures"&lt;/span&gt;

&lt;span class="c"&gt;# AI gets ~80% right immediately&lt;/span&gt;
&lt;span class="c"&gt;# The remaining 20% — Redis failover edge cases,&lt;/span&gt;
&lt;span class="c"&gt;# production-specific config, security gaps — YOU catch that&lt;/span&gt;
&lt;span class="c"&gt;# That gap is the job now. That's your value.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;They have strong opinions about system design.&lt;/strong&gt; When to use microservices versus a monolith. When a message queue adds value and when it just adds complexity. How to handle distributed transactions. When to cache — and when caching creates more problems than it solves. This is the domain where experience lives and AI doesn't, because it requires judgment shaped by having built things that broke in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They know exactly where AI fails.&lt;/strong&gt; Not vaguely ("AI makes mistakes") but specifically: hallucinated API calls that look correct until they don't. Security vulnerabilities in generated authentication code. Incorrect business logic assumptions baked silently into generated functions. Only about 30% of AI-suggested code gets accepted by developers who actually know what to look for — and that selectivity is itself a skill you have to develop. The developers doing well right now have built a detailed personal map of where AI goes wrong.&lt;/p&gt;

&lt;p&gt;Here's the clearest way I can put the distinction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# AI generates this in seconds — low value in knowing it by heart
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user_by_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# AI cannot answer these for you — this is where your career lives:
# → Why PostgreSQL over MongoDB for this specific use case?
# → How does this query behave under 10,000 concurrent requests?
# → What are the GDPR implications of storing this email field?
# → When do you add a Redis cache here, and when is it overkill?
# → How does this endpoint interact with your circuit breaker?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second list. That's the job now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're building in public.&lt;/strong&gt; Writing about what they're learning, contributing to open source, creating content that makes their &lt;em&gt;thinking&lt;/em&gt; visible. When AI can replicate anyone's code sample, the hiring signal shifts to judgment. The developers getting offers right now are the ones whose judgment is legible from the outside — you can read who they are from their GitHub, their articles, their opinions on hard problems.&lt;/p&gt;

&lt;p&gt;And the ones who are most secure? They understand the business too. AI is making pure technical skills cheaper every month. What it cannot replicate is the engineer who deeply understands the domain, speaks the language of product and business, can talk to customers, can translate between the technical and the strategic. That profile — technically sharp &lt;em&gt;and&lt;/em&gt; business-fluent — is more valuable right now than it has been at any point in the last decade.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Criticism That Needs to Be Said
&lt;/h2&gt;

&lt;p&gt;Something unpopular needs to be said.&lt;/p&gt;

&lt;p&gt;A lot of the "AI won't replace developers" discourse is being driven by people with significant financial or psychological incentives to believe it. Senior engineers who don't want to feel their skills are devaluing. Bootcamp founders who need enrolment. CS departments whose own enrolment is already dropping. VCs who've bet on human-in-the-loop products.&lt;/p&gt;

&lt;p&gt;None of these people are lying exactly. But they're all reading the same data through a very interested filter.&lt;/p&gt;

&lt;p&gt;U.S. Bureau of Labor Statistics data shows software developer employment fell 27.5% between 2023 and 2025.&lt;sup id="fnref8"&gt;8&lt;/sup&gt; A Resume.org survey of 1,000 U.S. business leaders found that six in ten companies are likely to lay off employees in 2026, with four in ten planning to specifically replace workers with AI.&lt;sup id="fnref9"&gt;9&lt;/sup&gt; These are not rounding errors. These are not post-pandemic corrections. These are structural shifts.&lt;/p&gt;

&lt;p&gt;When critics say "but AI code is buggy, it needs human review, it can't handle complex systems" — they're not wrong. But they're imagining a binary: either AI replaces engineers completely or nothing changes. Reality is a third option, the one that's already here: AI replaces specific tasks within engineering, shrinks team sizes, raises the floor of what gets you hired, and leaves a smaller but more capable group of engineers doing work that genuinely requires human judgment.&lt;/p&gt;

&lt;p&gt;That third option arrived while people were still debating whether the first one was possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Resume Has to Look Like Now
&lt;/h2&gt;

&lt;p&gt;Two years ago, a junior developer posting read: "1–2 years experience, proficiency in React and Node, familiar with Git."&lt;/p&gt;

&lt;p&gt;Today — if a junior posting exists at all, and there are far fewer — it reads something closer to: "Experience with AI-assisted development workflows, ability to review and validate AI-generated code, familiarity with prompt engineering for code generation, experience with at least two AI coding tools."&lt;/p&gt;

&lt;p&gt;Entry-level hiring at the 15 biggest tech firms fell 25% from 2023 to 2024, according to a SignalFire report.&lt;sup id="fnref10"&gt;10&lt;/sup&gt; Employers' rating of the market for college graduates is at its most pessimistic since 2020, per NACE's Job Outlook 2026.&lt;sup id="fnref11"&gt;11&lt;/sup&gt; With AI performing more of the grunt work that used to be the entry-level on-ramp, expectations for new grads have shifted dramatically upward. You're expected to show up already knowing things that used to be learned on the job.&lt;/p&gt;

&lt;p&gt;If you're graduating this year, or seriously thinking about entering the field — the playbook has fundamentally changed. You cannot follow the path that produced the engineers who might be mentoring you. Their path, the one that started with two years of boilerplate and slowly accumulated into expertise, is largely gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bet That's Already Been Made
&lt;/h2&gt;

&lt;p&gt;Here's the context I don't see enough people connecting to the rest of this.&lt;/p&gt;

&lt;p&gt;Tech companies globally are committing to a combined $700 billion in AI infrastructure investment. Jensen Huang put it directly: &lt;em&gt;"One trillion dollars of AI infrastructure is coming. The entire installed base of data centers will be renewed."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Companies don't bet that kind of money on something they think might fizzle. This is the largest concentrated capital commitment in tech history — bigger than the cloud transition, bigger than mobile. And every dollar of it is simultaneously a bet that AI will replace significant volumes of human cognitive labour, including coding labour.&lt;/p&gt;

&lt;p&gt;The companies making that bet are also the companies deciding who to hire. When Amazon, Microsoft, Google, and Meta collectively commit hundreds of billions to AI infrastructure, they are making a simultaneous workforce decision: fewer junior developers, more ML engineers, more people who build and maintain the systems that will do what humans used to do.&lt;/p&gt;

&lt;p&gt;This is not a hiring cycle. This is a structural transformation. And the decision was made years ago. We're just living in the consequences.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Question Worth Actually Sitting With
&lt;/h2&gt;

&lt;p&gt;Here's something I'd encourage every working developer to honestly answer for themselves.&lt;/p&gt;

&lt;p&gt;If your job title stayed exactly the same, but all the junior tasks — the boilerplate, the tests, the first-draft implementations — were offloaded to AI, what would you actually be doing all day?&lt;/p&gt;

&lt;p&gt;If the answer is "still plenty: architecture decisions, complex debugging, cross-team alignment, technical strategy, reviewing AI output critically" — you're probably in good shape. You've built the kind of irreplaceable judgment that AI, as of today, genuinely cannot replicate.&lt;/p&gt;

&lt;p&gt;If the answer is "I'm not sure" or "honestly, a lot of what I do could probably be generated" — that's important information. That's a signal worth acting on now, not later.&lt;/p&gt;

&lt;p&gt;Among Gen Z developers, 64% report worrying about being laid off, compared to 45% of their millennial counterparts, per Stack Overflow's Developer Survey. Those numbers aren't paranoia. They're pattern recognition. Gen Z engineers entered a market that looked like one thing and found something completely different when they arrived.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Summary
&lt;/h2&gt;

&lt;p&gt;Will AI replace software engineers? No. The discipline of engineering — systems thinking, architecture, the judgment that comes from having built things that broke — is genuinely hard to replicate and AI is genuinely bad at it.&lt;/p&gt;

&lt;p&gt;But will AI shrink junior roles, compress the hiring pipeline, raise the floor of what's expected at every level, and leave a smaller total number of engineers employed than the 2022 peak? It already has. That's not a prediction. That's a 2026 fact.&lt;/p&gt;

&lt;p&gt;In 2025 alone, at least 58 million workers globally received some form of AI training or certification, reflecting the scale of workforce transition already underway. The people who are going to be fine are the ones treating that transition not as a professional option but as a professional requirement.&lt;/p&gt;

&lt;p&gt;AI is not optional anymore. Not because some blog post said so. Because the hiring data, the layoff data, the productivity data, and the capital allocation data all point in the same direction. The companies with the most money in the world made their decision. They made it years ago.&lt;/p&gt;

&lt;p&gt;The question is just whether you make yours, and when.&lt;/p&gt;

&lt;p&gt;Because the engineers who ignore this — who wait for clarity, who keep doing what they've been doing and hope the market swings back to them — are making a bet. A bet that one of the best-funded, fastest-moving technological transitions in history is going to stall out before it reaches their desk.&lt;/p&gt;

&lt;p&gt;I wouldn't take that bet.&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%2Fun0bivnk6yoslhd46yae.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%2Fun0bivnk6yoslhd46yae.png" alt="Depicting an image on What you can do now" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Can Do, Starting Now
&lt;/h2&gt;

&lt;p&gt;Not a lecture. Just what I'd do.&lt;/p&gt;

&lt;p&gt;Start using AI tools as a real collaborator, not as autocomplete. Use Claude Code, Cursor, Copilot — use multiple, because they have different strengths and critically different failure modes. Build things with them. Learn where they fail. That failure map is your professional edge, because knowing when the AI is wrong is worth far more than being able to generate code you can't evaluate.&lt;/p&gt;

&lt;p&gt;Build the skills AI provably can't replicate in 2026: distributed systems design, security architecture, ML infrastructure, technical leadership, the ability to translate business requirements into technical decisions that account for real operational constraints. These are deeply human skills right now.&lt;/p&gt;

&lt;p&gt;Write publicly about what you're building and learning. In a market where AI can produce anyone's code sample, your &lt;em&gt;thinking&lt;/em&gt; has to be the differentiator. Make it visible.&lt;/p&gt;

&lt;p&gt;And invest real time in the business side. Understand the domain you're building in. Talk to the users. Learn enough about the product and the economics to make real decisions — not just technical ones. That combination of technical depth plus business fluency is, right now, as hard to replace as anything in this industry.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The friend I opened with — he's okay. After three rejections in a row, he spent three months rebuilding his workflow. AI for 60–70% of implementation. Critical review of everything it produced. He built a real sense of where it went wrong. Got back to final rounds. Got the job.&lt;/p&gt;

&lt;p&gt;But he lost months. He lost income. He went through the specific kind of humiliation that comes with being objectively skilled at something and still being passed over — not for someone better, but for someone who had simply adapted faster. The only reason was timing. He moved slower than the market moved.&lt;/p&gt;

&lt;p&gt;Don't be him. Move now.&lt;/p&gt;

&lt;p&gt;The question was never whether AI will replace software engineers. The question has always been whether &lt;em&gt;you&lt;/em&gt; will make yourself the kind of engineer that AI makes more powerful — or one that AI makes obsolete. That answer is entirely up to you.&lt;/p&gt;

&lt;p&gt;But you don't have unlimited time to decide.&lt;/p&gt;




&lt;h3&gt;
  
  
  References &amp;amp; Sources
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Additional data from: Stanford HAI 2026 AI Index · Stanford Digital Economy Lab · Stack Overflow Developer Survey 2024–2025 · Indeed Labour Market Data · Tech Layoff Tracker (May 2026) · Harvard Business Review (February 2026)&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me across the web:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Medium:&lt;/strong&gt; &lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;DEV.to:&lt;/strong&gt; &lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="http://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Salesforce Q4 FY2025 Earnings Call — Marc Benioff, CEO&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Joe Rogan Experience, January 2025 — Mark Zuckerberg, CEO of Meta&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;Alphabet Q3 2024 Earnings Call; Google Cloud Next 2026 (April 22, 2026) — Sundar Pichai, CEO of Google&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Microsoft Build 2025 — Satya Nadella, CEO of Microsoft&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Microsoft/GitHub Copilot Productivity Study, 2025&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;World Economic Forum — Future of Jobs Report 2025 &amp;amp; Reskilling Revolution Initiative&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;NASSCOM AI Talent Report 2026; Indian Ministry of Labour and Employment&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn8"&gt;
&lt;p&gt;U.S. Bureau of Labor Statistics, Occupational Employment Data, 2025&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn9"&gt;
&lt;p&gt;Resume.org Survey of 1,000 U.S. Business Leaders, 2025&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn10"&gt;
&lt;p&gt;SignalFire Entry-Level Hiring Report, 2024&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn11"&gt;
&lt;p&gt;National Association of Colleges and Employers (NACE) — Job Outlook 2026&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>discuss</category>
      <category>git</category>
      <category>node</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
