<?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: Mikul Gohil</title>
    <description>The latest articles on DEV Community by Mikul Gohil (@mikulg).</description>
    <link>https://dev.to/mikulg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3687662%2F97aead83-4633-4d64-8c94-4d934956a318.jpg</url>
      <title>DEV Community: Mikul Gohil</title>
      <link>https://dev.to/mikulg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikulg"/>
    <language>en</language>
    <item>
      <title>Container Queries: The CSS Feature That Changed Everything</title>
      <dc:creator>Mikul Gohil</dc:creator>
      <pubDate>Thu, 01 Jan 2026 18:13:12 +0000</pubDate>
      <link>https://dev.to/mikulg/container-queries-the-css-feature-that-changed-everything-28oj</link>
      <guid>https://dev.to/mikulg/container-queries-the-css-feature-that-changed-everything-28oj</guid>
      <description>&lt;p&gt;For years I wrote media queries that felt like educated guesses. "The sidebar is 300px, and on mobile the content area is full width, so if the viewport is less than 768px..." This arithmetic was fragile. Move a component to a different layout and the breakpoints broke.&lt;/p&gt;

&lt;p&gt;Container queries eliminated that mental math. Instead of asking "how wide is the screen?" I now ask "how wide is my parent container?" The component adapts to its actual available space, not some assumed viewport width.&lt;/p&gt;

&lt;p&gt;After using container queries across multiple production applications since they reached full browser support in 2023, I can say they've fundamentally changed how I think about responsive design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Container Queries Solve
&lt;/h2&gt;

&lt;p&gt;Consider a product card component. In a three-column grid, each card has roughly 400px of width. In a sidebar, the same card has 280px. With media queries, you'd write:&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;/* This assumes specific layout contexts */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.product-card&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;column&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;@media&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;769px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.product-card&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;But what if the sidebar appears on desktop? What if the grid changes to four columns? Every layout change requires recalculating breakpoints.&lt;/p&gt;

&lt;p&gt;Container queries invert this logic:&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;.product-card-container&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;350px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.product-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;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;349px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.product-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;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The card now responds to its container, not the viewport. Put it in a narrow sidebar it stacks. Put it in a wide grid cell it displays horizontally. No viewport calculations needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser Support in 2025
&lt;/h2&gt;

&lt;p&gt;Container queries have excellent browser support. Chrome 105+, Firefox 110+, Safari 16+, and Edge 105+ all fully support size queries, style queries, and container units. That covers over 98% of global browser usage.&lt;/p&gt;

&lt;p&gt;In my experience, you can use container queries in production without polyfills. For the rare legacy browser hit, your fallback is simply the default (non-queried) styles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Container Query API
&lt;/h2&gt;

&lt;p&gt;Three CSS properties control container queries:&lt;/p&gt;

&lt;h3&gt;
  
  
  container-type
&lt;/h3&gt;

&lt;p&gt;This property establishes a containment context. It tells the browser to track the element's dimensions.&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="c"&gt;/* Track width only */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.full-tracking&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;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Track width and height */&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; is what you'll use 90% of the time. It tracks the inline dimension (width in horizontal writing modes) and enables &lt;code&gt;@container&lt;/code&gt; queries based on width.&lt;/p&gt;

&lt;h3&gt;
  
  
  container-name
&lt;/h3&gt;

&lt;p&gt;When you have nested containers, naming them prevents query conflicts:&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-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="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="nc"&gt;.main-content&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;main&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;/* Target specific 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;.widget&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&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;@container&lt;/span&gt; &lt;span class="n"&gt;main&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;600px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.article-card&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;h3&gt;
  
  
  container (shorthand)
&lt;/h3&gt;

&lt;p&gt;Combine name and type in one declaration:&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;.panel&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;panel&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;This is equivalent to:&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;.panel&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;panel&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;h2&gt;
  
  
  Container Query Syntax
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@container&lt;/code&gt; rule works similarly to &lt;code&gt;@media&lt;/code&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="c"&gt;/* Anonymous container (nearest ancestor with container-type) */&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;.child&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="m"&gt;2rem&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;/* Named container */&lt;/span&gt;
&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="n"&gt;card-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-content&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Multiple conditions */&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;300px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.element&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.125rem&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;h2&gt;
  
  
  Container Query Units
&lt;/h2&gt;

&lt;p&gt;Container queries introduced new CSS units that scale relative to the container:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Unit&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1% of container's width&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1% of container's height&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1% of container's inline size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1% of container's block size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Smaller of &lt;code&gt;cqi&lt;/code&gt; or &lt;code&gt;cqb&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cqmax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Larger of &lt;code&gt;cqi&lt;/code&gt; or &lt;code&gt;cqb&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These units enable fluid scaling without breakpoints:&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="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="n"&gt;clamp&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="m"&gt;4&lt;/span&gt;&lt;span class="n"&gt;cqi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2rem&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-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;cqw&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-padding&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="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;cqw&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="n"&gt;cqw&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;In my experience, &lt;code&gt;cqi&lt;/code&gt; (inline size) is the most useful. It scales elements proportionally to the container's width regardless of the container's actual pixel dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Container Queries vs Media Queries
&lt;/h2&gt;

