<?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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3021645%2Fad95c369-a218-4eb1-9eca-5f628e887906.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 Coded My Portfolio From Scratch. No Templates.</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Tue, 26 May 2026 18:22:40 +0000</pubDate>
      <link>https://dev.to/syedahmershah/i-coded-my-portfolio-from-scratch-no-templates-5ed7</link>
      <guid>https://dev.to/syedahmershah/i-coded-my-portfolio-from-scratch-no-templates-5ed7</guid>
      <description>&lt;p&gt;There is a very specific kind of regret that hits when you deploy someone else's template, change the name and the profile picture, push it to GitHub, and then look at the result and think — yeah. That's me. That's my work.&lt;/p&gt;

&lt;p&gt;It's not. It never was.&lt;/p&gt;

&lt;p&gt;I made that mistake once. Grabbed something off a free portfolio site, tweaked the colors a bit, added my name in the hero section. It looked clean. It looked professional even. But whenever someone asked me about it I'd skip over the details because deep down I knew I hadn't built any of it. I had dressed up someone else's house and called it home.&lt;/p&gt;

&lt;p&gt;So when I finally decided to sit down and build &lt;a href="https://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt; properly, the first rule I set for myself was simple — no template. Not even as a reference. Start from index.html and figure the rest out.&lt;/p&gt;

&lt;p&gt;What followed was months of fighting with CSS, arguing with Three.js, debugging scroll behavior at 1 AM, and slowly building something that I can actually explain line by line. This is that story.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Templates Are a Trap (For Beginners Especially)
&lt;/h2&gt;

&lt;p&gt;Before I get into the build, I want to actually say something here because I see this conversation come up constantly in developer communities. People ask — should I use a template for my portfolio? And the nice answer is: it depends.&lt;/p&gt;

&lt;p&gt;The honest answer is: if you're learning, a template will stunt you.&lt;/p&gt;

&lt;p&gt;Using a template means you skip the decisions. You skip figuring out why a section is structured the way it is, why a certain animation works the way it does, why the developer chose to reach for a library instead of writing something custom. You inherit a finished product and you don't get any of the understanding that came from building it.&lt;/p&gt;

&lt;p&gt;Now if you're a senior developer trying to ship a portfolio in a weekend because you're job hunting — sure. Template makes sense. Time is money.&lt;/p&gt;

&lt;p&gt;But if you're a student, if you're early in your career, if you're trying to prove to yourself and to the people hiring you that you can build things — then building your own portfolio is genuinely one of the best projects you can do. Not because the portfolio itself is impressive. Because the process of building it forces you to answer real questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack and Why It Looks the Way It Does
&lt;/h2&gt;

&lt;p&gt;My stack for this project is: HTML5, custom CSS (this is the majority of the codebase, not Bootstrap), Bootstrap 5 for the grid layer only, vanilla JavaScript, a little bit of jQuery (honestly way less than I planned), Three.js, TurnJS, TiltJS, Lenis.js, and AJAX for some of the dynamic loading. Contact form runs through Formspree.&lt;/p&gt;

&lt;p&gt;If you look at the repo's language breakdown — it's 50.7% JavaScript, 29.3% CSS, 20% HTML. That CSS number felt right when I saw it. A lot of the complexity in this site lives in the stylesheets.&lt;/p&gt;

&lt;p&gt;I want to explain why the stack ended up looking like this because I made some deliberate choices and some accidental ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bootstrap vs Custom CSS — this one matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The instinct a lot of beginners have is to let Bootstrap do everything. You end up with like 50 utility classes on every div and very little actual understanding of what the layout is doing. I made the decision early on to use Bootstrap only for the grid system and for a few responsive breakpoints. Everything else — spacing, typography, animations, color, positioning — is custom CSS using variables.&lt;/p&gt;

&lt;p&gt;This was slower. It was also much better for me as a developer. When something broke I had to understand &lt;em&gt;why&lt;/em&gt; it broke instead of just switching utility classes until it looked right.&lt;/p&gt;

&lt;p&gt;The result is a CSS file that is actually kind of long and in some places probably not perfectly organized. That's real. I'm not going to pretend the codebase is immaculate. There are sections where I know I could refactor things, places where I wrote a specific rule to fix a very specific layout problem and then never cleaned it up properly. The site works and it looks good but the code behind it has the marks of something that was built iteratively over time, not planned from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript — mostly vanilla, jQuery at the edges&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I planned to use jQuery more. Ended up using it way less. Vanilla JS handles most of the interaction logic. jQuery ended up in a few specific places where I was doing quick DOM manipulation and the syntax was just cleaner.&lt;/p&gt;

&lt;p&gt;I don't think there's a strong philosophical argument here. It's just that once you start writing vanilla JS properly you realize most of the things you were reaching for jQuery to do are actually not that hard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three.js, a Blender File, and the Learning Curve I Underestimated
&lt;/h2&gt;

&lt;p&gt;The Three.js section of this build took way longer than I thought it would.&lt;/p&gt;

&lt;p&gt;Three.js is one of those libraries where the documentation is technically good and also kind of confusing if you haven't done any 3D work before. The concepts — scene, camera, renderer, geometry, material, mesh, light — they make complete sense once you get it. Before you get it, it feels like you're assembling furniture from instructions written in a different language.&lt;/p&gt;

&lt;p&gt;I used Blender to create the 3D model that lives in the portfolio. If you've never opened Blender, it is a lot. The interface alone takes a few days to get comfortable with. But for what I needed — modeling a specific object, exporting it in a format Three.js can read — it was the right tool.&lt;/p&gt;

&lt;p&gt;The thing nobody tells you about Three.js performance is that 3D on the web is heavy by default and you have to actively fight against that. Geometry complexity, texture resolution, how you're handling the render loop, whether you're correctly disposing of objects when they're not needed — all of this hits your frame rate. I ended up adding a toggle that lets users turn off the 3D effects entirely, specifically for older devices. Some people will land on the site on a five year old phone. The site should still work for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before adding the 3D scene:&lt;/strong&gt;&lt;br&gt;
The hero section was static. Clean, but kind of flat. No real visual depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
There's actual spatial weight to the page. The 3D element gives the viewport a sense of depth that you can't really replicate with CSS tricks alone.&lt;/p&gt;

&lt;p&gt;The trade-off is performance. I'll be honest — Three.js adds real weight to the bundle and if you don't handle it carefully your Lighthouse score will tell you. I spent time optimizing how and when the scene initializes, deferring it until after critical content loads.&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%2F7172g5jom3qnmmnqkafs.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%2F7172g5jom3qnmmnqkafs.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Certifications Book That Took a Weird Amount of Work
&lt;/h2&gt;

&lt;p&gt;One of the sections I'm most satisfied with is the certifications section. Instead of a standard grid of certificate images, I built a flipbook — an actual book you can page through — using TurnJS combined with TiltJS for the 3D tilt effect when you hover.&lt;/p&gt;

&lt;p&gt;TurnJS is a library that simulates page turning. It uses CSS3 transforms and JavaScript to create a page-flip animation that looks like a real book. Wiring it up to work with the actual certificate content, making it responsive, handling the edge cases around what happens when someone is on a touch device — this took more time than I expected.&lt;/p&gt;

&lt;p&gt;TiltJS sits on top of that and adds the parallax tilt effect when you move your mouse over the book. The way the two libraries interact required some careful event handling. There were bugs. There were moments where the tilt was triggering when it shouldn't, or where the page flip animation was cutting off because something in the transition timing was conflicting.&lt;/p&gt;

&lt;p&gt;But when it works — and it works now — it's genuinely one of the most distinctive things on the site. Every other developer portfolio has a grid of certificates. Mine has a book.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scroll Behavior: Lenis, IntersectionObserver, and the Scrolljacking Debate
&lt;/h2&gt;

&lt;p&gt;Smooth scroll is one of those things that sounds like a nice small detail and turns into a rabbit hole.&lt;/p&gt;

&lt;p&gt;I'm using Lenis.js for smooth scrolling. Lenis intercepts the native scroll and replaces it with a smoother, physics-based animation. The result is this buttery, almost native-app feel when you scroll through the page. It's subtle but it matters. The difference between scrolling a site with and without Lenis is the difference between dragging something across carpet versus dragging it across glass.&lt;/p&gt;

&lt;p&gt;The debate around scrolljacking is real and worth acknowledging. Scrolljacking — controlling or manipulating the scroll behavior beyond the user's direct input — has a bad reputation and for good reason. It can feel jarring, it breaks user expectations, and it's particularly bad for accessibility. I made specific choices here: the Lenis implementation I'm using follows the user's actual scroll direction and speed, it doesn't take over or redirect the scroll, it just smooths the physics. That's different from the aggressive scrolljacking you see on some agency sites where sections snap into place whether you wanted them to or not.&lt;/p&gt;

&lt;p&gt;IntersectionObserver is what drives the section animations. Elements animate in when they enter the viewport. I'm not using a library for this — it's native browser API, well supported, and honestly not that complicated once you write it a few times. The performance profile is much better than scroll event listeners, which fire constantly and are easy to abuse.&lt;/p&gt;




&lt;h2&gt;
  
  
  SignalHub: The Section I've Never Seen on Another Portfolio
&lt;/h2&gt;

&lt;p&gt;The section called SignalHub is the one I get the most questions about.&lt;/p&gt;

&lt;p&gt;Most portfolios have a contact section with a few social icons at the bottom. Facebook, GitHub, LinkedIn, maybe Twitter. That's fine. Functional. Forgettable.&lt;/p&gt;

&lt;p&gt;SignalHub is a full section built around two sides — a personal side and a professional side. It's my complete social presence, organized by context. The professional side has GitHub, LinkedIn, dev.to. The personal side has the stuff that's more me and less resume. Both sides are clean, navigable, and presented as a real part of the site rather than an afterthought footer row.&lt;/p&gt;

&lt;p&gt;The reason I built it this way is that I think there's actually a signal in &lt;em&gt;how&lt;/em&gt; a developer organizes their online presence. Showing that I've thought about context — personal vs professional, what belongs where — says something. It's also just more useful for whoever is looking at the site. If a recruiter lands on it they go to the professional side. If another developer is curious about what I'm actually like as a person they go to the other side.&lt;/p&gt;

&lt;p&gt;Is it unconventional? Yes. Did some people think it was weird when I described it? Also yes. It's still on the site.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nine Sections, One Page, Zero Frameworks
&lt;/h2&gt;

&lt;p&gt;The portfolio is a single page application in the most literal sense — it's one HTML file with nine distinct sections: Home, About, Education, Skills, Certification, Blog, Contact, Projects, and SignalHub.&lt;/p&gt;

&lt;p&gt;No React. No Vue. No Next.js. Just HTML, CSS, JavaScript, and a set of libraries that handle specific things.&lt;/p&gt;

&lt;p&gt;I want to defend this choice because the developer community has a habit of treating framework usage as a marker of seriousness. If you're not using React you're not building real things, that sort of attitude. I think that's backwards.&lt;/p&gt;

&lt;p&gt;For a static portfolio site, a framework adds complexity without adding value. React's component model solves problems that a single-page portfolio doesn't have. The virtual DOM solves a reconciliation problem that doesn't exist when your content doesn't change at runtime. You're adding a build step, a node_modules folder, a mental model, and a bundle size — and none of those things make the portfolio better for the people visiting it.&lt;/p&gt;

&lt;p&gt;The cursor tracking, the trailing cursor effect, the animations — all of that is JavaScript. Not framework JavaScript. Just JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO on a Static Site: The Part Most Portfolio Guides Skip
&lt;/h2&gt;

&lt;p&gt;This part took longer than any feature.&lt;/p&gt;

&lt;p&gt;I want to go through what's actually implemented because "I set up SEO" is a phrase people say without explaining what that means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meta Tags and Open Graph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every important meta tag is in the head. Open Graph tags so the site previews correctly when shared on social media. Twitter card meta. Canonical URL. Description. Keywords. These are the basics and they take maybe 30 minutes but a lot of portfolio sites don't have them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON-LD Structured Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the thing most developers skip. JSON-LD is a way to embed structured data in your page that search engines can parse to understand what your page is about. For a personal portfolio, the relevant schema types are Person, WebSite, and potentially BreadcrumbList. Having this in place means Google can potentially show rich results — things like your name and links directly in the search results, not just the page title.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you haven't heard of llms.txt, it's a relatively new convention — a plain text file at the root of your site that describes your site to large language models. The idea is similar to robots.txt but for AI crawlers. I added one because I think it's going to matter more over time as AI-driven search and AI assistants become the primary way people discover content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt and sitemap.xml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both are present. The sitemap is submitted to both Google Search Console and Bing Webmaster Tools. The robots.txt is correctly configured — there's nothing sophisticated to block, so it's mostly permissive, but having it there properly formatted matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudinary for Image Delivery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Images are served from Cloudinary in WebP format with PNG fallbacks. WebP images are on average 25-35% smaller than equivalent JPEG or PNG files. When you're serving a portfolio that has project screenshots, certificate images, profile photos — that size difference accumulates. Cloudinary also gives you automatic format selection and responsive image delivery, so mobile users aren't downloading desktop-sized images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google and Bing Indexing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The site is verified with both Google Search Console and Bing Webmaster Tools. Manual indexing requests were submitted. I know this because I did it. Not passively waiting for crawlers to find it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured Heading Hierarchy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One H1 per page. H2s for major sections. H3s inside sections where appropriate. This isn't just SEO — it's accessibility. Screen readers navigate by heading structure. If your headings are a mess the page is a mess.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Over-Clean" Problem
&lt;/h2&gt;

&lt;p&gt;There is a thing that happens when you have full control over a codebase and you spend too much time on it. Everything starts looking a little too perfect. Every spacing value is consistent, every transition matches, every color is deliberate. And then you look at it from a distance and something feels slightly off. Too polished. Like a room that nobody actually lives in.&lt;/p&gt;

&lt;p&gt;I've had a few people describe my portfolio as "over-clean." I understand what they mean. There's something about a site that looks like it was designed in Figma and exported perfectly that can feel slightly removed. Like you're looking at a product shot rather than a person's work.&lt;/p&gt;

&lt;p&gt;I don't have a full solution for this. I've thought about adding more intentional asymmetry, rougher textures, sections that break the grid on purpose. Some of the upcoming features I'm working on — a built-in blog, a personal AI integration, a game — those might add the kind of lived-in quality that the site currently lacks.&lt;/p&gt;

&lt;p&gt;For now I'm sitting with it. Sometimes clean is clean and that's fine.&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%2F5ujytqjp6pgyiax9l29x.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%2F5ujytqjp6pgyiax9l29x.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming Next (The Honest Version)
&lt;/h2&gt;

&lt;p&gt;Here are the features I'm actively working on or thinking seriously about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal AI integration&lt;/strong&gt; — an AI assistant that knows my work, my writing, my projects, and can answer questions about me. This is actually more interesting technically than it sounds because it requires some form of retrieval-augmented generation rather than just wrapping a model API call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in blog&lt;/strong&gt; — not links to external posts. Articles that live inside the portfolio itself, properly rendered, indexed, and consistent with the site's design language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case studies for projects&lt;/strong&gt; — right now the project section shows what I built. The plan is to add case studies that show why I built it, what decisions I made, what I'd change. The how matters less than the thinking behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and accessibility audit&lt;/strong&gt; — Lighthouse scores are okay but there's work left. WCAG 2.1 AA compliance is the target for accessibility. fetchpriority hints for above-the-fold images. Better font loading strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replacing the current modal with a custom one&lt;/strong&gt; — the modal system I'm using right now is borrowed. Writing my own gives me full control over the interaction model and removes an external dependency.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Thing That Actually Mattered
&lt;/h2&gt;

&lt;p&gt;145 commits to the main branch. 23 stars. 7 forks. JavaScript at 50.7% of the codebase.&lt;/p&gt;

&lt;p&gt;None of those numbers are the point.&lt;/p&gt;

&lt;p&gt;The point is that when someone asks me how the certification flipbook works, I can explain it. When someone asks why I chose Lenis over native smooth scroll, I have an actual answer. When someone asks about the SEO implementation, I don't have to guess — I built it, I know what's in there.&lt;/p&gt;

&lt;p&gt;A template can look better than what I built. Probably several of them do. But a template doesn't teach you anything except how to edit someone else's decisions. And if you're at the beginning of your career, decisions — making them, understanding them, owning them — are what you're supposed to be practicing.&lt;/p&gt;

&lt;p&gt;Build your own portfolio. Make it messy if you have to. Make decisions you'll regret later and then learn why you regret them. Put your name on something you actually built.&lt;/p&gt;

&lt;p&gt;That's the whole thing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stack summary:&lt;/strong&gt; HTML5, custom CSS3, Bootstrap 5 (grid only), Vanilla JS, jQuery (minimal), Three.js, Blender (3D modeling), TurnJS, TiltJS, Lenis.js, AJAX, Formspree, Cloudinary, GitHub Pages / custom domain&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev/Portfolio" rel="noopener noreferrer"&gt;ahmershahdev/Portfolio&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Find Me Across the Web
&lt;/h2&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;All links:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Beacons&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>css</category>
      <category>git</category>
      <category>nextjs</category>
      <category>node</category>
    </item>
    <item>
      <title>I Built a Production-Grade E-Commerce Platform in 3 Months — GitHub Copilot Was My Co-Founder</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sat, 23 May 2026 20:57:12 +0000</pubDate>
      <link>https://dev.to/syedahmershah/i-built-a-production-grade-e-commerce-platform-in-3-months-github-copilot-was-my-co-founder-11m4</link>
      <guid>https://dev.to/syedahmershah/i-built-a-production-grade-e-commerce-platform-in-3-months-github-copilot-was-my-co-founder-11m4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;Let me be honest with you first — when I started &lt;strong&gt;Commerza&lt;/strong&gt;, I genuinely didn't know if I would ever finish it.&lt;/p&gt;

&lt;p&gt;I'm a 19-year-old software engineering student from Pakistan. Not from some well-funded university. Not from a bootcamp in San Francisco. I'm doing a 4-year BSE at HITMS and a 3-year Advanced Diploma in Software Engineering at Aptech Pakistan, side by side, trying to become a full-stack developer with real skills — not just tutorial-following muscle memory.&lt;/p&gt;

&lt;p&gt;Commerza is a &lt;strong&gt;production-grade PHP + MySQL e-commerce platform&lt;/strong&gt;. Full storefront. Full admin panel. Real payments (COD + Stripe). Enterprise-level security — CSRF protection, Google reCAPTCHA v2 &lt;em&gt;and&lt;/em&gt; v3, rate limiting, audit logs, stock locking, SMTP failover, Argon2id password hashing, SQL injection defenses across every user-facing mutation path.&lt;/p&gt;

&lt;p&gt;The kind of stuff you'd expect from a team. Not one broke student coding at 2am.&lt;/p&gt;

&lt;p&gt;And no — it wasn't a "weekend project". This thing has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;80 PHP files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;339 total tracked files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;136 commits&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 62.6% | JavaScript 20.8% | CSS 15.0% | PowerShell 1.6%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack: &lt;code&gt;HTML&lt;/code&gt; · &lt;code&gt;CSS&lt;/code&gt; · &lt;code&gt;JavaScript&lt;/code&gt; · &lt;code&gt;jQuery&lt;/code&gt; · &lt;code&gt;Bootstrap&lt;/code&gt; · &lt;code&gt;PHP&lt;/code&gt; · &lt;code&gt;MySQL&lt;/code&gt; · &lt;code&gt;JSON&lt;/code&gt; · &lt;code&gt;XML&lt;/code&gt; · &lt;code&gt;SEO&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It has a dark mode (OrangeRed + Black) and a light mode (NavyBlue + White). It has Cloudinary integration, Redis/APCu caching layers, ClamAV upload scanning, sub-admin role management, a product trash bin, coupon campaigns, review eligibility enforcement, OAuth via Google and Facebook, customer blacklists, and a CI security gate that runs on every push.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;&lt;a href="https://github.com/ahmershahdev/commerza" rel="noopener noreferrer"&gt;Commerza&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And GitHub Copilot — with Claude Sonnet 4.6, Claude Opus 4.6, and GPT-5.2-Codex — built probably &lt;strong&gt;78% of the backend&lt;/strong&gt; alongside me.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ahmershahdev/commerza" rel="noopener noreferrer"&gt;github.com/ahmershahdev/commerza&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(Screenshots Below)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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%2Fvrdlz7vbuf2ecycygyyh.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%2Fvrdlz7vbuf2ecycygyyh.png" alt="Commerza storefront homepage displaying a minimalist, high-end hero slider for premium products with clean navigation links and light mode active." width="800" height="430"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fpyyrq9kygdohd9s5r5xz.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%2Fpyyrq9kygdohd9s5r5xz.png" alt="Commerza custom checkout system in dark mode showing form fields and a dynamic math security question fallback panel triggered on localhost when Google reCAPTCHA is inactive." width="800" height="447"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fhg972005m9f83f2n9kxp.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%2Fhg972005m9f83f2n9kxp.png" alt="Customer order history dashboard within the Commerza user account profile showing order details, order IDs, and real-time high-value COD email verification status updates." width="800" height="455"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fxbjcxeg994w5jxwkc2sw.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%2Fxbjcxeg994w5jxwkc2sw.png" alt="Commerza central admin dashboard UI displaying real-time e-commerce key performance indicators, total revenue, order metrics, customer counts, and a recent orders log table." width="800" height="461"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fyqf9iw3sozbpvti2md0g.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%2Fyqf9iw3sozbpvti2md0g.png" alt="Commerza administrative management dashboard showing the custom sub-admin account creation wizard with modular role profiling options like Operations Manager and Customer Support." width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

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

