<?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: Muhammad Hamid Raza</title>
    <description>The latest articles on DEV Community by Muhammad Hamid Raza (@hamidrazadev).</description>
    <link>https://dev.to/hamidrazadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3131979%2F8333e423-4d9b-4851-ab42-f268ef4993c4.png</url>
      <title>DEV Community: Muhammad Hamid Raza</title>
      <link>https://dev.to/hamidrazadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamidrazadev"/>
    <language>en</language>
    <item>
      <title>Stop Comparing Android and iOS — They Were Never Meant to Compete</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:34:59 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/stop-comparing-android-and-ios-they-were-never-meant-to-compete-1inp</link>
      <guid>https://dev.to/hamidrazadev/stop-comparing-android-and-ios-they-were-never-meant-to-compete-1inp</guid>
      <description>&lt;p&gt;You've seen the arguments. Someone tweets that iPhone is overpriced, and within minutes the replies are on fire. Android fans say it gives you freedom. iOS fans say it just works. Round and round we go.&lt;/p&gt;

&lt;p&gt;Here's the thing: &lt;strong&gt;this debate has been running for over a decade, and nobody has won.&lt;/strong&gt; That's not an accident.&lt;/p&gt;

&lt;p&gt;Android and iOS were not built to beat each other. They were built for completely different goals, different people, and different visions of what a smartphone should be. So every time we compare them like they're competing for the same crown, we miss the whole point.&lt;/p&gt;

&lt;p&gt;Have you ever compared a hammer to a screwdriver? Both are tools. Both are useful. But they were never meant to do the same job. 🔧&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does "Comparing Android and iOS" Actually Mean?
&lt;/h2&gt;

&lt;p&gt;When most people compare Android and iOS, they usually mean one of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Which is better for everyday use?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which should I pick?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are fair questions. But they're personal questions, not universal ones.&lt;/p&gt;

&lt;p&gt;Android is an open-source mobile operating system developed by Google. It runs on devices made by Samsung, Google, OnePlus, Xiaomi, and hundreds of other manufacturers. You can customize almost everything.&lt;/p&gt;

&lt;p&gt;iOS is Apple's mobile operating system. It runs only on iPhones and iPads. Apple controls the hardware and software together, which gives it a unique level of polish and consistency.&lt;/p&gt;

&lt;p&gt;They are two completely different philosophies wrapped in the shape of a phone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Topic Actually Matters
&lt;/h2&gt;

&lt;p&gt;If you're a developer, this debate affects your decisions every day.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which platform should you build for first?&lt;/li&gt;
&lt;li&gt;Should you go native, cross-platform, or web-first?&lt;/li&gt;
&lt;li&gt;How do you test your app on both ecosystems?&lt;/li&gt;
&lt;li&gt;Which users are you actually targeting?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you're just someone buying a phone, the comparison still matters — but in a very different way. Choosing the wrong platform for &lt;em&gt;your life&lt;/em&gt; can cause real friction.&lt;/p&gt;

&lt;p&gt;The problem isn't that people compare the two. The problem is that most comparisons assume one must be better than the other. &lt;strong&gt;That assumption is wrong, and it leads to bad decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding why they're different — not which is better — is what actually helps you make smart choices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Android and iOS Are Not the Same Kind of Thing
&lt;/h2&gt;

&lt;p&gt;Here's an analogy that might help.&lt;/p&gt;

&lt;p&gt;Imagine two restaurants. One is a five-star hotel restaurant. The menu is fixed, the portions are perfect, the service is flawless, and everything feels like it was designed together. You cannot ask for substitutions. You trust the chef.&lt;/p&gt;

&lt;p&gt;The other is a bustling city market. There are dozens of stalls. You can mix and match. You can find rare flavors from around the world. Nothing is perfectly coordinated, but the variety and freedom are unmatched.&lt;/p&gt;

&lt;p&gt;Which restaurant is better? That depends entirely on what you want tonight.&lt;/p&gt;

&lt;p&gt;iOS is the hotel restaurant. Android is the city market.&lt;/p&gt;

&lt;p&gt;Neither is wrong. They simply offer different experiences for different people.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Reasons Why Comparing Them Is Misleading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ 1. They Serve Different User Bases
&lt;/h3&gt;

&lt;p&gt;iOS users tend to value simplicity, privacy, seamless integration across Apple devices, and a consistent experience. Many are professionals, creatives, or people who want tech that "just works."&lt;/p&gt;

&lt;p&gt;Android users often value choice, flexibility, price range, and the ability to customize their experience. Many are power users, developers, or people in markets where mid-range phones dominate.&lt;/p&gt;

&lt;p&gt;When you declare one "better," you are really saying "better for people like me." That's fine. But it's not a universal truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ 2. Android Is Not One Thing
&lt;/h3&gt;

&lt;p&gt;This is one of the most overlooked points in the debate. Android runs on thousands of devices across every price point. Saying "Android is better than iOS" is like saying "cars are better than iPhones." Which car? A budget hatchback or a luxury SUV?&lt;/p&gt;

&lt;p&gt;A Samsung Galaxy S series is a very different experience from a budget Xiaomi phone. Both run Android. Comparing either to an iPhone without specifying the model makes the whole comparison unreliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ 3. iOS Is a Closed System by Design, Not Mistake
&lt;/h3&gt;

&lt;p&gt;Apple's control over its ecosystem is a deliberate choice. It allows them to optimize performance, guarantee security updates, and create smooth integration between iPhone, Mac, iPad, Apple Watch, and AirPods.&lt;/p&gt;

&lt;p&gt;That closed nature frustrates some users. But for many others, especially those already in the Apple ecosystem, it is exactly the feature — not the flaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ 4. The "Better" Answer Depends on Your Life
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Are your friends and family on iMessage? iOS might feel smoother.&lt;/li&gt;
&lt;li&gt;Do you need a phone under $200? Android gives you more options.&lt;/li&gt;
&lt;li&gt;Are you a developer building apps? You might need both.&lt;/li&gt;
&lt;li&gt;Do you live in a Google Workspace office? Android might feel more natural.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Context drives the answer. Stripping context out of the comparison makes it meaningless.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ 5. Each Keeps the Other Better
&lt;/h3&gt;

&lt;p&gt;This is the quiet truth nobody says enough. The existence of iOS makes Android better. The existence of Android makes iOS better. Competition pushes both platforms forward.&lt;/p&gt;

&lt;p&gt;When Android introduced widgets, Apple eventually added them too. When Apple pioneered Face ID, Android followed. When Google brought real-time translation, Apple improved Siri. They are watching each other — and both of us benefit.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Look at What Each Does Well
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iOS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customization&lt;/td&gt;
&lt;td&gt;🏆 Highly flexible&lt;/td&gt;
&lt;td&gt;Limited but clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware Choice&lt;/td&gt;
&lt;td&gt;🏆 Hundreds of options&lt;/td&gt;
&lt;td&gt;Only Apple devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy Controls&lt;/td&gt;
&lt;td&gt;Strong (improving)&lt;/td&gt;
&lt;td&gt;🏆 Industry-leading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Ecosystem&lt;/td&gt;
&lt;td&gt;Massive&lt;/td&gt;
&lt;td&gt;🏆 Higher app revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software Updates&lt;/td&gt;
&lt;td&gt;Fragmented&lt;/td&gt;
&lt;td&gt;🏆 Fast and consistent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price Range&lt;/td&gt;
&lt;td&gt;🏆 Budget to premium&lt;/td&gt;
&lt;td&gt;Premium only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Experience&lt;/td&gt;
&lt;td&gt;Strong tools&lt;/td&gt;
&lt;td&gt;🏆 Great for SwiftUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-device Sync&lt;/td&gt;
&lt;td&gt;Good with Google&lt;/td&gt;
&lt;td&gt;🏆 Seamless with Apple&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; Neither column dominates. Each wins where its philosophy shines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Tips for Developers and Users
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Developers 💡
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build for both from day one.&lt;/strong&gt; Use React Native, Flutter, or a web-first strategy if your budget allows. Ignoring one platform means ignoring half your potential users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't assume behavior.&lt;/strong&gt; iOS and Android handle navigation, permissions, notifications, and even font rendering differently. Test on real devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect each platform's design language.&lt;/strong&gt; iOS users expect the feel of UIKit/SwiftUI conventions. Android users expect Material Design patterns. Forcing one on the other causes friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize based on your market.&lt;/strong&gt; In South Asia and Southeast Asia, Android dominates. In North America and Japan, iOS has a strong share. Data should drive your decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Everyday Users 💡
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Think about your ecosystem.&lt;/strong&gt; If you own a MacBook, Apple Watch, or AirPods, iOS will feel dramatically smoother. If you use Google Docs, Drive, and Gmail heavily, Android might feel more natural.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try before you decide.&lt;/strong&gt; If you have a friend with the other platform, spend an hour using it. Your preference might surprise you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't switch just to win an argument.&lt;/strong&gt; Switch if your current phone genuinely isn't meeting your needs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make in This Debate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Mistake 1: Generalizing Android as One Platform
&lt;/h3&gt;

&lt;p&gt;Many people say "Android crashes more" or "Android feels slow." But they're usually talking about a specific budget phone from three years ago. A Pixel 9 or Galaxy S25 is a completely different experience. Be specific.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake 2: Assuming iOS Is Just About Status
&lt;/h3&gt;

&lt;p&gt;Yes, iPhones are expensive. But dismissing iOS users as people who "just want to look rich" ignores real technical reasons many developers, videographers, and professionals choose Apple — like Final Cut Pro integration, Apple Silicon performance, or consistent security updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake 3: Picking a Side and Ignoring the Trade-offs
&lt;/h3&gt;

&lt;p&gt;Every platform has trade-offs. iOS restricts sideloading apps. Android is fragmented across updates. Pretending your preferred platform has no downsides makes you less informed, not more confident.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake 4: Using Old Information
&lt;/h3&gt;

&lt;p&gt;The mobile landscape changes every year. Android's privacy controls have improved significantly. iOS has opened up more customization than ever before. Don't make decisions based on a 2016 Reddit thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake 5: Making It Personal
&lt;/h3&gt;

&lt;p&gt;You can love your phone and still acknowledge the other one does some things well. It's not loyalty. It's just honesty. 😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Use the Right Tool, Not the Popular Opinion
&lt;/h2&gt;

&lt;p&gt;Android and iOS are both remarkable pieces of technology. They've changed how billions of people communicate, work, learn, and create. Neither is inferior. Neither is perfect.&lt;/p&gt;

&lt;p&gt;The real question was never "which is better?" The real question is &lt;strong&gt;"which is better for you, right now, given your needs?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a developer, understanding both platforms makes you more employable, more empathetic to your users, and more capable of building things people actually love to use.&lt;/p&gt;

&lt;p&gt;As a regular user, understanding both platforms helps you make a smarter purchase — one based on your actual life, not the loudest voice in the comment section.&lt;/p&gt;

&lt;p&gt;So next time someone tries to start the Android vs iOS argument, you can smile and say: "They're different tools. I know which one works for me."&lt;/p&gt;

&lt;p&gt;That's a more useful answer than anything a 200-comment thread ever produced. 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want more practical developer content like this?&lt;/strong&gt;&lt;br&gt;
Head over to &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for articles, tools, and insights built for developers who want to keep learning and building smarter.&lt;/p&gt;

&lt;p&gt;If this post helped you see things differently, share it — you might save someone from a very long and very pointless argument. 😄&lt;/p&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>mobile</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Ollama vs LM Studio vs llama.cpp: Which One Should You Actually Use to Run Local LLMs? 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Fri, 18 Sep 2026 07:42:24 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/ollama-vs-lm-studio-vs-llamacpp-which-one-should-you-actually-use-to-run-local-llms-1e13</link>
      <guid>https://dev.to/hamidrazadev/ollama-vs-lm-studio-vs-llamacpp-which-one-should-you-actually-use-to-run-local-llms-1e13</guid>
      <description>&lt;p&gt;You finally decided to run an AI model on your own machine. No API keys, no per-token billing, no "you've hit your limit" popup at 2 AM.&lt;/p&gt;

&lt;p&gt;Then you open Google and get hit with three names at once: &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;LM Studio&lt;/strong&gt;, and &lt;strong&gt;llama.cpp&lt;/strong&gt;. Every tutorial swears by a different one. Every Reddit thread contradicts the last.&lt;/p&gt;

&lt;p&gt;So you do what we all do. You install all three, burn 40 GB of disk space, and still aren't sure which one you're supposed to keep. 😅&lt;/p&gt;

&lt;p&gt;Here's the part nobody tells you upfront: these three tools are not really competing the way it looks. They sit at different layers of the same stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So the real question isn't "which one is best?" — it's "which one matches the way you work?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's clear it up, simply.&lt;/p&gt;




&lt;h2&gt;
  
  
  First, What Are We Even Comparing?
&lt;/h2&gt;

&lt;p&gt;Imagine you want to drive somewhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llama.cpp&lt;/strong&gt; is the &lt;strong&gt;engine&lt;/strong&gt;. Raw, powerful, and you're expected to know where the bolts go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; is the &lt;strong&gt;car with an automatic gearbox&lt;/strong&gt;. Turn the key, drive, done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Studio&lt;/strong&gt; is the &lt;strong&gt;car with a big touchscreen dashboard&lt;/strong&gt;. Same driving, but you can see and tap everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three run the same kind of local language models. The difference is how much of the machinery you touch.&lt;/p&gt;

&lt;p&gt;Let's meet them one by one.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔧 llama.cpp — The Engine Underneath
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;llama.cpp&lt;/strong&gt; is an open-source project (started by Georgi Gerganov) that runs large language models efficiently in C/C++. It's the reason running a decent model on a normal laptop became realistic at all.&lt;/p&gt;

&lt;p&gt;It introduced and popularised the &lt;strong&gt;GGUF&lt;/strong&gt; model format — a single file containing the model weights plus the metadata needed to load it.&lt;/p&gt;

&lt;p&gt;It ships with command-line tools, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;llama-cli&lt;/code&gt; for chatting in the terminal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;llama-server&lt;/code&gt; for exposing a local HTTP API&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;llama-quantize&lt;/code&gt; for shrinking models to smaller formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It supports CPU-only machines and can accelerate on GPUs through backends like Metal (Apple), CUDA (NVIDIA), and Vulkan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; you either build it yourself or grab a prebuilt release, and you download model files manually. Flags matter. Paths matter. It's not hostile, but it does assume you're comfortable in a terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; people who want control, are building something custom, or genuinely want to understand what's happening under the hood.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚡ Ollama — The "Just Run It" Tool
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt; wraps local model running into something that feels like Docker for LLMs.&lt;/p&gt;

&lt;p&gt;You install it, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. It downloads the model, loads it, and drops you into a chat prompt.&lt;/p&gt;

&lt;p&gt;It also runs a &lt;strong&gt;local HTTP server&lt;/strong&gt; (by default on port &lt;code&gt;11434&lt;/code&gt;) with an &lt;strong&gt;OpenAI-compatible endpoint&lt;/strong&gt;, which is the part developers actually fall in love with. You can point existing code at your own machine by changing a base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# required by the client, not actually checked
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&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="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain recursion to a 10-year-old.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ollama also supports a &lt;strong&gt;Modelfile&lt;/strong&gt; — a small config file where you set a system prompt and parameters, then save it as your own named model. Think "Dockerfile, but for model behaviour."&lt;/p&gt;

&lt;p&gt;It's available on macOS, Linux, and Windows, and there's a desktop app alongside the CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; Ollama has historically built on llama.cpp for inference. So when you use Ollama, you're often benefiting from llama.cpp's work with a much friendlier wrapper on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; developers who want local models inside their apps and scripts, with minimum setup friction.&lt;/p&gt;




&lt;h3&gt;
  
  
  👀 LM Studio — The Desktop App With a Real UI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LM Studio&lt;/strong&gt; is a desktop application (macOS, Windows, Linux) built around a graphical interface.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;model browser&lt;/strong&gt; that searches and downloads GGUF models from Hugging Face&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;chat window&lt;/strong&gt; with settings you can see and adjust&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;local server mode&lt;/strong&gt; that exposes an OpenAI-compatible API, same idea as Ollama&lt;/li&gt;
&lt;li&gt;On Apple Silicon, support for &lt;strong&gt;MLX&lt;/strong&gt; models in addition to GGUF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real advantage is visibility. Context length, temperature, GPU offload — they're sliders and fields, not flags you have to remember. When a model fails to load, you can usually &lt;em&gt;see&lt;/em&gt; why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; it's a GUI-first app, so it's a less natural fit for a headless server. And unlike llama.cpp, the app itself isn't an open-source project you can freely fork, so check the current licence if you're deploying it at work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; beginners, students, designers, prompt engineers, and anyone who wants to test models quickly without living in the terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More Than It Used To
&lt;/h2&gt;