&lt;p&gt;Both have their place. Here's how I decide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use container queries for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reusable components (cards, widgets, navigation items)&lt;/li&gt;
&lt;li&gt;Components that appear in multiple layout contexts&lt;/li&gt;
&lt;li&gt;Component libraries and design systems&lt;/li&gt;
&lt;li&gt;Nested layouts where parent width varies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use media queries for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page-level layout changes (switching from sidebar to stacked)&lt;/li&gt;
&lt;li&gt;Global navigation changes (hamburger menu on mobile)&lt;/li&gt;
&lt;li&gt;Typography scale changes based on device class&lt;/li&gt;
&lt;li&gt;Print stylesheets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hybrid approach (what I do most often):&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="c"&gt;/* Media query for page-level layout */&lt;/span&gt;
&lt;span class="k"&gt;@media&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;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.page-layout&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;320px&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;/* Container query for component-level adaptation */&lt;/span&gt;
&lt;span class="nc"&gt;.sidebar-widget-container&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;280px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.widget-content&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page layout uses media queries. The components within use container queries. Each tool handles its appropriate scope.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Adaptive Card Component
&lt;/h3&gt;

&lt;p&gt;This pattern handles cards that might appear in a grid, sidebar, or modal:&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-container&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="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;column&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;0.75rem&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-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&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;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="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&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-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&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-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;@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;600px&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-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35%&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.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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dashboard Widget Grid
&lt;/h3&gt;

&lt;p&gt;Dashboard widgets need to adapt to their panel sizes:&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;.dashboard-panel&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;dashboard-panel&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="nc"&gt;.metric-widget&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;column&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="m"&gt;4&lt;/span&gt;&lt;span class="n"&gt;cqw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.metric-value&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="n"&gt;clamp&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="m"&gt;8&lt;/span&gt;&lt;span class="n"&gt;cqi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.metric-label&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="n"&gt;clamp&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="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;cqi&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="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#666&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="n"&gt;dashboard-panel&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;.metric-widget&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="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;space-between&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&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;h3&gt;
  
  
  Navigation That Adapts
&lt;/h3&gt;

&lt;p&gt;Navigation items can switch between icon-only and full labels:&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;.nav-container&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="nc"&gt;.nav-item&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;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&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;0.5rem&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="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="nc"&gt;.nav-label&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="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.nav-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&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="nl"&gt;height&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="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;200px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.nav-label&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="nb"&gt;inline&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;h2&gt;
  
  
  Style Queries
&lt;/h2&gt;

&lt;p&gt;Container queries can also query CSS custom property values, not just dimensions. Every element is a style container by default no &lt;code&gt;container-type&lt;/code&gt; needed:&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;.theme-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dark-section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&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="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&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;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1a1a1a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&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;@container&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&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;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&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;This enables theme scoping without JavaScript or class toggling. Set a custom property on a container, and descendants respond.&lt;/p&gt;

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

&lt;p&gt;Container queries use CSS Containment under the hood, which actually improves performance. The browser isolates the contained subtree, limiting the scope of style recalculations.&lt;/p&gt;

&lt;p&gt;In my testing with Chrome DevTools, container queries outperform equivalent JavaScript-based solutions (like ResizeObserver with class toggling) by 20-30% in repaint time. The browser handles everything natively.&lt;/p&gt;

&lt;p&gt;A few performance tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;inline-size&lt;/code&gt; over &lt;code&gt;size&lt;/code&gt; when you only need width queries&lt;/li&gt;
&lt;li&gt;Name containers in complex nested layouts to avoid unnecessary query matching&lt;/li&gt;
&lt;li&gt;Container units (&lt;code&gt;cqw&lt;/code&gt;, &lt;code&gt;cqi&lt;/code&gt;) are more performant than breakpoint-heavy queries for fluid scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Integration with React and Next.js
&lt;/h2&gt;

&lt;p&gt;Container queries work seamlessly with component frameworks. No special setup needed just CSS:&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="c1"&gt;// components/ProductCard.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&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;./ProductCard.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ProductCardProps&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="nl"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;image&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProductCard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;ProductCardProps&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&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;gt;&lt;/span&gt;&lt;span class="si"&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;h3&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="si"&gt;}&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;price&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;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;article&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* ProductCard.module.css */&lt;/span&gt;
&lt;span class="nc"&gt;.container&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="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;column&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;0.75rem&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="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.25rem&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;350px&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;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="nc"&gt;.image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&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;With Tailwind CSS, you can use the container query plugin or inline styles:&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@container"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col @[350px]:flex-row gap-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* content */&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;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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migration from Media Queries
&lt;/h2&gt;