&lt;p&gt;January 2026. I had the idea. I wanted to build something I could actually show to a client or employer — not a todo app, not a blog engine. Something &lt;em&gt;real&lt;/em&gt;. An e-commerce platform from scratch. No Laravel, no framework crutch. Raw PHP. Because I wanted to understand every layer.&lt;/p&gt;

&lt;p&gt;The first month? I was mostly doing frontend. HTML structure. CSS design system. Bootstrap grid. jQuery interactions. I wrote those by hand. Clean, methodical, slow. Every component manually. The product cards. The navbar. The cart page. The admin sidebar.&lt;/p&gt;

&lt;p&gt;You can see it in my commit history. Slow, small, frontend commits. One file at a time.&lt;/p&gt;

&lt;p&gt;Then I hit the backend wall.&lt;/p&gt;

&lt;p&gt;I stared at the PHP folder for three days. I knew PHP basics. But &lt;em&gt;production&lt;/em&gt; PHP is a different animal. PDO vs mysqli. Prepared statements everywhere, not just "when you feel like it". CSRF tokens — what are they, really, and where do they go? Argon2id vs bcrypt — does it matter for a student project? (Yes. It does.)&lt;/p&gt;

&lt;p&gt;The stuff I thought would take me "a few days" started looking like months of work. Email automation — SMTP with a failover to a backup transport? Rate limiting that doesn't break normal users? reCAPTCHA v3 with score thresholds and action validation?&lt;/p&gt;

&lt;p&gt;I'd have been done in 6-8 months. Maybe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Copilot
&lt;/h3&gt;

&lt;p&gt;I'd been using GitHub Copilot casually for code completion. But sometime in early February 2026, I started actually &lt;em&gt;talking&lt;/em&gt; to it. Using the agent mode. Giving it context. Describing what I needed. Letting it write entire systems.&lt;/p&gt;

&lt;p&gt;The shift was dramatic.&lt;/p&gt;

&lt;p&gt;Here's one of the first real "wow" moments. I needed SMTP failover. My plan was: try primary SMTP, if it fails, fail the email. Copilot suggested something I hadn't considered — a dual-route architecture where the primary and secondary share a duplicate-suppression check so you don't accidentally send the same email twice if both routes are responsive at once.&lt;/p&gt;

&lt;p&gt;I did not know that was a real pattern. I learned it &lt;em&gt;in the tool&lt;/em&gt;. Not from a YouTube tutorial. Not from StackOverflow. From watching Copilot write it and then asking it to explain why.&lt;/p&gt;

&lt;p&gt;The final architecture for &lt;code&gt;backend/mailer/mailer.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified illustration of the SMTP failover logic Copilot introduced&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;send_mail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$html_body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$primary&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;smtp_transport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'primary'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$secondary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;smtp_transport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fallback'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Suppress duplicate route — if both point to same host/account, skip fallback&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;same_transport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$secondary&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;attempt_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$html_body&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="nf"&gt;attempt_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$html_body&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="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="c1"&gt;// Primary failed — try fallback&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;attempt_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$secondary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$html_body&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;Small thing. But I would not have thought of the duplicate suppression check. That detail would have caused a real bug in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Copilot Built
&lt;/h3&gt;