&lt;p&gt;Running models locally isn't just a hobbyist flex. It solves real problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Your data stays on your machine.&lt;/strong&gt;&lt;br&gt;
Debugging a bug in code covered by an NDA? A local model means that code never leaves your laptop. No policy review needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No usage bill while you experiment.&lt;/strong&gt;&lt;br&gt;
Testing 300 prompt variations against a paid API gets expensive fast. Locally, the only cost is your electricity and your patience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It works offline.&lt;/strong&gt;&lt;br&gt;
Flights, trains, bad hotel Wi-Fi, a conference venue with 400 people on one router. Your model doesn't care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. You learn how the thing actually works.&lt;/strong&gt;&lt;br&gt;
Once you've watched a model fail to load because your context window was too big for your VRAM, you understand LLM memory in a way no blog post can teach you. (Including this one. 😄)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. It's a genuinely useful skill.&lt;/strong&gt;&lt;br&gt;
"Set up a private local LLM workflow for the team" is a real task at real companies now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&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;&lt;strong&gt;llama.cpp&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;LM Studio&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Command line&lt;/td&gt;
&lt;td&gt;Command line + desktop app&lt;/td&gt;
&lt;td&gt;Graphical desktop app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup effort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Lowest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model downloads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual (you fetch GGUF files)&lt;/td&gt;
&lt;td&gt;Built-in (&lt;code&gt;ollama pull&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Built-in browser UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local API server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (&lt;code&gt;llama-server&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Yes, OpenAI-compatible&lt;/td&gt;
&lt;td&gt;Yes, OpenAI-compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control over settings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maximum&lt;/td&gt;
&lt;td&gt;Good (Modelfile + params)&lt;/td&gt;
&lt;td&gt;Good, and visible in the UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;App is not open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom builds, deep control&lt;/td&gt;
&lt;td&gt;App development, automation&lt;/td&gt;
&lt;td&gt;Learning, testing, quick chats&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt;&lt;br&gt;
Learning and exploring → &lt;strong&gt;LM Studio&lt;/strong&gt;.&lt;br&gt;
Building apps and scripts → &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;br&gt;
Custom control, embedding, or squeezing out performance → &lt;strong&gt;llama.cpp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And honestly? Many people use two. LM Studio to browse and test models, Ollama to serve the one they picked. That's not indecision — that's using the right tool for each job. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips (Learned the Slightly Painful Way)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Start with a small model.&lt;/strong&gt;&lt;br&gt;
Begin with something in the 3B–8B range. If it works, go bigger. Starting with a 70B model on a 16 GB laptop is how you end up thinking "local AI is broken."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Understand quantization before you download.&lt;/strong&gt;&lt;br&gt;
Those &lt;code&gt;Q4_K_M&lt;/code&gt; and &lt;code&gt;Q8_0&lt;/code&gt; labels are compression levels. Lower numbers = smaller file, less memory, some quality loss. &lt;code&gt;Q4_K_M&lt;/code&gt; is a popular balanced starting point. &lt;code&gt;Q8_0&lt;/code&gt; is closer to the original but much heavier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Check your RAM/VRAM against the file size.&lt;/strong&gt;&lt;br&gt;
Rough rule: the model file needs to fit in memory, plus extra headroom for the context. A ~4.5 GB file on a machine with 8 GB total RAM will be tight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Lower your context length if loading fails.&lt;/strong&gt;&lt;br&gt;
Context isn't free. A large context window eats memory before you've typed a single word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use the OpenAI-compatible endpoint.&lt;/strong&gt;&lt;br&gt;
Both Ollama and LM Studio expose one. That means you can prototype locally and switch to a hosted API later by changing one base URL. Your code barely changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Don't judge a model from one bad reply.&lt;/strong&gt;&lt;br&gt;
Try a different prompt, a different quantization, or a different model. First impressions of small models are often unfair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Don't leave a 30 GB model on your SSD "just in case."&lt;/strong&gt;&lt;br&gt;
You know you won't use it. Your disk knows too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Expecting frontier-model quality from a 7B model on a laptop.&lt;/strong&gt;&lt;br&gt;
Small local models are genuinely useful for summarising, drafting, classifying, and answering routine questions. They will not match the biggest hosted models on hard reasoning. Knowing that upfront saves a lot of disappointment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Thinking these three tools are rivals.&lt;/strong&gt;&lt;br&gt;
They overlap, but they're layered. Ollama being easier doesn't make llama.cpp obsolete — Ollama has leaned on llama.cpp's engine work. Picking one doesn't mean the others were wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Forgetting the local server is already running.&lt;/strong&gt;&lt;br&gt;
"Port 11434 already in use" usually means Ollama is doing exactly what you asked it to, in the background, from yesterday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Ignoring the model's licence.&lt;/strong&gt;&lt;br&gt;
"Open weights" doesn't automatically mean "free for commercial use." Different models ship with different terms. Check before you build a product on one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Downloading five models before testing one.&lt;/strong&gt;&lt;br&gt;
Classic developer behaviour. Test one properly, then decide. Your bandwidth will thank you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Blaming the tool for a hardware limit.&lt;/strong&gt;&lt;br&gt;
If a model is slow, it's usually memory or GPU offload, not the app. Switching from Ollama to LM Studio won't add VRAM. 💡&lt;/p&gt;




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

&lt;p&gt;Here's the honest summary of &lt;strong&gt;Ollama vs LM Studio vs llama.cpp&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llama.cpp&lt;/strong&gt; gives you the most control and powers a lot of what the others do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; gives you the smoothest path from "installed" to "in my app."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Studio&lt;/strong&gt; gives you the friendliest way to see, test, and understand models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of them is the "wrong" answer. They're three different doors into the same room.&lt;/p&gt;

&lt;p&gt;If you're totally new, install &lt;strong&gt;LM Studio&lt;/strong&gt; tonight, download one small model, and just chat with it. That single step teaches you more than a week of reading comparisons.&lt;/p&gt;

&lt;p&gt;If you're a developer with a project in mind, install &lt;strong&gt;Ollama&lt;/strong&gt; and point your existing OpenAI client at &lt;code&gt;localhost&lt;/code&gt;. It takes about ten minutes and it feels a little bit like magic. ⚡&lt;/p&gt;

&lt;p&gt;And if you love knowing exactly how things work, clone &lt;strong&gt;llama.cpp&lt;/strong&gt; and go exploring. It's worth it.&lt;/p&gt;

&lt;p&gt;Running AI on your own machine used to be a research-lab thing. Now it's an afternoon. That's a genuinely good time to be a developer. 😊&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If this helped, pass it along.&lt;/strong&gt; Share it with the teammate who's been meaning to try local models, or drop it in your group chat.&lt;/p&gt;

&lt;p&gt;📚 More practical developer guides at &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💬 &lt;strong&gt;Now tell me in the comments:&lt;/strong&gt; which one did you end up keeping — Ollama, LM Studio, or llama.cpp? And what model are you running? I'm always curious what's working on other people's machines.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>VS Code 1.137 Is Here: Automations, Voice Mode, and the Features That'll Change How You Code</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sat, 12 Sep 2026 21:29:02 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vs-code-1137-is-here-automations-voice-mode-and-the-features-thatll-change-how-you-code-lgg</link>
      <guid>https://dev.to/hamidrazadev/vs-code-1137-is-here-automations-voice-mode-and-the-features-thatll-change-how-you-code-lgg</guid>
      <description>&lt;p&gt;VS Code just dropped another release, and this one feels different. 🚀&lt;/p&gt;

&lt;p&gt;Not in a "they changed a color somewhere" kind of way. More like "wait, the editor just started doing things I used to do manually, and I can now &lt;em&gt;talk&lt;/em&gt; to it." VS Code 1.137, released on September 9, 2026, is packed with features that push the editor closer to a real AI-powered coding partner.&lt;/p&gt;

&lt;p&gt;If you've ever thought, "I wish my editor could just handle this on its own while I grab a coffee" — this release was made for you.&lt;/p&gt;

&lt;p&gt;Let's break down everything that's new, what it actually means for your workflow, and how to get the most out of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VS Code 1.137?
&lt;/h2&gt;

&lt;p&gt;VS Code 1.137 is the latest stable update to Visual Studio Code, Microsoft's widely used free code editor. This version focuses heavily on &lt;strong&gt;agent-powered automation&lt;/strong&gt;, smarter chat workflows, voice interaction, and better GitHub integration — all without ever leaving your editor.&lt;/p&gt;

&lt;p&gt;Think of it as VS Code leveling up from "smart assistant" to "proactive team member." It's still your editor. It just does more now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Matters
&lt;/h2&gt;

&lt;p&gt;Here's the thing: most developers spend a big chunk of their day on repetitive work. Triaging issues. Catching up on recent changes. Reviewing pull requests. Switching between tools — editor, browser, GitHub, back to editor.&lt;/p&gt;

&lt;p&gt;VS Code 1.137 tackles all of that head-on. You can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schedule agent tasks to run on a timer, like a cron job but for AI&lt;/li&gt;
&lt;li&gt;Talk to the agent with your voice and interrupt it while it's working&lt;/li&gt;
&lt;li&gt;Review GitHub issues and pull requests right inside the editor&lt;/li&gt;
&lt;li&gt;Continue a quick chat even after deciding it needs a full workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just a list of shiny features. These are actual developer pain points getting solved.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features — What's New and Why It's Useful
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ Automations (Preview): Let the Agent Handle the Routine Stuff
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Setting:&lt;/strong&gt; &lt;code&gt;chat.automations.enabled&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You know those Monday morning tasks that are the same every single week? Checking what changed over the weekend, scanning for new bugs, triaging open issues? You can now schedule a Copilot agent task to handle those automatically — hourly, daily, or weekly.&lt;/p&gt;

&lt;p&gt;You pick a template (catching up on changes, triaging issues, finding bugs) or write your own prompt. Set the schedule. Done.&lt;/p&gt;

&lt;p&gt;This is genuinely one of those features where the first time it runs and saves you 20 minutes, you'll wonder how you worked without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to try it:&lt;/strong&gt; Enable &lt;code&gt;chat.automations.enabled&lt;/code&gt;, open the Agents window, and select &lt;strong&gt;Automations&lt;/strong&gt; in the sidebar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Automations is in Preview and rolling out gradually.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🎙️ Voice Mode (Experimental): Talk to Your Agent Like a Human
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Setting:&lt;/strong&gt; &lt;code&gt;agents.voice.enabled&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is the feature people will demo at meetups. Voice Mode lets you have a real spoken conversation with the Copilot agent while it works on your code.&lt;/p&gt;

&lt;p&gt;And the useful part? You can &lt;strong&gt;interrupt it&lt;/strong&gt;. While the agent is speaking or working, you can jump in with a new instruction or correction — just like you would with a teammate. No waiting for it to finish before you can redirect it.&lt;/p&gt;

&lt;p&gt;You can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show a live transcript in the chat input (&lt;code&gt;agents.voice.showTranscript&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Choose which voice reads responses aloud (&lt;code&gt;agents.voice.voice&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Pick your input microphone from the Command Palette&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's aware of your active session too — so you can ask things like "which model are we using?" or "what files are attached?" and it'll answer correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to try it:&lt;/strong&gt; Enable &lt;code&gt;agents.voice.enabled&lt;/code&gt;, then select the Voice Mode button in the chat input.&lt;/p&gt;




&lt;h3&gt;
  
  
  🐙 GitHub Issues and Pull Requests, Right in the Agents Window (Experimental)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Setting:&lt;/strong&gt; &lt;code&gt;extensions.experimental.enableAgentsWindowCapability&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This one is a workflow changer for teams using GitHub.&lt;/p&gt;

&lt;p&gt;Normally, when a chat conversation references a GitHub issue or PR, you'd click the link, open it in the browser, read through it, come back. VS Code 1.137 removes that detour. Select a &lt;code&gt;github.com&lt;/code&gt; issue or pull request link and its details open &lt;strong&gt;directly in the Agents window&lt;/strong&gt; — even if the repository isn't open locally.&lt;/p&gt;

&lt;p&gt;You can also add GitHub issues or pull requests as context using the &lt;strong&gt;Add Context...&lt;/strong&gt; menu in any chat input. The description, comments, or PR changes become available to the agent without you copy-pasting anything.&lt;/p&gt;

&lt;p&gt;Or paste a GitHub URL directly into the chat — VS Code automatically adds it as a context attachment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To enable:&lt;/strong&gt; Install the GitHub Pull Requests extension and enable &lt;code&gt;extensions.experimental.enableAgentsWindowCapability&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Continue Quick Chats in a Workspace
&lt;/h3&gt;

&lt;p&gt;This one's subtle but genuinely useful.&lt;/p&gt;

&lt;p&gt;You start a quick chat to explore an idea — maybe you're not sure if it's project-specific yet. The conversation develops, and it turns out you do need access to project files. &lt;/p&gt;

&lt;p&gt;Before, you'd have to start over in a workspace session and lose your chat history. Now, you just ask the Copilot agent to attach a local folder. After you confirm, the chat converts into a workspace session — keeping its &lt;strong&gt;title, conversation history, and current request&lt;/strong&gt;. The agent picks up right where it left off, now with access to your files.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Agent Host and Parallel Agent Workflows
&lt;/h3&gt;

&lt;p&gt;VS Code 1.137 introduces a few important agent infrastructure improvements worth knowing about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-queued messages&lt;/strong&gt; let you keep agents working in parallel. If an agent tries to contact a busy chat, VS Code queues the message and processes it in order once the active turn finishes. No interruptions, no lost messages.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;agent host&lt;/strong&gt; lets you connect to the same agent session from multiple VS Code windows. It runs agent harnesses in a dedicated process and aligns behavior with the Copilot CLI and the standalone GitHub Copilot app.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔀 Smart Diff Editor and Binary Files in Diffs
&lt;/h3&gt;

&lt;p&gt;Small but polished improvements to the diff editor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can now choose Inline, Side by Side, or Automatic layout consistently across regular diffs, multi-file diffs, and the Agents window Changes editor.&lt;/li&gt;
&lt;li&gt;Binary files (like images) now &lt;strong&gt;stay visible&lt;/strong&gt; in multi-file diffs instead of disappearing. You'll see a "Binary file changed" placeholder, and you can select &lt;strong&gt;Open Diff&lt;/strong&gt; to review the file properly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔗 GitHub Rich Links in the Markdown Editor (Experimental)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Settings:&lt;/strong&gt; &lt;code&gt;markdown.experimental.richLinks.enabled&lt;/code&gt;, &lt;code&gt;chat.experimental.richLinks.enabled&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Paste a GitHub issue or PR link in your Markdown editor and it shows the &lt;strong&gt;current title and status&lt;/strong&gt; inline — including CI updates. No more opening the browser just to check if an issue is still open or a PR was merged.&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;chat.experimental.richLinks.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; to get the same behavior in chat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before vs. After: How 1.137 Changes Your Daily Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Before 1.137&lt;/th&gt;
&lt;th&gt;After 1.137&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weekly issue triage&lt;/td&gt;
&lt;td&gt;Manual, every time&lt;/td&gt;
&lt;td&gt;Scheduled automation handles it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirect an agent mid-task&lt;/td&gt;
&lt;td&gt;Wait for it to finish&lt;/td&gt;
&lt;td&gt;Interrupt with Voice Mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review a PR in a chat context&lt;/td&gt;
&lt;td&gt;Open browser, copy info, paste back&lt;/td&gt;
&lt;td&gt;Add as context or click the link in Agents window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick chat → workspace&lt;/td&gt;
&lt;td&gt;Restart conversation&lt;/td&gt;
&lt;td&gt;Continue same chat, history intact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary file in multi-file diff&lt;/td&gt;
&lt;td&gt;Invisible — just missing&lt;/td&gt;
&lt;td&gt;Placeholder shown, Open Diff available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub link in Markdown&lt;/td&gt;
&lt;td&gt;Just a URL&lt;/td&gt;
&lt;td&gt;Live title and status inline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Practical Tips for Getting the Most Out of VS Code 1.137
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Do's&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enable Automations for recurring tasks first.&lt;/strong&gt; Start with one of the built-in templates. See what it does automatically before writing your own prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try Voice Mode with a clear workspace.&lt;/strong&gt; It works best when you have a session active and files attached. Give it a focused task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install the GitHub Pull Requests extension&lt;/strong&gt; before trying the Agents window GitHub integration. It's required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Add Context from the chat menu&lt;/strong&gt; when discussing GitHub issues. It's cleaner than copy-pasting descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update to 1.137 immediately&lt;/strong&gt; using Check for Updates, or download the Insiders build if you want the latest features even earlier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;❌ Don'ts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't expect Voice Mode to replace the keyboard entirely — it's a conversation layer, not a full replacement.&lt;/li&gt;
&lt;li&gt;Don't skip reading the automation output. Even scheduled agent tasks need a human review occasionally.&lt;/li&gt;
&lt;li&gt;Don't paste GitHub URLs into chat expecting context without the GitHub Pull Requests extension installed.&lt;/li&gt;
&lt;li&gt;Don't use the Agents window GitHub integration without enabling &lt;code&gt;extensions.experimental.enableAgentsWindowCapability&lt;/code&gt; first — nothing will work.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes Developers Make with New VS Code Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Enabling everything at once and getting confused
&lt;/h3&gt;

&lt;p&gt;It's tempting to flip on every experimental setting and see what happens. The problem is, when something doesn't work as expected, you won't know why. Enable features one at a time so you understand what each one does.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ignoring the "rolling out gradually" note
&lt;/h3&gt;

&lt;p&gt;Some features in 1.137, like Automations, are not available to everyone on day one. If you enable the setting and don't see the feature, wait a day or check the Insiders build.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Writing automation prompts that are too vague
&lt;/h3&gt;

&lt;p&gt;"Check things" is not a useful automation prompt. "Summarize any new issues opened in the last 24 hours and flag ones labeled 'bug'" is. The agent follows the prompt you give it. Be specific.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Forgetting to install the required extension
&lt;/h3&gt;

&lt;p&gt;The GitHub integration in the Agents window needs the &lt;strong&gt;GitHub Pull Requests extension&lt;/strong&gt; installed in your &lt;strong&gt;default VS Code profile&lt;/strong&gt;. If you use separate profiles, make sure it's in the right one.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Not trying the quick-chat-to-workspace transition
&lt;/h3&gt;

&lt;p&gt;This feature is easy to overlook because it solves a problem you might not realize you're having. Next time you start a quick chat that grows into something project-specific, try attaching a workspace instead of starting over.&lt;/p&gt;




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

&lt;p&gt;VS Code 1.137 is a thoughtful release. It's not just adding features for the sake of it — it's solving the annoying, repetitive, context-switching parts of a developer's day.&lt;/p&gt;

&lt;p&gt;Scheduled automations mean your routine tasks can run without you. Voice Mode means you can direct the agent without stopping to type. GitHub integration means you never have to leave your editor to check an issue. And continuing quick chats in a workspace means your conversational momentum doesn't get lost when work gets real.&lt;/p&gt;

&lt;p&gt;It's a genuinely good update. 😊&lt;/p&gt;

&lt;p&gt;Give it a try, explore the experimental features, and see which ones fit naturally into your workflow. Chances are at least two of them will stick.&lt;/p&gt;

&lt;p&gt;If you found this helpful, share it with a teammate who still manually triages issues every Monday morning. They'll thank you.&lt;/p&gt;

&lt;p&gt;For more practical dev tutorials, tools, and blog posts like this, head over to &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — there's plenty more where this came from. 🔧&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>VS Code 1.134 Is Here — Side-by-Side Chats, Prompt Timeline, and More Features You'll Actually Use</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Thu, 20 Aug 2026 09:03:11 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vs-code-1134-is-here-side-by-side-chats-prompt-timeline-and-more-features-youll-actually-use-2ck2</link>
      <guid>https://dev.to/hamidrazadev/vs-code-1134-is-here-side-by-side-chats-prompt-timeline-and-more-features-youll-actually-use-2ck2</guid>
      <description>&lt;p&gt;If you've ever scrolled forever trying to find something you typed ten minutes ago in a long chat session... VS Code 1.134 just heard your pain. 😅&lt;/p&gt;

&lt;p&gt;Released on &lt;strong&gt;August 19, 2026&lt;/strong&gt;, this update is one of those rare releases that feels like the team was watching over your shoulder while you worked. It fixes small but real annoyances, adds tools for managing complex agent sessions, and makes the whole editor feel a bit more like a smart workspace and less like a blank canvas you have to fight every day.&lt;/p&gt;

&lt;p&gt;So what exactly changed? Let's break it down in plain English.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VS Code 1.134?
&lt;/h2&gt;

&lt;p&gt;Visual Studio Code is the most popular free code editor in the world. Millions of developers use it daily — from students writing their first Python script to professionals building large-scale apps.&lt;/p&gt;

&lt;p&gt;Every month or so, the VS Code team ships a new version packed with bug fixes, performance improvements, and new features. Version &lt;strong&gt;1.134&lt;/strong&gt; is the latest of those updates, focused on three main areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt; — how VS Code handles AI-powered sessions and multi-window workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat&lt;/strong&gt; — organizing and navigating your conversations with AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor Experience&lt;/strong&gt; — small quality-of-life improvements that make daily work smoother&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think of it like a phone software update — except instead of fixing battery drain, it fixes the things that slow you down while writing code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Update Matters
&lt;/h2&gt;

&lt;p&gt;AI-powered coding tools have become a normal part of most developers' workflows. But as those tools get more powerful, the conversations get longer, the sessions get more complex, and managing everything becomes its own challenge.&lt;/p&gt;

&lt;p&gt;VS Code 1.134 addresses that challenge head-on.&lt;/p&gt;

&lt;p&gt;If you've used GitHub Copilot inside VS Code for any extended session, you know the feeling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're mid-task and can't remember what you asked earlier&lt;/li&gt;
&lt;li&gt;You want to compare two different agent responses&lt;/li&gt;
&lt;li&gt;You made a bunch of file changes but can't trace which prompt caused them&lt;/li&gt;
&lt;li&gt;You need to find a specific line from your conversation but scrolling takes forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This release tackles all of those problems — not with flashy features, but with practical, focused solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features in VS Code 1.134 — With Real-Life Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🗂️ Side-by-Side Chats (Grid Layout)
&lt;/h3&gt;

&lt;p&gt;Imagine you're comparing two approaches for the same problem. You ask the agent one way, then another. But switching between those conversations constantly is frustrating — like flipping between two browser tabs when you wish you could just split the screen.&lt;/p&gt;

&lt;p&gt;VS Code 1.134 lets you do exactly that. You can now &lt;strong&gt;arrange chats in horizontal or vertical groups&lt;/strong&gt; inside a session. Drag a chat — or a subagent chat — into a group and view them side by side.&lt;/p&gt;

&lt;p&gt;You can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hold &lt;code&gt;Alt&lt;/code&gt; and click a chat in the Chats picker to open it directly to the side&lt;/li&gt;
&lt;li&gt;Create a "side chat" to start a fresh conversation beside your current one&lt;/li&gt;
&lt;li&gt;Restore the exact same layout when you reload the window or return to the session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is genuinely useful when you're running parallel tasks or comparing results from different agent prompts without losing context.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. ⏱️ Prompt Timeline
&lt;/h3&gt;

&lt;p&gt;Long agent sessions are powerful — but they also produce a wall of conversation that's hard to navigate. Which prompt caused those file changes? Where did you start exploring that feature? Which earlier idea should you revisit?&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Prompt Timeline&lt;/strong&gt; solves this with a clean timeline in the transcript gutter of the Agents window. Each dot represents one of your prompts. The highlighted dot shows where you are right now.&lt;/p&gt;

&lt;p&gt;Hover over the timeline to see a list of your prompts. Click one to jump to it instantly. And if a prompt changed any files, the timeline shows you exactly &lt;strong&gt;how many lines were added or removed&lt;/strong&gt; — and lets you open the diff right there.&lt;/p&gt;

&lt;p&gt;You can control how the timeline appears using the &lt;code&gt;sessions.chatTimeline.display&lt;/code&gt; setting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ruler&lt;/code&gt; — shows the timeline beside the scrollbar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;off&lt;/code&gt; — hides it completely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like a chapter list for your agent session. You can finally stop scrolling through everything just to find where you were.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. 🔍 Find in Chat
&lt;/h3&gt;

&lt;p&gt;This one is simple but long overdue.&lt;/p&gt;

&lt;p&gt;You can now use &lt;code&gt;workbench.action.chat.find&lt;/code&gt; to &lt;strong&gt;search your entire conversation&lt;/strong&gt; — including content that's not currently visible on screen. It works in the Chat view, chat editors, and the Agents window.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Case-sensitive matching&lt;/li&gt;
&lt;li&gt;Whole-word matching&lt;/li&gt;
&lt;li&gt;Regular expressions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you jump to a match, VS Code scrolls it into view and even &lt;strong&gt;expands collapsed work summaries&lt;/strong&gt; if the match is inside them.&lt;/p&gt;

&lt;p&gt;If you've ever said "I know I typed this somewhere earlier..." — this feature is for you.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. 🌐 Open HTML Files in the Integrated Browser by Default
&lt;/h3&gt;

&lt;p&gt;Frontend developers, this one's for you.&lt;/p&gt;

&lt;p&gt;If your workflow involves frequently previewing local HTML files rather than editing them, you can now set the &lt;strong&gt;integrated browser as the default editor&lt;/strong&gt; for HTML files. Configure it through &lt;code&gt;workbench.editorAssociations&lt;/code&gt; or directly from the editor header.&lt;/p&gt;

&lt;p&gt;The integrated browser works just like a standalone browser tab — but it stays connected to your HTML file. Any links inside the file open in new tabs so the association is preserved.&lt;/p&gt;

&lt;p&gt;No more switching to Chrome just to check if your layout looks right. 💡&lt;/p&gt;




&lt;h3&gt;
  
  
  5. 🏠 Agent Host — Connect Multiple Windows to One Session
&lt;/h3&gt;

&lt;p&gt;This is a more advanced feature, but worth knowing about.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Agent Host&lt;/strong&gt; lets you connect to the same agent session from multiple VS Code windows. It runs agent processes in a dedicated environment using the Agent Host Protocol (AHP), and the Copilot agent inside it is powered by the Copilot SDK — so its behavior is consistent with the CLI, the standalone Copilot app, and other Copilot tools.&lt;/p&gt;

&lt;p&gt;If you work across multiple monitors or windows, this means your agent session doesn't have to be isolated to one window. You can attach to it from wherever you're working.&lt;/p&gt;

&lt;p&gt;The feature is still actively being developed, and the team is welcoming feedback through GitHub issues.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. 🪟 Improved Side Pane Layout
&lt;/h3&gt;

&lt;p&gt;The single-pane layout now follows your &lt;code&gt;workbench.editor.showTabs&lt;/code&gt; setting more naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With &lt;strong&gt;multiple tabs&lt;/strong&gt; visible, the layout stays familiar&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;single&lt;/strong&gt; or &lt;strong&gt;none&lt;/strong&gt; settings, a compact single-title header takes over — much cleaner for minimal setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Text file editors in this mode now use &lt;strong&gt;file breadcrumbs in the header&lt;/strong&gt;, just like the Changes editor — so you always know exactly what you're looking at.&lt;/p&gt;

&lt;p&gt;The side pane also holds its size and visibility when you switch between sessions. No more unexpected layout jumps.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. ✖️ Close Other Editors with Alt+Click
&lt;/h3&gt;

&lt;p&gt;Small feature, real time-saver.&lt;/p&gt;

&lt;p&gt;You know how you sometimes end up with eight tabs open and you just want to keep one? Normally you'd right-click a tab and dig through a context menu.&lt;/p&gt;

&lt;p&gt;Now you can just hold &lt;code&gt;Alt&lt;/code&gt; and the close button on any tab &lt;strong&gt;transforms into "Close Other Editors"&lt;/strong&gt;. Click it, and every other tab closes except the one you clicked on.&lt;/p&gt;

&lt;p&gt;That's it. Clean and fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before vs. After — What Actually Changed for Daily Work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Before 1.134&lt;/th&gt;
&lt;th&gt;After 1.134&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comparing two agent responses&lt;/td&gt;
&lt;td&gt;Open one, close it, open the other&lt;/td&gt;
&lt;td&gt;Drag both into a side-by-side group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finding an earlier prompt&lt;/td&gt;
&lt;td&gt;Scroll through the whole session&lt;/td&gt;
&lt;td&gt;Jump directly using the Prompt Timeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Searching conversation history&lt;/td&gt;
&lt;td&gt;Manual scrolling&lt;/td&gt;
&lt;td&gt;Ctrl+F style search with regex support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Previewing HTML files&lt;/td&gt;
&lt;td&gt;Switch to an external browser&lt;/td&gt;
&lt;td&gt;Use the integrated browser as default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keeping one tab, closing the rest&lt;/td&gt;
&lt;td&gt;Right-click → context menu&lt;/td&gt;
&lt;td&gt;Alt+click the close button&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these changes are dramatic on their own. But together they remove a surprising amount of friction from the daily workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips and Do's &amp;amp; Don'ts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable the Prompt Timeline (&lt;code&gt;sessions.chatTimeline.display: ruler&lt;/code&gt;) if you run long agent sessions — it pays off immediately&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Alt+click&lt;/code&gt; on chat items in the Chats picker to open them to the side instead of navigating away&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;workbench.editorAssociations&lt;/code&gt; for HTML if you're a frontend developer previewing files regularly&lt;/li&gt;
&lt;li&gt;Check for updates manually if you want 1.134 now — VS Code rolls out updates gradually, so use &lt;strong&gt;Help → Check for Updates&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;❌ Don't:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ignore the Agent Host documentation if you work with multiple windows — it's worth a quick read&lt;/li&gt;
&lt;li&gt;Forget that the Find in Chat tool supports regex — it's more powerful than a plain text search&lt;/li&gt;
&lt;li&gt;Close the side pane between sessions if you're actively comparing chats — 1.134 now preserves its size and position&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Waiting for the update to appear automatically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;VS Code uses a gradual rollout, so not everyone gets the update on day one. If you want 1.134 right now, go to &lt;code&gt;Help → Check for Updates&lt;/code&gt; and grab it manually. Waiting and wondering why you don't see the new features is a common time-waster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Overlooking the Prompt Timeline setting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Prompt Timeline defaults to showing beside the scrollbar. If you don't see it, check &lt;code&gt;sessions.chatTimeline.display&lt;/code&gt; in your settings. Some users enable the single-pane layout without realizing the timeline is available — don't miss it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Not using Find in Chat for long conversations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's natural to scroll when looking for something — because that's how we've always done it. But the new Find in Chat works across the entire conversation, including collapsed summaries. Make it a habit early so you stop wasting time scrolling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Forgetting that the Agent Host is still in development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Agent Host is genuinely useful, but it's early stage. If something doesn't work as expected, file an issue rather than assuming it's a permanent limitation. The team is actively improving it.&lt;/p&gt;




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

&lt;p&gt;VS Code 1.134 is not a "wow, everything changed" release. But it is a &lt;strong&gt;well-thought-out, practical improvement&lt;/strong&gt; to how you work with AI-powered sessions, long conversations, and everyday editor tasks.&lt;/p&gt;

&lt;p&gt;Side-by-side chats, the Prompt Timeline, Find in Chat, HTML preview by default, the Alt+click tab shortcut — each of these is small on its own. But if you spend hours every day in VS Code, these are exactly the kinds of improvements that add up.&lt;/p&gt;

&lt;p&gt;The team is clearly paying attention to how developers actually use the editor — not just adding features, but fixing the rough edges. 🚀&lt;/p&gt;

&lt;p&gt;If you want to try the latest features before the next stable release, grab the &lt;a href="https://code.visualstudio.com/insiders/" rel="noopener noreferrer"&gt;Insiders build&lt;/a&gt; — it gets updates as soon as they're ready.&lt;/p&gt;




&lt;p&gt;👉 &lt;strong&gt;Want more posts like this?&lt;/strong&gt; I cover the latest in VS Code, frontend development, and developer tools at &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;. Come check it out, and if this post saved you some time, share it with a developer friend who might find it useful. ✌️&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Vibe Coding Is Fun — But It Might Be Quietly Ruining Your Learning Journey 🚨</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Wed, 19 Aug 2026 07:15:21 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vibe-coding-is-fun-but-it-might-be-quietly-ruining-your-learning-journey-3o9k</link>
      <guid>https://dev.to/hamidrazadev/vibe-coding-is-fun-but-it-might-be-quietly-ruining-your-learning-journey-3o9k</guid>
      <description>&lt;p&gt;You open your laptop. You have a project idea. You type it into an AI tool. It spits out 200 lines of working code. You paste it in. It runs perfectly.&lt;/p&gt;

&lt;p&gt;You feel like a genius. 🚀&lt;/p&gt;

&lt;p&gt;But here is the thing — do you actually know what just happened? Can you explain any of that code? Could you fix it if it broke tomorrow? Could you write even 10 lines of it yourself?&lt;/p&gt;

&lt;p&gt;If your honest answer is "not really," then welcome to the trap that is quietly swallowing an entire generation of beginner developers.&lt;/p&gt;

&lt;p&gt;We need to talk about vibe coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Vibe Coding, Exactly?
&lt;/h2&gt;

&lt;p&gt;Vibe coding is a style of programming where you describe what you want in plain English, let an AI tool generate the code for you, and keep going without deeply understanding what was written.&lt;/p&gt;

&lt;p&gt;The term got popular because it matches a certain feeling — you are in flow, things are getting built, you feel productive. You are vibing.&lt;/p&gt;

&lt;p&gt;Think of it like ordering food at a restaurant by just saying "surprise me" every single time. The food might taste great. But you will never learn to cook.&lt;/p&gt;

&lt;p&gt;Vibe coding is not the same as using AI to help you learn or speed up repetitive work. There is a real difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Using AI as a tool while understanding the output&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using AI as a crutch that replaces understanding entirely&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vibe coding is the second one. And for beginners, it is a serious problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More Than People Admit
&lt;/h2&gt;

&lt;p&gt;Most beginners start coding because they want to build things. That is a great motivation.&lt;/p&gt;

&lt;p&gt;But building things and understanding things are not the same. When you are learning to drive, someone can steer the wheel for you while you sit in the seat. You might reach your destination. But you have not learned to drive.&lt;/p&gt;

&lt;p&gt;Vibe coding gives beginners the destination without the journey. And the journey is literally where the learning happens.&lt;/p&gt;

&lt;p&gt;Programming is not a collection of finished code snippets. It is a way of thinking. It is logic, problem-solving, pattern recognition, debugging, and understanding how things connect. None of that grows when you skip the thinking step.&lt;/p&gt;

&lt;p&gt;The market does not care how fast your AI can generate code. It cares whether &lt;strong&gt;you&lt;/strong&gt; can solve problems, adapt when things break, and build things that actually work.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Vibe Coding Quietly Damages Beginner Growth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. You Skip the Struggle — And the Struggle Is the Lesson
&lt;/h3&gt;

&lt;p&gt;There is a reason teachers give you practice problems instead of just showing you the answer. The struggle is not a bug in learning. It is the feature.&lt;/p&gt;

&lt;p&gt;When you sit with a problem, try different approaches, fail a few times, and finally figure it out — that is when your brain actually builds a mental model. That model sticks.&lt;/p&gt;

&lt;p&gt;Vibe coding removes the struggle entirely. You never build the model. So two weeks later, you cannot remember how to write a simple loop. And that is not laziness. It is just how learning works.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You Cannot Debug What You Do Not Understand
&lt;/h3&gt;

&lt;p&gt;Here is a scenario every vibe coder eventually faces.&lt;/p&gt;

&lt;p&gt;The AI-generated code works on day one. On day five, something breaks. You ask the AI to fix it. It gives you updated code. That breaks something else. You are now in a loop of asking, pasting, and hoping — with no idea what is actually going wrong.&lt;/p&gt;

&lt;p&gt;Debugging requires understanding. If you do not know what a piece of code is supposed to do, you cannot figure out why it is not doing it.&lt;/p&gt;

&lt;p&gt;Beginners who vibe code end up paralyzed the moment something does not work. They have no foundation to fall back on.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. You Develop Zero Problem-Solving Instincts
&lt;/h3&gt;

&lt;p&gt;A senior developer looks at a broken feature and knows roughly where to start looking. They read an error message and already have a mental shortlist of suspects. That instinct is built over years of actually solving problems.&lt;/p&gt;

&lt;p&gt;Vibe coding replaces your problem-solving loop with an AI-prompting loop. Instead of "why is this happening and how do I fix it," the thought becomes "let me paste this error into ChatGPT."&lt;/p&gt;

&lt;p&gt;That sounds convenient. And sometimes it is. But when you have never trained your own instincts, you have no backup when the AI fails you — and it will fail you.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. You Miss the Connections Between Concepts
&lt;/h3&gt;

&lt;p&gt;Programming is not a list of isolated facts. Everything connects. Variables relate to functions. Functions relate to scope. Scope relates to closures. Closures relate to async behavior. And so on.&lt;/p&gt;

&lt;p&gt;When you vibe code, you jump straight to output without tracing those connections. You end up with a patchwork of half-understood pieces that do not form a real picture.&lt;/p&gt;

&lt;p&gt;At some point, every developer needs to build something complex. That is when the gaps in understanding show up all at once — and it is overwhelming.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. You Build a False Confidence That Eventually Cracks
&lt;/h3&gt;

&lt;p&gt;This one hurts the most.&lt;/p&gt;

&lt;p&gt;Beginners who vibe code often feel more confident than those who struggle honestly. They have projects. They have demos. They can share links.&lt;/p&gt;

&lt;p&gt;But put them in a technical interview or a real team environment where they need to explain their code, extend it, or write something from scratch — and the confidence shatters.&lt;/p&gt;

&lt;p&gt;That moment is genuinely painful. And it is avoidable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vibe Coding vs. Intentional AI-Assisted Learning
&lt;/h2&gt;

&lt;p&gt;Let's be honest — AI tools are here to stay. Refusing to use them is not the answer. The answer is using them the right way.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Intentional AI-Assisted Learning&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Paste code without reading it&lt;/td&gt;
&lt;td&gt;Read every line and understand what it does&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use AI to avoid thinking&lt;/td&gt;
&lt;td&gt;Use AI to check your thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skip errors by asking AI to rewrite&lt;/td&gt;
&lt;td&gt;Debug errors yourself first, then consult AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build projects without knowing the concepts&lt;/td&gt;
&lt;td&gt;Learn concepts first, use AI to speed up practice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cannot explain your own code&lt;/td&gt;
&lt;td&gt;Can walk anyone through what you wrote&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The difference is not the tool. It is your relationship with the output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Tips for Beginners Who Want to Actually Learn 💡
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do these things:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Write code by hand first, even if it is slow and painful&lt;/li&gt;
&lt;li&gt;✅ When you use AI-generated code, read every single line and look up what you do not understand&lt;/li&gt;
&lt;li&gt;✅ Try to rebuild the AI's solution yourself after studying it&lt;/li&gt;
&lt;li&gt;✅ Use AI to explain concepts, not to replace your understanding of them&lt;/li&gt;
&lt;li&gt;✅ Keep a learning journal — write down what you figured out today in your own words&lt;/li&gt;
&lt;li&gt;✅ Solve at least a few practice problems every week without AI help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avoid these habits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Pasting code you have never read into your project&lt;/li&gt;
&lt;li&gt;❌ Moving on from a topic the moment the code "works"&lt;/li&gt;
&lt;li&gt;❌ Using AI as your first response to every problem&lt;/li&gt;
&lt;li&gt;❌ Building portfolios full of projects you cannot explain&lt;/li&gt;
&lt;li&gt;❌ Skipping fundamentals because AI can handle them&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes Beginners Make With Vibe Coding
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Treating working code as understood code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code running without errors is not the same as code you understand. A lot of beginners make this assumption and end up building on a foundation they do not actually have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: Jumping to complex projects too early&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vibe coding makes it easy to build things that look impressive but require zero understanding. Beginners think they are ready for advanced work when they have not even covered the basics. The gap catches up with them fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3: Replacing learning resources with AI chat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Documentation, courses, and tutorials are designed to build knowledge step by step. AI answers are designed to be immediately useful. Those are different goals. Relying only on AI chat for learning skips the structured progression that actually builds skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 4: Never reading error messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Error messages are not obstacles. They are information. Beginners who vibe code often stop reading error messages entirely because they just paste them into AI. Over time, they lose the ability to interpret them. Error messages are one of the most valuable debugging tools you have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 5: Assuming AI-generated code is always correct&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI tools make mistakes. They use outdated syntax. They misunderstand context. They generate code that looks right but has subtle bugs. A developer who does not understand the code cannot catch those mistakes — and ships broken software.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, Is Vibe Coding Completely Bad?
&lt;/h2&gt;

&lt;p&gt;No. That would be a lazy take.&lt;/p&gt;

&lt;p&gt;Vibe coding has a place. For experienced developers, it is a productivity tool. For people building internal prototypes, it can speed things up. For exploring an unfamiliar technology, it can show you what is possible before you dig in.&lt;/p&gt;

&lt;p&gt;But for someone who is still learning? For someone who has not yet built a mental model of how programming actually works?&lt;/p&gt;

&lt;p&gt;Vibe coding at that stage is like using a calculator before you understand math. You get the right answers. You learn nothing.&lt;/p&gt;

&lt;p&gt;The phase where you struggle with concepts, write bad code, break things, and fix them slowly — that phase is not something to escape. It is the phase where you actually become a developer. Skip it, and you skip the most important part of the whole journey.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note of Encouragement 😊
&lt;/h2&gt;

&lt;p&gt;If you have been vibe coding and you are reading this feeling a little uncomfortable — that is okay. Recognizing the problem is the first step.&lt;/p&gt;

&lt;p&gt;You do not have to throw away your AI tools. You just have to change how you use them.&lt;/p&gt;

&lt;p&gt;Slow down. Read the code. Ask yourself why it works. Try writing it yourself. Break it on purpose and figure out how to fix it. That is what learning actually looks like.&lt;/p&gt;

&lt;p&gt;The developers who will stand out in the next few years are not the ones who best know how to prompt AI. They are the ones who understand programming deeply enough to work with AI intelligently.&lt;/p&gt;

&lt;p&gt;That kind of understanding does not come from vibing. It comes from doing the real work.&lt;/p&gt;

&lt;p&gt;You have got this. 💪&lt;/p&gt;




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

&lt;p&gt;Vibe coding feels productive. It delivers results fast. And for experienced developers, it genuinely is a useful approach. But for beginners who are still building foundational skills, it removes the very process that creates those skills.&lt;/p&gt;

&lt;p&gt;The learning phase is not a hurdle to get past. It is the whole point.&lt;/p&gt;

&lt;p&gt;Use AI tools. Explore them. But use them as a supplement to your learning, not a replacement for it. Read the code you use. Understand what you build. Debug your own problems. Build slow, and build well.&lt;/p&gt;

&lt;p&gt;Your future self — the one sitting in a real interview, working on a real product, solving a real problem — will thank you for it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want more honest takes on the developer journey? Head over to *&lt;/em&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;** for more practical articles just like this one. If this post made you think, share it with a fellow beginner who needs to hear it. Drop a comment below — have you caught yourself vibe coding? How did you course-correct? 👇*&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>VS Code 1.133 Is Here — And These 4 New Features Will Change How You Code</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Fri, 14 Aug 2026 10:37:39 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vs-code-1133-is-here-and-these-4-new-features-will-change-how-you-code-21e8</link>
      <guid>https://dev.to/hamidrazadev/vs-code-1133-is-here-and-these-4-new-features-will-change-how-you-code-21e8</guid>
      <description>&lt;p&gt;VS Code just dropped another update. 🚀&lt;/p&gt;

&lt;p&gt;If you've been opening the editor every single day and feeling like something could be smoother, faster, or just a little less annoying — this release has a few answers.&lt;/p&gt;

&lt;p&gt;VS Code 1.133 shipped on &lt;strong&gt;August 12, 2026&lt;/strong&gt;, and while it's not the most massive release in history, the features it brings are genuinely useful. Especially if you're working with AI agents, long chat conversations, or building HTML files and wanting instant feedback.&lt;/p&gt;

&lt;p&gt;So what actually changed? Let's break it down in plain, honest terms.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VS Code 1.133?
&lt;/h2&gt;

&lt;p&gt;VS Code (Visual Studio Code) is a free, open-source code editor made by Microsoft. It's one of the most popular tools for developers worldwide, and the team releases updates regularly with new features, fixes, and improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 1.133&lt;/strong&gt; is the latest stable release. It focuses on three main areas: AI agent flexibility, a better chat experience, and a smarter live browser preview.&lt;/p&gt;

&lt;p&gt;Nothing revolutionary on the surface — but when you're coding every day, small quality-of-life upgrades add up fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Matters
&lt;/h2&gt;

&lt;p&gt;Most developers don't celebrate small editor updates. You open the editor, see a "1.133 available" notification, click update, and move on.&lt;/p&gt;

&lt;p&gt;But skipping the release notes is how you miss features that could save you 10 minutes every day.&lt;/p&gt;

&lt;p&gt;Here's why 1.133 is worth your attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you use &lt;strong&gt;Claude or Copilot&lt;/strong&gt; for AI-assisted coding, you now have more provider flexibility.&lt;/li&gt;
&lt;li&gt;If you have &lt;strong&gt;long AI chat conversations&lt;/strong&gt;, you won't lose track of your prompts anymore.&lt;/li&gt;
&lt;li&gt;If you &lt;strong&gt;preview HTML locally&lt;/strong&gt;, it now refreshes automatically on every save.&lt;/li&gt;
&lt;li&gt;And if GitHub authentication gets in your way, there's a new workaround for that too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small changes. Real impact.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 4 New Features Worth Knowing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Mix Anthropic and Copilot Models in a Single Claude Session
&lt;/h3&gt;

&lt;p&gt;This one is big if you use the Claude agent in VS Code.&lt;/p&gt;

&lt;p&gt;Previously, your Claude session was tied to one provider — either your &lt;strong&gt;GitHub Copilot subscription&lt;/strong&gt; or your own &lt;strong&gt;Claude API key&lt;/strong&gt;. If you wanted to switch, you had to reconfigure the entire agent host. That was annoying.&lt;/p&gt;

&lt;p&gt;Now, the model picker shows &lt;strong&gt;both groups at once&lt;/strong&gt;. You can switch between Anthropic models (billed to your API key) and Copilot models (billed to your Copilot subscription) between turns — without touching any settings.&lt;/p&gt;

&lt;p&gt;Think of it like switching between two toolkits mid-project without putting anything away first.&lt;/p&gt;

&lt;p&gt;This is especially useful when you want to try a different model for a specific task or compare outputs without interrupting your workflow.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Open the Agents Window Without GitHub Sign-In
&lt;/h3&gt;

&lt;p&gt;Setting: &lt;code&gt;chat.agentHost.allowSignedOutWhenUsable&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is marked &lt;strong&gt;experimental&lt;/strong&gt;, but it solves a real frustration.&lt;/p&gt;

&lt;p&gt;Before this, opening the Agents window always showed a GitHub sign-in prompt — and you couldn't dismiss it. If your machine couldn't reach &lt;code&gt;github.com&lt;/code&gt;, or you simply didn't need GitHub in your workflow, you were stuck staring at that screen.&lt;/p&gt;

&lt;p&gt;If you already had &lt;strong&gt;Claude configured with an API key&lt;/strong&gt;, you didn't need GitHub at all. But the editor forced you through the sign-in step anyway.&lt;/p&gt;

&lt;p&gt;With this new experimental setting enabled, the Agents window opens &lt;strong&gt;without the GitHub sign-in gate&lt;/strong&gt;. Authentication becomes per-agent or per-model instead of blocking the whole window.&lt;/p&gt;

&lt;p&gt;Right now this only works for Claude. Copilot with custom model keys and Codex support is planned for future releases.&lt;/p&gt;

&lt;p&gt;To enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"chat.agentHost.allowSignedOutWhenUsable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Sticky Scroll for Chat Prompts
&lt;/h3&gt;

&lt;p&gt;Setting: &lt;code&gt;chat.stickyScroll.enabled&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a simple feature, but once you use it, you'll wonder how you lived without it.&lt;/p&gt;

&lt;p&gt;If you've had a long back-and-forth conversation in the VS Code chat panel — asking Claude or Copilot to debug, refactor, explain, generate, and review code — you know how fast it gets overwhelming. You scroll down to read a response, and suddenly you've lost track of which question that response was even answering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sticky scroll for prompts&lt;/strong&gt; pins the last prompt you scrolled past to the top of the chat window. It shows you its position in the conversation, and you can click it to jump back or use the previous/next buttons to step through your prompts one by one.&lt;/p&gt;

&lt;p&gt;It works the same way as sticky scroll in the code editor — but for your chat history. 👀&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Auto-Reload HTML Files in the Integrated Browser
&lt;/h3&gt;

&lt;p&gt;Setting: &lt;code&gt;workbench.browser.autoReloadOnFileChange&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you've ever worked on a plain HTML file in VS Code and used the built-in browser preview, you know the pain. You save your file, switch to the preview, and... nothing changed. You have to manually reload it. Every. Single. Time.&lt;/p&gt;

&lt;p&gt;This feature kills that friction.&lt;/p&gt;

&lt;p&gt;Now, when you have a local HTML file open in the integrated browser, it &lt;strong&gt;refreshes automatically&lt;/strong&gt; whenever the file changes on disk. Save your file, and the preview updates immediately — no manual reload needed.&lt;/p&gt;

&lt;p&gt;You can toggle auto-reload per tab or set it globally using the setting above.&lt;/p&gt;

&lt;p&gt;It's a small thing. But if you're doing any kind of front-end work or quick HTML prototyping, it's a genuine time-saver.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Solves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mix Anthropic + Copilot models&lt;/td&gt;
&lt;td&gt;No more provider lock-in per session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents window without GitHub sign-in&lt;/td&gt;
&lt;td&gt;Unblocks users who don't need GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sticky scroll for chat prompts&lt;/td&gt;
&lt;td&gt;Never lose your place in long AI conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-reload HTML preview&lt;/td&gt;
&lt;td&gt;Instant feedback without manual refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Comparison: Before vs. After 1.133
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Claude with Multiple Providers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Pick one provider. Want to switch? Reconfigure the agent host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Both providers live in the same model picker. Switch mid-conversation. No reconfiguration needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML Preview Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Save → switch to preview → manually reload → check result → repeat forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Save → preview updates automatically. Done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long AI Chat Sessions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Scroll through 40 turns of conversation and lose track of which prompt a response belongs to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; The prompt sticks to the top of the screen. You always know where you are.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips for Getting the Most Out of 1.133
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Enable sticky scroll early.&lt;/strong&gt; If you use chat regularly, turn on &lt;code&gt;chat.stickyScroll.enabled&lt;/code&gt; right now. You'll notice the difference immediately in longer sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Try the unsigned Agents window if GitHub is slowing you down.&lt;/strong&gt; If you already use Claude via API key and GitHub sign-in is just friction, enable &lt;code&gt;chat.agentHost.allowSignedOutWhenUsable&lt;/code&gt; and simplify your workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use auto-reload for static HTML prototyping.&lt;/strong&gt; It's not just for agent edits — your own saved changes trigger the reload too. Great for quick mockups and style experiments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Explore the mixed model picker.&lt;/strong&gt; If you have both a Copilot subscription and a Claude API key, the new model picker makes switching between them genuinely easy. Test both on the same task and see which output suits you better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Update immediately if you want these features now.&lt;/strong&gt; VS Code 1.133 is rolling out gradually. Use &lt;strong&gt;Help → Check for Updates&lt;/strong&gt; in the editor to get it right away without waiting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❌ Ignoring experimental settings.&lt;/strong&gt; Features labeled "experimental" are still real, working features — they're just not fully finalized. The Agents-window-without-sign-in setting works today for Claude. Don't dismiss it just because of the label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Forgetting to enable settings.&lt;/strong&gt; A few features in this release (sticky scroll, auto-reload, unsigned agents) are &lt;strong&gt;not on by default&lt;/strong&gt;. If you're waiting to see these features magically appear, they won't. Open your settings and enable them manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Assuming mixed model support works for all agents.&lt;/strong&gt; Right now, switching providers mid-session only works within Claude sessions. It doesn't extend to every agent or configuration. Read the docs before expecting it everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Skipping the agent host documentation.&lt;/strong&gt; The agent host is getting more powerful with every release. If you're not familiar with it yet, the &lt;a href="https://code.visualstudio.com/docs" rel="noopener noreferrer"&gt;VS Code Agent Host documentation&lt;/a&gt; is worth a read.&lt;/p&gt;




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

&lt;p&gt;VS Code 1.133 isn't a flashy, headline-grabbing release. But it's a polished one.&lt;/p&gt;

&lt;p&gt;The ability to &lt;strong&gt;mix Anthropic and Copilot models&lt;/strong&gt; in a single session gives you real flexibility when working with AI tools. &lt;strong&gt;Sticky scroll for chat prompts&lt;/strong&gt; solves a genuine usability problem that grows worse the longer your conversations get. &lt;strong&gt;Auto-reload HTML preview&lt;/strong&gt; removes a small friction that adds up to a lot of lost seconds over a long day. And the &lt;strong&gt;unsigned Agents window&lt;/strong&gt; quietly removes a blocker for a whole group of developers who didn't need GitHub standing between them and their tools.&lt;/p&gt;

&lt;p&gt;Good tools get better in small steps. This release is exactly that.&lt;/p&gt;

&lt;p&gt;Update your editor, enable the settings that fit your workflow, and keep building.&lt;/p&gt;




&lt;p&gt;💡 Enjoyed this breakdown? More posts like this live at &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — practical dev content, tool breakdowns, and real-world tips.&lt;/p&gt;

&lt;p&gt;If this helped you, share it with a teammate who hasn't updated yet. Drop a comment if you've already tried any of these features — I'd love to hear what your experience has been like.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>CSS Container Queries: Write Truly Responsive Components (Finally!)</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Tue, 11 Aug 2026 07:32:46 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/css-container-queries-write-truly-responsive-components-finally-3bl4</link>
      <guid>https://dev.to/hamidrazadev/css-container-queries-write-truly-responsive-components-finally-3bl4</guid>
      <description>&lt;p&gt;Most of us have written media queries that felt... a little wrong. You're styling a card component, but you're checking the &lt;em&gt;viewport&lt;/em&gt; width to decide how it should look. The card lives inside a sidebar, though. So when the sidebar is narrow — even on a wide screen — your card still renders like it has all the space in the world. 🙃&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;CSS Container Queries fix exactly this. And if you haven't used them yet, this post will change how you think about responsive design.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are CSS Container Queries?
&lt;/h2&gt;

&lt;p&gt;Here's the simple version: &lt;strong&gt;a container query lets an element respond to the size of its &lt;em&gt;parent container&lt;/em&gt;, not the viewport.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of it like this. Imagine you're a chameleon. With media queries, you change color based on the weather outside — the whole environment. With container queries, you change color based on the &lt;em&gt;room you're standing in&lt;/em&gt;. Much more accurate. Much more useful.&lt;/p&gt;

&lt;p&gt;In code terms, you define a container, and then you write styles that activate based on how wide (or tall) that container is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&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;That's it. The &lt;code&gt;.card&lt;/code&gt; now adapts based on &lt;code&gt;.card-wrapper&lt;/code&gt;'s width, not the browser window.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Here's the problem with viewport-based media queries for components.&lt;/p&gt;

&lt;p&gt;You build a &lt;code&gt;ProductCard&lt;/code&gt; component. It looks great in the main content area. Then a designer drops it into a sidebar. Suddenly it breaks — because the sidebar is only 280px wide, but your media query triggers at 768px viewport width. The viewport is still wide. The component has no idea it's in a tight space.&lt;/p&gt;

&lt;p&gt;This is such a common frustration that developers have patched around it for years using JavaScript resize observers, custom hooks, or just making separate components. That's a lot of workarounds for something CSS should handle natively.&lt;/p&gt;

&lt;p&gt;Container queries &lt;em&gt;are&lt;/em&gt; the native solution. They've been in all major browsers since late 2023, and by 2025 browser support crossed 94%+. There is no good reason not to use them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits with Real-Life Examples
&lt;/h2&gt;

&lt;p&gt;Here's what container queries actually give you in day-to-day work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Truly reusable components.&lt;/strong&gt; A card component can live in a sidebar, a grid, a modal, or a full-width section — and style itself correctly in each case. You write it once. It works everywhere. ✅&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cleaner component code.&lt;/strong&gt; Instead of passing a &lt;code&gt;variant="compact"&lt;/code&gt; prop to a card just to handle narrow layouts, let CSS handle it. Your component logic stays focused on behavior, not presentation math.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better design systems.&lt;/strong&gt; Design system teams love this. A &lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Card&lt;/code&gt;, or &lt;code&gt;ListItem&lt;/code&gt; component can now be truly layout-agnostic. It adapts to wherever the design places it without needing every consuming team to override styles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less JavaScript.&lt;/strong&gt; Before container queries, libraries like &lt;code&gt;react-use-measure&lt;/code&gt; or custom &lt;code&gt;ResizeObserver&lt;/code&gt; hooks were common. Container queries replace most of those use cases with two lines of CSS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easier maintenance.&lt;/strong&gt; When styles live with the container instead of scattered across breakpoints at the page level, debugging is much faster. You open the component's CSS, not 400 lines of &lt;code&gt;@media&lt;/code&gt; rules. 🔧&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Media Queries vs Container Queries
&lt;/h2&gt;

&lt;p&gt;This comparison &lt;em&gt;does&lt;/em&gt; make sense here, because knowing when to use each one is the whole point.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Layout changes at the page level (header collapses, sidebar hides)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Media Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A component adapts based on where it's placed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Container Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typography scaling for the whole page&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Media Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A card switches from column to row layout in different contexts&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Container Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark mode, print styles&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Media Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A widget component used across multiple layout zones&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Container Query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Short version: &lt;strong&gt;page-level layout → media queries. Component-level layout → container queries.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will still use both. They solve different problems. Container queries don't replace media queries — they complete them.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use Container Queries (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Define the container
&lt;/h3&gt;

&lt;p&gt;Add &lt;code&gt;container-type&lt;/code&gt; to the parent element you want to query against.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&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;code&gt;inline-size&lt;/code&gt; means you're querying the &lt;em&gt;width&lt;/em&gt; of the container (which is the horizontal size in most writing modes). There's also &lt;code&gt;size&lt;/code&gt; if you want to query both width and height.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Optionally name the container
&lt;/h3&gt;

&lt;p&gt;Naming is useful when you have nested containers and need to query a specific ancestor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;container-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sidebar&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;Or shorthand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sidebar&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;inline-size&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;
  
  
  Step 3: Write your container query
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&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="c"&gt;/* Using a named container */&lt;/span&gt;
&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="n"&gt;sidebar&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&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;That's the full API for the most common use cases. There's also &lt;code&gt;max-width&lt;/code&gt;, &lt;code&gt;aspect-ratio&lt;/code&gt;, and &lt;code&gt;orientation&lt;/code&gt; queries available.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Do: Apply &lt;code&gt;container-type&lt;/code&gt; to the wrapper, not the component itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The container and the element being queried should be different elements. Querying your own size creates a circular reference. Wrap the component in a &lt;code&gt;div&lt;/code&gt; and apply &lt;code&gt;container-type&lt;/code&gt; there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Correct */&lt;/span&gt;
&lt;span class="nc"&gt;.card-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Avoid: the card querying itself */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* then @container styles for .card itself won't work as expected */&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;✅ Do: Use container queries for layout decisions, not content decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Swapping from a stacked layout to a side-by-side layout based on container width — great use case. Changing &lt;em&gt;text content&lt;/em&gt; based on container size — that's better handled in JavaScript or with conditional rendering in your framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Do: Combine with CSS custom properties for cleaner scaling.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--card-padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--card-padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&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="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--card-padding&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;✅ Do: Name your containers when nesting.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unnamed queries match the nearest ancestor container. When you have nested containers, name them to be explicit and avoid surprising style inheritance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Forgetting to set &lt;code&gt;container-type&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing a &lt;code&gt;@container&lt;/code&gt; query without first declaring &lt;code&gt;container-type&lt;/code&gt; on the parent does nothing. No error, no warning — just silence. This trips up almost everyone the first time. Always double-check the parent has the declaration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Querying the element that is also the container.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;.card&lt;/code&gt; has both &lt;code&gt;container-type: inline-size&lt;/code&gt; and &lt;code&gt;@container&lt;/code&gt; rules targeting &lt;code&gt;.card&lt;/code&gt;, you'll get unexpected behavior. The element cannot query its own size cleanly. Use a wrapper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Replacing media queries entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some developers get excited and try to remove all media queries. Don't. Page-level layout (navigation collapsing, footer restructuring, font scaling for the whole page) still belongs to media queries. Container queries handle &lt;em&gt;component&lt;/em&gt; layout. Know the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Not testing in all the layout positions the component lives in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The whole point of container queries is that your component adapts. But you need to actually test it in every context it'll be used — sidebar, main column, modal, full-width section. A component that works in isolation might still break somewhere in the app if you haven't checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Worrying about browser support when you don't need to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Container queries have strong support across Chrome, Edge, Firefox, and Safari. If you're not supporting very old browsers, you can use them today without polyfills. Check caniuse.com if you need to verify for your specific audience, but for most modern projects the answer is: go ahead. ⚡&lt;/p&gt;




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

&lt;p&gt;CSS Container Queries solve one of the longest-standing frustrations in responsive web development. The idea is simple: components should respond to &lt;em&gt;where they live&lt;/em&gt;, not just how big the screen is.&lt;/p&gt;

&lt;p&gt;If you've been shipping &lt;code&gt;variant&lt;/code&gt; props, &lt;code&gt;ResizeObserver&lt;/code&gt; hooks, or duplicated CSS just to handle components in different layout contexts — container queries are the cleaner answer you've been waiting for.&lt;/p&gt;

&lt;p&gt;The API is small. The browser support is solid. And once you start using it, you'll wonder how you built component libraries without it.&lt;/p&gt;

&lt;p&gt;Start with one component. Pick a card, a widget, or a sidebar item that behaves differently in different layouts. Replace that logic with a container query. See how it feels.&lt;/p&gt;

&lt;p&gt;Once you do, you probably won't go back. 🚀&lt;/p&gt;




&lt;p&gt;If this helped you, I'd love for you to share it with a dev friend who's still wrestling with layout props and media queries. More practical guides like this are on &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; — drop by anytime.&lt;/p&gt;

&lt;p&gt;Got questions or a use case you want to talk through? Leave a comment below. Happy to help.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>VS Code 1.132 Is Here — And It's Packed with Features You'll Actually Use 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Thu, 06 Aug 2026 09:26:56 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vs-code-1132-is-here-and-its-packed-with-features-youll-actually-use-2687</link>
      <guid>https://dev.to/hamidrazadev/vs-code-1132-is-here-and-its-packed-with-features-youll-actually-use-2687</guid>
      <description>&lt;p&gt;Have you ever wished you could ask a quick question without breaking your AI agent's flow? Or leave feedback on a web page element the same way you'd leave a comment in a PR? VS Code 1.132, released on &lt;strong&gt;August 5, 2026&lt;/strong&gt;, brings exactly those moments — and a handful more that quietly make your daily coding life smoother.&lt;/p&gt;

&lt;p&gt;Let's walk through everything new, and why it matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VS Code 1.132?
&lt;/h2&gt;

&lt;p&gt;Visual Studio Code 1.132 is the latest monthly release from the VS Code team. Every release ships with new features, fixes, and quality improvements — but this one leans heavily into the &lt;strong&gt;AI and agent experience&lt;/strong&gt;, making it one of the more exciting drops of the year.&lt;/p&gt;

&lt;p&gt;From smarter chat interactions to a revamped dictation engine and a browser you can annotate like a document, 1.132 is pushing VS Code closer to a full AI-native development environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Matters
&lt;/h2&gt;

&lt;p&gt;AI-assisted coding is no longer a novelty — it's a workflow. Millions of developers now rely on agents to write code, run tasks, and navigate projects. VS Code 1.132 doubles down on making that workflow feel &lt;strong&gt;less like fighting tools and more like working with a teammate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the same time, it improves things that matter beyond AI — like terminal output readability, dictation accuracy, and Markdown editing.&lt;/p&gt;

&lt;p&gt;Whether you're a solo dev, a student, or working in a large team, something in this release will likely improve how your day feels at the keyboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Big New Features — With Real-Life Context
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🤖 Agent Host: One Agent Session, Multiple Windows
&lt;/h3&gt;

&lt;p&gt;Previously, each VS Code window had its own isolated agent session. If you were working across windows, you had to juggle multiple contexts — annoying when you're deep in a large project.&lt;/p&gt;

&lt;p&gt;The new &lt;strong&gt;Agent Host&lt;/strong&gt; lets you connect to the &lt;strong&gt;same agent session from multiple VS Code windows&lt;/strong&gt;. It runs AI harnesses like Copilot, Claude, and Codex in a dedicated process, using the new Agent Host Protocol (AHP).&lt;/p&gt;

&lt;p&gt;Think of it like having one shared whiteboard that every window can see and write on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Copilot agent on the agent host is powered by the Copilot SDK, so its behavior stays consistent with the Copilot CLI and standalone Copilot app.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🪟 Agents Window: Your Mission Control for Agent Sessions
&lt;/h3&gt;

&lt;p&gt;The new &lt;strong&gt;Agents Window&lt;/strong&gt; gives you a dedicated space to start and monitor multiple agent sessions at once.&lt;/p&gt;

&lt;p&gt;Above the chat input, you'll see &lt;strong&gt;live status pills&lt;/strong&gt; that update in real time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Changes&lt;/strong&gt; — shows how many file changes the agent has made; click to view a live multi-file diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Previews&lt;/strong&gt; — quick access to Markdown previews for files the agent creates or edits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subagents&lt;/strong&gt; — follow what's happening inside a subagent in a separate chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browsers&lt;/strong&gt; — watch the agent interact with an integrated browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of visibility you need when an agent is touching ten files across three folders. Instead of wondering what just changed, you can see it live.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Side Chats with &lt;code&gt;/btw&lt;/code&gt; — Ask Without Interrupting
&lt;/h3&gt;

&lt;p&gt;This one is genuinely clever. You're running an agent turn — maybe it's refactoring a module or generating a test suite — and you have a quick question. Do you stop the agent? Do you wait?&lt;/p&gt;

&lt;p&gt;Now you can just type &lt;code&gt;/btw&lt;/code&gt; in the chat input to open a &lt;strong&gt;side chat&lt;/strong&gt;. It shares the context and prompt cache of your primary chat, so your question is informed by what's already happening. The agent keeps going; you get your answer.&lt;/p&gt;

&lt;p&gt;You can also &lt;strong&gt;select text in a chat response&lt;/strong&gt; to ask a follow-up question about that specific part. Very useful when a response is long and one paragraph needs clarification.&lt;/p&gt;

&lt;p&gt;Want to share context across chats? Drag chat tabs into the input box, or type &lt;code&gt;#chat:&lt;/code&gt; and pick a chat by name.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 Commenting in the Integrated Browser
&lt;/h3&gt;

&lt;p&gt;Imagine you're reviewing a generated web page in VS Code's built-in browser and the layout is slightly off in one section. Instead of describing it in words ("the button near the top, I think?"), you can now &lt;strong&gt;click directly on the element&lt;/strong&gt; and attach a comment.&lt;/p&gt;

&lt;p&gt;Use the &lt;code&gt;workbench.action.browser.addElementCommentToChat&lt;/code&gt; keyboard shortcut to enter comment mode. Select multiple elements, add a note to each, then send the whole set of annotated feedback straight to the chat. Precise, fast, and way clearer than text descriptions.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎙️ Multilingual Dictation — Now Actually Smart
&lt;/h3&gt;

&lt;p&gt;VS Code's built-in dictation received a major upgrade. The new default model is &lt;strong&gt;multilingual Nemotron 3.5&lt;/strong&gt;, which runs entirely on-device (your audio never leaves your machine).&lt;/p&gt;

&lt;p&gt;What's new:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language auto-detection&lt;/strong&gt;: dictation can follow your &lt;code&gt;agents.voice.language&lt;/code&gt; setting or automatically detect the language from your system locale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell-aware cleanup in the terminal&lt;/strong&gt;: say "git commit dash m hello world" and it produces &lt;code&gt;git commit -m "Hello World"&lt;/code&gt; — not the literal words&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom instructions&lt;/strong&gt;: run &lt;em&gt;Voice: Configure Dictation Instructions&lt;/em&gt; and add a &lt;code&gt;dictation.md&lt;/code&gt; file to your project or home directory to teach it your terminology and formatting preferences&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding experience&lt;/strong&gt;: first-time users see a microphone waveform, a device picker, and links to settings before they start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your network restrictions block the model download, an action lets you import an official Foundry Local model package from disk — no internet required.&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Markdown Diffs in the Hybrid Editor (Experimental)
&lt;/h3&gt;

&lt;p&gt;VS Code 1.131 introduced the &lt;strong&gt;hybrid Markdown editor&lt;/strong&gt; — a view that combines rendered Markdown with in-place editing and agent-actionable comments.&lt;/p&gt;

&lt;p&gt;In 1.132, Markdown diffs now open &lt;strong&gt;inside&lt;/strong&gt; that hybrid editor. The modified document stays editable while gutter indicators highlight what's been added, changed, or deleted — just like code diffs, but for rendered Markdown.&lt;/p&gt;

&lt;p&gt;You can switch between the text diff view and the Markdown editor with diff annotations using the editor type dropdown. This is marked experimental, but it already works well enough for daily use.&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ Terminal Output Reflow
&lt;/h3&gt;

&lt;p&gt;This is a small fix with a surprisingly large quality-of-life impact.&lt;/p&gt;

&lt;p&gt;Previously, expanded terminal output in Chat used a fixed width. If you resized your panel, lines would wrap too early on narrow views or leave dead space on wide ones.&lt;/p&gt;

&lt;p&gt;Now, &lt;strong&gt;terminal output reflows&lt;/strong&gt; to match the available width as you resize. It works for both the Local agent harness and the Copilot harness on the agent host. Clean, readable, and no more awkward wrapping mid-command.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison: Before vs. After 1.132 for Agent Workflows
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Before 1.132&lt;/th&gt;
&lt;th&gt;After 1.132&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Working across two windows&lt;/td&gt;
&lt;td&gt;Two isolated agent sessions&lt;/td&gt;
&lt;td&gt;One shared agent session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick question during agent turn&lt;/td&gt;
&lt;td&gt;Stop the agent or wait&lt;/td&gt;
&lt;td&gt;Open a side chat with &lt;code&gt;/btw&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser feedback&lt;/td&gt;
&lt;td&gt;Describe elements in words&lt;/td&gt;
&lt;td&gt;Comment directly on page elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dictating terminal commands&lt;/td&gt;
&lt;td&gt;Literal transcription&lt;/td&gt;
&lt;td&gt;Shell-aware cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watching agent file changes&lt;/td&gt;
&lt;td&gt;Unclear unless you check manually&lt;/td&gt;
&lt;td&gt;Live status pills above chat input&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Best Tips for Getting the Most from 1.132 ✅
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;/btw&lt;/code&gt; for quick questions&lt;/strong&gt; — don't interrupt agent turns for things that can wait in a side chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up &lt;code&gt;dictation.md&lt;/code&gt;&lt;/strong&gt; with your project's terminology before using voice heavily — it'll save you a lot of corrections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable &lt;code&gt;breadcrumbs.showEditorType&lt;/code&gt;&lt;/strong&gt; if you switch between diff and regular editors often — the dropdown saves time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try the Markdown diff view&lt;/strong&gt; on files where your agent is making large edits — seeing the rendered diff is much clearer than a raw text diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag chat tabs into the input&lt;/strong&gt; when you want to share context across multiple chat sessions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the status pills.&lt;/strong&gt; A lot of developers dismiss the live status pills above the chat input as visual noise. They're not — they're your only real-time window into what an agent is doing across your project. Get in the habit of checking them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not configuring dictation instructions.&lt;/strong&gt; Out of the box, Nemotron 3.5 is solid but generic. Adding a &lt;code&gt;dictation.md&lt;/code&gt; file with your preferred terms, abbreviations, and formatting rules makes a real difference, especially on long coding sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming the agent host is always on.&lt;/strong&gt; The &lt;code&gt;ChatAgentHostEnabled&lt;/code&gt; policy has been removed, so administrators can no longer centrally disable it — but individual developers can still toggle it via &lt;code&gt;chat.agentHost.enabled&lt;/code&gt;. If agent behavior feels inconsistent, check this setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping the dictation onboarding.&lt;/strong&gt; The new onboarding shows you a live waveform and lets you pick your microphone before you start. Skipping it and diving straight in often leads to picking the wrong mic or missing a setting that affects quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;VS Code 1.132 is a thoughtful release. It doesn't reinvent the editor — it tightens up the agent experience, adds the kind of small contextual touches that make a workflow feel polished, and quietly fixes the rough edges that accumulated over the last few releases.&lt;/p&gt;

&lt;p&gt;Side chats with &lt;code&gt;/btw&lt;/code&gt;, element-level browser commenting, shell-aware dictation, live agent status pills — these are the kinds of features that sound small in a changelog but genuinely change how a day at the keyboard feels.&lt;/p&gt;

&lt;p&gt;If you haven't updated yet, do it now. Use &lt;strong&gt;Check for Updates&lt;/strong&gt; in VS Code, or download the latest nightly Insiders build to get features even earlier.&lt;/p&gt;

&lt;p&gt;For more posts like this, check out &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; — practical dev content without the fluff. If this helped you, share it with a teammate who's living in VS Code all day. They'll thank you. 😊&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Next.js 16.3 Is Here — And It's the Biggest Update Since 16.0</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Tue, 04 Aug 2026 08:57:42 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/nextjs-163-is-here-and-its-the-biggest-update-since-160-3hgb</link>
      <guid>https://dev.to/hamidrazadev/nextjs-163-is-here-and-its-the-biggest-update-since-160-3hgb</guid>
      <description>&lt;p&gt;If you've ever opened a Next.js project, run &lt;code&gt;next dev&lt;/code&gt;, and watched your laptop fans spin up like a jet engine — this update is for you. 🚀&lt;/p&gt;

&lt;p&gt;Next.js 16.3 dropped on August 3rd, 2026, and honestly, the changelog reads like a wish list that someone actually delivered on. Less memory. Faster builds. Faster rendering. Smarter prefetching. New devtools. Oh, and an entire suite of opt-in features that bring SPA-style snappiness to your server-rendered apps.&lt;/p&gt;

&lt;p&gt;Sound too good to be true? Let's walk through everything together — clearly, practically, and without the jargon overload.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Next.js 16.3?
&lt;/h2&gt;

&lt;p&gt;Next.js is the popular React framework built by Vercel. It helps developers build fast, production-ready web apps with features like server-side rendering, static generation, file-based routing, and more.&lt;/p&gt;

&lt;p&gt;Version 16.3 is not a complete rewrite. Think of it like a major tune-up on a car you already love. The engine is the same, but they've cleaned out the oil, replaced the air filter, upgraded the exhaust, and added a GPS that actually works.&lt;/p&gt;

&lt;p&gt;Every improvement in 16.3 either makes your &lt;strong&gt;development experience faster&lt;/strong&gt;, your &lt;strong&gt;app's runtime faster&lt;/strong&gt;, or both — with zero changes to your existing app code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Actually Matters
&lt;/h2&gt;

&lt;p&gt;Here's the honest truth about working with Next.js before this update.&lt;/p&gt;

&lt;p&gt;Dev sessions on large projects could chew through gigabytes of RAM. If you had 50+ routes, your machine would slow down over time. Builds felt slow on CI. Navigations sometimes felt sluggish compared to SPAs. And error boundaries were a bit of a minefield.&lt;/p&gt;

&lt;p&gt;These aren't small complaints. They're the kinds of daily friction that add up over a long project. And 16.3 takes a serious swing at fixing most of them.&lt;/p&gt;

&lt;p&gt;Whether you're a student building your first portfolio or an engineer shipping production apps, these improvements will be noticeable from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New — Feature by Feature
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 Up to 90% Less Memory in Dev
&lt;/h3&gt;

&lt;p&gt;This is probably the headline feature. Turbopack (Next.js's Rust-based bundler) now uses &lt;strong&gt;disk caching&lt;/strong&gt; and &lt;strong&gt;memory eviction&lt;/strong&gt; by default during development.&lt;/p&gt;

&lt;p&gt;In real-world tests on &lt;code&gt;vercel.com&lt;/code&gt;'s dashboard, memory dropped from &lt;strong&gt;21.5 GB to 2 GB&lt;/strong&gt; after compiling 50 routes. On &lt;code&gt;nextjs.org&lt;/code&gt;, it went from 4,600 MB down to 840 MB.&lt;/p&gt;

&lt;p&gt;To put that in human terms: if your dev server used to feel like a memory black hole after a few hours of work, it now behaves more like a well-organized tool that actually gives memory back when it's done with it.&lt;/p&gt;

&lt;p&gt;No config change needed. It just works after upgrading.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚡ Faster Builds — Up to 5.5×
&lt;/h3&gt;

&lt;p&gt;The same disk caching that improved dev is now enabled by default for &lt;code&gt;next build&lt;/code&gt; too. Turbopack can read unchanged artifacts from cache instead of recompiling everything from scratch.&lt;/p&gt;

&lt;p&gt;In tests, the &lt;code&gt;vercel.com/geist&lt;/code&gt; project went from a &lt;strong&gt;30-second cold build to a 5.5-second cached build&lt;/strong&gt;. That's not a typo.&lt;/p&gt;

&lt;p&gt;For CI pipelines that run dozens of builds a day, this is a significant time (and cost) saving.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔷 TypeScript 7 Support for Faster Type Checking
&lt;/h3&gt;

&lt;p&gt;TypeScript 7 is a native Rust port of the TypeScript compiler, and it's roughly &lt;strong&gt;10× faster&lt;/strong&gt; at type checking than the previous Node.js-based version.&lt;/p&gt;

&lt;p&gt;To use it during &lt;code&gt;next build&lt;/code&gt;, you just bump your local TypeScript version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; typescript@^7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No special flags. No extra configuration.&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ 22% More Requests Handled Under Load
&lt;/h3&gt;

&lt;p&gt;The App Router rendering layer now uses &lt;strong&gt;native Node.js streams&lt;/strong&gt; instead of web streams. Previously, there was overhead from converting between the two during server-side rendering. Removing that conversion layer lets your server handle up to &lt;strong&gt;22% more requests under the same load&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No changes to your code. Just upgrade and your server gets faster automatically.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Versioned Docs for AI Coding Agents
&lt;/h3&gt;

&lt;p&gt;Here's a thoughtful addition. When you run &lt;code&gt;next dev&lt;/code&gt;, Next.js now writes an &lt;code&gt;AGENTS.md&lt;/code&gt; file that points AI coding agents (like Cursor, GitHub Copilot, etc.) to the documentation that matches &lt;strong&gt;your specific version of Next.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No more agents giving you advice based on the wrong version of the docs. They now read the docs bundled right inside your &lt;code&gt;node_modules&lt;/code&gt;. It's a small detail that makes AI-assisted development noticeably more reliable.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Fewer Prefetch Requests
&lt;/h3&gt;

&lt;p&gt;Previously, every visible link could trigger its own prefetch request. In large apps, this led to dozens of network requests firing at once.&lt;/p&gt;

&lt;p&gt;In 16.3, small prefetches are &lt;strong&gt;automatically bundled together&lt;/strong&gt;, reducing the total number of requests. Larger shared segments still stay separate so they can be reused across routes.&lt;/p&gt;

&lt;p&gt;Less network chatter. Faster perceived load times.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Better Caching for Static Assets
&lt;/h3&gt;

&lt;p&gt;Immutable static assets (files that never change after they're built) can now be &lt;strong&gt;reused across deployments&lt;/strong&gt;. Since they're immutable, there's no risk of serving stale files from the previous version. It's safe, and it means repeat visitors load your site faster after a new deploy.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ Custom Error Boundaries with &lt;code&gt;catchError&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Before 16.3, React error boundaries in Next.js had real limitations. They interfered with &lt;code&gt;notFound()&lt;/code&gt; and &lt;code&gt;redirect()&lt;/code&gt;. They couldn't retry server components that failed. And they had no clean way to re-fetch failed data.&lt;/p&gt;

&lt;p&gt;16.3 introduces a &lt;code&gt;catchError&lt;/code&gt; API that fixes all of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&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;catchError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&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;next/error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ErrorFallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;title&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="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retry&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Try again&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;catchError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ErrorFallback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;retry()&lt;/code&gt; function re-fetches the boundary's children — including any Server Components that failed — without a full page reload. This is a genuinely useful addition for handling real-world errors gracefully.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗂️ Built-In Glob Imports
&lt;/h3&gt;

&lt;p&gt;Turbopack now supports &lt;code&gt;import.meta.glob&lt;/code&gt;, the same API Vite users have been enjoying for a while. It lets you import multiple files from the file system in one line, with hot-module reloading support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&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;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./posts/*.md&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;eager&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially handy for blog pages, documentation sites, or any pattern where you're loading content from local files dynamically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instant Navigations — The Big Opt-In Suite
&lt;/h2&gt;

&lt;p&gt;This deserves its own section because it's not just one feature. It's a whole approach to making Next.js apps feel as fast as SPAs without giving up the benefits of server rendering.&lt;/p&gt;

&lt;p&gt;You enable it by adding two flags to your &lt;code&gt;next.config.ts&lt;/code&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="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;cacheComponents&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="na"&gt;partialPrefetching&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what that unlocks:&lt;/p&gt;

&lt;h3&gt;
  
  
  Instant Insights (New DevTool)
&lt;/h3&gt;

&lt;p&gt;A new panel in the Next.js DevTools that &lt;strong&gt;automatically surfaces slow navigations&lt;/strong&gt; while you work. Each insight also gives you a prompt you can pass to your AI agent to fix the issue. No more guessing which routes feel sluggish.&lt;/p&gt;

&lt;h3&gt;
  
  
  Partial Prefetching
&lt;/h3&gt;

&lt;p&gt;Before 16.3, you had two options: a shared loading shell via &lt;code&gt;loading.tsx&lt;/code&gt;, or aggressive full-page prefetching with &lt;code&gt;&amp;lt;Link prefetch={true}&amp;gt;&lt;/code&gt;. Both were limiting.&lt;/p&gt;

&lt;p&gt;Partial Prefetching lets Next.js extract &lt;strong&gt;per-route loading shells&lt;/strong&gt; and gives you fine-grained control over how much content to prefetch per link. It's more flexible and less wasteful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Incremental Static Regeneration (ISR)
&lt;/h3&gt;

&lt;p&gt;Previously, if you didn't prerender a page at build time, the first visitor had to wait for it to generate — no loading shell, just a wait.&lt;/p&gt;

&lt;p&gt;Now, even pages you didn't prerender can &lt;strong&gt;serve an instant loading shell to the first visitor&lt;/strong&gt;, then upgrade to the fully rendered version in the background. Every later visitor gets the final cached content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation Inspector (New DevTool)
&lt;/h3&gt;

&lt;p&gt;Because Next.js disables prefetching in dev, it was hard to know exactly what a user would see during a navigation. The Navigation Inspector lets you &lt;strong&gt;pause navigations at the shell&lt;/strong&gt; so you can visually inspect the loading state before the full page loads. Incredibly useful for QA and polish.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playwright Test Helper
&lt;/h3&gt;

&lt;p&gt;This one's for teams who care about preventing regressions. The new &lt;code&gt;instant()&lt;/code&gt; helper for Playwright lets you write tests that assert what content should be &lt;strong&gt;immediately visible&lt;/strong&gt; during a navigation:&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;instant&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;@next/playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;product title is available immediately&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;page&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;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products/shoes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&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;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a[href="/products/hats"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toContainText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Baseball Cap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a refactor accidentally makes that content slow to appear, the test fails. No surprises in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Experimental Features Worth Knowing About
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rust-Based React Compiler
&lt;/h3&gt;

&lt;p&gt;The React Compiler already optimizes your components at build time, so you don't have to manually add &lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt; everywhere. Until now, it ran through Babel in Node.js.&lt;/p&gt;

&lt;p&gt;16.3 ships an experimental Rust port that runs &lt;strong&gt;directly inside Turbopack&lt;/strong&gt;, skipping the Babel step entirely. In tests on large apps like &lt;code&gt;v0&lt;/code&gt;, this cut the time from &lt;code&gt;next dev&lt;/code&gt; to a ready page by &lt;strong&gt;34% on a cold build and 46% on a warm one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can try it today:&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="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;reactCompiler&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="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;turbopackRustReactCompiler&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's experimental, but the numbers are impressive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network Resilience (&lt;code&gt;useOffline&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;experimental.useOffline&lt;/code&gt; enabled, when the network drops, instead of throwing an error, Next.js keeps the request &lt;strong&gt;pending and retries automatically&lt;/strong&gt; when the connection returns.&lt;/p&gt;

&lt;p&gt;A new &lt;code&gt;useOffline&lt;/code&gt; hook also lets you show the user a banner so they know what's happening:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useOffline&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;next/offline&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;OfflineBanner&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;isOffline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useOffline&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;isOffline&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;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;You're offline. Retrying when you reconnect.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combined with Partial Prefetching, prefetched routes can still render their shell while offline. It's a small feature that makes apps feel much more resilient on spotty connections.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before vs. After — At a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Before 16.3&lt;/th&gt;
&lt;th&gt;After 16.3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dev server memory (50 routes)&lt;/td&gt;
&lt;td&gt;~21.5 GB&lt;/td&gt;
&lt;td&gt;~2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build time (cached)&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Up to 5.5× faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSR request throughput&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Up to 22% more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error boundaries&lt;/td&gt;
&lt;td&gt;Limited, interfered with &lt;code&gt;redirect&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Full control with &lt;code&gt;catchError&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefetching&lt;/td&gt;
&lt;td&gt;All-or-nothing&lt;/td&gt;
&lt;td&gt;Fine-grained per link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glob imports&lt;/td&gt;
&lt;td&gt;Not built-in&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;import.meta.glob&lt;/code&gt; supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent docs&lt;/td&gt;
&lt;td&gt;Generic&lt;/td&gt;
&lt;td&gt;Version-matched automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tips for Getting the Most Out of 16.3
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Upgrade immediately for the free wins.&lt;/strong&gt;&lt;br&gt;
Memory savings, faster builds, and faster SSR require zero code changes. Run &lt;code&gt;npm install next@latest&lt;/code&gt; and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Try TypeScript 7 if type checking feels slow.&lt;/strong&gt;&lt;br&gt;
If &lt;code&gt;next build&lt;/code&gt; type checking is a bottleneck on your team's CI, bumping to &lt;code&gt;typescript@^7&lt;/code&gt; is low-risk and potentially high-reward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Enable Instant Navigations on a branch first.&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;cacheComponents&lt;/code&gt; and &lt;code&gt;partialPrefetching&lt;/code&gt; flags change navigation behavior. Test on a feature branch before rolling them out to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use the Navigation Inspector before shipping.&lt;/strong&gt;&lt;br&gt;
If you care about perceived performance, use the new DevTools panel to check what loading states users actually see during navigations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Write an &lt;code&gt;instant()&lt;/code&gt; Playwright test for your most important routes.&lt;/strong&gt;&lt;br&gt;
If you have a product page or checkout flow, protect its navigation speed with a regression test. Future you will thank present you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Don't skip the error boundary migration if you're using custom boundaries.&lt;/strong&gt;&lt;br&gt;
The old approach is still supported, but &lt;code&gt;catchError&lt;/code&gt; is cleaner and more capable. It's worth migrating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Don't enable the experimental Rust React Compiler in production yet.&lt;/strong&gt;&lt;br&gt;
It's promising, but it's still experimental. Use it locally to measure the gains, then wait for a stable release before shipping it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Common Mistakes to Watch Out For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Upgrading without testing &lt;code&gt;cacheComponents&lt;/code&gt; behavior.&lt;/strong&gt;&lt;br&gt;
Cache Components changes how data is cached and served. If you turn it on in an existing app without reading the migration guide, you might see unexpected behavior with dynamic data. Always test on a staging environment first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming TypeScript 7 is a drop-in replacement for all projects.&lt;/strong&gt;&lt;br&gt;
For most projects it is, but if you rely heavily on Babel-based transforms, the interplay with the Rust React Compiler may need a bit of extra configuration. Check the docs before flipping both on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the Instant Insights panel.&lt;/strong&gt;&lt;br&gt;
It's easy to dismiss DevTools notifications during development, but the Instant Insights panel actually tells you something actionable. If a route shows up as slow, it's worth spending five minutes on the fix while you're in that area of the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting that experimental features can change.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;useOffline&lt;/code&gt; and &lt;code&gt;turbopackRustReactCompiler&lt;/code&gt; are experimental. Their APIs could change in a future release. Build on them for learning and prototyping, but don't build critical production paths around them just yet.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Upgrade Right Now
&lt;/h2&gt;

&lt;p&gt;Just run this in your project:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Or with pnpm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add next@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it for the stable improvements. For Instant Navigations, add the two flags to your config. For experimental features, follow the individual guides in the docs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Next.js 16.3 is one of those releases where the team clearly listened. The 90% memory reduction in dev is huge. The build speed improvements are real and measurable. The SSR throughput gains cost you nothing. And Instant Navigations gives you a proper upgrade path toward SPA-style responsiveness without abandoning the server-rendering model that makes Next.js worth using in the first place.&lt;/p&gt;

&lt;p&gt;It's not a revolutionary release that breaks everything. It's a thoughtful, well-executed one that makes the framework noticeably better for everyone who uses it daily.&lt;/p&gt;

&lt;p&gt;If you've been on the fence about upgrading your Next.js projects, 16.3 is the push you needed. The gains are real, and the migration path is gentle.&lt;/p&gt;

&lt;p&gt;Give it a try, and if you found this walkthrough useful, share it with a teammate or fellow developer who's still running a memory-hungry dev server. 😊&lt;/p&gt;

&lt;p&gt;For more practical dev guides, deep dives, and developer content, head over to &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — there's always something worth reading there.&lt;/p&gt;

&lt;p&gt;Happy building! 🔧&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>performance</category>
    </item>
    <item>
      <title>Claude Opus 5 Is Here — And It's the Most Capable Everyday AI Model Yet 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Tue, 04 Aug 2026 06:18:53 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/claude-opus-5-is-here-and-its-the-most-capable-everyday-ai-model-yet-4fdd</link>
      <guid>https://dev.to/hamidrazadev/claude-opus-5-is-here-and-its-the-most-capable-everyday-ai-model-yet-4fdd</guid>
      <description>&lt;p&gt;You know that feeling when a tool you already rely on suddenly gets &lt;em&gt;dramatically&lt;/em&gt; better, for the exact same price? That's what Anthropic just delivered with Claude Opus 5.&lt;/p&gt;

&lt;p&gt;Released on July 24, 2026, Claude Opus 5 is not a quiet point-release. It is a genuine step change in the Opus tier — better at coding, smarter at reasoning, more aligned, and still priced at the same rate as its predecessor, Opus 4.8.&lt;/p&gt;

&lt;p&gt;Whether you are a developer using AI to write and debug code, a researcher running complex multi-step analyses, or a builder trying to ship products faster, Opus 5 was designed with you in mind.&lt;/p&gt;

&lt;p&gt;So what exactly changed, and is it worth switching to? Let's break it all down.&lt;/p&gt;




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

&lt;p&gt;Claude Opus 5 is Anthropic's latest flagship AI model in the Opus tier — their highest-capability class of models available for general use.&lt;/p&gt;

&lt;p&gt;Think of Claude's model lineup like a team with different specialists. Haiku is fast and lightweight. Sonnet balances speed and smarts. Opus is the deep thinker — the one you bring in when the problem is hard and you need the best result, not just the quickest one.&lt;/p&gt;

&lt;p&gt;Opus 5 is the newest and most powerful version of that deep thinker.&lt;/p&gt;

&lt;p&gt;It sits below Claude Fable 5 (the current top-tier model) and the restricted-access Claude Mythos 5, but it comes remarkably close to Fable 5's performance — at &lt;strong&gt;half the price per task&lt;/strong&gt; on many benchmarks. That is not a small deal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Claude Opus 5 Matters
&lt;/h2&gt;

&lt;p&gt;Here is the honest truth about AI models in 2026: the race is no longer just about raw capability. It is about who can get you frontier-level intelligence without burning through your budget in the process.&lt;/p&gt;

&lt;p&gt;Opus 5 is Anthropic's answer to that. It is designed to be used &lt;em&gt;every single day&lt;/em&gt; — for coding, research, writing, analysis, and long-running automated workflows — without requiring the cost of a top-tier frontier model for every task.&lt;/p&gt;

&lt;p&gt;It is now the &lt;strong&gt;default model on Claude Max&lt;/strong&gt; and the &lt;strong&gt;strongest model on Claude Pro&lt;/strong&gt;. In other words, if you are already on Claude, you are probably using Opus 5 right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits with Real-Life Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Top of the leaderboard on coding tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On Frontier-Bench v0.1, Opus 5 outperforms every other model and more than doubles Opus 4.8's performance — at a lower cost per task. On CursorBench 3.2 at max effort, it lands within 0.5% of Fable 5's peak score, at half the cost.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What this means for you:&lt;/em&gt; You can tackle harder engineering problems with the same budget. Think complex refactors, root-cause debugging, and building full features end to end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dramatically better at agentic, multi-step work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On Zapier AutomationBench — a benchmark for completing real business workflows from start to finish — Opus 5's pass rate is around 1.5 times the next-best model, at the same cost. Even at its &lt;em&gt;lowest&lt;/em&gt; effort setting, Opus 5 passes more tasks than any other model on the leaderboard.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Real example from early-access testing:&lt;/em&gt; A trading firm engineer used Opus 5 to build a full market data feed for a new exchange in a single session. Previous models could not complete this task at all, even with detailed plans from the engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A massive leap on novel problem-solving&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On ARC-AGI 3 — an evaluation where the model must solve completely new problem types it has never seen before — Opus 5 scored &lt;strong&gt;three times higher than the next-best model&lt;/strong&gt;. That is not a small margin. That is a different class of reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Better computer use, at less cost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On OSWorld 2.0, a computer use benchmark, Opus 5 outperforms every other model at any given cost — and it surpasses Fable 5's best result at just over a third of the cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Improved scientific research capabilities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Opus 5 outperforms Opus 4.8 on every single life sciences evaluation Anthropic runs, including structural biology, organic chemistry, and bioinformatics. On organic chemistry tasks, it scores more than 10 percentage points higher than Opus 4.8. On protein-related tasks, it scores nearly 8 points higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Stronger visual outputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early adopters noted better animations, games, 3D work, and visual artifacts — the strongest visual output from an Opus model to date.&lt;/p&gt;




&lt;h2&gt;
  
  
  Opus 5 vs Opus 4.8 — Is the Upgrade Real?
&lt;/h2&gt;

&lt;p&gt;Yes, and here is the honest picture:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What Changed&lt;/th&gt;
&lt;th&gt;Opus 4.8&lt;/th&gt;
&lt;th&gt;Opus 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontier-Bench performance&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;More than 2×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC-AGI 3&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;3× next-best&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price per million input tokens&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$5 (same)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price per million output tokens&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;$25 (same)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alignment (behavioral audit score)&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;td&gt;2.3 (lowest of recent models)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default on Claude Max&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (still default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode (2.5× speed)&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The short version: same price, significantly better results. The biggest gains are on hard, long-horizon tasks — exactly the kind of work where Opus models are supposed to shine.&lt;/p&gt;

&lt;p&gt;One real note on honest nuance: Opus 5 stays &lt;strong&gt;behind Mythos 5 on cybersecurity exploitation tasks&lt;/strong&gt; by design. Anthropic has intentionally kept those capabilities gated in the restricted-access Mythos tier, and Opus 5's safety classifiers are tuned accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips for Getting the Most from Opus 5
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use the effort setting for your task type.&lt;/strong&gt; Opus 5 comes with per-turn effort controls — including an &lt;code&gt;xhigh&lt;/code&gt; reasoning mode. For simple tasks, use lower effort to save tokens and speed up the response. For deep debugging, root-cause analysis, or long research tasks, bump it up. The model's performance scales noticeably with effort level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let it verify its own work.&lt;/strong&gt; One of the biggest shifts in Opus 5 is how it checks itself. In testing, it repeatedly caught its own errors during planning — before writing a single line of code. Trust the process, and give it room to think rather than rushing it toward an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for long agentic workflows.&lt;/strong&gt; If you have been holding off on building multi-step AI agents because earlier models kept losing the thread halfway through, Opus 5 is worth trying again. Lovable reported 22% improvement over Opus 4.7 on their hardest agentic coding tasks, with significantly less run-to-run variance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pair it with Claude Code for serious engineering tasks.&lt;/strong&gt; The Fast mode integration in Claude Code makes this combination a good fit for iterative build-debug cycles where you need both speed and depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers: check out the two new beta features.&lt;/strong&gt; Mid-conversation tool changes let you swap which tools Claude can use mid-session without breaking your prompt cache. Automatic fallbacks route flagged requests to the best available model instead of returning a block. Both are useful for production agentic systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Treating every task the same.&lt;/strong&gt; Opus 5 is powerful, but that does not mean you should use max-effort mode for a simple summary or a quick code snippet. Match the effort to the task. The model is efficient by design — use that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expecting it to replace human judgment on risky decisions.&lt;/strong&gt; Opus 5 is notably more honest about its own uncertainty and limitations than previous versions. It will push back on bad designs (early testers reported it holding its ground in code reviews rather than just agreeing). That is a feature, not a flaw. Let it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the safety fallback settings.&lt;/strong&gt; If you are building production systems, set up the automatic fallback option on the API. It routes classifier-flagged requests to the best available model automatically, so you do not end up with unexpected blocks in your workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming your old prompts still need heavy optimization.&lt;/strong&gt; Opus 5 is more instruction-following and better at picking up intent from context. Prompts that needed heavy engineering to work with earlier models may now work more simply. Test before you over-engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confusing Opus 5 with a niche research model.&lt;/strong&gt; Some people mentally categorize the Opus tier as "the expensive one for edge cases." Opus 5 is specifically designed to be an everyday model — it's the default on Claude Max precisely because Anthropic built it to work efficiently across normal daily usage.&lt;/p&gt;




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

&lt;p&gt;Claude Opus 5 is a meaningful upgrade in every area that matters for practical developer and knowledge work: coding performance, agentic reliability, reasoning depth, and alignment. It delivers frontier-adjacent intelligence at the same price as its predecessor, which is the kind of thing that actually changes how people build.&lt;/p&gt;

&lt;p&gt;If you are already using Claude, you are likely already on Opus 5. If you are using the API and want to try it explicitly, the model string is &lt;code&gt;claude-opus-5&lt;/code&gt;. Pricing is $5 per million input tokens and $25 per million output tokens — unchanged from Opus 4.8.&lt;/p&gt;

&lt;p&gt;The AI field is moving fast, and it is not always easy to tell which updates are genuinely meaningful versus just marketing. This one is real. 💡&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want more breakdowns like this one? Check out &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for practical developer content on AI tools, frontend development, and everything in between. If this post helped you, share it with a developer friend — it genuinely helps the community grow. Drop a comment below if you have questions or have already been testing Opus 5 in your own projects. Would love to hear what you find.&lt;/em&gt; 👀&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>VS Code 1.131 Is Here — And It Just Got a Whole Lot Smarter 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Wed, 29 Jul 2026 16:54:50 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/vs-code-1131-is-here-and-it-just-got-a-whole-lot-smarter-5bi</link>
      <guid>https://dev.to/hamidrazadev/vs-code-1131-is-here-and-it-just-got-a-whole-lot-smarter-5bi</guid>
      <description>&lt;p&gt;VS Code dropped another update, and honestly? This one hits differently.&lt;/p&gt;

&lt;p&gt;If you've been using AI agents in your editor, you already know the struggle — multiple subagents running in the background, no idea what they're doing, your terminal talking over your screen reader, and your Markdown file just sitting there silently judging you.&lt;/p&gt;

&lt;p&gt;VS Code 1.131, released July 29, 2026, tackles exactly these pain points. This release is quietly one of the most developer-experience-focused updates in a while, even if the changelog doesn't scream it.&lt;/p&gt;

&lt;p&gt;So, what's new? And should you care? Let's find out.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VS Code 1.131?
&lt;/h2&gt;

&lt;p&gt;VS Code 1.131 is the latest stable release of Visual Studio Code — Microsoft's wildly popular, open-source code editor used by millions of developers worldwide.&lt;/p&gt;

&lt;p&gt;Every few weeks, the VS Code team ships updates that range from tiny bug fixes to full architecture overhauls. Version 1.131 lands somewhere in the middle — a meaningful release that pushes agent tooling, accessibility, and built-in AI features forward without breaking your entire workflow.&lt;/p&gt;

&lt;p&gt;The headline features this time around are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More visibility into running subagents&lt;/strong&gt; in the Agents window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in dictation&lt;/strong&gt; (no extension needed anymore)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hybrid Markdown editor&lt;/strong&gt; in the Agents window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also important work happening under the hood with the new &lt;strong&gt;Agent Host architecture&lt;/strong&gt;, and small but useful wins for Python developers and accessibility users.&lt;/p&gt;

&lt;p&gt;Let's walk through each one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Matters
&lt;/h2&gt;

&lt;p&gt;Here's the thing about developer tools — the best updates aren't always the flashiest ones. They're the ones that fix the small friction points you didn't even realize were slowing you down.&lt;/p&gt;

&lt;p&gt;VS Code 1.131 is full of those.&lt;/p&gt;

&lt;p&gt;If you're using AI agents to help with your code, you've probably experienced the "black box" problem: a subagent is running, you know &lt;em&gt;something&lt;/em&gt; is happening, but you have no idea if it's been going for 3 seconds or 3 minutes, or what it's even doing right now.&lt;/p&gt;

&lt;p&gt;That's now fixed.&lt;/p&gt;

&lt;p&gt;If you've ever wanted to just &lt;em&gt;speak&lt;/em&gt; your chat prompt instead of typing it — and you didn't want to hunt down an extension, install it, configure it, and pray it works — that's now also fixed.&lt;/p&gt;

&lt;p&gt;And if you write Markdown in VS Code and work inside the Agents window, there's a new hybrid editor that lets you read, write, and even leave comments that your agent can act on.&lt;/p&gt;

&lt;p&gt;Small changes. Real impact.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New in VS Code 1.131 — Feature by Feature
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👀 Subagents: Finally, Some Visibility
&lt;/h3&gt;

&lt;p&gt;When your agent delegates a task to a subagent (like running a parallel search or analysis), you can now see what's happening &lt;strong&gt;without opening the subagent's full conversation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Right in the Agents window, each running subagent shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Which model&lt;/strong&gt; it's using&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How long it's been running&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which tool&lt;/strong&gt; it's actively calling at that moment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is huge. Instead of staring at a spinner wondering if something froze, you can see "Oh, it's running &lt;code&gt;readFile&lt;/code&gt; right now." That's the kind of transparency that actually builds trust in agent tooling.&lt;/p&gt;

&lt;p&gt;You can still click into any subagent to read its full conversation, while the parent conversation stays right where you left it.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎙️ Built-In Dictation (Experimental)
&lt;/h3&gt;

&lt;p&gt;This one surprised me.&lt;/p&gt;

&lt;p&gt;VS Code now has &lt;strong&gt;built-in dictation&lt;/strong&gt; — no VS Code Speech extension required. You can dictate in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat inputs&lt;/li&gt;
&lt;li&gt;Text editors&lt;/li&gt;
&lt;li&gt;The integrated terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three surfaces share &lt;strong&gt;one microphone session&lt;/strong&gt;, which means no overlapping recordings and no "wait, where did that text go?" moments.&lt;/p&gt;

&lt;p&gt;The transcription model is &lt;strong&gt;Nemotron&lt;/strong&gt;, which runs completely &lt;strong&gt;offline on your device&lt;/strong&gt;. Your audio never leaves your machine. It downloads the model on first use, and that's it.&lt;/p&gt;

&lt;p&gt;A couple of settings worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dictation.showTranscript&lt;/code&gt; — shows a live transcript as you speak&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dictation.experimental.llmCleanup&lt;/code&gt; — lets Copilot clean up filler words and add formatting to your transcript as you go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Platform support right now:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows x64 and Arm64 ✅&lt;/li&gt;
&lt;li&gt;macOS Apple Silicon ✅&lt;/li&gt;
&lt;li&gt;Linux x64 and Arm64 (glibc 2.34+) ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not supported yet: VS Code for the Web, Intel-based Macs, and 32-bit/Arm32 systems. More platforms are in progress.&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Hybrid Markdown Editor (Experimental)
&lt;/h3&gt;

&lt;p&gt;The Agents window now has a &lt;strong&gt;hybrid Markdown editor&lt;/strong&gt;. Instead of staring at raw &lt;code&gt;.md&lt;/code&gt; syntax, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt; your Markdown as rendered output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit&lt;/strong&gt; it in-place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add comments&lt;/strong&gt; that your agent can act on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can switch between the regular text editor and this new hybrid view using &lt;strong&gt;Reopen Editor With&lt;/strong&gt; — works both in the Agents window and in regular editor windows.&lt;/p&gt;

&lt;p&gt;This is still experimental, but if you write docs, READMEs, or spec files inside your agent workflow, it's already genuinely useful.&lt;/p&gt;




&lt;h3&gt;
  
  
  🏗️ Agent Host Architecture (Under the Hood)
&lt;/h3&gt;

&lt;p&gt;This one's a bigger deal than it sounds.&lt;/p&gt;

&lt;p&gt;VS Code is rearchitecting how agent sessions work around something called the &lt;strong&gt;Agent Host&lt;/strong&gt; — a dedicated process that runs agent harnesses like Copilot, Claude, and Codex using the &lt;strong&gt;Agent Host Protocol (AHP)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What does that mean practically?&lt;/p&gt;

&lt;p&gt;Because each session lives in its own process, &lt;strong&gt;the same agent session can now be connected to and rendered from multiple VS Code windows at once&lt;/strong&gt;. That's a pretty significant architectural unlock for complex workflows.&lt;/p&gt;

&lt;p&gt;To try it early: enable &lt;code&gt;chat.agentHost.enabled&lt;/code&gt; and select an agent host harness from the harness dropdown.&lt;/p&gt;

&lt;p&gt;It's rolling out gradually, so don't panic if you don't see it yet.&lt;/p&gt;




&lt;h3&gt;
  
  
  🐾 VS Code Pet (Very Experimental)
&lt;/h3&gt;

&lt;p&gt;Okay, this one's just fun.&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;/vscode-pet&lt;/code&gt; in chat to meet your new VS Code companion. That's literally all we know. Go discover it yourself. 😊&lt;/p&gt;




&lt;h3&gt;
  
  
  ♿ Accessibility: Quieter, Smarter Terminal Updates
&lt;/h3&gt;

&lt;p&gt;Screen reader users get a useful improvement in this release.&lt;/p&gt;

&lt;p&gt;The new setting &lt;code&gt;terminal.integrated.accessibleViewPreserveCursorPosition&lt;/code&gt; (set to &lt;code&gt;always&lt;/code&gt;) keeps your cursor position in the terminal Accessible View steady even when new output arrives. You can read at your own pace without the view jumping around.&lt;/p&gt;

&lt;p&gt;On top of that, terminal live updates now use &lt;strong&gt;non-interrupting ARIA status announcements&lt;/strong&gt; instead of assertive alerts, so output is available to screen readers without constantly interrupting other speech.&lt;/p&gt;

&lt;p&gt;Small change. Big difference for accessibility.&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ Control the Terminal Resize Overlay
&lt;/h3&gt;

&lt;p&gt;You know that columns-by-rows overlay that pops up when you resize the terminal? Turns out, some people find it distracting.&lt;/p&gt;

&lt;p&gt;You can now disable it entirely with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terminal.integrated.resizeDimensionsOverlay.enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it to &lt;code&gt;false&lt;/code&gt; and it's gone. Change applies immediately to open terminals — no restart needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  🐍 Python: Faster Startup, Smarter Environments
&lt;/h3&gt;

&lt;p&gt;Python Environments is now the default environment-management experience in both VS Code Stable and Insiders, having hit 100% rollout.&lt;/p&gt;

&lt;p&gt;The key improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conda discovery is deferred&lt;/strong&gt; until actually needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent environment scans are consolidated&lt;/strong&gt; instead of running separately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pylance can now use the last-known interpreter&lt;/strong&gt; while a full refresh continues in the background&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Translation: Python projects start faster. You spend less time waiting and more time coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  VS Code 1.131 vs 1.130 — What Actually Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Before (1.130)&lt;/th&gt;
&lt;th&gt;After (1.131)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subagent visibility&lt;/td&gt;
&lt;td&gt;Open conversation to check progress&lt;/td&gt;
&lt;td&gt;See model, time, and tool inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dictation&lt;/td&gt;
&lt;td&gt;Required Speech extension&lt;/td&gt;
&lt;td&gt;Built-in, offline, no extension needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown in Agents&lt;/td&gt;
&lt;td&gt;Raw text editor only&lt;/td&gt;
&lt;td&gt;Hybrid view with rendered preview + comments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal resize overlay&lt;/td&gt;
&lt;td&gt;Always visible&lt;/td&gt;
&lt;td&gt;Optional, can be disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screen reader updates&lt;/td&gt;
&lt;td&gt;Assertive/interrupting alerts&lt;/td&gt;
&lt;td&gt;Non-interrupting ARIA status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python startup&lt;/td&gt;
&lt;td&gt;Full environment scan every time&lt;/td&gt;
&lt;td&gt;Deferred Conda, faster launch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tips for Getting the Most Out of 1.131
&lt;/h2&gt;

&lt;p&gt;💡 &lt;strong&gt;Try dictation in your next chat prompt.&lt;/strong&gt; Even if you type fast, speaking a long system prompt or context block can be faster. Enable it, speak naturally, let LLM cleanup do the rest.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Explore the Agent Host early.&lt;/strong&gt; Enable &lt;code&gt;chat.agentHost.enabled&lt;/code&gt; and experiment with it before it becomes the default. Getting familiar now will save you confusion later.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Use subagent visibility as a debugging signal.&lt;/strong&gt; If a subagent has been calling the same tool for two minutes, something might be stuck. You'll now catch it without opening its full conversation.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Don't force the hybrid Markdown editor everywhere.&lt;/strong&gt; It's best in the Agents window when you're working on docs your agent needs to reference or modify. For regular editing, the text editor is still faster.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Update immediately.&lt;/strong&gt; VS Code is rolling out gradually. Use &lt;strong&gt;Check for Updates&lt;/strong&gt; from inside VS Code if you don't want to wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid with These New Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Forgetting dictation is platform-limited.&lt;/strong&gt;&lt;br&gt;
If you're on an Intel Mac or VS Code for the Web and wondering why built-in dictation isn't showing up — that's why. Check the platform support list before assuming it's broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expecting agent host to be fully stable.&lt;/strong&gt;&lt;br&gt;
It's still rolling out. Some behaviors might feel unpolished. Enable it to explore, but don't build critical workflows around it just yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leaving &lt;code&gt;dictation.experimental.llmCleanup&lt;/code&gt; enabled on a slow connection.&lt;/strong&gt;&lt;br&gt;
The cleanup feature sends your transcript to a language model. If your connection is spotty, the cleanup step might lag or fail. VS Code falls back to the raw transcript, but it's worth knowing how it works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the subagent model info.&lt;/strong&gt;&lt;br&gt;
That little detail — which model your subagent is using — matters more than you'd think. If a subagent is using a slower or weaker model than you expected, you'll now catch it at a glance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;VS Code 1.131 isn't a flashy update. There's no headline-stealing new feature that everyone will screenshot and post about.&lt;/p&gt;

&lt;p&gt;But it's a &lt;em&gt;solid&lt;/em&gt; one.&lt;/p&gt;

&lt;p&gt;Better agent transparency, built-in offline dictation, a smarter Markdown experience, faster Python startup, and thoughtful accessibility improvements — all in one release. That's the kind of steady, deliberate progress that makes a tool genuinely great to use every day.&lt;/p&gt;

&lt;p&gt;If you haven't updated yet, open VS Code and hit &lt;strong&gt;Check for Updates&lt;/strong&gt;. Or grab the Insiders build if you want to stay on the bleeding edge.&lt;/p&gt;

&lt;p&gt;For more developer content, tips, and breakdowns like this one, check out &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — I write regularly about the tools, workflows, and features that actually matter to working developers.&lt;/p&gt;

&lt;p&gt;If this post saved you some scroll time through the changelog, share it with a developer friend who'll appreciate it. 🙌&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Set Up Prettier in Next.js (With Every Error Fixed Step by Step)</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:06:15 +0000</pubDate>
      <link>https://dev.to/hamidrazadev/how-to-set-up-prettier-in-nextjs-with-every-error-fixed-step-by-step-196d</link>
      <guid>https://dev.to/hamidrazadev/how-to-set-up-prettier-in-nextjs-with-every-error-fixed-step-by-step-196d</guid>
      <description>&lt;p&gt;You just started a fresh Next.js project. Your code looks messy. Your tabs and spaces are at war. A teammate opens the same file and now there are 47 formatting "changes" in the diff — even though nothing actually changed.&lt;/p&gt;

&lt;p&gt;Sound familiar? 😅&lt;/p&gt;

&lt;p&gt;That's exactly why Prettier exists. It's a code formatter that takes your messy code and makes it clean, consistent, and predictable. Every time. Automatically.&lt;/p&gt;

&lt;p&gt;But setting it up in a modern Next.js project isn't always smooth. Especially if you're using &lt;strong&gt;ESLint Flat Config&lt;/strong&gt; (&lt;code&gt;eslint.config.mjs&lt;/code&gt;), &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;pnpm&lt;/strong&gt;. The internet is full of outdated tutorials that either miss steps or don't tell you what to do when things break.&lt;/p&gt;

&lt;p&gt;This guide covers the full setup &lt;strong&gt;and&lt;/strong&gt; every real error you might run into — with exact fixes for each one.&lt;/p&gt;

&lt;p&gt;Let's get into it. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Prettier?
&lt;/h2&gt;

&lt;p&gt;Prettier is an &lt;strong&gt;opinionated code formatter&lt;/strong&gt;. You give it your code, it gives it back — clean, consistent, and formatted exactly the way you configured it.&lt;/p&gt;

&lt;p&gt;Think of it like autocorrect for your code. You type fast and messy, and Prettier quietly cleans up after you before you even notice.&lt;/p&gt;

&lt;p&gt;It handles things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent use of single or double quotes&lt;/li&gt;
&lt;li&gt;Trailing commas&lt;/li&gt;
&lt;li&gt;Semicolons at the end of lines&lt;/li&gt;
&lt;li&gt;Line length limits&lt;/li&gt;
&lt;li&gt;Indentation width&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prettier doesn't care about logic or bugs — that's ESLint's job. Prettier only cares about &lt;strong&gt;how your code looks&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Inconsistent formatting is a silent killer of team productivity. One developer uses tabs, another uses spaces. One prefers single quotes, the other uses double quotes. The result? Git shows hundreds of "changes" in every pull request that are just formatting noise — not actual code changes.&lt;/p&gt;

&lt;p&gt;Prettier solves this completely. Once it's set up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every file gets formatted the same way, every time&lt;/li&gt;
&lt;li&gt;Your team stops fighting over style preferences&lt;/li&gt;
&lt;li&gt;Code reviews focus on logic, not formatting&lt;/li&gt;
&lt;li&gt;Tailwind class orders stay consistent with &lt;code&gt;prettier-plugin-tailwindcss&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;VS Code can format your file automatically every time you save&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The setup is a one-time cost that saves you time forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Setup Guide (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install Prettier and Its Plugins
&lt;/h3&gt;

&lt;p&gt;Open your terminal in your project root and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; prettier eslint-config-prettier prettier-plugin-tailwindcss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what each package does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;prettier&lt;/code&gt;&lt;/strong&gt; — The core formatter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eslint-config-prettier&lt;/code&gt;&lt;/strong&gt; — Turns off ESLint formatting rules that conflict with Prettier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;prettier-plugin-tailwindcss&lt;/code&gt;&lt;/strong&gt; — Automatically sorts your Tailwind CSS classes in the correct order&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 2: Create Your Prettier Config
&lt;/h3&gt;

&lt;p&gt;In your project root, create a file called &lt;code&gt;.prettierrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"semi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"singleQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trailingComma"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"printWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"prettier-plugin-tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What each option does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;semi&lt;/code&gt; — Adds semicolons at the end of statements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;singleQuote&lt;/code&gt; — Uses &lt;code&gt;'&lt;/code&gt; instead of &lt;code&gt;"&lt;/code&gt; for strings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tabWidth&lt;/code&gt; — Uses 2 spaces for indentation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trailingComma: "es5"&lt;/code&gt; — Adds trailing commas where valid in ES5 (arrays, objects)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;printWidth&lt;/code&gt; — Wraps lines longer than 100 characters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plugins&lt;/code&gt; — Activates the Tailwind class sorting plugin&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 3: Create a &lt;code&gt;.prettierignore&lt;/code&gt; File
&lt;/h3&gt;

&lt;p&gt;You don't want Prettier touching generated files, build outputs, or lock files. Create &lt;code&gt;.prettierignore&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.next
node_modules
public
pnpm-lock.yaml
docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 4: Add npm Scripts
&lt;/h3&gt;

&lt;p&gt;Open your &lt;code&gt;package.json&lt;/code&gt; and add these scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next lint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --check ."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pnpm format&lt;/code&gt; — Formats every file in your project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pnpm format:check&lt;/code&gt; — Checks formatting without changing files (great for CI)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 5: Update Your ESLint Config
&lt;/h3&gt;

&lt;p&gt;Open your &lt;code&gt;eslint.config.mjs&lt;/code&gt; and add &lt;code&gt;eslint-config-prettier&lt;/code&gt; at the end of your config array:&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="nx"&gt;eslintConfigPrettier&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;eslint-config-prettier&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;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// ... your existing ESLint rules&lt;/span&gt;
  &lt;span class="nx"&gt;eslintConfigPrettier&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 must go &lt;strong&gt;last&lt;/strong&gt; in the array. It disables ESLint rules that would conflict with Prettier's formatting decisions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: VS Code Auto-Format on Save (Optional but Highly Recommended)
&lt;/h3&gt;

&lt;p&gt;Create or update &lt;code&gt;.vscode/settings.json&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Make sure you have the &lt;strong&gt;Prettier - Code formatter&lt;/strong&gt; extension installed in VS Code (&lt;code&gt;esbenp.prettier-vscode&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now every time you hit &lt;code&gt;Ctrl + S&lt;/code&gt;, your file gets formatted automatically. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging Every Error (The Real Journey)
&lt;/h2&gt;

&lt;p&gt;Here's where most tutorials stop — and where developers get stuck. Let's fix every error you might hit.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔴 Error 1: &lt;code&gt;Invalid project directory provided, no such directory: portfolio\lint&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;next lint
&lt;span class="go"&gt;Invalid project directory provided, no such directory: H:\...\portfolio\lint
[ELIFECYCLE] Command failed with exit code 1.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Next.js 15/16 (and sometimes 14.2+), the CLI argument parser has a known bug where it misreads &lt;code&gt;lint&lt;/code&gt; as a directory path instead of a subcommand — especially when using ESLint Flat Config (&lt;code&gt;eslint.config.mjs&lt;/code&gt;). So it looks for a folder called &lt;code&gt;lint&lt;/code&gt; and fails.&lt;/p&gt;

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

&lt;p&gt;Change your &lt;code&gt;lint&lt;/code&gt; script in &lt;code&gt;package.json&lt;/code&gt; to call ESLint directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If ESLint isn't already installed locally, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; eslint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This bypasses Next's CLI argument parser entirely. It's faster, cleaner, and fully compatible with ESLint v9+ and Flat Config.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔴 Error 2: &lt;code&gt;TypeError: Converting circular structure to JSON&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeError: Converting circular structure to JSON
  --&amp;gt; starting at object with constructor 'Object'
  |   property 'configs' -&amp;gt; object with constructor 'Object'
  |   property 'flat' -&amp;gt; object with constructor 'Object'
  |   ...
  |   property 'plugins' -&amp;gt; object with constructor 'Object'
  --- property 'react' closes the circle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;eslint.config.mjs&lt;/code&gt; is using &lt;code&gt;FlatCompat&lt;/code&gt; to extend &lt;code&gt;"next/core-web-vitals"&lt;/code&gt;. Under the hood, &lt;code&gt;FlatCompat&lt;/code&gt; from &lt;code&gt;@eslint/eslintrc&lt;/code&gt; tries to serialize the config using &lt;code&gt;JSON.stringify()&lt;/code&gt; to validate it. But &lt;code&gt;eslint-plugin-react&lt;/code&gt; (included inside Next's config) contains &lt;strong&gt;circular object references&lt;/strong&gt; — objects that point back to themselves. &lt;code&gt;JSON.stringify()&lt;/code&gt; can't handle circular references, so it crashes.&lt;/p&gt;

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

&lt;p&gt;Drop &lt;code&gt;FlatCompat&lt;/code&gt; entirely. Import &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;First, install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @next/eslint-plugin-next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note for pnpm users:&lt;/strong&gt; pnpm uses strict package isolation. Even if &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; is used internally by &lt;code&gt;eslint-config-next&lt;/code&gt;, pnpm won't hoist it to your root &lt;code&gt;node_modules&lt;/code&gt; unless you explicitly install it. That's why you need to add it manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then replace your &lt;code&gt;eslint.config.mjs&lt;/code&gt; with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;nextPlugin&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;@next/eslint-plugin-next&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="nx"&gt;eslintConfigPrettier&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;eslint-config-prettier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import('eslint').Linter.Config[]} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt; &lt;span class="o"&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;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.{js,mjs,cjs,ts,jsx,tsx}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@next/next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;core-web-vitals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;eslintConfigPrettier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.next/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;out/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;docs/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;FlatCompat&lt;/code&gt;. No circular JSON crash. Clean and native. ✅&lt;/p&gt;




&lt;h3&gt;
  
  
  🔴 Error 3: &lt;code&gt;Cannot find package '@next/eslint-plugin-next'&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@next/eslint-plugin-next'
imported from H:\...\portfolio\eslint.config.mjs
Did you mean to import "@next/eslint-plugin-next/dist/index.js"?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;pnpm uses &lt;strong&gt;strict package isolation&lt;/strong&gt; by design. It doesn't hoist nested dependencies to your root &lt;code&gt;node_modules&lt;/code&gt; the way npm does. So even though &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; is used internally by the &lt;code&gt;next&lt;/code&gt; package, your code can't import it unless it's explicitly listed as your own dependency.&lt;/p&gt;

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

&lt;p&gt;Install it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @next/eslint-plugin-next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run lint again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔴 Error 4: 155 TypeScript and JSX Parsing Errors
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sample errors:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/_error.tsx  28:1  error  Parsing error: The keyword 'interface' is reserved
app/about/loading.tsx  5:9  error  Parsing error: Unexpected token &amp;lt;
app/api/ask/route.ts  15:52  error  Parsing error: Unexpected token ModelId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ESLint's default parser is &lt;code&gt;espree&lt;/code&gt;, which only understands plain JavaScript. It doesn't know TypeScript keywords like &lt;code&gt;interface&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, or generics. It also doesn't know JSX syntax like &lt;code&gt;&amp;lt;Component /&amp;gt;&lt;/code&gt;. You need to tell ESLint to use &lt;code&gt;@typescript-eslint/parser&lt;/code&gt; for your &lt;code&gt;.ts&lt;/code&gt; and &lt;code&gt;.tsx&lt;/code&gt; files.&lt;/p&gt;

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

&lt;p&gt;Install the TypeScript ESLint parser and plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @typescript-eslint/parser @typescript-eslint/eslint-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update your &lt;code&gt;eslint.config.mjs&lt;/code&gt; to use the TypeScript parser:&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="nx"&gt;nextPlugin&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;@next/eslint-plugin-next&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="nx"&gt;tsParser&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;@typescript-eslint/parser&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="nx"&gt;tsPlugin&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;@typescript-eslint/eslint-plugin&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="nx"&gt;eslintConfigPrettier&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;eslint-config-prettier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import('eslint').Linter.Config[]} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt; &lt;span class="o"&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;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.next/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;out/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;docs/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@next/next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;jsx&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;core-web-vitals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;eslintConfigPrettier&lt;/span&gt;&lt;span class="p"&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;default&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run lint again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All 155 parsing errors disappear. ✅&lt;/p&gt;




&lt;h3&gt;
  
  
  🔴 Error 5: Circular JSON Error Returns After Re-Adding FlatCompat
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If at any point you re-introduce &lt;code&gt;FlatCompat&lt;/code&gt; to extend &lt;code&gt;"next/core-web-vitals"&lt;/code&gt; or &lt;code&gt;"next/typescript"&lt;/code&gt;, the circular JSON error comes back. &lt;code&gt;FlatCompat&lt;/code&gt; is fundamentally incompatible with the current version of &lt;code&gt;eslint-plugin-react&lt;/code&gt; bundled inside &lt;code&gt;eslint-config-next&lt;/code&gt; and ESLint v9+.&lt;/p&gt;

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

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; use &lt;code&gt;FlatCompat&lt;/code&gt; at all. The final working &lt;code&gt;eslint.config.mjs&lt;/code&gt; below is the definitive version that handles everything — Next.js rules, TypeScript parsing, JSX, and Prettier compatibility — without touching &lt;code&gt;FlatCompat&lt;/code&gt; or &lt;code&gt;@eslint/eslintrc&lt;/code&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="nx"&gt;nextPlugin&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;@next/eslint-plugin-next&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="nx"&gt;tsParser&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;@typescript-eslint/parser&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="nx"&gt;tsPlugin&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;@typescript-eslint/eslint-plugin&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="nx"&gt;eslintConfigPrettier&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;eslint-config-prettier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import('eslint').Linter.Config[]} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt; &lt;span class="o"&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;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.next/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;out/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;docs/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@next/next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;jsx&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;core-web-vitals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;eslintConfigPrettier&lt;/span&gt;&lt;span class="p"&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;default&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the config that works. Keep it and don't look back.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pros and Cons: &lt;code&gt;FlatCompat&lt;/code&gt; vs Native Flat Config
&lt;/h2&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;&lt;code&gt;FlatCompat&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Native Flat Config&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Works with ESLint v9+&lt;/td&gt;
&lt;td&gt;❌ Often breaks&lt;/td&gt;
&lt;td&gt;✅ Fully supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript support&lt;/td&gt;
&lt;td&gt;Needs extra setup&lt;/td&gt;
&lt;td&gt;✅ With &lt;code&gt;@typescript-eslint/parser&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pnpm compatibility&lt;/td&gt;
&lt;td&gt;❌ Circular JSON crash&lt;/td&gt;
&lt;td&gt;✅ Works perfectly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code complexity&lt;/td&gt;
&lt;td&gt;More boilerplate&lt;/td&gt;
&lt;td&gt;✅ Cleaner and simpler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommended for new projects&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're starting a Next.js project today, go native Flat Config from day one. &lt;code&gt;FlatCompat&lt;/code&gt; was a bridge for legacy configs — it's not meant to be the destination.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final File Checklist
&lt;/h2&gt;

&lt;p&gt;Here's everything you should have set up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;.prettierrc&lt;/code&gt;&lt;/strong&gt; (project root)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"semi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"singleQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trailingComma"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"printWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"prettier-plugin-tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;.prettierignore&lt;/code&gt;&lt;/strong&gt; (project root)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.next
node_modules
public
pnpm-lock.yaml
docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;eslint.config.mjs&lt;/code&gt;&lt;/strong&gt; (project root)&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="nx"&gt;nextPlugin&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;@next/eslint-plugin-next&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="nx"&gt;tsParser&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;@typescript-eslint/parser&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="nx"&gt;tsPlugin&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;@typescript-eslint/eslint-plugin&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="nx"&gt;eslintConfigPrettier&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;eslint-config-prettier&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;eslintConfig&lt;/span&gt; &lt;span class="o"&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;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.next/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;out/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;docs/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@next/next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;jsx&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="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;core-web-vitals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;eslintConfigPrettier&lt;/span&gt;&lt;span class="p"&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;default&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&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;&lt;code&gt;package.json&lt;/code&gt; scripts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --check ."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;.vscode/settings.json&lt;/code&gt;&lt;/strong&gt; (optional but recommended)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always put &lt;code&gt;eslintConfigPrettier&lt;/code&gt; last&lt;/strong&gt; in your ESLint config array. It needs to override any formatting rules that come before it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit your &lt;code&gt;.prettierrc&lt;/code&gt; to version control&lt;/strong&gt; so every teammate uses the same formatting rules automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;pnpm format:check&lt;/code&gt; in your CI pipeline&lt;/strong&gt; to catch unformatted code before it gets merged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install the Prettier VS Code extension&lt;/strong&gt; (&lt;code&gt;esbenp.prettier-vscode&lt;/code&gt;) — it makes the whole workflow seamless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never mix &lt;code&gt;FlatCompat&lt;/code&gt; with native Flat Config imports&lt;/strong&gt; in the same file. Pick one approach and stick with it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Keeping &lt;code&gt;next lint&lt;/code&gt; as your lint script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;next lint&lt;/code&gt; uses Next.js's CLI parser, which has a known argument parsing bug in newer versions. Switching to &lt;code&gt;eslint .&lt;/code&gt; directly is more stable and faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: Using &lt;code&gt;FlatCompat&lt;/code&gt; in ESLint v9+ projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;FlatCompat&lt;/code&gt; tries to convert legacy ESLint configs. But &lt;code&gt;eslint-plugin-react&lt;/code&gt; (bundled in &lt;code&gt;eslint-config-next&lt;/code&gt;) now contains circular object references that crash &lt;code&gt;JSON.stringify()&lt;/code&gt;. The fix is native Flat Config — no &lt;code&gt;FlatCompat&lt;/code&gt; needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3: Forgetting &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; with pnpm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;pnpm doesn't hoist nested packages. Even if &lt;code&gt;next&lt;/code&gt; uses &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; internally, you need to install it explicitly in your own &lt;code&gt;package.json&lt;/code&gt; or the import will fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 4: Missing the TypeScript parser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ESLint's default parser doesn't understand TypeScript or JSX. If you don't set &lt;code&gt;@typescript-eslint/parser&lt;/code&gt; as your &lt;code&gt;languageOptions.parser&lt;/code&gt;, you'll get hundreds of "Unexpected token" errors on perfectly valid code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 5: Not ignoring &lt;code&gt;.next/&lt;/code&gt; and &lt;code&gt;node_modules/&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ESLint will try to lint every file it can find unless you tell it otherwise. Always add &lt;code&gt;ignores&lt;/code&gt; in your config and a &lt;code&gt;.prettierignore&lt;/code&gt; file to skip build artifacts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Setting up Prettier in a modern Next.js project isn't as simple as the docs make it look — especially once you add TypeScript, Tailwind CSS, ESLint Flat Config, and pnpm into the mix. But once it's working, it's one of the best quality-of-life improvements you can make to your workflow.&lt;/p&gt;

&lt;p&gt;Here's a quick recap of what you did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Installed Prettier with Tailwind sorting and ESLint compatibility&lt;/li&gt;
&lt;li&gt;✅ Created &lt;code&gt;.prettierrc&lt;/code&gt; and &lt;code&gt;.prettierignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Fixed the &lt;code&gt;next lint&lt;/code&gt; path bug by calling &lt;code&gt;eslint .&lt;/code&gt; directly&lt;/li&gt;
&lt;li&gt;✅ Fixed the circular JSON crash by removing &lt;code&gt;FlatCompat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Fixed pnpm's strict isolation with a direct &lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; install&lt;/li&gt;
&lt;li&gt;✅ Fixed 155 TypeScript parsing errors with &lt;code&gt;@typescript-eslint/parser&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Set up VS Code to auto-format on every save&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your codebase is cleaner, your team stays consistent, and you never have to argue about tabs vs spaces again. 😊&lt;/p&gt;

&lt;p&gt;If you found this guide helpful, share it with your team — chances are they've hit the same errors too. And for more practical dev guides, visit &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; where I write about real-world frontend development, Next.js, TypeScript, and more.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>prettier</category>
      <category>eslint</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