&lt;p&gt;If you're migrating existing components, here's my approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify components that appear in multiple layout contexts&lt;/li&gt;
&lt;li&gt;Wrap each component instance in a container div with &lt;code&gt;container-type: inline-size&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Convert &lt;code&gt;@media&lt;/code&gt; queries to &lt;code&gt;@container&lt;/code&gt; queries using the container's expected sizes&lt;/li&gt;
&lt;li&gt;Test the component in all its layout contexts&lt;/li&gt;
&lt;li&gt;Remove viewport-specific media queries from the component&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: component styles should use container queries, page layout styles should use media queries. This separation makes components truly portable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>tailwindcss</category>
      <category>frontend</category>
    </item>
    <item>
      <title>2026: The Year of Agentic Development</title>
      <dc:creator>Mikul Gohil</dc:creator>
      <pubDate>Wed, 31 Dec 2025 15:21:09 +0000</pubDate>
      <link>https://dev.to/mikulg/2026-the-year-of-agentic-development-4507</link>
      <guid>https://dev.to/mikulg/2026-the-year-of-agentic-development-4507</guid>
      <description>&lt;p&gt;The shift happening in 2026 is fundamentally different from what we saw in previous years. We moved from autocomplete to conversation in 2024. We moved from conversation to collaboration in 2025. Now we are moving from collaboration to delegation.&lt;/p&gt;

&lt;p&gt;AI coding tools are becoming agents. Not assistants that wait for instructions, but autonomous systems that take ownership of entire tasks, make decisions, and deliver completed work. The developer role is transforming from writing code to directing AI teammates.&lt;/p&gt;

&lt;p&gt;Here is what this means for how we will build software in the year ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Assistants to Agents
&lt;/h2&gt;

&lt;p&gt;The distinction matters. An assistant responds to your requests. An agent pursues goals.&lt;/p&gt;

&lt;p&gt;When I use GitHub Copilot for autocomplete, it suggests the next line based on context. When I use Claude Code for a refactoring task, it executes a series of steps to achieve an outcome. The difference is agency: the ability to plan, execute, and adapt without constant human guidance.&lt;/p&gt;

&lt;p&gt;2026 marks the year this capability matures from experimental to expected. The tools we will use daily will not just help us code. They will code on our behalf.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Agent Capabilities Look Like
&lt;/h3&gt;

&lt;p&gt;The current generation of AI coding agents can already:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example: Delegating a complete feature to an agent&lt;/span&gt;
claude &lt;span class="s2"&gt;"Implement user preference caching for the dashboard.
Requirements:
- Cache preferences in localStorage with 24-hour expiry
- Sync with server on changes
- Handle offline gracefully
- Add tests for all paths

Work autonomously. Checkpoint before major decisions.
Notify me only if you encounter blockers."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent breaks this into subtasks, implements each one, writes tests, and commits the work. I review the output rather than directing each step.&lt;/p&gt;

&lt;p&gt;This pattern will become standard in 2026. The expectation will shift from "AI helps me code" to "AI handles this while I work on something else."&lt;/p&gt;

&lt;h2&gt;
  
  
  Devin and the Autonomous Engineer Wave
&lt;/h2&gt;

&lt;p&gt;Devin, marketed as the first autonomous AI software engineer, represents where the industry is heading. It handles end-to-end project work: planning, coding, testing, debugging, and deployment.&lt;/p&gt;

&lt;p&gt;The implications are significant:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task delegation changes scope.&lt;/strong&gt; Instead of asking AI to write a function, you describe a feature. Instead of a feature, you describe an outcome. The granularity of human involvement decreases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review becomes the primary skill.&lt;/strong&gt; When AI generates complete implementations, the developer's job shifts to validation. Understanding what good code looks like matters more than writing it character by character.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specialization increases.&lt;/strong&gt; AI agents excel at well-defined tasks with clear success criteria. Human developers focus on ambiguous problems, stakeholder communication, and architectural decisions that require business context.&lt;/p&gt;

&lt;p&gt;I expect to see more tools in the Devin category throughout 2026. Competition will drive capability improvements rapidly.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP and the Context Problem
&lt;/h2&gt;

&lt;p&gt;One of the biggest limitations of current AI tools is context. They understand code but not the broader environment: your team's conventions, the business requirements, the deployment constraints.&lt;/p&gt;