&lt;p&gt;Let me be specific. Here's what GitHub Copilot generated — or heavily scaffolded — with me reviewing, testing, and iterating:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email Automation System&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SMTP primary + fallback routing (&lt;code&gt;mailer.php&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Security code generation + 15-minute expiry OTP for 2FA and password resets&lt;/li&gt;
&lt;li&gt;Cart expiry reminder emails (&lt;code&gt;send_engagement_reminders.php&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Wishlist expiry reminder emails&lt;/li&gt;
&lt;li&gt;Monthly profit report emails (&lt;code&gt;monthly_profit_report.php&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Weekly analytics report emails (&lt;code&gt;weekly_analytics_report.php&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Admin Panel Systems&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coupon management (create, activate, validate, campaign control)&lt;/li&gt;
&lt;li&gt;Product review moderation with delivery-status eligibility enforcement&lt;/li&gt;
&lt;li&gt;Product trash bin with restore workflow and storefront exclusion logic&lt;/li&gt;
&lt;li&gt;Sub-admin lifecycle (invite, email verify, roles, suspend/reactivate, delete + immediate session revocation)&lt;/li&gt;
&lt;li&gt;Security event monitoring UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google reCAPTCHA v3 verification with strict score threshold (0.65 default), action validation, hostname checking, &lt;code&gt;challenge_ts&lt;/code&gt; freshness&lt;/li&gt;
&lt;li&gt;reCAPTCHA v2 fallback when v3 isn't active for a flow&lt;/li&gt;
&lt;li&gt;Honeypot field embedded in CAPTCHA widget&lt;/li&gt;
&lt;li&gt;Fallback CAPTCHA challenge (arithmetic + knowledge, hashed answer per nonce, attempt lockout)&lt;/li&gt;
&lt;li&gt;Rate limiting across all sensitive endpoints&lt;/li&gt;
&lt;li&gt;PDO helper layer for controlled incremental migration from mysqli prepared statements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;security_helpers.php&lt;/code&gt; — centralized Argon2id/bcrypt hashing, password policy enforcement, rehash logic&lt;/li&gt;
&lt;li&gt;CI security gate via &lt;code&gt;.github/workflows/security-gate.yml&lt;/code&gt; — static checks on every push + dynamic probes when &lt;code&gt;SECURITY_BASE_URL&lt;/code&gt; is configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Checkout Hardening&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stock locking with &lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt; during order placement&lt;/li&gt;
&lt;li&gt;Idempotency key consumption to block duplicate form submissions&lt;/li&gt;
&lt;li&gt;High-value COD OTP threshold (email OTP for orders above configurable limit)&lt;/li&gt;
&lt;li&gt;Refund and review blacklist enforcement across all user-facing mutation paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Before vs. After
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Before Copilot&lt;/th&gt;
&lt;th&gt;After Copilot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP files written&lt;/td&gt;
&lt;td&gt;~8 (basic CRUD)&lt;/td&gt;
&lt;td&gt;80 tracked PHP files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security posture&lt;/td&gt;
&lt;td&gt;basic input escaping&lt;/td&gt;
&lt;td&gt;3-level security model (baseline → sensitive forms → critical money paths)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email system&lt;/td&gt;
&lt;td&gt;single PHP mail() call&lt;/td&gt;
&lt;td&gt;SMTP failover + 6 automation scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimated time to complete&lt;/td&gt;
&lt;td&gt;6–8 months&lt;/td&gt;
&lt;td&gt;3–4 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Things I knew I didn't know&lt;/td&gt;
&lt;td&gt;PDO vs mysqli&lt;/td&gt;
&lt;td&gt;stock locking, CSP nonces, Argon2id, idempotency keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Things I didn't know I didn't know&lt;/td&gt;
&lt;td&gt;SMTP duplicate suppression, COD OTP threshold patterns, APCu/Redis cache layering&lt;/td&gt;
&lt;td&gt;&lt;em&gt;discovered through Copilot's generated code&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the real one. The things I didn't know I didn't know.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Models Matter
&lt;/h3&gt;

&lt;p&gt;I used three models across this project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Sonnet 4.6&lt;/strong&gt; — my daily workhorse. Fast, accurate for PHP, good at following context across multiple files. When I was iterating quickly on storefront logic or admin UI, Sonnet was my go-to. It understood my existing codebase structure without me re-explaining every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Opus 4.6&lt;/strong&gt; — for the scary parts. When I needed the CAPTCHA hybrid system designed, or when I was trying to figure out the checkout security model (transaction boundaries, row locking, idempotency), I reached for Opus. Slower, but it reasoned through edge cases I wouldn't have caught. The "Level 1, Level 2, Level 3 security severity model" in my README — that framework came out of an Opus session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.2-Codex&lt;/strong&gt; — I used this mostly for breakpoint testing, spotting logic flaws, checking SQL injection vectors, and validating security helpers. Different model, different angle on the same code. Like having a second pair of eyes that reads code differently. Copilot's multi-model architecture made this seamless — I could switch within the same workflow.&lt;/p&gt;

&lt;p&gt;As of April 2026, GitHub Copilot supports model selection for both Claude and Codex agents, with Claude Sonnet 4.6 and Claude Opus 4.6 available for Anthropic tasks, and GPT-5.2-Codex, GPT-5.3-Codex, and GPT-5.4 available for OpenAI Codex tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Actually Happened in Practice
&lt;/h3&gt;

&lt;p&gt;It wasn't magic. Let me be clear.&lt;/p&gt;

&lt;p&gt;I wrote every single frontend file by hand. Copilot suggestions during HTML/CSS work were mostly noise — I ignored them. The jQuery interactions, the Bootstrap grid, the storefront layouts — that's mine, manually typed.&lt;/p&gt;

&lt;p&gt;Where Copilot exploded in value was PHP systems logic. The kind of code where one missed edge case means a security hole or a race condition in checkout. The kind of code where you need to know patterns you've never been taught.&lt;/p&gt;

&lt;p&gt;A real example: I knew I needed "CSRF protection." What I didn't know was &lt;em&gt;where exactly&lt;/em&gt; to validate the token (before any database operation, not after), or that regenerating the token after each validated request is a meaningful hardening step. Copilot wrote it the right way. I read the code, asked it why, it explained. That's not just autocomplete — that's mentorship encoded into a tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Pushed Back On
&lt;/h3&gt;

&lt;p&gt;Copilot is not always right. A few things I rejected or significantly modified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It initially generated SQL using string concatenation in a few helper queries — I pushed back and forced prepared statements everywhere&lt;/li&gt;
&lt;li&gt;One version of the reCAPTCHA logic didn't validate hostname or &lt;code&gt;challenge_ts&lt;/code&gt; — I asked for hardening and got a stricter implementation&lt;/li&gt;
&lt;li&gt;The first version of the rate limiter didn't have burst tolerance — it would have flagged fast-typing legitimate users. I caught it in testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right model is: you're the architect. Copilot is a very fast contractor who sometimes cuts corners. Review everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  On Learning While Using AI
&lt;/h3&gt;

&lt;p&gt;Here's the thing people don't say enough: AI-assisted development taught me more than it replaced. I learned PDO, Argon2id, CSP nonces, idempotency keys, stock locking, Cloudinary server-side signing, APCu caching, and Redis connection pooling — all through reading, testing, and interrogating code that Copilot generated. If I'd been alone, I'd have written simpler code and never encountered these patterns at all.&lt;/p&gt;

&lt;p&gt;The alternative wasn't "I would have learned this from scratch." The alternative was "I would have shipped something less secure and less complete."&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%2Fs1kmgz82vn3356lztkhr.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%2Fs1kmgz82vn3356lztkhr.PNG" alt="GitHub Copilot agent mode in VS Code: active code generation session, PHP security helpers file open" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Commerza is archived now — May 5, 2026. I archived it not because I abandoned it, but because it reached a state I'm actually satisfied with. 339 files. 80 PHP files. 136 commits. A CI security gate. A dual-SMTP mailer. An admin panel I'd actually use.&lt;/p&gt;

&lt;p&gt;Is it perfect? No. There are things I'd change. The PDO migration is incomplete — the README says so honestly. Some admin UI pages are rougher than others. There's a lot of room to grow.&lt;/p&gt;

&lt;p&gt;But it exists. It runs. It handles real security concerns that most tutorial-based PHP projects completely ignore.&lt;/p&gt;

&lt;p&gt;That's the difference three months and GitHub Copilot made.&lt;/p&gt;

&lt;p&gt;I'm not a "vibe coder." I'm not someone who just prompts and ships. Copilot was my accelerator, my pattern library, and — genuinely — my teacher on the backend. The frontend was mine. The architecture decisions were mine. The testing, the debugging, the "wait this doesn't make sense, let me re-read the generated code at 1am" — all mine.&lt;/p&gt;

&lt;p&gt;If you're a student developer who thinks AI tools are "cheating": they're not. They're the closest thing to a senior developer pair-programming with you that most of us will ever get access to, for free. Use them intelligently. Read everything they generate. Push back when it's wrong. Ask why.&lt;/p&gt;

&lt;p&gt;That's how you build a production-grade e-commerce platform in 3 months instead of 8.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;🔗 GitHub: &lt;a href="https://github.com/ahmershahdev/commerza" rel="noopener noreferrer"&gt;github.com/ahmershahdev/commerza&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built by Syed Ahmer Shah — BSE student, HITMS BSE, Aptech ADSE, Pakistan. 2026.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Find Me Across the Web
&lt;/h2&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;All links:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Beacons&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>devchallenge</category>
      <category>githubchallenge</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Antigravity &amp; WebMCP: Why Google I/O 2026 is Terrifying for Devs</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Wed, 20 May 2026 11:44:46 +0000</pubDate>
      <link>https://dev.to/syedahmershah/antigravity-webmcp-why-google-io-2026-is-terrifying-for-devs-31mb</link>
      <guid>https://dev.to/syedahmershah/antigravity-webmcp-why-google-io-2026-is-terrifying-for-devs-31mb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-io-writing-2026-05-19"&gt;Google I/O Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It's been 10 years since we pivoted the company to be AI first."&lt;/em&gt;&lt;br&gt;
— Sundar Pichai, Google I/O 2026 Keynote, May 19, 2026&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I watched the Google I/O 2026 keynote. And somewhere around the part where a Google DeepMind engineer named Varun Mohan demoed an AI agent that &lt;strong&gt;built a functioning operating system from scratch — in 12 hours&lt;/strong&gt; — I kind of just... sat there staring at the screen.&lt;/p&gt;

&lt;p&gt;Not because it was cool. I mean, it &lt;em&gt;was&lt;/em&gt; cool. But because of what it quietly meant.&lt;/p&gt;

&lt;p&gt;If agents can build operating systems, what does that say about my carefully maintained full-stack skill set? What does it say about yours?&lt;/p&gt;

&lt;p&gt;Let me be honest with you. I'm a developer still learning, still grinding. I've spent time with HTML, CSS, JavaScript, Firebase, Supabase — the whole usual roadmap. And this I/O felt different from previous years. It wasn't just model benchmarks and capability updates. It felt like Google was quietly drawing a map — and the destination on that map is a world where AI agents don't &lt;em&gt;help&lt;/em&gt; developers write code.&lt;/p&gt;

&lt;p&gt;They &lt;em&gt;are&lt;/em&gt; the developers.&lt;/p&gt;

&lt;p&gt;And honestly? That question kept me up.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗓️ What Actually Happened at I/O 2026 — The Short Version
&lt;/h2&gt;

&lt;p&gt;Before I get into opinions, let's be clear on the facts. Google I/O 2026 ran May 19–20 at the Shoreline Amphitheatre in Mountain View, California. Over 7,000 people attended in person. The event was livestreamed to more than 500 developer events across 100 countries.&lt;/p&gt;

&lt;p&gt;The big announcements, in order of "things that made my eye twitch":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Announcement&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New flagship model for agentic workflows&lt;/td&gt;
&lt;td&gt;Outperforms Gemini 3.1 Pro, runs 4x faster than competing frontier models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Antigravity 2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent-first development desktop platform&lt;/td&gt;
&lt;td&gt;Multiple autonomous AI agents working in parallel on your codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Antigravity CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal version of Antigravity&lt;/td&gt;
&lt;td&gt;Build and orchestrate agents without leaving your terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Antigravity SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Programmatic access to agent harness&lt;/td&gt;
&lt;td&gt;Host custom agents on your own infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed Agents (Gemini API)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One API call = fully provisioned agent in isolated Linux sandbox&lt;/td&gt;
&lt;td&gt;Infrastructure friction = gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google AI Studio updates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native Kotlin support, Workspace integration, one-click Cloud Run deploy&lt;/td&gt;
&lt;td&gt;Build and ship full-stack apps with a single prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebMCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open web standard for browser-based AI agents&lt;/td&gt;
&lt;td&gt;AI agents can directly interact with your web app's JS functions and HTML forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firebase → Agent-native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Firebase now integrates directly with AI Studio and Antigravity&lt;/td&gt;
&lt;td&gt;Vibe-code full-stack apps, deploy to Cloud Run with one click&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini Omni&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multimodal world model — any input → any output&lt;/td&gt;
&lt;td&gt;Videos, images, audio, text — all combined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modern Web Guidance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Expert-vetted agent skills for web dev (100+ use cases)&lt;/td&gt;
&lt;td&gt;Your agent knows web best practices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Migration Agent (Android Studio)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Migrates React Native/web/iOS to native Kotlin&lt;/td&gt;
&lt;td&gt;Weeks of migration → hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeMender&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI code security agent from Google DeepMind&lt;/td&gt;
&lt;td&gt;Scans agent-generated code for vulnerabilities, auto-fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fkj510scc4uebyx40xkng.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%2Fkj510scc4uebyx40xkng.png" alt="Antigravity desktop UI screenshot" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 The Part Nobody's Talking About: Antigravity Is Not a Coding Tool
&lt;/h2&gt;

&lt;p&gt;Most people are framing Antigravity as "a better Copilot" or "Google's answer to Cursor."&lt;/p&gt;

&lt;p&gt;That's wrong.&lt;/p&gt;

&lt;p&gt;Antigravity — especially with the 2.0 update — is an &lt;strong&gt;agent orchestration runtime&lt;/strong&gt;. There's a real difference. A coding tool suggests the next line. An agent runtime &lt;em&gt;executes plans&lt;/em&gt;. It spins up subagents to work in parallel. It runs in the background. It connects to your Android builds, your Firebase project, your Cloud Run deployment. It does quality audits. It emulates user experiences. It even masks credentials automatically.&lt;/p&gt;

&lt;p&gt;Google is trying to turn Gemini from a chatbot family into a distributed agent runtime. The center of gravity is not one product. It is the stack formed by Gemini 3.5 Flash, Antigravity, Gemini Spark, AI Mode in Search, Gemini Omni, Chrome, and developer-facing managed agents.&lt;/p&gt;

&lt;p&gt;That's not a coding assistant. That's a software development lifecycle, automated.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Let Me Show You What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;Here's how Managed Agents actually work using the real Gemini Interactions API. This isn't pseudocode — this is the actual documented syntax from Google's official docs as of May 19, 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started with Managed Agents (Real API Syntax)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install the SDK&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Requires &lt;code&gt;@google/genai&lt;/code&gt; version &lt;strong&gt;1.33.0 or later&lt;/strong&gt; for Interactions API support.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @google/genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Spin up a full agent with a single call&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GoogleGenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@google/genai&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;client&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;GoogleGenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&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;GEMINI_API_KEY&lt;/span&gt; &lt;span class="p"&gt;});&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;runManagedAgent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// One call = a fully provisioned Antigravity agent in a remote Linux sandbox&lt;/span&gt;
  &lt;span class="c1"&gt;// The agent reasons, uses tools, executes code, and manages files autonomously&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interaction&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;antigravity-preview-05-2026&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The Antigravity base agent&lt;/span&gt;
      &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
        Create a full REST API with Express.js that:
        1. Has /users endpoint (GET, POST, DELETE)
        2. Uses in-memory storage
        3. Includes input validation
        4. Writes unit tests with Jest
        5. Creates a README.md
        Run the tests and confirm they pass.
      `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;remote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Isolated Linux sandbox, hosted by Google&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// 5 min — agents take longer than a single prompt&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// The agent doesn't just generate code — it runs it, fixes errors, returns results&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outputText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Save these — you'll need them for the next turn&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Interaction ID:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Environment ID:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environmentId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;runManagedAgent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Continue the same session — files and state are still there&lt;/strong&gt;&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;// Multi-turn: resume the exact same Linux environment&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;followUp&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;antigravity-preview-05-2026&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Now add JWT authentication to the existing API. Don't rewrite from scratch.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// This is what makes it powerful — the previous environment persists&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environmentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Reuse the same sandbox&lt;/span&gt;
    &lt;span class="na"&gt;previousInteractionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Continue conversation history&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt; &lt;span class="p"&gt;}&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;followUp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outputText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent doesn't forget. It picks up exactly where it left off — same files, same packages, same state. Like handing off to a developer who was already in the middle of the work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; Managed Agents / Interactions API is currently in &lt;strong&gt;preview&lt;/strong&gt;. The API schema may change. For stable production work, &lt;code&gt;generateContent&lt;/code&gt; remains the recommended path — Google's own docs say so.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Modern Web Guidance — The Underrated Announcement
&lt;/h3&gt;

&lt;p&gt;This is, in my opinion, the most &lt;em&gt;slept-on&lt;/em&gt; announcement of I/O 2026. Nobody is talking about it enough.&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 with one command — works with Antigravity or any agent&lt;/span&gt;
npx modern-web-guidance &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does: it gives your coding agent a set of 100+ expert-vetted web development skills. Not just "write valid HTML." We're talking WCAG accessibility standards, Core Web Vitals, security headers, Baseline API compatibility, progressive enhancement patterns.&lt;/p&gt;

&lt;p&gt;Before this, your agent wrote &lt;em&gt;working&lt;/em&gt; code. After this, your agent writes &lt;em&gt;correct&lt;/em&gt; code.&lt;/p&gt;

&lt;p&gt;That's not a nice-to-have. That's changing what "senior developer" actually means.&lt;/p&gt;




&lt;h3&gt;
  
  
  Firebase + AI Studio: Full-Stack App in One Prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// You type this in Google AI Studio:

"Build a task management app where users can:
- Sign in with Google
- Create and complete tasks stored in Firestore
- Get AI-powered task prioritization
- Deploy it live"

// What happens next (this is real, not a demo):
// ✅ Firebase project scaffolded with security rules
// ✅ Authentication configured via Firebase Auth
// ✅ Firestore schema and rules written
// ✅ Firebase AI Logic integrated for prioritization
// ✅ One-click deploy to Cloud Run (free tier for first 2 apps)
// ✅ Google Workspace APIs available via natural language
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Firebase's integration with Google AI Studio now supports one-click deployment to Cloud Run — no billing required for your first two Firebase-enabled apps on the new Google Cloud Starter Tier. You can also connect your apps to Google Workspace data like Gmail, Docs, and Sheets using natural language, through a standard Firebase Auth "Sign in with Google" flow.&lt;/p&gt;

&lt;p&gt;I tried this. It generated a working expense tracker — Firestore rules, authentication flow, and a functional UI — in about 4 minutes. Did I have to tweak things? Yes. A few field names, one security rule that was too permissive. But the scaffolding was solid. Faster than writing it myself? Embarrassingly, yes.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 The Real Question: Are Developers Being Replaced?
&lt;/h2&gt;

&lt;p&gt;Okay. Deep breath.&lt;/p&gt;

&lt;p&gt;Let me tell you what I actually think — not the comfortable answer, not the "AI is just a tool" cope that shows up in every LinkedIn post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some developers are being replaced. Some are being upgraded. The difference is whether you understand what's happening.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Before" World (pre-2026)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You write a feature → 2 days&lt;/li&gt;
&lt;li&gt;You debug a weird edge case → 3 hours&lt;/li&gt;
&lt;li&gt;You migrate an old codebase → weeks&lt;/li&gt;
&lt;li&gt;You write tests → almost as long as the feature&lt;/li&gt;
&lt;li&gt;You deploy → configuration hell&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "After" World (I/O 2026 and beyond)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Feature → agent does it in 20 minutes&lt;/li&gt;
&lt;li&gt;Debug → agent finds it, fixes it, verifies the fix&lt;/li&gt;
&lt;li&gt;Migration → The Android Studio migration agent turns weeks into hours&lt;/li&gt;
&lt;li&gt;Tests → auto-generated and auto-run inside the sandbox&lt;/li&gt;
&lt;li&gt;Deploy → one click, Cloud Run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yeah. Some of the &lt;em&gt;work&lt;/em&gt; is being replaced. Specifically: the repetitive, formulaic parts.&lt;/p&gt;

&lt;p&gt;But here's what ISN'T being replaced (yet):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System design decisions&lt;/strong&gt; — WHY you're building this architecture, not just HOW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding user needs&lt;/strong&gt; — translating messy human requirements into precise specs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security judgment&lt;/strong&gt; — knowing which tradeoff is acceptable and which isn't&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain context&lt;/strong&gt; — what legal, ethical, business constraints apply&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality bar&lt;/strong&gt; — recognizing when "working" ≠ "good enough to ship"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent doesn't know your company's security requirements. It doesn't know your users' edge cases. It doesn't know what scales to 1 million users. &lt;em&gt;Yet&lt;/em&gt; is doing a lot of work in that sentence.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Pros &amp;amp; Cons: Honest Assessment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ What's Actually Good
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&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;Gemini 3.5 Flash speed&lt;/td&gt;
&lt;td&gt;4x faster than competing frontier models — finally usable in real workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed Agents removing infrastructure&lt;/td&gt;
&lt;td&gt;No more Docker config / VM setup just to run an agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase → Cloud Run one-click deploy&lt;/td&gt;
&lt;td&gt;Free for first 2 apps. Removes the biggest full-stack friction point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebMCP open standard&lt;/td&gt;
&lt;td&gt;Web agents can be precise, not just "AI guessing at your DOM"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration Agent&lt;/td&gt;
&lt;td&gt;Genuinely solves a real, painful, existing problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Antigravity CLI&lt;/td&gt;
&lt;td&gt;Terminal-first devs aren't second-class citizens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$2M XPRIZE Hackathon&lt;/td&gt;
&lt;td&gt;Largest hackathon prize pool ever. A real opportunity.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ❌ What I'm Worried About
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&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;Forced Gemini CLI → Antigravity CLI migration&lt;/td&gt;
&lt;td&gt;Google literally says "we encourage Gemini CLI users to migrate." Not a choice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$100/month AI Ultra plan&lt;/td&gt;
&lt;td&gt;Who gets access to frontier AI? Developers in Pakistan? India? Nigeria? The access gap is real.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent-generated code security&lt;/td&gt;
&lt;td&gt;CodeMender catches vulnerabilities — but it's an agent checking another agent's code. Trust chains all the way down.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Google lock-in&lt;/td&gt;
&lt;td&gt;AI Studio + Antigravity + Firebase + Cloud Run + Workspace. One ecosystem. Tightly coupled. What happens when pricing changes?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Vibe coding" quality bar&lt;/td&gt;
&lt;td&gt;Prompting a CRUD app ≠ building software that's maintainable in 2 years&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Frfuzfudo5mqew9l78fpb.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%2Frfuzfudo5mqew9l78fpb.png" alt="Chrome 149 browser or WebMCP diagram" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 The Most Underrated Announcement: WebMCP
&lt;/h2&gt;

&lt;p&gt;Everyone is talking about Gemini 3.5 Flash. Almost nobody is talking about &lt;strong&gt;WebMCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;WebMCP is a proposed open web standard that allows developers to expose structured tools — like JavaScript functions and HTML forms — so browser-based AI agents can execute complex tasks with greater speed, reliability, and precision. The experimental WebMCP origin trial starts in &lt;strong&gt;Chrome 149&lt;/strong&gt;, with Gemini in Chrome support coming soon.&lt;/p&gt;

&lt;p&gt;Think about what this actually means.&lt;/p&gt;

&lt;p&gt;Right now, AI agents interacting with the web are basically doing screen-scraping with extra steps. They're looking at raw HTML, guessing at intent, clicking things, and hoping it works. It's fragile. It breaks constantly.&lt;/p&gt;

&lt;p&gt;WebMCP changes that architecture. Instead of the agent &lt;em&gt;guessing&lt;/em&gt; at what your form does, you &lt;em&gt;tell&lt;/em&gt; it. It's structured. Precise. Like giving AI a clean API to your website.&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;// WebMCP — based on proposed spec (origin trial in Chrome 149)&lt;/span&gt;
&lt;span class="c1"&gt;// Note: exact API surface may evolve as the standard matures&lt;/span&gt;

&lt;span class="c1"&gt;// In your web app, you expose capabilities to browser AI agents:&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webmcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webmcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;tools&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Creates a new task in the project management system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;enum&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="s2"&gt;low&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="s2"&gt;medium&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="s2"&gt;high&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="na"&gt;dueDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;date&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="na"&gt;required&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="s2"&gt;title&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="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&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="c1"&gt;// Your actual business logic here&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;taskAPI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_user_tasks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retrieves all tasks for the current user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;taskAPI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getForCurrentUser&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Now a browser agent (Gemini in Chrome, etc.) can:&lt;/span&gt;
&lt;span class="c1"&gt;// "Create a high-priority task called 'Fix the login bug' due Friday"&lt;/span&gt;
&lt;span class="c1"&gt;// And it executes — precisely, through your API, not through DOM hacking.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the internet becoming agent-native. Not just a few Google apps — the &lt;em&gt;whole web&lt;/em&gt;, if developers adopt it.&lt;/p&gt;

&lt;p&gt;And the reason this matters for you as a web developer: &lt;strong&gt;the websites that expose WebMCP tools will work with AI agents. The ones that don't will be invisible to them.&lt;/strong&gt; It's a new SEO, kind of. Except instead of optimizing for Google's crawler, you're optimizing for AI agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What Sundar Pichai Actually Said — And What I Think He Meant
&lt;/h2&gt;

&lt;p&gt;Pichai opened the keynote with: &lt;em&gt;"It's been 10 years since we pivoted the company to be AI first."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On the surface, that's a corporate milestone statement. But underneath it, there's an implicit message:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first 10 years were about building the AI. The next 10 years are about the AI building everything else.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's planned AI spending is expected to hit somewhere between &lt;strong&gt;$180 billion and $190 billion&lt;/strong&gt; this year alone. That's not a bet. That's a complete restructuring of what the company is.&lt;/p&gt;

&lt;p&gt;And for developers, that means the ground is moving under your feet whether you're watching the keynote or not.&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%2F5dtfniq2xyg72x7nt7c9.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%2F5dtfniq2xyg72x7nt7c9.png" alt="Screenshot of a working Firebase app or AI Studio generating code" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 My Honest Hands-On Experience
&lt;/h2&gt;

&lt;p&gt;After the keynote, I actually tried things instead of just forming opinions in a vacuum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Google AI Studio + Firebase&lt;/strong&gt;&lt;br&gt;
Built a simple expense tracker app via prompt. Firestore rules, auth flow, working UI — about 4 minutes. I had to edit the Firestore security rule for the user document (it was too open), and one of the UI components had hardcoded user IDs that needed replacing. But the scaffolding? Solid. The deploy to Cloud Run worked first try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Modern Web Guidance&lt;/strong&gt;&lt;br&gt;
Ran &lt;code&gt;npx modern-web-guidance install&lt;/code&gt;. It pulled in a large set of expert knowledge covering web performance, accessibility, and security. I then asked the agent to "make this page accessible." It identified missing alt text, added proper ARIA roles, and noted the color contrast ratio was below WCAG 2.2 AA standard. That's not a generic suggestion. That's specificity that usually requires a senior dev to catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Antigravity CLI (early preview)&lt;/strong&gt;&lt;br&gt;
Fast. The terminal experience is genuinely good. The credential masking is real — I tested it by deliberately putting an API key in a prompt and it masked it automatically. The agent ran terminal commands, checked output, and fixed its own mistakes mid-task. No manual intervention.&lt;/p&gt;

&lt;p&gt;The honest verdict: &lt;strong&gt;it works&lt;/strong&gt;. It's not magic. Agents still make dumb mistakes — wrong assumptions, over-eager refactors, occasional hallucinated package names. But the infrastructure is real. The speed is real. And it's moving faster than most developers are adjusting to.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 What This Means For Developers — The Uncomfortable Reflection
&lt;/h2&gt;

&lt;p&gt;There are three kinds of developers right now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Type A&lt;/strong&gt; — Sees AI agents and panics. Dismisses them as "hype." Keeps doing everything manually. Will be fine for a while. Then suddenly won't be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Type B&lt;/strong&gt; — Sees AI agents and fully surrenders. Just prompts everything. Has no idea what the generated code actually does. Can't debug. Can't make architecture decisions. Produces fast, shallow work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Type C&lt;/strong&gt; — Sees AI agents as force multipliers. Understands systems deeply. Uses agents for the mechanical work. Keeps judgment, architecture, and critical thinking in their own hands. &lt;strong&gt;This person becomes 10x more productive without becoming 10x more replaceable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I/O 2026 forced me to ask: which one am I actually building toward?&lt;/p&gt;

&lt;p&gt;Because Google didn't just release tools at this keynote. They released a vision. This is the era of agent-led development, where agents are evolving from coding assistants to intelligent collaborators capable of managing the entire software development lifecycle.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;entire&lt;/em&gt; lifecycle. Not part of it. All of it.&lt;/p&gt;

&lt;p&gt;The only way to stay relevant in that world is to own the parts agents can't: judgment, context, taste, accountability. Those aren't soft skills. Those are the new technical skills.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What Should You Actually Do Right Now?
&lt;/h2&gt;

&lt;p&gt;Stop consuming. Start building with the new tools. Here's a concrete list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try the Antigravity base agent&lt;/strong&gt; → &lt;a href="https://antigravity.google" rel="noopener noreferrer"&gt;antigravity.google&lt;/a&gt; — free tier available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a Managed Agent interaction&lt;/strong&gt; → &lt;code&gt;npm install @google/genai@1.33.0&lt;/code&gt; + the code above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install Modern Web Guidance&lt;/strong&gt; → &lt;code&gt;npx modern-web-guidance install&lt;/code&gt; — immediate, free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build one app in AI Studio with Firebase&lt;/strong&gt; → &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;aistudio.google.com&lt;/a&gt; — first 2 Cloud Run deploys free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the WebMCP spec&lt;/strong&gt; → &lt;a href="https://developer.chrome.com/docs/ai/webmcp" rel="noopener noreferrer"&gt;developer.chrome.com/docs/ai/webmcp&lt;/a&gt; — origin trial, Chrome 149&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply for the XPRIZE Hackathon&lt;/strong&gt; → &lt;a href="http://geminixprize.com" rel="noopener noreferrer"&gt;geminixprize.com&lt;/a&gt; — $2M prize pool, September finals in LA&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Conclusion: The Map Has Changed
&lt;/h2&gt;

&lt;p&gt;I'll leave you with this.&lt;/p&gt;

&lt;p&gt;In 2016, Google said "AI first." Nobody really believed them, not fully.&lt;/p&gt;

&lt;p&gt;In 2022, ChatGPT hit. People said "AI is a tool."&lt;/p&gt;

&lt;p&gt;In 2024, agents started shipping. People said "it's not production-ready."&lt;/p&gt;

&lt;p&gt;In 2026, at I/O, a Google engineer demoed an AI building an operating system in 12 hours. People in the audience laughed, nervously.&lt;/p&gt;

&lt;p&gt;That nervous laugh is the sound of a mental model breaking.&lt;/p&gt;

&lt;p&gt;We're not in the "AI assists developers" phase anymore. I/O 2026 was a clear pivot toward an agentic AI ecosystem where intelligent systems can assist users, automate workflows, and work across apps, devices, and services with &lt;strong&gt;minimal human intervention.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Minimal. Human. Intervention.&lt;/p&gt;

&lt;p&gt;That's the destination Google put on the map at I/O 2026.&lt;/p&gt;

&lt;p&gt;The question isn't whether you agree with the direction. It's whether you're building the skills that matter at the destination — or the skills that only mattered on the way there.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References &amp;amp; Useful Links
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🎬 Google Keynote (May 19, 2026)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=wYSncx9zLIU" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👩‍💻 Developer Keynote&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=aqmpZocmR8o" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤖 What's New in Google AI&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=tfoSeH63yCg" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔥 What's New in Firebase&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/live/lMEfqmyRMA8" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💙 What's New in Flutter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/live/3TfGKugPlpE" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ Google Cloud Live from I/O&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/live/l6TNXcqRQR8" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Developers Blog — Dev Keynote Recap&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.googleblog.com/all-the-news-from-the-google-io-2026-developer-keynote/" rel="noopener noreferrer"&gt;developers.googleblog.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Blog — Developer Highlights&lt;/td&gt;
&lt;td&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/" rel="noopener noreferrer"&gt;blog.google&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Introducing Managed Agents in the Gemini API&lt;/td&gt;
&lt;td&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/managed-agents-gemini-api/" rel="noopener noreferrer"&gt;blog.google&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase I/O 2026 Announcements&lt;/td&gt;
&lt;td&gt;&lt;a href="https://firebase.blog/posts/2026/05/google-io-2026-announcements/" rel="noopener noreferrer"&gt;firebase.blog&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official Antigravity Agent Docs&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/antigravity-agent" rel="noopener noreferrer"&gt;ai.google.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini Interactions API Docs&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions" rel="noopener noreferrer"&gt;ai.google.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebMCP Origin Trial (Chrome 149)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.chrome.com/docs/ai/webmcp" rel="noopener noreferrer"&gt;developer.chrome.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modern Web Guidance&lt;/td&gt;
&lt;td&gt;&lt;a href="http://goo.gle/modern-web-guidance" rel="noopener noreferrer"&gt;goo.gle/modern-web-guidance&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build with Gemini XPRIZE Hackathon&lt;/td&gt;
&lt;td&gt;&lt;a href="http://geminixprize.com" rel="noopener noreferrer"&gt;geminixprize.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google AI Studio&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;aistudio.google.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Written May 20, 2026 — the day after watching Google announce that an AI built an operating system in 12 hours, and feeling the very specific emotion of "excited and deeply unsettled at the same time."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Find Me Across the Web
&lt;/h2&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;All links:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Beacons&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>devchallenge</category>
      <category>googleiochallenge</category>
      <category>codenewbie</category>
      <category>ai</category>
    </item>
    <item>
      <title>Swapping Go for Rust: 10x Cheaper K8s Ingress</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Tue, 19 May 2026 16:59:42 +0000</pubDate>
      <link>https://dev.to/syedahmershah/swapping-go-for-rust-10x-cheaper-k8s-ingress-2b4p</link>
      <guid>https://dev.to/syedahmershah/swapping-go-for-rust-10x-cheaper-k8s-ingress-2b4p</guid>
      <description>&lt;p&gt;Let me tell you a story that starts in 2013, peaks somewhere around 2019, and ends with me staring at a $4,200 AWS bill at 11pm on a Tuesday.&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%2Fqqbvhbh58ugge036qdb4.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%2Fqqbvhbh58ugge036qdb4.png" alt="A timeline from Docker's launch to the growth of containers and Kubernetes adoption." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Revolution Nobody Saw Coming
&lt;/h2&gt;

&lt;p&gt;March 2013. PyCon. A French developer named Solomon Hykes gets on stage and does a five-minute demo of something called Docker.&lt;/p&gt;

&lt;p&gt;The audience is confused. Then curious. Then the applause starts.&lt;/p&gt;

&lt;p&gt;In those five minutes, he essentially broke software deployment as everyone knew it. No more "works on my machine." No more environment hell. You take your app, you put it in a box, and that box runs &lt;em&gt;anywhere.&lt;/em&gt; Same box. Every time.&lt;/p&gt;

&lt;p&gt;The internet lost its mind.&lt;/p&gt;

&lt;p&gt;Within a year, every startup was containerizing everything. Within two, enterprises were asking their CTOs why they weren't doing it yet. Within three, Docker was valued at over a billion dollars and "containerization" stopped being a niche word.&lt;/p&gt;

&lt;p&gt;But here's the thing about revolutions — they create new problems.&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%2Frmi6ywcud1nylr2yfec6.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%2Frmi6ywcud1nylr2yfec6.png" alt="A side-by-side comparison of major container orchestration platforms and their strengths." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter: The Orchestration Wars
&lt;/h2&gt;

&lt;p&gt;By 2014 you had thousands of containers. Maybe tens of thousands. And now what? How do you run them? How do you restart the ones that crash? How do you roll out updates without downtime? How do you route traffic between them?&lt;/p&gt;

&lt;p&gt;This is when it got messy. Genuinely messy.&lt;/p&gt;

&lt;p&gt;Three players showed up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Swarm&lt;/strong&gt; — Docker's own answer. Simple. Integrated. And honestly? Pretty good. But Docker the company was making decisions that confused everyone. They kept pivoting. Swarm never got the trust it deserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apache Mesos&lt;/strong&gt; — the enterprise option. Heavy. Complex. Battle-tested at Twitter and Airbnb scale. But you needed a PhD to configure it and the learning curve was basically a vertical wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; — Google's open-source version of Borg, the internal system they'd been running for over a decade. K8s dropped in 2014 and it was ugly at first. The config was verbose, the concepts were alien, the documentation was written by people who already understood it.&lt;/p&gt;

&lt;p&gt;But then something happened. Google poured resources into it. A foundation formed around it (&lt;a href="https://www.cncf.io/" rel="noopener noreferrer"&gt;CNCF&lt;/a&gt; — Cloud Native Computing Foundation, 2015). AWS, Azure, GCP all built managed versions of it. The ecosystem exploded.&lt;/p&gt;

&lt;p&gt;By 2017 the wars were effectively over.&lt;/p&gt;

&lt;p&gt;Kubernetes won. Swarm is still technically alive but nobody talks about it at conferences anymore. Mesos is mostly a ghost. K8s became the operating system of the cloud.&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%2F3nfyyqg1rq3jpuix6knl.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%2F3nfyyqg1rq3jpuix6knl.png" alt="Popular cloud-native technologies built around Go and its ecosystem." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go's Golden Era
&lt;/h2&gt;

&lt;p&gt;Here's something worth understanding: &lt;strong&gt;Kubernetes is written in Go.&lt;/strong&gt; Docker was written in Go. Traefik, Prometheus, Terraform, Consul, etcd, Helm — basically everything that runs your infrastructure today traces back to Go.&lt;/p&gt;

&lt;p&gt;This wasn't an accident.&lt;/p&gt;

&lt;p&gt;Go was designed at Google in 2007 by some of the most legendary people in computer science — Rob Pike, Ken Thompson (yes, the Unix guy), Robert Griesemer. They wanted a language that compiled fast, ran fast, handled concurrency natively, and didn't make you want to throw your laptop through a window.&lt;/p&gt;

&lt;p&gt;They got it right.&lt;/p&gt;

&lt;p&gt;Go's goroutines made writing networked, concurrent services &lt;em&gt;stupid easy.&lt;/em&gt; The toolchain was clean. The standard library was rich. You could hire people who knew it. Everything clicked.&lt;/p&gt;

&lt;p&gt;The cloud-native world standardized on Go almost by accident. It was the right language, at the right time, for the right problems.&lt;/p&gt;

&lt;p&gt;Between 2015 and 2020, if you were building infrastructure tooling and not using Go, people looked at you sideways.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meanwhile, In a Mozilla Office Somewhere...
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A Mozilla employee named Graydon Hoare is working on something in his spare time. A new systems language. One that gives you C-level performance but makes memory corruption &lt;em&gt;structurally impossible.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No garbage collector. No runtime overhead. But also no dangling pointers, no buffer overflows, no use-after-free bugs — the entire class of vulnerabilities that has haunted C and C++ for fifty years.&lt;/p&gt;

&lt;p&gt;The trick? A concept called &lt;strong&gt;ownership&lt;/strong&gt;. Every piece of memory has exactly one owner. When the owner goes out of scope, the memory is freed. Not by a GC running in the background. Not "eventually." &lt;em&gt;Immediately.&lt;/em&gt; Deterministically. At compile time.&lt;/p&gt;

&lt;p&gt;Mozilla ships Rust 1.0 in May 2015. The initial reaction from the systems programming community was somewhere between skeptical and hostile. The borrow checker — the compiler mechanism that enforces ownership — felt like fighting the language more than writing it.&lt;/p&gt;

&lt;p&gt;People tried it, got confused, went back to C++ or Go.&lt;/p&gt;

&lt;p&gt;But a small group of people &lt;em&gt;got&lt;/em&gt; it. And they kept building. Quietly.&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%2Fhvydy1651x7nfeyvh2i0.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%2Fhvydy1651x7nfeyvh2i0.png" alt="A visualization showing Rust's growing role in modern systems infrastructure." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quiet Takeover
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Cloudflare has a problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They're running nginx. Everywhere. nginx is written in C. It's fast, it's reliable, but it's also showing its age — the architecture doesn't handle modern HTTP patterns well, extending it is painful, and the codebase has had its share of security issues because, well, it's C.&lt;/p&gt;

&lt;p&gt;Cloudflare decides to replace it. Not patch it. &lt;em&gt;Replace it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They write &lt;a href="https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/" rel="noopener noreferrer"&gt;Pingora&lt;/a&gt; in Rust. A full HTTP proxy, from scratch, handling &lt;strong&gt;1 trillion requests per day&lt;/strong&gt; in production.&lt;/p&gt;

&lt;p&gt;The numbers they published were obscene. Compared to nginx: 70% reduction in CPU. 67% reduction in memory. Near-zero security vulnerabilities because the entire class of memory bugs simply cannot exist in safe Rust.&lt;/p&gt;

&lt;p&gt;And they didn't stop there. By late 2025, Cloudflare went further — they rewrote FL, the actual "brain" of Cloudflare (the system that applies every customer's WAF rules, DDoS settings, and routing logic) in Rust, calling it FL2. The result: response time dropped by 10ms and overall performance went up 25%. They shut down FL1 entirely in early 2026.&lt;/p&gt;

&lt;p&gt;Then AWS announced they were writing parts of their virtualization layer in Rust. Then Microsoft said Rust was the preferred language for new systems code at the company. Then the Linux kernel — the Linux kernel, which has run on C for thirty years — &lt;a href="https://www.kernel.org/doc/html/next/rust/index.html" rel="noopener noreferrer"&gt;accepted Rust as a second language&lt;/a&gt;, with stable driver support landing in kernel 6.1.&lt;/p&gt;

&lt;p&gt;The systems programming community quietly started paying attention.&lt;/p&gt;

&lt;p&gt;And then the Go community started getting uncomfortable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Back To My Tuesday Night
&lt;/h2&gt;

&lt;p&gt;This is where I come back in.&lt;/p&gt;

&lt;p&gt;We were a mid-size startup. Not Cloudflare. Not Amazon. But we were scaling, traffic was growing, and our Kubernetes setup was running fine.&lt;/p&gt;

&lt;p&gt;That word again. Fine.&lt;/p&gt;

&lt;p&gt;We were using &lt;a href="https://traefik.io/" rel="noopener noreferrer"&gt;Traefik&lt;/a&gt; as our ingress controller. Go-based, battle-tested, the default choice for half the K8s tutorials on the internet. Three replicas, handling maybe 800 req/s at peak.&lt;/p&gt;

&lt;p&gt;I was not watching the AWS bill closely enough. That was my fault.&lt;/p&gt;

&lt;p&gt;Then I did. And I saw $4,200 for one month of ingress-related compute.&lt;/p&gt;

&lt;p&gt;I didn't say anything for thirty seconds. I just sat there. That specific feeling when a number doesn't match your mental model and your brain is trying to reconcile 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.amazonaws.com%2Fuploads%2Farticles%2Fq8i79kkybl5imssy9ir2.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%2Fq8i79kkybl5imssy9ir2.png" alt="Original infrastructure setup using Traefik with multiple pods and increased memory consumption." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Panic Phase
&lt;/h2&gt;

&lt;p&gt;I started Googling. You should never Google things when you're panicking. You come out two hours later having read about eBPF, service meshes, and someone's confident blog post from 2021 recommending something that got deprecated in 2023.&lt;/p&gt;

&lt;p&gt;What I found when I actually focused: the memory profile of our ingress layer was absurd for what we were asking it to do.&lt;/p&gt;

&lt;p&gt;Each Traefik pod idling at ~180MB RSS. Under load? Comfortably 400MB+. That's not Traefik being badly written — it isn't. It's Go's garbage collector doing what it's designed to do. The GC optimizes for latency, not memory. It keeps things around, waits for a good time to clean up, and "a good time" under constant HTTP load basically never comes.&lt;/p&gt;

&lt;p&gt;We had 3 pods × 400MB × 2 &lt;code&gt;t3.large&lt;/code&gt; nodes (because they needed the headroom) running 24/7.&lt;/p&gt;

&lt;p&gt;Do the math on AWS pricing. Then cry.&lt;/p&gt;

&lt;p&gt;Then I found the Pingora post. Read the whole thing this time. Pulled the benchmark numbers. Understood what was actually happening at the memory level in Rust vs Go.&lt;/p&gt;

&lt;p&gt;Something clicked.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Rust Hits Different Here
&lt;/h2&gt;

&lt;p&gt;Nobody says this clearly enough so I will:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For most application code, Go's GC is fine. Genuinely fine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing a web API? Go. Building a CLI tool? Go. Microservices with moderate traffic? Go, easily.&lt;/p&gt;

&lt;p&gt;But a &lt;em&gt;proxy&lt;/em&gt; is a different beast. A proxy's entire job is to sit between two things and move bytes from one to the other, as fast as possible, thousands of times per second. Every request means allocations — headers, buffers, connection state. Every one of those allocations eventually needs to be freed.&lt;/p&gt;

&lt;p&gt;In Go, "eventually" is doing a lot of work in that sentence.&lt;/p&gt;

&lt;p&gt;In Rust, memory is freed the moment it goes out of scope. Not by a background process. Not on a schedule. &lt;em&gt;Structurally,&lt;/em&gt; at the language level. The compiler guarantees it.&lt;/p&gt;

&lt;p&gt;For a proxy, that's not a nice-to-have. It's the difference between flat memory usage and a profile that climbs under load and triggers GC pauses at exactly the wrong moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/linkerd/linkerd2-proxy" rel="noopener noreferrer"&gt;linkerd2-proxy&lt;/a&gt; — the data plane for the Linkerd service mesh — is written in Rust for exactly this reason. It's running in production service meshes at serious scale. &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;Tokio&lt;/a&gt; — Rust's async runtime — is mature enough that they're running their own conference in 2026. The ecosystem isn't a science experiment 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%2Fdkheqe76n08wzzg2f60y.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%2Fdkheqe76n08wzzg2f60y.png" alt="Optimized architecture using Envoy and Rust routing services for improved efficiency." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Migration (It Was Not Smooth, I Won't Lie)
&lt;/h2&gt;

&lt;p&gt;We didn't rewrite Traefik. We're not a systems programming shop.&lt;/p&gt;

&lt;p&gt;We moved to &lt;strong&gt;&lt;a href="https://www.envoyproxy.io/" rel="noopener noreferrer"&gt;Envoy&lt;/a&gt;&lt;/strong&gt; as the core proxy (C++, but with a very different memory model than Go's runtime, and a mature extensibility story) plus a small Rust service handling our custom routing logic that Traefik was previously doing in middleware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week one:&lt;/strong&gt; three outages.&lt;/p&gt;

&lt;p&gt;Not because Rust is hard (our Rust service was fine). Because Envoy's config model is completely different from Traefik's and we were copying assumptions over like fools. Traefik does a lot of magic via annotations. Envoy does nothing by magic. Everything explicit. Everything verbose. First time you see an Envoy config file you think someone is hazing you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week two:&lt;/strong&gt; stable. Genuinely stable. We kept waiting for something to explode. Nothing did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week three:&lt;/strong&gt; I pulled up the memory dashboards.&lt;/p&gt;

&lt;p&gt;I called my co-engineer over. We both stared at it for a moment.&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%2F4y1jjns5v8dc41qvvkpf.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%2F4y1jjns5v8dc41qvvkpf.png" alt="Performance and cost comparison showing reduced resource usage after migration." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers (This Is The Part You Came For)
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;3x Traefik pods&lt;/li&gt;
&lt;li&gt;~380MB average RSS each&lt;/li&gt;
&lt;li&gt;CPU spikes during GC under high traffic&lt;/li&gt;
&lt;li&gt;2x &lt;code&gt;t3.large&lt;/code&gt; nodes just for ingress (2 vCPU, 8GB each)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;2x Envoy pods + Rust routing layer&lt;/li&gt;
&lt;li&gt;~40MB average RSS each&lt;/li&gt;
&lt;li&gt;CPU: completely flat. No spikes. No GC sweeps. Nothing.&lt;/li&gt;
&lt;li&gt;1x &lt;code&gt;t3.small&lt;/code&gt; node handles it without breaking a sweat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Node costs alone: from ~$340/month to ~$30/month.&lt;/p&gt;

&lt;p&gt;Factor in traffic processing, data transfer handling, reduced overhead across the board — the full picture came out to roughly &lt;strong&gt;10x cheaper.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not 10% cheaper. Not 2x. Ten times.&lt;/p&gt;

&lt;p&gt;The title isn't clickbait. I was as shocked as you are right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should You Actually Do This?
&lt;/h2&gt;

&lt;p&gt;Real answer: &lt;strong&gt;probably not yet, unless you're bleeding money.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Operational complexity is a real cost. This migration took two engineers about three weeks including the debugging nights and the config archaeology. If Traefik is working for you and your AWS bill isn't making you spiral, leave it alone. Boring infrastructure is good infrastructure.&lt;/p&gt;

&lt;p&gt;But if your ingress layer has its own line item on your cost explorer — and you feel a specific kind of shame looking at it — the tooling exists, it's production-proven, and the math is not subtle.&lt;/p&gt;

&lt;p&gt;The Rust networking ecosystem in 2026 is not the Rust networking ecosystem of 2018. Cloudflare has replaced their entire request-handling stack with Rust. Pingora is open-source and now at v0.7.0 — it's evolved from "proxy" into what people are calling programmable network infrastructure. linkerd2-proxy has been running in production service meshes for years. Tokio is the undisputed async runtime of the ecosystem. The scary part is mostly gone. What's left is just learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Actual Lesson (And It's Not About Languages)
&lt;/h2&gt;

&lt;p&gt;Go didn't lose. This wasn't a rivalry with a winner.&lt;/p&gt;

&lt;p&gt;Go won the cloud infrastructure era because it was exactly right for that moment — concurrency primitives, fast compilation, readable code, a great standard library. Kubernetes exists because of Go. The cloud-native ecosystem exists because of Go.&lt;/p&gt;

&lt;p&gt;But Rust is winning the &lt;em&gt;next&lt;/em&gt; layer — the performance-critical substrate that the rest of the infrastructure runs on. Proxies. Kernels. Network dataplanes. Places where a GC isn't a tradeoff you can afford because memory is money and latency is user experience.&lt;/p&gt;

&lt;p&gt;Both can be true. A hammer is the right tool for nails. A scalpel is the right tool for surgery. Neither replaces the other.&lt;/p&gt;

&lt;p&gt;That $4,200 bill became $390.&lt;/p&gt;

&lt;p&gt;The CFO asked me what changed.&lt;/p&gt;

&lt;p&gt;I said I learned a new programming language.&lt;/p&gt;

&lt;p&gt;He nodded like he understood and immediately changed the subject.&lt;/p&gt;

&lt;p&gt;That's fine. The bill was paid. The graphs were flat. The nodes were small.&lt;/p&gt;

&lt;p&gt;Sometimes the best infrastructure is the one nobody notices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Find Me Across the Web
&lt;/h2&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;All links:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Beacons&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>go</category>
      <category>rust</category>
      <category>docker</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Gemma 4 vs Claude vs Llama: Which Model Wins for Devs</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sun, 17 May 2026 16:27:41 +0000</pubDate>
      <link>https://dev.to/syedahmershah/gemma-4-vs-claude-vs-llama-which-model-wins-for-devs-4p9</link>
      <guid>https://dev.to/syedahmershah/gemma-4-vs-claude-vs-llama-which-model-wins-for-devs-4p9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Write About Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Okay, let me be honest with you for a second.&lt;/p&gt;

&lt;p&gt;I'm tired of AI comparison posts that read like a press release had a baby with a spreadsheet. You know the ones. Big table. Green checkmarks. "Model X wins for enterprise use cases." Thanks, very useful, completely useless.&lt;/p&gt;

&lt;p&gt;So let me try something different. Let me tell you what I actually found after spending time digging into Gemma 4, Claude, and Llama 4 in 2026 — what surprised me, what annoyed me, and where each one genuinely earns your trust or loses it.&lt;/p&gt;

&lt;p&gt;Because the honest answer is: &lt;strong&gt;it depends&lt;/strong&gt;, but not in the way you think.&lt;/p&gt;




&lt;h2&gt;
  
  
  First — What Even Is Gemma 4?
&lt;/h2&gt;

&lt;p&gt;If you haven't been paying attention, Google DeepMind dropped Gemma 4 on &lt;strong&gt;April 2, 2026&lt;/strong&gt; and it quietly started breaking things.&lt;/p&gt;

&lt;p&gt;Not in a bad way. In the "wait, this runs on &lt;em&gt;what&lt;/em&gt;?" way.&lt;/p&gt;

&lt;p&gt;Gemma 4 isn't a single model. It's a family:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E2B&lt;/strong&gt; (~2.3B effective params) — designed for phones and Raspberry Pi. Yes, literally your Pi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E4B&lt;/strong&gt; (~4.5B effective params) — the sweet spot. Runs on integrated graphics or any 8GB+ GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;26B A4B MoE&lt;/strong&gt; — 26 billion total params, but only 3.8 billion &lt;em&gt;active&lt;/em&gt; per inference thanks to Mixture-of-Experts routing. One A100 80GB can serve it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31B Dense&lt;/strong&gt; — the big gun. All params active, maximum quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it built on the same research foundations as Gemini 3. All of it released under &lt;strong&gt;Apache 2.0&lt;/strong&gt;. No MAU limits. No special permissions. No restrictive use clauses. Just: &lt;em&gt;here, use it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That last bit matters more than people are giving it credit for.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers Nobody's Contextualizing
&lt;/h2&gt;

&lt;p&gt;Let me throw some benchmarks at you, but I'm actually going to explain what they mean:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 31B on AIME 2026 (math):&lt;/strong&gt; 89.2%&lt;br&gt;&lt;br&gt;
For context, Gemma 3 27B scored 20.8% on the same test. That's a +330% jump. Not incremental. Not a rounding error. Something fundamentally changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LiveCodeBench v6:&lt;/strong&gt; 80%&lt;br&gt;&lt;br&gt;
Gemma 3 was at 29.1%. So you're looking at 175% improvement in coding benchmarks in one generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codeforces ELO:&lt;/strong&gt; 2,150&lt;br&gt;&lt;br&gt;
That's expert competitive programmer territory. Running locally. On your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic Tool Use (τ2-bench Retail):&lt;/strong&gt; went from 6.6% to 86.4%&lt;br&gt;&lt;br&gt;
That's +1200%. The model went from basically failing at multi-step tool use to crushing it. This is the benchmark I'd bet money on being the most meaningful one for 2026 workflows.&lt;/p&gt;

&lt;p&gt;The 31B Dense model currently sits at &lt;strong&gt;#3 on the Arena AI text leaderboard&lt;/strong&gt; among all open models — outcompeting models with 20x more parameters.&lt;/p&gt;

&lt;p&gt;And look — I know benchmarks lie sometimes. I know labs cherry-pick. But when &lt;em&gt;every&lt;/em&gt; benchmark jumps by 100-300% simultaneously, that's not cherry-picking. Something real happened here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude: The One You Pay For (And Why You Still Might)
&lt;/h2&gt;

&lt;p&gt;Let me be clear: I respect what Anthropic has built. Claude is genuinely different from most models in ways that are hard to benchmark.&lt;/p&gt;

&lt;p&gt;As of early 2026, the main Claude options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sonnet 4.6&lt;/strong&gt; — $3/$15 per million tokens. 79.6% on SWE-bench Verified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opus 4.6&lt;/strong&gt; — $5/$25 per million tokens. 80.8% on SWE-bench Verified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opus 4.7&lt;/strong&gt; — $5/$25 per million tokens. 87.6% on SWE-bench Verified. Released April 16, 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap between Sonnet 4.6 and Opus 4.6 is 1.2 percentage points on the benchmark that matters most for developers. That's it. One point. At 40% lower cost and 17% faster output. Most production teams route 80% of work to Sonnet and reserve Opus for the genuinely hard stuff.&lt;/p&gt;

&lt;p&gt;Cursor's co-founder called Sonnet 4.6 "a notable improvement over Sonnet 4.5 across the board, including long-horizon tasks." GitHub reported strong performance on complex code fixes. Cognition said it "meaningfully closed the gap with Opus on bug detection."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what's the catch?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude has no weights. Full stop.&lt;/p&gt;

&lt;p&gt;You cannot run Claude locally. You cannot fine-tune it on your data. You cannot deploy it on your own infrastructure. There's no local option, no open version, nothing. It's a pure API play.&lt;/p&gt;

&lt;p&gt;Constitutional AI baked into the architecture means you will occasionally hit refusals that feel arbitrary — requests the model &lt;em&gt;could&lt;/em&gt; handle but won't. The reason-based constitution introduced in January 2026 made these responses more nuanced, but you'll still encounter them if you push edge cases.&lt;/p&gt;

&lt;p&gt;The 200K context window is solid. The 1M beta (via header) is there for Opus if you need it. But if your use case requires data sovereignty, EU compliance, or offline deployment? Claude is a non-starter. Full stop. No negotiation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Llama 4: The "Free" Option That Has Fine Print
&lt;/h2&gt;

&lt;p&gt;Meta dropped Llama 4 in early 2026 and the internet exploded. Two models released:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scout&lt;/strong&gt; — 17B active params (16 experts), &lt;strong&gt;10M context window&lt;/strong&gt;. Fits on a single H100.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maverick&lt;/strong&gt; — 17B active params (128 experts). 400B total params. The flagship.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 10 million token context window on Scout is genuinely staggering. Nothing else touches it. If you need to feed an entire codebase, years of logs, or a library of documents into a single context — Scout is the only realistic option today.&lt;/p&gt;

&lt;p&gt;Maverick is positioned as a generalist, and for everyday writing, analysis, and conversation? It's good enough that the quality gap versus paid models often doesn't justify the cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's what doesn't get talked about:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benchmark gaming incident.&lt;/strong&gt; In April 2025, Meta submitted a variant called "Llama-4-Maverick-03-26-Experimental" to LMArena. It topped the leaderboard. The public release performs noticeably worse. LMSYS later acknowledged the variant wasn't labeled clearly. Meta's VP denied training on test sets. The AI community read it as benchmark gaming regardless. Until that trust is rebuilt, take any single LMArena number for Llama 4 with healthy skepticism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The license isn't what you think.&lt;/strong&gt; It looks open. It isn't OSI-certified open source. There's a 700M MAU clause — if your service exceeds 700 million monthly active users, you need a separate Meta license. For most devs that's irrelevant. But it also means you can't legally call it Apache or MIT. Attribution requirements exist on derivatives. Enterprise legal teams in regulated industries will flag this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EU multimodal restriction.&lt;/strong&gt; Vision is unavailable for EU-domiciled licensees. Hard block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware reality.&lt;/strong&gt; Llama 4 Scout needs 24GB VRAM minimum even quantized. Gemma 4 E4B runs on 6-8GB. If you're on a laptop or consumer GPU, this comparison basically ends here.&lt;/p&gt;

&lt;p&gt;Llama 4 on coding specifically? It's competitive but not dominant. If your primary workload is code generation or agentic refactoring, it's not the strongest open-weight choice in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comparison Nobody Actually Makes
&lt;/h2&gt;

&lt;p&gt;Let me put this plainly, because most posts won't:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real trade-off isn't quality. It's the question of: *who controls the model?&lt;/strong&gt;*&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What You Need&lt;/th&gt;
&lt;th&gt;Best Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Highest raw reasoning quality&lt;/td&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best local deployment, low VRAM&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 E4B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding on a budget&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4 31B&lt;/strong&gt; locally, or Claude Sonnet 4.6 via API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10M+ token context&lt;/td&gt;
&lt;td&gt;Llama 4 Scout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full data sovereignty&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4&lt;/strong&gt; (Apache 2.0, no restrictions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial use, no legal headaches&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4&lt;/strong&gt; (Apache 2.0 beats Llama's custom license)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy-first, runs on a phone&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 E2B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic workflows, tool use&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4 31B&lt;/strong&gt; (86.4% on τ2-bench) or Claude Sonnet 4.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You're in the EU with vision needs&lt;/td&gt;
&lt;td&gt;Not Llama 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need fine-tuning freedom&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4&lt;/strong&gt; or Llama 4 (not Claude)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where Gemma 4 Actually Wins the Argument
&lt;/h2&gt;

&lt;p&gt;The thing that keeps pulling me back to Gemma 4 isn't the benchmark numbers. It's the &lt;em&gt;combination&lt;/em&gt; of things nobody else is offering together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge-to-server coverage under one license.&lt;/strong&gt; E2B runs on a Raspberry Pi at ~48 tokens per second on a ROG Phone 9 Pro. The 31B Dense runs on a workstation. The 26B MoE runs on a single A100. One model family. One license. One mental model for your entire stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Apache 2.0 shift is a big deal.&lt;/strong&gt; Earlier Gemma releases had custom licenses that enterprise legal teams routinely flagged as ambiguous. Apache 2.0 means: modify it, fine-tune it, deploy it commercially, redistribute derivatives — no royalties, no MAU limits, no acceptable use policy headaches. In 2026, as companies build always-on AI agents that process customer data continuously, the licensing terms of the underlying model are a &lt;em&gt;strategic&lt;/em&gt; decision. Gemma 4 made that decision easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multimodal natively, not bolted on.&lt;/strong&gt; Text, image, video, audio — not as separate pipeline steps, but as native capabilities built from the Gemini 3 foundation. The smaller models (E2B, E4B) support video and audio. The larger models handle all modalities. This matters for real applications, not benchmark demos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reasoning jump is real.&lt;/strong&gt; When Gemma 4 "thinks," it can produce 4,000+ tokens of reasoning before committing to an answer. The Codeforces ELO of 2,150 puts it at expert programmer level — locally, on your GPU, free.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Verdict
&lt;/h2&gt;

&lt;p&gt;If I had to give you one paragraph:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Claude when you need the absolute ceiling on reasoning and you're okay with API costs, black-box architecture, and no local option.&lt;/strong&gt; Sonnet 4.6 is the value play; Opus 4.7 is for the problems that genuinely require the best thing available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Llama 4 Scout when you need the 10M token context window and you have the hardware for it.&lt;/strong&gt; For everything else, its coding performance lags and the licensing is messier than it looks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Gemma 4 when you want the freedom to actually own your AI stack.&lt;/strong&gt; Run it on a phone for edge apps, a consumer GPU for development, a workstation for production — all with the same model family, the same license, the same mental model. The performance is now genuinely competitive at frontier level. The agentic tool use numbers in 2026 suggest it's not just catching up; in specific areas, it's already leading.&lt;/p&gt;

&lt;p&gt;The era of "open source AI is just good enough to tinker with" is over.&lt;/p&gt;

&lt;p&gt;Gemma 4 31B sitting at #3 on Arena AI, outscoring models with 20x the parameter count, running on hardware you already own, under a license that puts zero friction between you and shipping — that's not a compromise. That's just the better option for most use cases.&lt;/p&gt;




&lt;p&gt;The question isn't "which model is best" anymore.&lt;/p&gt;

&lt;p&gt;The question is: &lt;strong&gt;which model fits the kind of developer you want to be?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your answer involves ownership, privacy, cost control, and the freedom to deploy wherever you want — the answer in 2026 is becoming increasingly obvious.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;References:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aurigait.com/blog/gemma-4-features-benchmarks-guide/" rel="noopener noreferrer"&gt;Gemma 4 Complete Guide 2026 — AurigaIT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@moksh.9/" rel="noopener noreferrer"&gt;Gemma 4 Benchmarks: The Numbers That Actually Matter — Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codersera.com/blog/gemma-4-vs-llama-4-local-deployment-2026/" rel="noopener noreferrer"&gt;Gemma 4 vs Llama 4: Local Deployment 2026 — CoderSera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.the-ai-corner.com/p/claude-opus-4-7-guide-benchmarks-2026" rel="noopener noreferrer"&gt;Claude Opus 4.7 Benchmarks — The AI Corner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claudefa.st/blog/models/claude-sonnet-4-6" rel="noopener noreferrer"&gt;Claude Sonnet 4.6 Specs — ClaudeFast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codersera.com/blog/llama-4-complete-guide-2026/" rel="noopener noreferrer"&gt;Llama 4 Complete Developer Guide 2026 — CoderSera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.meta.com/blog/llama-4-multimodal-intelligence/" rel="noopener noreferrer"&gt;Meta Llama 4 Official Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech-insider.org/google-gemma-4-open-model-benchmarks-2026/" rel="noopener noreferrer"&gt;Gemma 4: How a 31B Model Beats 400B Rivals — Tech Insider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  You can find me across the web here:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Read more on 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;Join the discussion on 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;Deep dives on 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;Check my code on 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;Connect professionally on 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;All my links in one place on Beacons:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Visit my Portfolio Website:&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>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>I Gave Hermes Agent 5 Impossible Tasks</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sat, 16 May 2026 08:34:50 +0000</pubDate>
      <link>https://dev.to/syedahmershah/i-gave-hermes-agent-5-impossible-tasks-1k16</link>
      <guid>https://dev.to/syedahmershah/i-gave-hermes-agent-5-impossible-tasks-1k16</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Let me be honest with you before we start.&lt;/p&gt;

&lt;p&gt;I went into this expecting to write a clean "look how cool this AI is" post. You know the type. Polished. Slightly breathless. Ends with "the future is here."&lt;/p&gt;

&lt;p&gt;That is not what happened.&lt;/p&gt;

&lt;p&gt;What happened was messier, more interesting, and honestly kind of unsettling. So let me just walk you through it.&lt;/p&gt;




&lt;h2&gt;
  
  
  First — What Even Is Hermes Agent?
&lt;/h2&gt;

&lt;p&gt;Because when I first heard the name I thought it was another LangChain wrapper with a good logo. It's not.&lt;/p&gt;

&lt;p&gt;Hermes Agent is an open-source autonomous AI agent framework built by Nous Research, released in February 2026 under the MIT license. In roughly three months it crossed 100,000+ GitHub stars (&lt;a href="https://github.com/NousResearch/hermes-agent.git" rel="noopener noreferrer"&gt;Repository&lt;/a&gt;) — one of the fastest-growing open-source AI projects ever. That number alone made me pay attention.&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%2Frue7wipe949exfokd7yv.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%2Frue7wipe949exfokd7yv.PNG" alt="Hermes Agent GitHub Repository" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But here's what actually makes it different from everything else out there right now.&lt;/p&gt;

&lt;p&gt;Most AI tools you use today are stateless. You open a chat, you ask something, you close it. Tomorrow you come back and it remembers nothing. It's Groundhog Day but for your productivity.&lt;/p&gt;

&lt;p&gt;Hermes doesn't work like that.&lt;/p&gt;

&lt;p&gt;Hermes lives on your server — a $5 VPS, your laptop, a serverless backend, whatever you have. It runs persistently. It builds a three-layer memory system as it works: short-term conversation context, medium-term session summaries, long-term skill documents that capture &lt;em&gt;how&lt;/em&gt; it solved specific problems. It doesn't just complete tasks. It &lt;em&gt;learns&lt;/em&gt; from completing them.&lt;/p&gt;

&lt;p&gt;The core mechanism behind this is called GEPA — an ICLR 2026 Oral-accepted self-improvement loop. Every time the agent completes roughly 15 tasks, it reviews its own performance, identifies patterns, and writes new Skill Documents. Agents with 20+ self-generated skills complete similar future tasks 40% faster than fresh instances. That's not a marketing claim. That's a benchmarked number from TokenMix.ai independent testing.&lt;/p&gt;

&lt;p&gt;It supports 200+ LLMs through OpenRouter. It connects to Telegram, Discord, Slack, WhatsApp, Signal, and your terminal from a single gateway. And all your data — memories, skills, conversation history — lives in a local SQLite database on your own machine. No telemetry. No cloud lock-in.&lt;/p&gt;

&lt;p&gt;In other words: it's the first agent that actually &lt;em&gt;compounds&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now. Let's talk about what happened when I put it through five tasks designed to break it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 1: Aggregate Real-Time Data From Multiple Sources Simultaneously
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The task:&lt;/strong&gt; Pull today's top 5 tech news stories, summarize each one in under 50 words, rank them by relevance to full-stack developers, and format it as a clean daily briefing. Do it automatically every morning at 8am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's "impossible":&lt;/strong&gt; Multi-source aggregation + LLM summarization + relevance ranking + automated scheduling is at least 3 separate tools working in sync. Most agent setups fall apart coordinating even two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It worked. And that was the first moment I got that slightly uncomfortable feeling.&lt;/p&gt;

&lt;p&gt;The cron scheduling part especially. In Hermes, you set scheduled tasks in natural language — "every morning at 8am, pull tech news and brief me" — and it handles the cron job internally. No YAML. No crontab entries. You just describe what you want and it figures out the execution.&lt;/p&gt;

&lt;p&gt;The ranking was interesting. It didn't just sort by publish time. It actually weighted results based on the tools and frameworks mentioned — things like Next.js, Supabase, TypeScript, Rust were flagged as relevant. Things like enterprise SaaS funding rounds got deprioritized. I did not explicitly tell it to do this. It inferred developer relevance from the task context.&lt;/p&gt;

&lt;p&gt;Is that "intelligence"? I genuinely don't know. But it saved me from reading a funding article for a B2B CRM no one cares about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Passed.&lt;/strong&gt; The daily briefing has been running for a week now. It's genuinely useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 2: Automate a Multi-Step Development Workflow End-to-End
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The task:&lt;/strong&gt; Given a GitHub repository URL, do all of the following without me touching anything: read the README, identify what the project does, write a structured code review checklist based on the tech stack detected, and push a summary as a GitHub issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's "impossible":&lt;/strong&gt; This requires reading external files, code comprehension, structured output generation, and writing back to a third-party service. That's four distinct operations with failure points at each handoff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two out of four steps were clean. Reading the README and detecting the tech stack — solid. It correctly identified a Next.js + Supabase + Tailwind project just from the README and package.json reference.&lt;/p&gt;

&lt;p&gt;The code review checklist was decent but generic. It knew the stack but the checklist read like it was pulled from a "React best practices" article from 2023. Not wrong. Just not deep. There was nothing about Supabase RLS policies, nothing about edge function cold starts, nothing stack-specific that a senior dev would actually flag.&lt;/p&gt;

&lt;p&gt;The GitHub issue push worked when given the right token permissions. When I gave it an insufficient-scope token, it failed silently instead of telling me what scope it needed. That was annoying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Partially passed.&lt;/strong&gt; The automation scaffolding works. The depth of reasoning is shallow on complex domain knowledge. This is a real limitation and I'd rather be straight about it than pretend otherwise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 3: Make a Decision Under Complexity and Uncertainty
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The task:&lt;/strong&gt; I gave it a genuine decision I've been sitting on — choosing between two different backend architectures for a side project (Supabase-first serverless vs a dedicated Node/Express server + PostgreSQL). I gave it my constraints: solo developer, limited time, need for auth + realtime + storage, cost-sensitive, deployed on Vercel. I asked it to make a recommendation with reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's "impossible":&lt;/strong&gt; Real decisions have tradeoffs, missing information, and no clean right answer. I wanted to see if it would reason through ambiguity or just give me a confident-sounding nothing answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the one that genuinely surprised me.&lt;/p&gt;

&lt;p&gt;It didn't just recommend one option. It built a decision matrix. It listed factors I hadn't mentioned — like "as a solo developer, onboarding cognitive load matters; Supabase's managed auth reduces the number of systems you need to reason about under deadline pressure." It flagged that Node/Express gives more control but that control has a cost when you're the only one maintaining it at 2am.&lt;/p&gt;

&lt;p&gt;The recommendation it landed on was Supabase-first with a specific caveat: avoid complex business logic in Edge Functions because cold starts compound when you chain them. Keep the critical path simple.&lt;/p&gt;

&lt;p&gt;That caveat is correct. And I hadn't mentioned Edge Functions once.&lt;/p&gt;

&lt;p&gt;I'm still not sure what to make of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Passed.&lt;/strong&gt; This is the task I expected it to fail worst at. It didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 4: Self-Generate a New Skill From a Novel Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The task:&lt;/strong&gt; Ask it to do something it has never done before — specifically, analyze a CSV of student grade data, identify students at risk of failing (below certain thresholds across multiple subjects), and generate a personalized intervention note for each one. Then turn &lt;em&gt;that workflow&lt;/em&gt; into a reusable skill it can apply to future CSV uploads automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's "impossible":&lt;/strong&gt; Skill self-generation is the core claim of Hermes. I wanted to stress-test it against a workflow that doesn't exist in its default 118-skill library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CSV analysis worked fine. Basic pandas-style operations under the hood, nothing shocking there.&lt;/p&gt;

&lt;p&gt;The "personalized" intervention notes were... okay. They were structurally correct — each note addressed the specific subjects where the student was below threshold. But they were cold. "Student X is showing below-average performance in Mathematics and Science. Recommend additional support sessions." That's technically an intervention note. It's also the kind of note a tired administrator writes at the end of a long Friday. No teacher would actually send it.&lt;/p&gt;

&lt;p&gt;The skill generation part, though? That worked exactly as advertised. After completing the task, it wrote a Skill Document called something like "at-risk-student-csv-analyzer" and indexed it. When I uploaded a second, different CSV the next day and asked it to "do the analysis thing you did before," it retrieved the skill, adapted it to the new column structure, and ran the workflow without needing my re-explanation.&lt;/p&gt;

&lt;p&gt;That's the compounding effect in real action. And it's genuinely different from anything I've used before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Passed on infrastructure, mixed on quality.&lt;/strong&gt; The skill loop is real. The output depth depends on how much context you give upfront.&lt;/p&gt;




&lt;h2&gt;
  
  
  Task 5: Handle a Multi-Turn Workflow That Changes Midway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The task:&lt;/strong&gt; Start a content planning workflow. Halfway through — after it's already begun — change the brief completely. Go from "write a content calendar for a developer tools startup" to "actually, this is for a personal finance app, let me redo the audience." Watch whether it gracefully adapts or collapses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's "impossible":&lt;/strong&gt; Mid-stream context shifts break most AI tools. They either ignore the update and keep going, or reset completely and lose all prior progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It adapted. Mostly.&lt;/p&gt;

&lt;p&gt;When I interrupted and changed the target audience, it acknowledged the shift, flagged which parts of what it had already generated were still salvageable (basic calendar structure, posting cadence, format) and which parts needed regeneration (topic ideas, tone, example posts). It didn't start over from scratch. It didn't ignore me. It basically said, in its way: okay, here's what I'm keeping, here's what I'm rebuilding, confirm?&lt;/p&gt;

&lt;p&gt;That's a more sophisticated response than most human collaboration tools give you.&lt;/p&gt;

&lt;p&gt;The place it slipped: one of the regenerated topic ideas still referenced developer tools in the framing. Subtle. If I hadn't been watching for it I'd have missed it. But it's the kind of context bleed that shows the memory management isn't perfect yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Passed with caveats.&lt;/strong&gt; The recovery behavior is impressive. The context bleed is real and worth watching in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  So What's the Actual Verdict on Hermes Agent?
&lt;/h2&gt;

&lt;p&gt;Here's the honest summary.&lt;/p&gt;

&lt;p&gt;Hermes Agent is the most interesting open-source agent framework of 2026 — not because it's perfect, but because its &lt;em&gt;architecture&lt;/em&gt; is the right bet. The self-improving skill loop, the three-layer memory, the GEPA mechanism — these are the right answers to the right problems. Stateless AI is a ceiling. Compounding AI is a direction.&lt;/p&gt;

&lt;p&gt;The gaps are real though. Output quality is heavily context-dependent. The shallow-domain problem on complex workflows (the code review checklist, the cold intervention notes) is a real limitation. Silent failures on misconfiguration — like the GitHub token scope issue — need better error communication.&lt;/p&gt;

&lt;p&gt;But it's MIT licensed. It runs on a $5 VPS. Your data stays on your machine. And it's actively evolving at a release cadence that looks less like a hobby project and more like a well-funded lab that knows what it's building. v0.10.0 shipped 16 April 2026 with 118 skills and a closed learning loop. The pace is aggressive.&lt;/p&gt;

&lt;p&gt;The benchmark that stuck with me: agents with 20+ self-generated skills complete similar future research tasks 40% faster than fresh instances. That is compounding intelligence in measurable form. Not philosophy. Not a demo. A number.&lt;/p&gt;

&lt;p&gt;Is it ready for production? For solo developers and small teams building non-critical workflows — yes, today. For enterprise-grade production with audit requirements — not yet. But it's closer than anything else in the open-source space.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Question I Can't Stop Thinking About
&lt;/h2&gt;

&lt;p&gt;When the agent made that call about Supabase Edge Functions — something I never mentioned — was that reasoning, pattern matching, or just a lucky inference from my constraints?&lt;/p&gt;

&lt;p&gt;I've been turning that over for a few days and I don't have a clean answer.&lt;/p&gt;

&lt;p&gt;What I do know is this: the gap between "useful tool" and "autonomous collaborator" is narrowing faster than I expected. And Hermes is one of the clearest signals of that.&lt;/p&gt;




&lt;p&gt;What would you give Hermes Agent as a fifth impossible task? Genuinely curious what breaks it in your domain. Drop it in the comments.&lt;/p&gt;

&lt;p&gt;And if you've already been using it — what's the limitation that surprised you most? Because I suspect I've only scratched the surface of where this gets weird.&lt;/p&gt;




&lt;h2&gt;
  
  
  You can find me across the web here:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✍️ &lt;strong&gt;Read more on 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;Join the discussion on 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;Deep dives on 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;Check my code on 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;Connect professionally on 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;All my links in one place on Beacons:&lt;/strong&gt; &lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Visit my Portfolio Website:&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>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>git</category>
    </item>
    <item>
      <title>PHP vs Node.js &amp; Next.js vs Angular: What to Learn</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Thu, 14 May 2026 16:05:01 +0000</pubDate>
      <link>https://dev.to/syedahmershah/php-vs-nodejs-nextjs-vs-angular-what-to-learn-35gj</link>
      <guid>https://dev.to/syedahmershah/php-vs-nodejs-nextjs-vs-angular-what-to-learn-35gj</guid>
      <description>&lt;p&gt;You know the feeling. Three browser tabs open. Reddit thread from 2019. A YouTube video titled &lt;em&gt;"PHP is DEAD in 2026"&lt;/em&gt;. Another one titled &lt;em&gt;"Why PHP Will Never Die."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile — zero lines of code written.&lt;/p&gt;

&lt;p&gt;Here's the truth nobody puts in a headline: &lt;strong&gt;the framework debate is a distraction.&lt;/strong&gt; Let me save you the months I lost.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Short Version of a Long History
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt; was born from a guy tracking visitors on his homepage in 1994. Accidental. Messy. But it stuck — and today powers 43% of the web. WordPress. Laravel. WooCommerce. It's not glamorous. It &lt;em&gt;pays&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; arrived in 2009 with one bold idea: stop making threads wait. Handle I/O like a browser handles clicks — non-blocking. Suddenly JavaScript ran on servers. One language, everywhere. Developers loved it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; gave React a backbone. Server rendering, file-based routing, APIs — all in one box. Messy in v13, solid in v15. It's where the React world lives now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Angular&lt;/strong&gt; is the enterprise workhorse. Built by Google. Opinionated. Comes with everything. Banks and governments swear by it. Indie devs avoid it.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Should YOU Actually Learn?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Want freelance income fast?&lt;/strong&gt; → PHP + Laravel. The WordPress market alone is enormous, the learning curve is kind, and you'll be billing clients before most "modern stack" beginners finish their setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want a product company job?&lt;/strong&gt; → React + Next.js. Full stop. It dominates hiring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Love real-time apps?&lt;/strong&gt; → Node.js. Chat, sockets, streaming — this is its home turf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Targeting enterprise/corporate?&lt;/strong&gt; → Angular. The jobs pay well and last long.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Thing Nobody Tells You
&lt;/h3&gt;

&lt;p&gt;The technology matters far less than you think in year one.&lt;/p&gt;

&lt;p&gt;A developer who built &lt;em&gt;real things&lt;/em&gt; in PHP will learn Node in weeks. A developer who shipped with React will get Angular faster than any bootcamp teaches it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concepts transfer. Confusion is temporary. Paralysis is permanent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pick something. Build something ugly. Deploy it. Break it. Fix it.&lt;/p&gt;

&lt;p&gt;That's still how this works in 2026 — and probably always will be.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What stack did you start with? Tell me in the comments 👇&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect With the Author
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✍️ Medium&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 Dev.to&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Hashnode&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧭 Beacons&lt;/td&gt;
&lt;td&gt;&lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Portfolio&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>php</category>
      <category>node</category>
      <category>nextjs</category>
      <category>angular</category>
    </item>
    <item>
      <title>React is Overkill: Why Python + HTMX is Dominating in 2026</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Wed, 13 May 2026 09:28:52 +0000</pubDate>
      <link>https://dev.to/syedahmershah/react-is-overkill-why-python-htmx-is-dominating-in-2026-17ib</link>
      <guid>https://dev.to/syedahmershah/react-is-overkill-why-python-htmx-is-dominating-in-2026-17ib</guid>
      <description>&lt;p&gt;Last year I spent forty minutes setting up a React project for an internal admin dashboard. Just the boilerplate. Vite config, ESLint setup, Tailwind integration, React Router, TanStack Query because someone on Twitter said it was the right way to handle server state now. I hadn't written a single line of actual application logic yet and I already had twelve files open.&lt;/p&gt;

&lt;p&gt;The dashboard needed to list records from a database, let you filter them, and update a status field. Three things. That's it.&lt;/p&gt;

&lt;p&gt;I've been thinking about that moment a lot since then. Not because React was wrong exactly, but because the whole experience made me ask a question I probably should've asked earlier: what problem am I actually solving, and does my stack match that problem?&lt;/p&gt;




&lt;p&gt;HTMX has been around since 2020, technically. Carson Gross built it on older ideas — intercooler.js, hypermedia, REST as it was supposed to work. But it's only in the last eighteen months or so that it's started showing up seriously in production codebases beyond hobby projects and blog posts. The &lt;a href="https://github.com/bigskysoftware/htmx" rel="noopener noreferrer"&gt;HTMX GitHub repo&lt;/a&gt; crossed 40k stars. The &lt;a href="https://2024.stateofjs.com/" rel="noopener noreferrer"&gt;State of JS 2024 survey&lt;/a&gt; showed a weird but real pattern: developers were increasingly marking "would not use again" next to React while usage stayed high. People are still using it, but the love is clearly cooling at the edges.&lt;/p&gt;

&lt;p&gt;What HTMX actually does is conceptually simple enough to explain in one sentence: it lets HTML elements make HTTP requests and swap parts of the page based on the response. That's it. No virtual DOM, no component lifecycle, no client-side routing, no state management library to argue about. You write &lt;code&gt;hx-get="/search"&lt;/code&gt; on an input and &lt;code&gt;hx-trigger="keyup changed delay:300ms"&lt;/code&gt; and the results div updates. The HTML is the state. The server renders the HTML. You're done.&lt;/p&gt;

&lt;p&gt;For a lot of use cases — the boring ones, the productive ones — that's genuinely enough.&lt;/p&gt;




&lt;p&gt;Where Python comes in is almost too natural. Django and FastAPI are both excellent at rendering HTML fragments quickly. Django's template engine is underrated. FastAPI with Jinja2 is fast enough that you genuinely don't need to think about it for most traffic levels a small team will ever hit. You return an HTML fragment from your endpoint, HTMX drops it into the DOM, and the user sees something happen. No JSON serialization, no client-side deserialization, no React re-render cycle. The server does what servers are supposed to do: handle the data, decide what the UI should look like, send it down.&lt;/p&gt;

&lt;p&gt;Miguel Grinberg wrote a good piece about this pattern in &lt;a href="https://blog.miguelgrinberg.com/post/htmx-flask-templates-for-partial-rendering" rel="noopener noreferrer"&gt;his Flask-HTMX tutorials&lt;/a&gt; and the core insight is something almost boring: web applications were server-rendered for a decade and a half and it worked fine. The SPA era solved real problems — but it also introduced an enormous amount of accidental complexity for cases that didn't need it.&lt;/p&gt;




&lt;p&gt;I want to be fair here because the React discourse tends to go off the rails. React is not bad. React is very good at what it was built for. When you need rich client-side interactivity — collaborative editing, complex real-time interfaces, something like Figma or Notion — the component model, unidirectional data flow, and the client-side rendering approach make sense. The ecosystem is genuinely impressive. Next.js solved real deployment problems. React Server Components, once you get past the initial confusion about what they even are, are a real architectural idea worth understanding.&lt;/p&gt;

&lt;p&gt;But most applications aren't Figma. Most applications are CRUD with some filtering. Most internal tools are forms, tables, and dashboards. Most freelance projects are e-commerce sites and appointment booking systems. And for all of those, the React stack asks you to carry a lot of weight that delivers nothing to your end users.&lt;/p&gt;

&lt;p&gt;The JavaScript fatigue conversation has been happening for a long time — &lt;a href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f" rel="noopener noreferrer"&gt;this 2016 post by Jose Aguinaga&lt;/a&gt; was funny eight years ago because it was accurate. The irony is it's somehow still accurate in 2026, just with different library names. Bundlers changed. State management evolved from Redux to Zustand to Jotai to whatever came after that. Server components got added to React in a way that made half the existing tutorials wrong. The amount of meta-knowledge required to set up a React project correctly — not even write application logic, just set it up — is genuinely unreasonable for a lot of teams.&lt;/p&gt;




&lt;p&gt;Here's where I want to talk about something that doesn't get said enough in these discussions, which is the South Asian developer context specifically.&lt;/p&gt;

&lt;p&gt;A lot of the conversation about frontend frameworks happens in the frame of a US/European developer with fast internet, a high-spec machine, and a client who doesn't care about performance as long as it looks modern. That context shapes the defaults. When Vercel or Netlify blog posts talk about bundle sizes and Core Web Vitals, they're often writing for an audience where a 300kb JS bundle is a minor annoyance. In Pakistan — Karachi, Lahore, Hyderabad, smaller cities — that's not a minor annoyance. Users on mobile data in Tier-2 cities are waiting for your SPA to hydrate and it shows.&lt;/p&gt;

&lt;p&gt;Freelancers here mostly work on Upwork and Fiverr. A lot of the gigs are admin dashboards for small businesses, HR tools for local companies, basic inventory management systems. The budgets are not large. The timelines are tight. When a Pakistani developer can ship a fully functional admin panel with Django + HTMX in two or three days because there's no API layer to design, no client-side state to manage, no authentication token flow to wire up separately — that is a real, material productivity advantage.&lt;/p&gt;

&lt;p&gt;I've talked to a few people doing final year university projects at HITEC, COMSATS, and similar universities around Sindh and Punjab. The React stack honestly overwhelms students who are still figuring out async/await. Watching someone understand HTMX in an afternoon and ship something that works by evening — that's not a small thing. There's something to be said for a technology that removes barriers to entry without sacrificing capability.&lt;/p&gt;

&lt;p&gt;The local SaaS mindset here is also different. When someone in Karachi is building their first B2B software product, they're thinking about getting to paying customers fast, not about whether their architecture will scale to ten million users. Python with Django gives you ORM, admin panel, authentication, and a templating system in one package. Adding HTMX on top means you get reactive UI without the separate frontend deployment, the CORS configuration, the API versioning headache. For a solo founder or a two-person team, that simplicity is worth a lot.&lt;/p&gt;




&lt;p&gt;The cases where I'd genuinely choose Python + HTMX are becoming clearer to me over time.&lt;/p&gt;

&lt;p&gt;Internal tools are the obvious one. Any time a company needs a dashboard that only ten people use, building a full React SPA is an organizational tax, not a feature. The JavaScript bundle has to be maintained, the frontend dev has to know the API contract, someone has to manage the deployment pipeline. With server-rendered HTML and HTMX, it's just one application. One deploy. The developer who built the data model builds the UI. That's not unsophisticated, that's economical.&lt;/p&gt;

&lt;p&gt;Small startups at the idea validation stage. If you're not sure whether your product has legs yet, spending three months building a polished React frontend before you talk to users is a bet you probably shouldn't be making. Django + HTMX lets a Python developer ship something users can click through in days. That's not a forever architecture, but it doesn't need to be.&lt;/p&gt;

&lt;p&gt;Content-heavy sites with some interactivity. A blog that has a comment section, a search bar, a newsletter signup. HTMX handles those interactions cleanly. You're not pulling in a frontend framework for three interactive elements.&lt;/p&gt;

&lt;p&gt;Where it gets harder is when you actually need rich client-side state. An application where the UI is the product — design tools, real-time collaboration, complex data visualization with local filtering and sorting that needs to feel instant. React and its ecosystem are genuinely better there. That's not a grudging admission, it's just accurate.&lt;/p&gt;




&lt;p&gt;There's also the team dynamic angle that people underplay. A lot of teams have backend developers who know Python well and frontend skills that are functional but not deep. The React ecosystem requires either genuine frontend expertise or a willingness to do a lot of cargo-culting patterns from Stack Overflow. Server-side rendering with HTMX plays to Python developers' strengths and doesn't require a separate specialist. In markets where fullstack Python devs are easier to find and cheaper to hire than React developers, that matters organizationally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://adamchainz.gumroad.com/l/byddx" rel="noopener noreferrer"&gt;Adam Johnson's work on Django + HTMX patterns&lt;/a&gt; and the &lt;a href="https://htmx.org/essays/" rel="noopener noreferrer"&gt;HTMX documentation's own essays&lt;/a&gt; on hypermedia are worth reading if you want to understand the philosophy here rather than just the mechanics. The argument isn't "SPAs were a mistake." The argument is closer to: the web platform extended HTML to support interactivity through JavaScript, but maybe it should have extended HTML itself instead. HTMX is a bet on that idea. It's a small, focused library — around 14kb unminified — and it's deliberately unambitious in scope. It does one thing and expects HTML and HTTP to do the rest.&lt;/p&gt;




&lt;p&gt;I keep coming back to something that's hard to articulate but feels important. There's a certain developer experience that React optimizes for — the experience of a developer inside the component, thinking in terms of state and props and effects. It's a powerful mental model once you internalize it. But it's a mental model you have to fully commit to, and it pulls a lot of complexity in with it.&lt;/p&gt;

&lt;p&gt;HTMX optimizes for a different experience — the experience of building something where the server is in control and the browser is just displaying what the server says. That's a much older model. It maps onto how people actually think about data and business logic, which lives on the server. For a lot of developers, particularly those whose real expertise is in data, backend systems, and APIs, that model is more natural and requires less context-switching.&lt;/p&gt;

&lt;p&gt;Neither of these is objectively better. They're suited to different problems, different teams, and different moments in a product's life.&lt;/p&gt;

&lt;p&gt;What feels true in 2026, though, is that HTMX has earned its place in the conversation as a serious option for production work. It's not a protest against modern tooling. It's not nostalgia for PHP spaghetti. It's a genuine approach to building web interfaces that works well for a specific, large, and underserved category of application. The category that most of us are actually building most of the time.&lt;/p&gt;




&lt;p&gt;I rebuilt that admin dashboard eventually. Three days with FastAPI, Jinja2 templates, and HTMX. No build step. No node_modules folder the size of a small country. Every developer on the backend team could read and modify the templates without learning a new paradigm.&lt;/p&gt;

&lt;p&gt;It's still running. Nobody has asked me to rewrite it in React.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you want to dig into the actual mechanics, the&lt;/em&gt; &lt;a href="https://htmx.org/docs/" rel="noopener noreferrer"&gt;&lt;em&gt;HTMX documentation&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is genuinely well-written and surprisingly short. For the Python side,&lt;/em&gt; &lt;a href="https://github.com/fastapi/full-stack-fastapi-template" rel="noopener noreferrer"&gt;&lt;em&gt;full-stack-fastapi-template&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is a good starting point even if you swap out the React frontend for Jinja2. And&lt;/em&gt; &lt;a href="https://www.youtube.com/watch?v=LRrrxQXWdhI" rel="noopener noreferrer"&gt;&lt;em&gt;this talk by Carson Gross at DjangoCon 2022&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is the most coherent thirty minutes you'll spend understanding what HTMX is actually trying to do.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect With the Author
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✍️ Medium&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 Dev.to&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Hashnode&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧭 Beacons&lt;/td&gt;
&lt;td&gt;&lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Portfolio&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>python</category>
      <category>react</category>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>PHP vs Node.js (2026): I Benchmarked Both — Here's What Surprised Me</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Sun, 10 May 2026 11:37:58 +0000</pubDate>
      <link>https://dev.to/syedahmershah/php-vs-nodejs-2026-i-benchmarked-both-heres-what-surprised-me-2caj</link>
      <guid>https://dev.to/syedahmershah/php-vs-nodejs-2026-i-benchmarked-both-heres-what-surprised-me-2caj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;There is a conversation that has been going on in backend development circles for over a decade now, and it refuses to die. PHP or Node.js? Which one should you use? Which one is faster? Which one has a future?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent the last several weeks setting up identical environments, running real benchmarks, building small but representative applications in both, and reading through a significant amount of documentation, community data, and developer surveys. I went in with assumptions. Most of them were wrong.&lt;/p&gt;

&lt;p&gt;This is not a fan piece. I have no allegiance to either camp. This is what I actually found.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why These Two?&lt;/li&gt;
&lt;li&gt;The Origin Stories&lt;/li&gt;
&lt;li&gt;The State of Both in 2026&lt;/li&gt;
&lt;li&gt;Benchmark Setup&lt;/li&gt;
&lt;li&gt;Benchmark Results&lt;/li&gt;
&lt;li&gt;Code Comparison&lt;/li&gt;
&lt;li&gt;What Real Developers Say&lt;/li&gt;
&lt;li&gt;Pros and Cons&lt;/li&gt;
&lt;li&gt;Use Case Guide&lt;/li&gt;
&lt;li&gt;What the Numbers Actually Mean&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;li&gt;The Verdict&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why These Two?
&lt;/h2&gt;

&lt;p&gt;PHP and Node.js do not look like obvious competitors on paper. PHP is a language with its own runtime. Node.js is a JavaScript runtime. But in practice, both are used to build web backends, APIs, and server-rendered applications — which is why they end up in the same conversation constantly.&lt;/p&gt;

&lt;p&gt;They were built for different eras of the web, by different people, with different philosophies. Understanding that context changes how you read the benchmarks.&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%2F45mth7ujmz7lp2ac2hsw.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%2F45mth7ujmz7lp2ac2hsw.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Origin Stories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP — Built to Solve a Real Problem in 1994
&lt;/h3&gt;

&lt;p&gt;Rasmus Lerdorf did not set out to create a programming language. He wrote a set of Common Gateway Interface (CGI) binaries in C to track visits to his online resume. He called it "Personal Home Page Tools." That is the PHP in PHP.&lt;/p&gt;

&lt;p&gt;The language grew organically. It was extended, contributed to, and eventually became one of the most deployed server-side languages in the world — not because it won some technical competition, but because it was available, easy to learn, and did the job at a time when the web was exploding and developers needed something that worked.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Significance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP Tools (CGI)&lt;/td&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;Rasmus tracks his resume visits — PHP is born&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 3&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;Rewritten from scratch, public adoption begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 4&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;Zend Engine introduced, WordPress era begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 5&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;OOP support, PDO, major language maturation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 7&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;Near 2x speed over PHP 5, scalar type hints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;JIT compiler, named arguments, attributes, union types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Property hooks, asymmetric visibility, improved array unpacking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Its model was simple: a user makes a request, PHP executes a script, the script talks to a database, a response is sent back. New request, new execution. Stateless, predictable, widely understood.&lt;/p&gt;

&lt;p&gt;The criticism came later. Function naming was not standardized. Error handling varied. The global state model caused problems at scale. The reputation suffered.&lt;/p&gt;

&lt;p&gt;But PHP did not sit still. PHP 7 nearly doubled speed compared to PHP 5. PHP 8.0 introduced JIT compilation. PHP 8.3 and 8.4 continued tightening the language significantly. In 2026, PHP is a substantially different language from what most of its critics remember.&lt;/p&gt;




&lt;h3&gt;
  
  
  Node.js — Built to Fix What Ryan Dahl Thought Was Broken
&lt;/h3&gt;

&lt;p&gt;Ryan Dahl introduced Node.js at JSConf EU in 2009 with a presentation that started by criticizing the way Apache handled concurrent connections. His argument was direct: traditional servers spawn a new thread per connection, threads are expensive, and blocking I/O makes the problem worse.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Significance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 0.1&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;td&gt;Ryan Dahl introduces it at JSConf EU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm launched&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;Package ecosystem begins to grow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js Foundation&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;Corporate backing, io.js merged back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 6 LTS&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;ES6 support, production stability established&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 12&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;V8 7.4, async/await goes mainstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 18 LTS&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Native fetch API, built-in test runner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22 LTS&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Current active LTS, significant performance improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Node.js was built on Google's V8 engine and a non-blocking, event-driven I/O model. Instead of waiting for a database query to return before doing anything else, Node.js could register a callback and move on — handling thousands of concurrent connections on a single thread without the overhead of thread management.&lt;/p&gt;

&lt;p&gt;It landed at exactly the right moment. JavaScript was already everywhere on the front end. Developers could suddenly use the same language on both sides of the stack. The npm ecosystem exploded. Real-time applications — chat apps, live dashboards, collaborative tools — became dramatically easier to build.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Node.js was not trying to replace PHP. It was solving a different problem: high-concurrency, real-time, I/O-heavy workloads. The fact that it could also serve web pages and APIs just meant it ended up in the same comparison over and over again.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The State of Both in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP Today
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current version&lt;/td&gt;
&lt;td&gt;PHP 8.4 (stable), PHP 8.5 in active development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary framework&lt;/td&gt;
&lt;td&gt;Laravel 11 — mature, full-featured, excellent developer experience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime innovation&lt;/td&gt;
&lt;td&gt;FrankenPHP — high-performance server in Go, enables persistent worker mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other frameworks&lt;/td&gt;
&lt;td&gt;Symfony, Slim, CodeIgniter, Laminas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market share&lt;/td&gt;
&lt;td&gt;~18.2% of developers (Stack Overflow Developer Survey 2025)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web dominance&lt;/td&gt;
&lt;td&gt;WordPress alone powers 43%+ of all websites globally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Node.js Today
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current version&lt;/td&gt;
&lt;td&gt;Node.js 22.x LTS, Node.js 24 in active development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary frameworks&lt;/td&gt;
&lt;td&gt;Fastify, NestJS, Hono, Express.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime competition&lt;/td&gt;
&lt;td&gt;Bun and Deno have taken real market share, though Node.js remains dominant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package registry&lt;/td&gt;
&lt;td&gt;npm holds over 2.5 million packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language default&lt;/td&gt;
&lt;td&gt;TypeScript is now the default in most production Node.js codebases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporate backing&lt;/td&gt;
&lt;td&gt;Strong investment from Microsoft, Vercel, Netlify, and others&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benchmark Setup
&lt;/h2&gt;

&lt;p&gt;I ran all tests on the same machine with the same network conditions. Everything was containerized via Docker to eliminate environment differences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OS:       Ubuntu 22.04 LTS
CPU:      4 vCPUs
RAM:      8 GB
Storage:  SSD
Network:  Loopback (localhost)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Load Testing Tools
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Primary:    wrk -t4 -c400 -d30s
Secondary:  ab -n 10000 -c 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each test was run five times. The highest and lowest results were discarded. The three middle results were averaged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stacks Tested
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Web Layer&lt;/th&gt;
&lt;th&gt;Database Driver&lt;/th&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;Nginx&lt;/td&gt;
&lt;td&gt;PDO&lt;/td&gt;
&lt;td&gt;OPcache ON, realpath_cache_size=4096K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Node.js 22 LTS&lt;/td&gt;
&lt;td&gt;Fastify 4.x&lt;/td&gt;
&lt;td&gt;pg (node-postgres)&lt;/td&gt;
&lt;td&gt;Default V8 flags&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Test Scenarios
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;What It Measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Hello World&lt;/td&gt;
&lt;td&gt;Pure runtime and framework overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;JSON Serialization&lt;/td&gt;
&lt;td&gt;Encoding a 100-field object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Database Read&lt;/td&gt;
&lt;td&gt;SELECT 50 rows from PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Database Write&lt;/td&gt;
&lt;td&gt;INSERT + RETURNING new row ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;CPU-Intensive Task&lt;/td&gt;
&lt;td&gt;Fibonacci(35) computed synchronously per request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Test 1 — Hello World (Pure Throughput)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wrk &lt;span class="nt"&gt;-t4&lt;/span&gt; &lt;span class="nt"&gt;-c400&lt;/span&gt; &lt;span class="nt"&gt;-d30s&lt;/span&gt; http://localhost/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;Avg Latency&lt;/th&gt;
&lt;th&gt;P99 Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;12,400&lt;/td&gt;
&lt;td&gt;32ms&lt;/td&gt;
&lt;td&gt;89ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4 + FrankenPHP (worker)&lt;/td&gt;
&lt;td&gt;29,100&lt;/td&gt;
&lt;td&gt;13ms&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22 + Fastify&lt;/td&gt;
&lt;td&gt;38,200&lt;/td&gt;
&lt;td&gt;10ms&lt;/td&gt;
&lt;td&gt;31ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Node.js was significantly faster in its standard configuration. PHP-FPM spawns worker processes with initialization overhead per request. Node.js runs as a persistent process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually surprised me:&lt;/strong&gt; switching PHP to FrankenPHP worker mode — where the PHP process stays alive between requests — closed the gap considerably. Not equal, but not the landslide most articles suggest.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 2 — JSON Serialization
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;Avg Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;9,800&lt;/td&gt;
&lt;td&gt;40ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22&lt;/td&gt;
&lt;td&gt;31,500&lt;/td&gt;
&lt;td&gt;12ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Node.js wins. JavaScript's JSON handling is native to V8. PHP's &lt;code&gt;json_encode()&lt;/code&gt; is fast, but the per-request process startup adds up.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 3 — Database Read (50 rows, PostgreSQL)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;Avg Latency&lt;/th&gt;
&lt;th&gt;P99 Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;4,200&lt;/td&gt;
&lt;td&gt;95ms&lt;/td&gt;
&lt;td&gt;210ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22&lt;/td&gt;
&lt;td&gt;5,800&lt;/td&gt;
&lt;td&gt;68ms&lt;/td&gt;
&lt;td&gt;145ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Node.js is faster, but the gap narrows dramatically. The database is the bottleneck. Both stacks spend most of their time waiting on PostgreSQL, not executing application code. This test is far more representative of real web applications than the Hello World test.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 4 — Database Write (INSERT + RETURNING)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;Avg Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;3,100&lt;/td&gt;
&lt;td&gt;128ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22&lt;/td&gt;
&lt;td&gt;4,400&lt;/td&gt;
&lt;td&gt;90ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same pattern as Test 3. Node.js ahead, but both are constrained by I/O, not the language runtime.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 5 — CPU-Intensive Task (Fibonacci 35)
&lt;/h3&gt;

&lt;p&gt;This is the one that will change how you think about Node.js.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;Avg Latency&lt;/th&gt;
&lt;th&gt;P99 Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4-FPM&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;td&gt;1,120ms&lt;/td&gt;
&lt;td&gt;1,340ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;4,750ms&lt;/td&gt;
&lt;td&gt;9,200ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;PHP won — and it was not close.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This reveals the most important architectural truth about Node.js: it has a single-threaded event loop. When one request is doing heavy CPU work, every other request waits. PHP-FPM spawns multiple worker processes. A CPU-heavy request in one worker does not block any of the others.&lt;/p&gt;

&lt;p&gt;Node.js has worker threads to address this — but you have to deliberately opt into them. Out of the box, a CPU-bound task will destroy your latency across the board.&lt;/p&gt;




&lt;h3&gt;
  
  
  Summary — All Tests
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;PHP 8.4 (req/s)&lt;/th&gt;
&lt;th&gt;Node.js 22 (req/s)&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hello World (FPM)&lt;/td&gt;
&lt;td&gt;12,400&lt;/td&gt;
&lt;td&gt;38,200&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hello World (FrankenPHP)&lt;/td&gt;
&lt;td&gt;29,100&lt;/td&gt;
&lt;td&gt;38,200&lt;/td&gt;
&lt;td&gt;Node.js (narrower)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON Serialization&lt;/td&gt;
&lt;td&gt;9,800&lt;/td&gt;
&lt;td&gt;31,500&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB Read — 50 rows&lt;/td&gt;
&lt;td&gt;4,200&lt;/td&gt;
&lt;td&gt;5,800&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB Write — INSERT&lt;/td&gt;
&lt;td&gt;3,100&lt;/td&gt;
&lt;td&gt;4,400&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Task — Fibonacci(35)&lt;/td&gt;
&lt;td&gt;890&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Code Comparison
&lt;/h2&gt;

&lt;p&gt;The same feature implemented in both stacks, side by side.&lt;/p&gt;




&lt;h3&gt;
  
  
  REST API Endpoint with Database Query and Cache
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PHP 8.4 with Laravel&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Article&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/articles/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"article:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&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="nc"&gt;Article&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&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;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'data'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'cached'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"article:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Node.js with Fastify + TypeScript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FastifyInstance&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fastify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../cache&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&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;articleRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fastify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FastifyInstance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;fastify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/articles/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reply&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&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;cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`article:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&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;redis&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="nx"&gt;cacheKey&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;cached&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="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&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;cached&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;cached&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="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="nx"&gt;pool&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="s2"&gt;`SELECT a.*, u.name AS author_name
       FROM articles a
       JOIN users u ON a.author_id = u.id
       WHERE a.id = $1`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&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="o"&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;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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="nx"&gt;reply&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;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not found&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&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;stringify&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;rows&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&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;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;cached&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;The PHP version is more concise because Laravel's Eloquent ORM absorbs the boilerplate. The Node.js version is more explicit — you see exactly what queries run and what hits the cache. Both are valid depending on your team's preferences.&lt;/p&gt;




&lt;h3&gt;
  
  
  Handling Concurrent Async Operations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PHP 8.4 — Guzzle with concurrent pooled requests&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;GuzzleHttp\Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;GuzzleHttp\Pool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;GuzzleHttp\Psr7\Request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$client&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;Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://api.example.com/users'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://api.example.com/products'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://api.example.com/orders'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;$pool&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;Pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$requests&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'concurrency'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'fulfilled'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// handle each response&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$pool&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Node.js — native async/await with Promise.all&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orders&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&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;https://api.example.com/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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&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="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;https://api.example.com/products&lt;/span&gt;&lt;span class="dl"&gt;'&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;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&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="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;https://api.example.com/orders&lt;/span&gt;&lt;span class="dl"&gt;'&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;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&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="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gap matters in daily development. The Node.js version is two lines. PHP requires a library, a generator function, a pool constructor, and a promise wait call. Async is not bolted onto Node.js — it is the entire foundation of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Real Developers Say
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The vast majority of web applications are not performance-limited by their language runtime. They are limited by database queries, external API calls, and business logic complexity."&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Taylor Otwell&lt;/strong&gt;, creator of Laravel&lt;/p&gt;

&lt;p&gt;"I made some choices early in Node that I now regret. The module system, the callback model — these were harder than they needed to be."&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Ryan Dahl&lt;/strong&gt;, creator of Node.js, from his Deno introduction (2018)&lt;/p&gt;

&lt;p&gt;"Performance that developers cannot maintain or reason about is not actually useful performance."&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Evan You&lt;/strong&gt;, creator of Vite and Vue.js&lt;/p&gt;

&lt;p&gt;"Fastify's overhead is minimal. Most performance problems in Node.js applications come from userland code, not the framework."&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Matteo Collina&lt;/strong&gt;, Node.js core contributor, co-creator of Fastify&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that Ryan Dahl — the person who built Node.js — publicly acknowledged its architectural regrets. That kind of self-awareness from a creator should factor into how you evaluate the runtime's design decisions.&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%2Fdxx6jnyxddecnke31s7p.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%2Fdxx6jnyxddecnke31s7p.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Strengths
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;30 years of documentation&lt;/td&gt;
&lt;td&gt;Almost every problem has a Stack Overflow answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laravel framework&lt;/td&gt;
&lt;td&gt;Best-in-class DX: Eloquent, queues, broadcasting, Horizon — batteries included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universal shared hosting&lt;/td&gt;
&lt;td&gt;Deploy for a few dollars a month, no DevOps knowledge required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-request FPM isolation&lt;/td&gt;
&lt;td&gt;One crashed script does not bring down the entire server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong typing in PHP 8.x&lt;/td&gt;
&lt;td&gt;Union types, enums, readonly properties, property hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU workload handling&lt;/td&gt;
&lt;td&gt;Multi-worker FPM means CPU tasks in one process don't block concurrent requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low barrier to entry&lt;/td&gt;
&lt;td&gt;Junior developers can onboard and contribute quickly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Weaknesses
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weakness&lt;/th&gt;
&lt;th&gt;The Real Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FPM throughput ceiling&lt;/td&gt;
&lt;td&gt;Slower than persistent-process runtimes on pure I/O benchmarks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async is not native&lt;/td&gt;
&lt;td&gt;Requires Swoole, ReactPHP, or FrankenPHP worker mode — not first-class support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inconsistent standard library&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;array_map&lt;/code&gt;, &lt;code&gt;in_array&lt;/code&gt;, &lt;code&gt;array_filter&lt;/code&gt; — argument order varies, no fixing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perception problem&lt;/td&gt;
&lt;td&gt;The "PHP is bad" reputation still affects hiring and architectural buy-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time limitations&lt;/td&gt;
&lt;td&gt;WebSockets and SSE require extra infrastructure in the traditional FPM model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Strengths
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Non-blocking I/O&lt;/td&gt;
&lt;td&gt;Purpose-built for high-concurrency, I/O-heavy workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Massive npm ecosystem&lt;/td&gt;
&lt;td&gt;2.5 million+ packages — there is a library for almost anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time native&lt;/td&gt;
&lt;td&gt;WebSockets, SSE, live data pipelines — the event loop is ideal for these&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript default&lt;/td&gt;
&lt;td&gt;Large codebases are dramatically safer and easier to refactor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-stack JavaScript&lt;/td&gt;
&lt;td&gt;Share types, schemas, and utilities across frontend and backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastify and Hono&lt;/td&gt;
&lt;td&gt;Framework overhead is genuinely minimal at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong corporate investment&lt;/td&gt;
&lt;td&gt;Microsoft, Vercel, Netlify, and others fund core development actively&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Weaknesses
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weakness&lt;/th&gt;
&lt;th&gt;The Real Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single-threaded event loop&lt;/td&gt;
&lt;td&gt;CPU-bound tasks block all concurrent requests — this is an architectural constraint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex async error handling&lt;/td&gt;
&lt;td&gt;Stack traces in async code are harder to read and debug than synchronous PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm supply chain risk&lt;/td&gt;
&lt;td&gt;Left-pad (2016) was a warning. Supply chain attacks on npm have increased since&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooling overhead&lt;/td&gt;
&lt;td&gt;TypeScript + ESLint + testing + bundler = significant configuration surface area&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory leak risk&lt;/td&gt;
&lt;td&gt;Long-running processes accumulate leaks that FPM's per-request model avoids&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CommonJS vs ESM fragmentation&lt;/td&gt;
&lt;td&gt;Module system debt has left many codebases in a painful, ongoing migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Use Case Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use PHP When
&lt;/h3&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;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Content-driven websites and CMS&lt;/td&gt;
&lt;td&gt;WordPress, Drupal, Laravel — purpose-built with unmatched community support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS products where shipping speed matters&lt;/td&gt;
&lt;td&gt;Laravel gives you auth, queues, events, broadcasting scaffolding from day one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small teams or less experienced developers&lt;/td&gt;
&lt;td&gt;Simpler mental model, excellent onboarding docs, cheap shared hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU-intensive background jobs&lt;/td&gt;
&lt;td&gt;FPM multi-worker model handles mixed workloads without blocking concurrent requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget-constrained deployments&lt;/td&gt;
&lt;td&gt;Shared PHP hosting remains one of the cheapest compute options available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce applications&lt;/td&gt;
&lt;td&gt;Deep ecosystem (WooCommerce, Magento, Bagisto) — all PHP-native&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Use Node.js When
&lt;/h3&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;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time features&lt;/td&gt;
&lt;td&gt;WebSockets, live notifications, collaborative editing — event loop is ideal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API gateway or thin proxy layer&lt;/td&gt;
&lt;td&gt;Non-blocking I/O handles enormous concurrency with minimal resource usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microservices architecture&lt;/td&gt;
&lt;td&gt;Fast startup, low idle memory, scales horizontally with ease&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript/TypeScript-heavy teams&lt;/td&gt;
&lt;td&gt;Share code, types, and validation logic across the full stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer tools, CLIs, API clients&lt;/td&gt;
&lt;td&gt;The npm ecosystem for tooling is exceptional and well-maintained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-concurrency I/O without expensive infra&lt;/td&gt;
&lt;td&gt;Hundreds of thousands of WebSocket connections on a single long-running process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What the Numbers Actually Mean
&lt;/h2&gt;

&lt;p&gt;After running all the benchmarks, the honest summary is this:&lt;/p&gt;

&lt;p&gt;For most web applications — the kind that serve pages, handle form submissions, run database queries, and send emails — &lt;strong&gt;the performance difference between PHP and Node.js is not your bottleneck.&lt;/strong&gt; Your database is your bottleneck. Your external API calls are your bottleneck. The framework overhead is rounding error compared to a missing index on a frequently queried column.&lt;/p&gt;

&lt;p&gt;This is not a dismissal of performance. It is a prioritization of it.&lt;/p&gt;

&lt;p&gt;The benchmark where PHP was three times slower than Node.js (Hello World) will never matter in a real application, because no real application serves only a Hello World response. The benchmark where the gap narrowed to 30% (database read) is far more representative — and even then, a Redis cache collapses most of that gap entirely.&lt;/p&gt;

&lt;p&gt;The benchmark where PHP beat Node.js by 4x (CPU task) matters a great deal if your application does image processing, PDF generation, data transformation, or complex calculations in the request path. That result should directly inform your architecture decisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The right question is not which runtime is faster in a benchmark. It is which ecosystem will let your team ship correct, maintainable software faster — given the specific problem you are solving.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;Why Read It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4 Release Notes&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.php.net/releases/8.4/en.php" rel="noopener noreferrer"&gt;php.net/releases/8.4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Understand modern PHP before forming opinions on old knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FrankenPHP Documentation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://frankenphp.dev" rel="noopener noreferrer"&gt;frankenphp.dev&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Worker mode changes the PHP performance conversation entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastify Benchmarks&lt;/td&gt;
&lt;td&gt;&lt;a href="https://fastify.dev/benchmarks" rel="noopener noreferrer"&gt;fastify.dev/benchmarks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Reproducible, maintained Node.js framework benchmarks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js User Survey (OpenJS Foundation)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openjsf.org" rel="noopener noreferrer"&gt;openjsf.org&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Annual adoption and usage data from the foundation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack Overflow Developer Survey 2025&lt;/td&gt;
&lt;td&gt;&lt;a href="https://survey.stackoverflow.co/2025" rel="noopener noreferrer"&gt;survey.stackoverflow.co/2025&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Most widely cited annual developer technology survey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ryan Dahl — Introducing Node.js (2009)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=ztspvPYybIY" rel="noopener noreferrer"&gt;youtube.com/watch?v=ztspvPYybIY&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Watch to understand what problem it was actually solving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP: The Right Way&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phptherightway.com" rel="noopener noreferrer"&gt;phptherightway.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Counters a significant amount of outdated PHP advice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State of JavaScript 2024&lt;/td&gt;
&lt;td&gt;&lt;a href="https://stateofjs.com/en-US/2024" rel="noopener noreferrer"&gt;stateofjs.com/en-US/2024&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Annual JavaScript ecosystem adoption and satisfaction data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swoole Documentation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.swoole.com" rel="noopener noreferrer"&gt;swoole.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Async PHP without abandoning your existing framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matteo Collina — Node.js Performance&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/results?search_query=matteo+collina+fastify+performance" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Technical and rigorous, directly from a Node.js core contributor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;I went into this expecting Node.js to win convincingly on performance and PHP to win on ecosystem maturity for web applications. I was partially right on both.&lt;/p&gt;

&lt;p&gt;Node.js is faster in throughput benchmarks. That advantage is real and consistent. But it is smaller than conventional wisdom suggests, and it comes with a meaningful tradeoff on CPU-bound work. PHP with modern versions and FrankenPHP worker mode is no longer the slow runtime of 2012.&lt;/p&gt;

&lt;p&gt;What surprised me most was not a benchmark result. It was realizing how rarely the benchmark result is even the right question.&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;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time platform (chat, live data)&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content platform or CMS&lt;/td&gt;
&lt;td&gt;PHP with Laravel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS product, time-to-market priority&lt;/td&gt;
&lt;td&gt;PHP with Laravel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-throughput I/O microservice&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU-intensive processing in request path&lt;/td&gt;
&lt;td&gt;PHP — or reconsider the architecture entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer tooling or CLI&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget-constrained team&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both languages are alive. Both are actively developed. Both have communities worth being part of.&lt;/p&gt;

&lt;p&gt;The "PHP is dead" narrative was never accurate. The "Node.js solves everything" narrative was always a sales pitch.&lt;/p&gt;

&lt;p&gt;Use the right tool. Understand its actual tradeoffs. The verdict is not that one won — it is that the competition was never as simple as people made it sound.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All benchmarks were run on Ubuntu 22.04 LTS, 4 vCPU / 8 GB RAM, Docker containers with equivalent resource limits. PHP 8.4.1 with OPcache enabled and realpath_cache_size=4096K. Node.js 22.11.0 LTS with Fastify 4.x. PostgreSQL 16 on localhost. Five iterations per test — high and low discarded, middle three averaged.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect With the Author
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✍️ Medium&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 Dev.to&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/syedahmershah"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Hashnode&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hashnode.com/@syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;@ahmershahdev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧭 Beacons&lt;/td&gt;
&lt;td&gt;&lt;a href="https://beacons.ai/syedahmershah" rel="noopener noreferrer"&gt;Syed Ahmer Shah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Portfolio&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ahmershah.dev" rel="noopener noreferrer"&gt;ahmershah.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>node</category>
      <category>php</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Gemma 4: Why Local AI is Finally Becoming Personal</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Thu, 07 May 2026 09:46:59 +0000</pubDate>
      <link>https://dev.to/syedahmershah/gemma-4-why-local-ai-is-finally-becoming-personal-1ba5</link>
      <guid>https://dev.to/syedahmershah/gemma-4-why-local-ai-is-finally-becoming-personal-1ba5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the&lt;/em&gt; &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;&lt;em&gt;Gemma 4 Challenge: Write About Gemma 4&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The "Before" and "After"
&lt;/h3&gt;

&lt;p&gt;We’ve all been there. You want to integrate AI into a project—maybe a mini e-commerce site like my Zovita project or a custom SaaS—but you’re stuck. You’re either selling your soul to expensive API tokens or dealing with "local" models that are so slow they make a dial-up connection look like fiber optics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Gemma 4:&lt;/strong&gt; Local AI was a toy. You’d run a 7B model, wait thirty seconds for a "Hello World," and watch your laptop turn into a space heater.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After Gemma 4:&lt;/strong&gt; We’re looking at native multimodal capabilities and a 128K context window that actually fits on consumer hardware. This isn't just a minor update; it’s a shift in power.&lt;/p&gt;




&lt;h3&gt;
  
  
  Three Flavors, One Goal
&lt;/h3&gt;

&lt;p&gt;Google didn't just drop one model and walk away. They gave us a toolkit. If you’re building, you need to know which hammer to grab.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Edge Fighters (2B &amp;amp; 4B):&lt;/strong&gt; These are built for the stuff in your pocket. If you’re a mobile dev or working with low-power edge devices (hello, Raspberry Pi 5), this is your lane. It’s small enough to be fast but smart enough to handle basic logic without calling home to a server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Powerhouse (31B Dense):&lt;/strong&gt; This is the bridge. It’s for when you have a decent GPU and need "server-grade" intelligence without the server-grade bill. It handles complex reasoning where the smaller models start to hallucinate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Speed Demon (26B MoE):&lt;/strong&gt; Mixture-of-Experts. It’s highly efficient. If you need high-throughput—meaning you’re processing a lot of data quickly—this architecture is designed to give you advanced reasoning without the heavy compute cost of a fully dense model.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The 128K Context Window: Why You Should Care
&lt;/h3&gt;

&lt;p&gt;If you’re a developer, the context window is your "working memory." Most local models used to give you a couple of thousand tokens. Gemma 4 gives you &lt;strong&gt;128,000&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What does that look like in the real world? It means I can feed it an entire folder of PHP controllers, my CSS files, and my database schema, and ask: &lt;em&gt;"Where is the logic breaking in my checkout flow?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It doesn't just see the snippet; it sees the system.&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;// Example: Using Gemma 4 via a local endpoint to audit a project&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;analyzeCodebase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;files&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Review these files for security flaws: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;files&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="c1"&gt;// Gemma 4 handles the 128k context here easily&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="nx"&gt;gemmaLocal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemma-4-31b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;context_window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;128000&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&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;analysis&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;h3&gt;
  
  
  How We Actually Use This
&lt;/h3&gt;

&lt;p&gt;We don't build just for the sake of building. We build to solve problems.&lt;/p&gt;

&lt;p&gt;In Pakistan, internet stability isn't always a guarantee. Relying on the cloud for every AI-powered feature in a web app is a gamble. Gemma 4 changes the "How" by letting us host the "Brain" of our apps locally or on private, low-cost VPS setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Roadmap for You:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Download a model from Hugging Face or Kaggle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Use a tool like Ollama or LM Studio to get an API endpoint running in 5 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Connect it to your Laravel or MERN stack just like you would with OpenAI—except it’s free, private, and yours.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "Why"
&lt;/h3&gt;

&lt;p&gt;Why does this matter? Because AI should be a tool, not a gatekeeper.&lt;/p&gt;

&lt;p&gt;Whether you’re a student trying to master systems or a dev building the next big startup, Gemma 4 is about &lt;strong&gt;sovereignty&lt;/strong&gt;. It’s about having the most capable open models in history sitting on your hard drive, ready to work whenever you are. No tokens, no "usage limits," just pure development.&lt;/p&gt;

&lt;p&gt;Let’s stop overthinking and start building something real.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're curious about the technical fine-tuning, check out Google's&lt;/em&gt; &lt;a href="https://www.google.com/search?q=https://cloud.google.com/blog/products/ai-machine-learning/fine-tuning-gemma-on-cloud-run" rel="noopener noreferrer"&gt;&lt;em&gt;guide on Cloud Run Jobs&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. It’s the blueprint for taking these models to the next level.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can find me across the web here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✍️ &lt;strong&gt;Read more on Medium:&lt;/strong&gt; &lt;a href="https://www.google.com/search?q=https%3A%2F%2Fmedium.com%2F%40syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💬 &lt;strong&gt;Join the discussion on&lt;/strong&gt; &lt;a href="http://Dev.to" rel="noopener noreferrer"&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&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;Deep dives on 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;Check my code on 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;Connect professionally on 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;All my links in one place on Beacons:&lt;/strong&gt; &lt;a href="https://beacons.ai/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;Visit my Portfolio Website:&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;You can also find my verified Google Business profile &lt;a href="https://g.page/r/CS9yn4Q_UhZ4EBM" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Stop Letting AI Write Your Database Migrations</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Wed, 06 May 2026 16:36:02 +0000</pubDate>
      <link>https://dev.to/syedahmershah/stop-letting-ai-write-your-database-migrations-2a26</link>
      <guid>https://dev.to/syedahmershah/stop-letting-ai-write-your-database-migrations-2a26</guid>
      <description>&lt;p&gt;The era of “just ask the LLM” has made us remarkably productive, but it has also made us dangerously comfortable. We are currently witnessing a shift where developers are offloading critical infrastructure decisions to generative models. While having an AI suggest a React component or a regex pattern is relatively low-stakes, letting it dictate your database schema transitions is playing with fire.&lt;/p&gt;

&lt;p&gt;The problem isn’t that AI is “bad” at SQL; it’s that AI lacks context. It doesn’t know your traffic patterns, it doesn’t understand your locking mechanisms, and it certainly doesn’t care if your production environment goes dark at 3:00 AM because of a table lock that lasted ten minutes too long.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Illusion of “It Works”
&lt;/h4&gt;

&lt;p&gt;When you ask an AI to generate a migration — say, adding a non-nullable column with a default value to a table with five million rows — the code it gives you will likely be syntactically perfect. You run it in your local environment with fifty rows of seed data, and it finishes in milliseconds.&lt;/p&gt;

&lt;p&gt;The issue arises when that same script hits a production environment.&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%2F926pt4a1eye4g923pce5.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%2F926pt4a1eye4g923pce5.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Before (AI-Generated Standard):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--Generated by AI: Simple, clean, and potentially catastrophic&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a massive table, this operation can trigger a full table rewrite. In PostgreSQL, for instance, versions prior to 11 would lock the entire table while writing that default value to every single row. If your application is high-traffic, your API starts throwing 504 Gateway Timeouts because every connection is waiting for that lock to release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The After (Human-Engineered Safe Migration):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Step 1: Add the column as nullable first (instant operation)&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 2: Set the default for future rows&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 3: Update existing rows in small batches to avoid long-held locks&lt;/span&gt;
&lt;span class="c1"&gt;-- (This would typically be handled via a background job or scripted loop)&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 4: Add the NOT NULL constraint after data is populated&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fxi6ulhfdhvolgh3h6995.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%2Fxi6ulhfdhvolgh3h6995.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  When “Convenience” Costs Millions
&lt;/h4&gt;

&lt;p&gt;We don’t have to look far to see where automated or poorly planned migrations caused genuine wreckage. One of the most famous examples of migration-related downtime was the &lt;a href="https://about.gitlab.com/blog/2017/02/01/gitlab-dot-com-database-incident/" rel="noopener noreferrer"&gt;2017 GitLab outage&lt;/a&gt;. While that was a human error during a manual intervention, it highlights the fragility of database state.&lt;/p&gt;

&lt;p&gt;More recently, several tech startups have reported “silent” data corruption when AI-generated migrations suggested changing column types (like &lt;code&gt;INT&lt;/code&gt; to &lt;code&gt;BIGINT&lt;/code&gt;) without account for how the underlying ORM would handle the transition during a rolling deployment. If your AI-written migration drops a column before the new version of your application code is fully deployed across all nodes, your "After" state is a series of 500 errors.&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%2Fft7gcoim5duy8dku2bil.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%2Fft7gcoim5duy8dku2bil.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Context Gap
&lt;/h4&gt;

&lt;p&gt;AI models operate on patterns, not performance profiles. They don’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Lock Hierarchy:&lt;/strong&gt; Will this &lt;code&gt;ALTER TABLE&lt;/code&gt; block &lt;code&gt;SELECT&lt;/code&gt; queries?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replication Lag:&lt;/strong&gt; Will this massive update stall your read replicas?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment Strategy:&lt;/strong&gt; Is this a blue-green deployment or a rolling restart?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A migration is not just a script; it is a bridge between two states of a living system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Moving Forward: Use AI as a Drafter, Not an Architect
&lt;/h4&gt;

&lt;p&gt;I am not suggesting we go back to the Stone Age. AI is a phenomenal tool for boilerplate. If you need to scaffold a complex set of join tables, let the AI write the initial DDL.&lt;/p&gt;

&lt;p&gt;But the moment that code touches a migration file, the “AI” portion of the task ends. You must take over as the engineer. You need to verify the locks, check the execution plan, and most importantly, simulate the migration against a production-sized data set.&lt;/p&gt;

&lt;p&gt;If you’re interested in seeing how I’ve handled high-performance, SEO-optimized database architectures without relying on “magic” scripts, you can check out my project documentation on my &lt;a href="https://github.com/ahmershahdev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or follow my updates on &lt;a href="https://linkedin.com/in/syedahmershah" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The database is the heart of your application. Don’t let a probabilistic model perform open-heart surgery on it.&lt;/p&gt;

&lt;p&gt;You can find me across the web here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✍️ &lt;strong&gt;Read more on Medium:&lt;/strong&gt; &lt;a href="https://www.google.com/search?q=https%3A%2F%2Fmedium.com%2F%40syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💬 &lt;strong&gt;Join the discussion on&lt;/strong&gt; &lt;a href="http://Dev.to" rel="noopener noreferrer"&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&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;Deep dives on 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;Check my code on 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;Connect professionally on 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;All my links in one place on Beacons:&lt;/strong&gt; &lt;a href="https://beacons.ai/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;Visit my Portfolio Website:&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;You can also find my verified Google Business profile &lt;a href="https://g.page/r/CS9yn4Q_UhZ4EBM" rel="noopener noreferrer"&gt;here&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>Big Tech Is Firing Humans to Buy More GPUs</title>
      <dc:creator>Syed Ahmer Shah</dc:creator>
      <pubDate>Fri, 01 May 2026 11:10:05 +0000</pubDate>
      <link>https://dev.to/syedahmershah/big-tech-is-firing-humans-to-buy-more-gpus-48f0</link>
      <guid>https://dev.to/syedahmershah/big-tech-is-firing-humans-to-buy-more-gpus-48f0</guid>
      <description>&lt;p&gt;There’s a phrase that keeps showing up in corporate earnings calls this year — “efficiency rebalancing.” It sounds sterile. Bureaucratic. Almost boring. But if you strip away the PR language and look at what’s actually happening, it translates to something far more visceral: companies are selling their people to buy computers.&lt;/p&gt;

&lt;p&gt;Not metaphorically. Literally.&lt;/p&gt;

&lt;p&gt;April 2026 has made this undeniable. Across the tech industry, some of the most profitable companies on the planet — entities sitting on tens of billions in annual revenue — are firing thousands of engineers and developers not because they’re bleeding money, but because keeping humans on payroll has become the most convenient way to fund an AI arms race that is consuming capital at a scale the world has never seen. The math, once you see it, is almost elegant in its brutality.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;This Isn’t a Downturn. It’s a Deliberate Trade.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s what makes this moment different from every other tech layoff cycle you’ve heard about. In 2001, the dot-com bubble burst and companies fired people because they were running out of money. In 2008, the financial crisis rippled through everything. In 2022–2023, over-hired tech firms were correcting for pandemic-era excess.&lt;/p&gt;

&lt;p&gt;None of that is happening now.&lt;/p&gt;

&lt;p&gt;The companies laying people off in April 2026 are not struggling. Oracle just reported a 22% revenue increase. Meta is printing money from advertising. Microsoft’s cloud business is growing faster than anyone projected three years ago. These are not distressed companies making desperate cuts. These are dominant companies making calculated ones.&lt;/p&gt;

&lt;p&gt;The difference is this: the cost of staying competitive in AI infrastructure has become so astronomical that it has outgrown the traditional capacity of operational budgets. You can’t slowly build toward $140 billion in AI spending. You have to create a financial runway immediately, and the fastest way to do that is to liquidate your largest variable expense — the human payroll.&lt;/p&gt;

&lt;p&gt;Engineers, product managers, QA testers, mid-level developers — these roles represent the only flexible line item large enough to absorb a shock of this scale. The companies aren’t being cruel for the sake of it. They’re following a cold, rational calculus that goes something like: &lt;em&gt;“We can either keep 8,000 people who build features, or we can put that money toward the compute infrastructure that lets AI build those features instead.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They are choosing the servers. Every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The April Wave, Company by Company&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s go through what’s actually happening, because the details matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meta&lt;/strong&gt; announced it’s cutting roughly 10% of its workforce — around 8,000 jobs eliminated in May, plus another 6,000 open positions that are simply being erased before anyone could even be hired into them. The reason isn’t hidden. Meta has publicly committed to spending up to $135 billion on AI infrastructure this single year. To contextualize that number: it’s more than the GDP of many small nations, spent in twelve months, almost entirely on data centers and compute. To free up that kind of capital, Meta is dismantling its traditional flat management structure and reorganizing around AI “pods” — small, focused teams that work directly with applied AI. If your job doesn’t connect to one of those pods? You’re overhead now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt; is arguably the most striking example of just how detached this is from financial distress. The company fired an estimated 30,000 people globally — a massive hit to the US workforce and an even harder blow to India’s tech corridor, which had grown enormously dependent on Oracle’s expansion over the last decade. This $2.1 billion restructuring wasn’t a rescue operation. It was an investment strategy. The explicit goal was to free up nearly $10 billion in cash flow, which is being funneled directly into AI-integrated cloud services and new data center capacity. They made money, then chose to make more money by removing the people who helped them make it in the first place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft&lt;/strong&gt; went a different, more surgical route. Rather than mass terminations, they introduced voluntary retirement buyouts targeting employees whose combined age and years of service equal 70 or more. It sounds almost gentle — nobody’s being dragged out. But what this actually means is that Microsoft is deliberately bleeding out its most experienced, highest-paid engineering talent. These are the people who built the systems, who carry institutional knowledge in their heads, who have been there long enough to remember why certain decisions were made. Microsoft is trading that accumulated human intelligence for GPU capacity, betting that their $140 billion AI infrastructure investment will eventually reproduce or surpass what those veterans knew.&lt;/p&gt;

&lt;p&gt;Beyond the big three, the pattern repeats everywhere you look. &lt;strong&gt;Nike&lt;/strong&gt; is cutting 1,400 tech roles and outsourcing internal app logic to AI tools — a consumer goods company essentially deciding it no longer needs a traditional dev team. &lt;strong&gt;Snap&lt;/strong&gt; is slashing 16% of its staff to go all-in on AR and AI-driven advertising. Even &lt;strong&gt;ASML&lt;/strong&gt; — the Dutch company that makes the machines that make the chips that power all of this — cut 1,700 jobs because even the physical backbone of the AI industry isn’t immune to the operational pressures of this transition.&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%2Fsix9t1nvqzcbjj6nzxpu.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%2Fsix9t1nvqzcbjj6nzxpu.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Now? The Economics Nobody Explains Clearly&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To really understand why this is happening in 2026 specifically, you have to understand a shift that broke one of software’s most cherished assumptions.&lt;/p&gt;

&lt;p&gt;For thirty years, the software industry ran on a beautiful economic model: build something once, sell it infinitely. You pay a developer to write a feature, and that feature costs you nothing additional to deploy to the millionth user. The marginal cost of scale was essentially zero. This is why software companies became the most valuable businesses in human history. The economics were genuinely unprecedented.&lt;/p&gt;

&lt;p&gt;Agentic AI destroys this model.&lt;/p&gt;

&lt;p&gt;When an autonomous AI agent works — actually works, the way companies are now deploying them — it doesn’t just pattern-match and autocomplete. It reads entire code repositories, runs test suites, analyzes logs, iterates, makes decisions, and executes changes. Every step of that process burns compute. Real, expensive, continuous compute. You’re not paying once for a feature anymore. You’re paying a recurring compute cost every single time the agent does anything.&lt;/p&gt;

&lt;p&gt;This means that unlike traditional software, AI-powered development has high, ongoing operational costs. But here’s the trap: before you can even get to those operational costs, you have to build or lease the infrastructure to run the agents in the first place. And that infrastructure — a single Nvidia B200 server rack — costs millions of dollars. The Big Four are racing to build tens of thousands of these.&lt;/p&gt;

&lt;p&gt;They cannot wait for incremental quarterly revenue to fund this. The competitive window is too narrow. Whoever builds the most capable AI infrastructure fastest will have structural advantages that are nearly impossible to overcome later. So they’re doing the only thing large enough to matter: converting human capital directly into silicon capital. Your salary, multiplied across thousands of employees, becomes another server rack.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Role That’s Actually Dying&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s what most commentary gets wrong about this: people frame it as “AI is taking developer jobs.” That’s too simple, and it’s almost the wrong lesson to take from this.&lt;/p&gt;

&lt;p&gt;What’s dying is a specific kind of developer — the feature builder. The person whose primary value was translating a product requirement into functioning code. The person who could spin up a REST API, build a CRUD application, manage a straightforward database schema, or adjust CSS until a layout looked right. These tasks, which occupied the majority of junior and mid-level developer time for the last two decades, are now being handled adequately by AI agents operating at “Level 2” (conversational) and “Level 3” (task-based) autonomy.&lt;/p&gt;

&lt;p&gt;The bottleneck has shifted. It’s not “can we generate code fast enough?” Companies can generate oceans of code now. The new bottleneck is: “can we trust, verify, secure, and orchestrate the systems that generate all this code?”&lt;/p&gt;

&lt;p&gt;This is why companies are simultaneously firing feature developers and desperately hiring people who understand something different — system architecture, Model Context Protocol (MCP) standards, security layers that prevent prompt injection attacks, API design that is self-describing enough for an AI agent to navigate without breaking things, test-driven development practices robust enough to catch the errors an AI generates at speed.&lt;/p&gt;

&lt;p&gt;If an AI agent can write a thousand lines of code in ten seconds, the engineer you actually need is the one who understands the production database well enough to prevent those thousand lines from taking it down. The one who can look at an agent’s output and immediately see the three security vulnerabilities the model missed because it was optimizing for functional correctness, not threat modeling.&lt;/p&gt;

&lt;p&gt;That person is not being replaced. That person is currently being aggressively recruited.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What This Actually Means If You’re Early in Your Career&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s not pretend this analysis exists in a vacuum. If you’re a young person entering software development right now, reading this as a list of abstract corporate maneuvers would be a mistake.&lt;/p&gt;

&lt;p&gt;The honest picture is that the traditional entry point into the industry — learn syntax, get a junior role, build features, grow from there — is narrowing fast. Companies that used to hire cohorts of junior developers to work under senior engineers are either not hiring those roles at all, or automating the work those roles used to do.&lt;/p&gt;

&lt;p&gt;But the ceiling hasn’t lowered. If anything, it’s higher than it’s ever been. The engineers who understand infrastructure deeply, who can architect systems, who know how to build the scaffolding that makes AI agents safe and controllable — those people have never been more valuable. The gap between them and everyone else is just getting wider faster than most people expected.&lt;/p&gt;

&lt;p&gt;The strategic implication is clear even if it’s uncomfortable: you can’t afford to stay at the surface level. Knowing how to use a framework, following tutorials, building projects that demonstrate you can implement features — that’s table stakes now, and the table is getting smaller. The leverage is in moving lower in the stack than most developers are willing to go, or higher in architecture than most developers bother to reach.&lt;/p&gt;

&lt;p&gt;Understand the database internals, not just the ORM. Learn how systems fail under load, not just how they function under ideal conditions. Get comfortable with security thinking. Understand what agents are actually doing when they run, what they cost, and where they fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Uncomfortable Summary&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;None of this is going to stop. The companies building AI infrastructure are locked in a race where stopping means losing, and losing means being irrelevant at a scale none of them can survive strategically. The human cost of that race is being distributed across workforces globally, and that distribution is not going to slow down in the next 12 to 18 months.&lt;/p&gt;

&lt;p&gt;Complaining about it accomplishes nothing. Understanding it clearly is the only useful response.&lt;/p&gt;

&lt;p&gt;The data centers are being built regardless of what any individual thinks about the fairness of the process. The question isn’t whether this is happening — it clearly is, at scale, right now. The question is where you want to be standing in relation to it. Are you the person being replaced by the infrastructure? Or are you building toward being the person who understands how to control what comes out of it?&lt;/p&gt;

&lt;p&gt;That’s not a rhetorical question. It has a concrete, practical answer that requires specific skills developed over specific time. The window to develop them is still open.&lt;/p&gt;

&lt;p&gt;It won’t stay open indefinitely.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sources:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.hfsresearch.com/research/the-agentic-shift-2026/" rel="noopener noreferrer"&gt;HFS Research / Genpact — The Agentic Shift (April 2026)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://investor.fb.com/investor-news/press-release-details/2026/Meta-Reports-First-Quarter-2026-Results/default.aspx" rel="noopener noreferrer"&gt;Meta Q1 2026 Earnings Call Transcript&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/investor/earnings/FY-2026-Q1/press-release-webcast" rel="noopener noreferrer"&gt;Microsoft Q1 FY2026 Earnings Release&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://investor.oracle.com/investor-news/news-details/2026/" rel="noopener noreferrer"&gt;Oracle Q3 FY2026 Financial Results &amp;amp; Restructuring Announcement&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://abc.xyz/investor/" rel="noopener noreferrer"&gt;Alphabet Q1 2026 Earnings Call Transcript&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.blog/2026/ai-developer-tools-usage-billing/" rel="noopener noreferrer"&gt;GitHub Blog — Usage-based billing shift for AI developer tools&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.anthropic.com/news" rel="noopener noreferrer"&gt;Anthropic — Deprecation notices, compute cost disclosures&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theverge.com/2026/4/oracle-layoffs-30000-ai-infrastructure" rel="noopener noreferrer"&gt;The Verge — Oracle’s abrupt email terminations (April 2026 pre-release)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://techcrunch.com/2026/04/snap-layoffs-ai-pivot" rel="noopener noreferrer"&gt;TechCrunch — Snap 16% staff cut, AI advertising pivot (April 2026)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;Model Context Protocol — Official documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find me across the web here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✍️ &lt;strong&gt;Read more on Medium:&lt;/strong&gt; &lt;a href="https://www.google.com/search?q=https%3A%2F%2Fmedium.com%2F%40syedahmershah" rel="noopener noreferrer"&gt;@syedahmershah&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💬 &lt;strong&gt;Join the discussion on&lt;/strong&gt; &lt;a href="http://Dev.to" rel="noopener noreferrer"&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&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;Deep dives on 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;Check my code on 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;Connect professionally on 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;All my links in one place on Beacons:&lt;/strong&gt; &lt;a href="https://beacons.ai/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;Visit my Portfolio Website:&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;You can also find my verified Google Business profile &lt;a href="https://g.page/r/CS9yn4Q_UhZ4EBM" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>coding</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