&lt;p&gt;Model Context Protocol (MCP) addresses this by standardizing how AI tools access external information. In 2025, early MCP adoption connected Claude Code to Figma, Slack, Jira, and internal documentation. In 2026, this ecosystem expands significantly.&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="c1"&gt;// Example: MCP-enabled agent workflow&lt;/span&gt;
&lt;span class="c1"&gt;// The agent pulls context from multiple sources automatically&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Reads the Jira ticket for requirements&lt;/span&gt;
&lt;span class="c1"&gt;// 2. Checks the Figma design for UI specifications&lt;/span&gt;
&lt;span class="c1"&gt;// 3. Reviews existing patterns in the codebase&lt;/span&gt;
&lt;span class="c1"&gt;// 4. Consults internal API documentation&lt;/span&gt;
&lt;span class="c1"&gt;// 5. Generates implementation matching all constraints&lt;/span&gt;

&lt;span class="c1"&gt;// All without explicit human instruction for each step&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agents that succeed in 2026 will be those with the richest context. Expect to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistent memory across sessions.&lt;/strong&gt; Agents that remember previous decisions and learn from feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team-aware context.&lt;/strong&gt; Agents that understand not just your code but your team's patterns, preferences, and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business context integration.&lt;/strong&gt; Agents that connect technical implementation to business requirements automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent Harnesses: The New Infrastructure
&lt;/h2&gt;

&lt;p&gt;AI labs are building what they call "agent harnesses" - infrastructure for running agents reliably over extended periods. This matters for software development because meaningful work often spans hours or days.&lt;/p&gt;

&lt;p&gt;Current agents work well for tasks that complete in minutes. 2026 agents will handle multi-day projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrating a codebase from one framework to another&lt;/li&gt;
&lt;li&gt;Implementing a feature across frontend, backend, and infrastructure&lt;/li&gt;
&lt;li&gt;Conducting security audits and implementing fixes&lt;/li&gt;
&lt;li&gt;Refactoring legacy systems with comprehensive testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The infrastructure requirements for this are substantial. Agent harnesses provide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpointing and recovery.&lt;/strong&gt; When agents work for hours, failures are inevitable. The ability to checkpoint progress and resume from failures becomes essential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource management.&lt;/strong&gt; Long-running agents consume API tokens, compute resources, and human attention. Harnesses manage these budgets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observability.&lt;/strong&gt; Understanding what an agent did, why it made specific decisions, and where it might have gone wrong requires logging and tracing at a level we do not have today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small Language Models at the Edge
&lt;/h2&gt;

&lt;p&gt;Not all AI development will happen in the cloud. Edge-deployed personal agents via small language models (SLMs) represent another 2026 trend.&lt;/p&gt;

&lt;p&gt;The appeal is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy: Code never leaves your machine&lt;/li&gt;
&lt;li&gt;Latency: No network round-trip for suggestions&lt;/li&gt;
&lt;li&gt;Cost: No per-token charges for local inference&lt;/li&gt;
&lt;li&gt;Availability: Works offline, on planes, in areas with poor connectivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current SLMs cannot match cloud models for complex reasoning, but for common tasks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Boilerplate generation&lt;/li&gt;
&lt;li&gt;Simple refactoring&lt;/li&gt;
&lt;li&gt;Documentation writing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They perform well enough. I expect 2026 to bring SLMs specialized for coding that run efficiently on developer laptops and provide real-time assistance without cloud dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Automation Accelerates
&lt;/h2&gt;

&lt;p&gt;AI-powered testing tools made significant progress in 2025. Tools like Codium for real-time unit test suggestions, Diffblue Cover for Java test generation, and QA Wolf for end-to-end testing demonstrated that AI could handle significant testing workloads.&lt;/p&gt;

&lt;p&gt;2026 takes this further:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test generation becomes automatic.&lt;/strong&gt; When you implement a feature, tests generate alongside it. Not as a separate step, but as an integrated part of the development workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual regression testing scales.&lt;/strong&gt; AI understands UI intent well enough to identify meaningful visual changes versus noise. Screenshot comparison becomes intelligent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E2E test maintenance reduces.&lt;/strong&gt; One of the biggest pain points with end-to-end tests is brittleness. AI agents that understand application structure can update tests when UI changes, reducing maintenance burden.&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="c1"&gt;// Future pattern: Tests as implementation artifacts&lt;/span&gt;
&lt;span class="c1"&gt;// When you write this component...&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;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Avatar&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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="c1"&gt;// The agent automatically generates:&lt;/span&gt;
&lt;span class="c1"&gt;// - Unit tests for rendering with various user states&lt;/span&gt;
&lt;span class="c1"&gt;// - Accessibility tests for screen reader compatibility&lt;/span&gt;
&lt;span class="c1"&gt;// - Visual regression baseline&lt;/span&gt;
&lt;span class="c1"&gt;// - Integration tests for data fetching&lt;/span&gt;
&lt;span class="c1"&gt;// All without explicit instruction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Changing Developer Role
&lt;/h2&gt;

&lt;p&gt;Geoffrey Hinton's predictions about AI replacing human jobs extend to software development. While I do not expect developers to become obsolete in 2026, the role changes meaningfully.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills That Gain Importance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Specification clarity.&lt;/strong&gt; The better you can describe what you want, the better agents perform. Prompt engineering evolves into specification engineering, where precision and completeness in requirements directly impact output quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review and validation.&lt;/strong&gt; Reading code becomes more important than writing it. Understanding whether AI-generated solutions are correct, secure, and maintainable is the core skill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System design.&lt;/strong&gt; Agents handle implementation details well. Humans handle ambiguity, tradeoffs, and decisions that require business context. Architecture and system design become more valuable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context curation.&lt;/strong&gt; The MCP ecosystem rewards those who organize their context well. Documentation, architectural decision records, and well-structured codebases help agents perform better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills That Lose Importance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Syntax memorization.&lt;/strong&gt; Knowing exact API signatures matters less when AI can look them up instantly and use them correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate writing.&lt;/strong&gt; Repetitive code that follows established patterns becomes AI territory entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple debugging.&lt;/strong&gt; Agents that can read stack traces and fix obvious bugs reduce the need for this traditionally time-consuming activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing for the Shift
&lt;/h2&gt;

&lt;p&gt;Based on these predictions, here is how I am preparing for 2026:&lt;/p&gt;

&lt;h3&gt;
  
  
  Invest in Agent-Ready Tooling
&lt;/h3&gt;

&lt;p&gt;I am setting up my development environment for agent collaboration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP integrations&lt;/strong&gt; for my most-used tools (Jira, Figma, internal wikis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear documentation&lt;/strong&gt; that agents can parse and understand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured task descriptions&lt;/strong&gt; that translate well to agent instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practice Delegation Patterns
&lt;/h3&gt;

&lt;p&gt;The skill of delegating to AI agents requires practice. I am experimenting with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giving agents larger scope tasks and reviewing outputs&lt;/li&gt;
&lt;li&gt;Writing specifications before implementations&lt;/li&gt;
&lt;li&gt;Building feedback loops to improve agent performance over time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Develop Review Expertise
&lt;/h3&gt;

&lt;p&gt;Since review becomes central, I am focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding common AI failure patterns in generated code&lt;/li&gt;
&lt;li&gt;Building mental models for security and performance review&lt;/li&gt;
&lt;li&gt;Creating checklists for validating AI outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stay Current with the Ecosystem
&lt;/h3&gt;

&lt;p&gt;The AI coding tool landscape changes rapidly. I am following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, OpenAI, and Google AI announcements&lt;/li&gt;
&lt;li&gt;Emerging tools in the Devin category&lt;/li&gt;
&lt;li&gt;MCP ecosystem developments&lt;/li&gt;
&lt;li&gt;SLM progress from Meta, Mistral, and others&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What This Means for Teams
&lt;/h2&gt;

&lt;p&gt;For engineering teams, the agentic development shift has organizational implications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow changes.&lt;/strong&gt; Code review processes need updating when AI generates significant portions of code. Ownership models may need revision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill development.&lt;/strong&gt; Teams need training on effective agent collaboration. The skills that made developers productive in 2023 are not identical to what works in 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool standardization.&lt;/strong&gt; Teams benefit from shared agent configurations, MCP integrations, and specification templates. Consistency helps agents perform better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality assurance.&lt;/strong&gt; New validation processes for AI-generated code become necessary. Security review, in particular, needs enhancement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Year Ahead
&lt;/h2&gt;

&lt;p&gt;2026 will not replace developers with AI. But it will change what developers do daily. The mechanical aspects of coding, the tasks that are well-defined and repetitive, increasingly become agent territory.&lt;/p&gt;

&lt;p&gt;What remains human is judgment, creativity, and the ability to navigate ambiguity. The developers who thrive will be those who learn to work with agents effectively, treating them as capable teammates rather than fancy autocomplete.&lt;/p&gt;

&lt;p&gt;The tools are ready. The infrastructure is maturing. The only question is how quickly we adapt our workflows to take advantage of what agents can do.&lt;/p&gt;

&lt;p&gt;I am excited about writing less boilerplate. I am excited about delegating tedious tasks. I am excited about focusing on the parts of software development that require genuine human insight.&lt;/p&gt;

&lt;p&gt;2026 is the year AI stops assisting and starts doing. The question for each of us: what will we do with the time that frees up?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
    <item>
      <title>2025: The Year AI Became My Coding Partner</title>
      <dc:creator>Mikul Gohil</dc:creator>
      <pubDate>Wed, 31 Dec 2025 15:17:11 +0000</pubDate>
      <link>https://dev.to/mikulg/2025-the-year-ai-became-my-coding-partner-30ek</link>
      <guid>https://dev.to/mikulg/2025-the-year-ai-became-my-coding-partner-30ek</guid>
      <description>&lt;p&gt;Looking back at 2025, the shift is unmistakable. This wasn't the year AI learned to write code it already could. This was the year AI learned to &lt;em&gt;understand&lt;/em&gt; my codebase, my patterns, my workflows. The difference between 2024 and 2025 is the difference between a translator and a collaborator.&lt;/p&gt;

&lt;p&gt;My terminal became a conversation. My commits got better. My refactoring sessions that once took days now take hours. Here's what changed and why it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Autocomplete to Autonomous
&lt;/h2&gt;

&lt;p&gt;The AI coding tools of 2024 were impressive pattern matchers. You'd start typing, and they'd finish your thoughts. Useful, but fundamentally reactive. You were still driving. The AI was just a faster keyboard.&lt;/p&gt;

&lt;p&gt;2025 brought something different: agency. Tools stopped waiting for me to lead and started anticipating what needed to happen next.&lt;/p&gt;

&lt;p&gt;Claude Code's evolution captures this shift perfectly. Early in the year, it was already a capable terminal companion. By December, it had become something I genuinely collaborate with checkpoints to rewind mistakes, subagents that verify my work independently, hooks that enforce team standards automatically.&lt;/p&gt;

&lt;p&gt;The moment I realized things had changed was during a large refactoring project. I described the migration in plain English, walked away to make coffee, and came back to find not just the code changes but also the tests updated, the documentation revised, and a suggested commit message waiting. That's not autocomplete. That's partnership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code: The Terminal That Thinks
&lt;/h2&gt;

&lt;p&gt;I've written about &lt;a href="https://dev.to/blog/code-review-with-ai-claude-code-experience"&gt;Claude Code before&lt;/a&gt;, but the 2025 version deserves fresh examination. The features that landed this year fundamentally changed how I work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checkpoints Changed How I Experiment
&lt;/h3&gt;

&lt;p&gt;Before checkpoints, experimental refactoring was risky. Make a wrong turn, and you're manually reverting or digging through undo history. Checkpoints changed this completely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start a refactoring session&lt;/span&gt;
claude &lt;span class="s2"&gt;"Refactor the authentication module to use the new token pattern"&lt;/span&gt;

&lt;span class="c"&gt;# If the direction is wrong, rewind&lt;/span&gt;
&lt;span class="c"&gt;# Press Esc + Esc or use /rewind&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code automatically saves state before making changes. When an approach doesn't work and many don't on the first try I rewind to the checkpoint and take a different direction. No manual cleanup, no lost work, no fear of experimentation.&lt;/p&gt;

&lt;p&gt;In my experience, this single feature increased my willingness to try ambitious refactoring by at least 3x. The safety net makes exploration free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subagents Verify While I Work
&lt;/h3&gt;

&lt;p&gt;The subagent system lets Claude Code delegate specialized tasks. The pattern I use most: verification subagents that check my work independently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="s2"&gt;"Implement the payment processing module.
Use a subagent to verify that all error cases are handled
and no sensitive data is logged."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main agent writes the code. A separate subagent reviews it against security criteria. Two perspectives, one command. I've caught issues this way that I would have missed in manual review edge cases where error messages inadvertently included PII, retry logic that could leak timing information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hooks Enforce Team Standards
&lt;/h3&gt;

&lt;p&gt;Hooks transform Claude Code from a personal tool into a team-aware system. They're automated actions that trigger on specific events.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: Pre-commit hook that runs linting&lt;/span&gt;
&lt;span class="c1"&gt;// .claude/hooks/pre-commit.js&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="na"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before-commit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;action&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;context&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;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;npm run lint:fix&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="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;npm run typecheck&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;My team uses hooks to enforce design system usage, check for deprecated API patterns, and ensure test coverage on modified files. The standards apply automatically, regardless of which developer is working or how rushed the deadline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Operations Became Conversational
&lt;/h3&gt;

&lt;p&gt;This surprised me most. I now handle roughly 90% of my git operations through Claude Code rather than raw git commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instead of: git log --oneline --grep="auth"&lt;/span&gt;
claude &lt;span class="s2"&gt;"Show me all commits related to authentication changes in the last month"&lt;/span&gt;

&lt;span class="c"&gt;# Instead of manually crafting commit messages&lt;/span&gt;
claude &lt;span class="s2"&gt;"Review my staged changes and write an appropriate commit message"&lt;/span&gt;

&lt;span class="c"&gt;# Instead of complex rebase conflict resolution&lt;/span&gt;
claude &lt;span class="s2"&gt;"I have merge conflicts in the auth module. Help me resolve them,
preferring our implementation for the token validation logic"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The natural language interface isn't just more convenient it's more expressive. I can add context that raw git commands can't capture. "Prefer our implementation" would require multiple manual steps with standard git. With Claude Code, it's just part of the sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: The Protocol That Connected Everything
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) emerged as the hidden infrastructure story of 2025. It's not a flashy feature it's plumbing. But it's plumbing that made AI tools dramatically more useful.&lt;/p&gt;

&lt;p&gt;MCP standardizes how AI tools access external context. Before MCP, each tool had its own integrations. Claude Code could read files. Copilot could see your editor. But connecting to Figma, Slack, Jira, your internal documentation each required custom work.&lt;/p&gt;

&lt;p&gt;MCP changed this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull design context directly into coding session&lt;/span&gt;
claude &lt;span class="s2"&gt;"Implement the component from the latest Figma mockup
in the 'Dashboard Redesign' project"&lt;/span&gt;

&lt;span class="c"&gt;# Connect to project management&lt;/span&gt;
claude &lt;span class="s2"&gt;"What Jira tickets are assigned to me for this sprint?
Summarize what code changes each will require."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice, MCP means I no longer context-switch between tools. The AI meets me where I am and pulls in what it needs. During a recent feature implementation, Claude Code pulled the spec from Notion, referenced the design in Figma, checked the existing API contracts, and generated code that fit all constraints without me opening any of those applications.&lt;/p&gt;

&lt;p&gt;The Code with Claude 2025 event in San Francisco showcased real-world MCP implementations. Teams shared patterns for connecting internal tools, managing authentication across systems, and building custom MCP servers for proprietary platforms. The ecosystem is young but growing fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow That Emerged
&lt;/h2&gt;

&lt;p&gt;After a year of experimentation, my daily workflow consolidated into distinct patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  Morning: Strategic Planning with Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the day with codebase awareness&lt;/span&gt;
claude &lt;span class="s2"&gt;"What areas of the codebase have the most recent churn?
Any patterns in the changes that suggest refactoring opportunities?"&lt;/span&gt;

&lt;span class="c"&gt;# Plan the day's work&lt;/span&gt;
claude &lt;span class="s2"&gt;"Given the tickets in this sprint and the current codebase state,
suggest an order for tackling them that minimizes merge conflicts"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This strategic layer didn't exist in 2024. AI tools could answer questions, but they didn't have enough context to offer meaningful strategic guidance. MCP integration with project management changed that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Midday: Implementation with Checkpoints
&lt;/h3&gt;

&lt;p&gt;Active coding uses checkpoints heavily. I work in exploratory bursts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start a feature&lt;/span&gt;
claude &lt;span class="s2"&gt;"Implement user preference caching.
Checkpoint before each major decision."&lt;/span&gt;

&lt;span class="c"&gt;# Review each checkpoint&lt;/span&gt;
&lt;span class="c"&gt;# If the direction feels wrong, rewind&lt;/span&gt;
&lt;span class="c"&gt;# If it feels right, continue&lt;/span&gt;

&lt;span class="c"&gt;# When complete, review the full diff&lt;/span&gt;
claude &lt;span class="s2"&gt;"Summarize the changes made since the initial checkpoint.
Highlight any areas that warrant additional review."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Afternoon: Review and Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before pushing&lt;/span&gt;
claude &lt;span class="s2"&gt;"Review all changes against our style guide and security checklist.
Create any missing tests."&lt;/span&gt;

&lt;span class="c"&gt;# Integration prep&lt;/span&gt;
claude &lt;span class="s2"&gt;"What's the migration path for these changes?
Any consumers that will break?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  End of Day: Documentation and Handoff
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update documentation&lt;/span&gt;
claude &lt;span class="s2"&gt;"Update the README and API docs to reflect today's changes"&lt;/span&gt;

&lt;span class="c"&gt;# Write meaningful commit messages&lt;/span&gt;
claude &lt;span class="s2"&gt;"Organize today's changes into logical commits with clear messages"&lt;/span&gt;

&lt;span class="c"&gt;# Prepare for async collaboration&lt;/span&gt;
claude &lt;span class="s2"&gt;"Write a summary of today's work for the team standup"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Actually Got Faster
&lt;/h2&gt;

&lt;p&gt;The productivity gains aren't uniform. Some tasks accelerated dramatically; others barely changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dramatically faster (5-10x):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codebase-wide refactoring with consistent patterns&lt;/li&gt;
&lt;li&gt;Generating tests for existing code&lt;/li&gt;
&lt;li&gt;Documentation updates after code changes&lt;/li&gt;
&lt;li&gt;Resolving merge conflicts with clear preference rules&lt;/li&gt;
&lt;li&gt;Bulk API migrations (deprecated patterns to new patterns)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Significantly faster (2-3x):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial implementation of well-specified features&lt;/li&gt;
&lt;li&gt;Code review preparation (identifying concerns before human review)&lt;/li&gt;
&lt;li&gt;Debugging with clear reproduction steps&lt;/li&gt;
&lt;li&gt;Setting up new projects with established patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modestly faster (1.2-1.5x):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex architectural decisions (AI helps explore, but decisions are still mine)&lt;/li&gt;
&lt;li&gt;Performance optimization (requires measurement and domain knowledge)&lt;/li&gt;
&lt;li&gt;Security-critical code (I review everything carefully regardless)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not faster:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novel algorithm design (AI can implement, but creative solutions are still human)&lt;/li&gt;
&lt;li&gt;Understanding legacy code with no documentation (AI hallucinates when context is insufficient)&lt;/li&gt;
&lt;li&gt;Debugging intermittent issues (requires patience and observation that AI can't provide)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is clear: AI excels at tasks with clear specifications and established patterns. It struggles with ambiguity and genuinely novel problems. This isn't a limitation it's a useful heuristic for deciding when to lean on AI assistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Skills That Matter Now
&lt;/h2&gt;

&lt;p&gt;Working effectively with AI coding tools is a skill. A year of intensive use taught me what separates productive AI collaboration from frustrating false starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Specification Quality Matters More Than Ever
&lt;/h3&gt;

&lt;p&gt;The clearer my prompt, the better the result. This sounds obvious, but the implication is important: investing time in clear specifications pays off more than it used to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Vague (produces mediocre results)&lt;/span&gt;
claude &lt;span class="s2"&gt;"Add error handling to the API"&lt;/span&gt;

&lt;span class="c"&gt;# Specific (produces usable code)&lt;/span&gt;
claude &lt;span class="s2"&gt;"Add error handling to all API routes in /api/v2.
Catch database connection errors and return 503 with retry-after header.
Catch validation errors and return 400 with field-specific messages.
Log all errors to our existing logger with request ID correlation."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Checkpoint Discipline Prevents Rabbit Holes
&lt;/h3&gt;

&lt;p&gt;I learned to checkpoint frequently. The cost is zero; the benefit is the ability to backtrack without frustration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# My rule: checkpoint before any decision that could go wrong&lt;/span&gt;
claude &lt;span class="s2"&gt;"Checkpoint, then try approach A for the caching layer"&lt;/span&gt;
&lt;span class="c"&gt;# Evaluate results&lt;/span&gt;
claude &lt;span class="s2"&gt;"That introduced too much complexity. Rewind and try approach B instead"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Review Everything, Trust Nothing Blindly
&lt;/h3&gt;

&lt;p&gt;AI-generated code is not reviewed code. I treat every output as a pull request from a junior developer who knows patterns but might miss context.&lt;/p&gt;

&lt;p&gt;The code is usually syntactically correct. It usually follows patterns. But it sometimes misses edge cases, uses deprecated APIs, or introduces subtle bugs that don't appear until production. Every AI output gets human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ecosystem Beyond Claude
&lt;/h2&gt;

&lt;p&gt;While Claude Code became my primary tool, the broader ecosystem evolved significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; remained excellent for inline autocomplete. The subscription cost is low, the integration is seamless, and for quick suggestions while typing, nothing beats it. I use both Copilot for inline assistance, Claude Code for larger operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; evolved its agent capabilities. For developers who prefer IDE-based AI rather than terminal-based, Cursor's 2025 updates made it genuinely competitive. The background agents can handle long-running tasks while you continue other work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt; emerged as Google's answer to Claude Code. It's open source, which appeals to developers who want to understand and modify their tools. The community extensions are interesting, though the ecosystem is less mature.&lt;/p&gt;

&lt;p&gt;The tools are converging on similar capabilities agentic operation, codebase awareness, checkpoint-and-rewind but with different ergonomics. Terminal versus IDE. Subscription versus usage-based. Closed versus open source. The right choice depends on your existing workflow and preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;2025 was the year AI coding tools became genuine collaborators. 2026 will likely push further in the same direction.&lt;/p&gt;

&lt;p&gt;I expect to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deeper integration between AI tools and testing infrastructure&lt;/li&gt;
&lt;li&gt;More sophisticated multi-agent patterns (review agents, security agents, performance agents)&lt;/li&gt;
&lt;li&gt;Better handling of genuinely novel problems through improved reasoning&lt;/li&gt;
&lt;li&gt;Standardization around MCP making tool choice less lock-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I don't expect is for these tools to replace thoughtful engineering. They accelerate execution, but the judgment about what to build and why remains fundamentally human.&lt;/p&gt;

&lt;p&gt;The developers who thrived in 2025 learned to collaborate with AI effectively clear specifications, checkpoint discipline, rigorous review. Those same skills will matter even more as the tools continue to improve.&lt;/p&gt;

&lt;p&gt;My terminal now thinks with me. The code is still mine. The responsibility hasn't changed. But the friction is lower than it's ever been, and that's worth celebrating as we close out this year.&lt;/p&gt;

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