<?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: DevUnionX</title>
    <description>The latest articles on DEV Community by DevUnionX (@devunionx).</description>
    <link>https://dev.to/devunionx</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%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg</url>
      <title>DEV Community: DevUnionX</title>
      <link>https://dev.to/devunionx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devunionx"/>
    <language>en</language>
    <item>
      <title>HTML?</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Thu, 12 Nov 2026 16:46:34 +0000</pubDate>
      <link>https://dev.to/devunionx/html-58ii</link>
      <guid>https://dev.to/devunionx/html-58ii</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe" class="crayons-story__hidden-navigation-link"&gt;10 Things Even AI Can't Do in HTML&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devunionx" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" alt="devunionx profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devunionx" class="crayons-story__secondary fw-medium m:hidden"&gt;
              DevUnionX
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                DevUnionX
                
                
              
              &lt;div id="story-author-preview-content-5024631" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devunionx" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;DevUnionX&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe" id="article-link-5024631"&gt;
          10 Things Even AI Can't Do in HTML
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/html"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;html&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/css"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;css&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;/div&gt;


</description>
    </item>
    <item>
      <title>10 Things Even AI Can't Do in HTML</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Thu, 12 Nov 2026 16:46:24 +0000</pubDate>
      <link>https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe</link>
      <guid>https://dev.to/devunionx/10-things-even-ai-cant-do-in-html-dpe</guid>
      <description>&lt;p&gt;Give it a prompt, and it can create a navigation bar, build a landing page, generate forms, organize content, and even produce a complete website structure.&lt;/p&gt;

&lt;p&gt;The result might look perfectly fine at first glance.&lt;/p&gt;

&lt;p&gt;But there's a difference between generating HTML and knowing how to use HTML properly.&lt;/p&gt;

&lt;p&gt;A page can render without errors and still have a confusing structure. A button can look correct but behave like the wrong element. A form can collect information without considering whether users actually need to provide it.&lt;/p&gt;

&lt;p&gt;This is where things get interesting.&lt;/p&gt;

&lt;p&gt;I've been thinking about what makes a developer valuable in a world where generating code is becoming easier. The answer isn't simply writing more code or memorizing more HTML elements. It's understanding why something should be built, making the right decisions, and knowing when an apparently correct solution isn't good enough.&lt;/p&gt;

&lt;p&gt;Here are ten things AI still cannot reliably handle on its own when working with HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understand the Problem Before Writing the Markup
&lt;/h2&gt;

&lt;p&gt;The first mistake in many development tasks happens before anyone writes a single line of HTML.&lt;/p&gt;

&lt;p&gt;Someone describes a feature, and the immediate reaction is to start implementing it.&lt;/p&gt;

&lt;p&gt;AI follows this approach particularly well. Give it a request for a dashboard, navigation menu, or registration page, and it will probably generate something that matches the description.&lt;/p&gt;

&lt;p&gt;But does the requested interface actually solve the problem?&lt;/p&gt;

&lt;p&gt;Imagine a company asking for a registration form with fifteen fields.&lt;/p&gt;

&lt;p&gt;AI can generate all fifteen fields. It can add labels, placeholders, and validation attributes.&lt;/p&gt;

&lt;p&gt;A developer should ask a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do we really need all fifteen fields?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Perhaps the application only needs an email address and a password. Maybe the remaining information can be collected later, when it becomes relevant.&lt;/p&gt;

&lt;p&gt;This is what problem definition means. Before deciding how to implement something, you need to understand why it is necessary.&lt;/p&gt;

&lt;p&gt;The HTML might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/subscribe"&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
    &lt;span class="na"&gt;autocomplete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Subscribe
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's simple because the task itself is simple. There's no reason to add unnecessary fields or interactions.&lt;/p&gt;

&lt;p&gt;AI can help implement a requirement, but deciding whether that requirement is worth implementing requires product understanding, communication, and judgment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; A good developer doesn't just ask how to build something. They ask whether it should be built in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Give HTML Elements Their Actual Meaning
&lt;/h2&gt;

&lt;p&gt;HTML is not just a collection of tags used to arrange content on a page.&lt;/p&gt;

&lt;p&gt;It is a language for describing the structure and meaning of a document.&lt;/p&gt;

&lt;p&gt;This distinction is easy to forget when working with modern frontend frameworks and CSS-heavy interfaces.&lt;/p&gt;

&lt;p&gt;Consider this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Save changes
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks like a button. With CSS, you can make it look exactly like one.&lt;/p&gt;

&lt;p&gt;But it isn't a native button. It doesn't automatically provide the same keyboard interaction, focus behavior, or semantics.&lt;/p&gt;

&lt;p&gt;The more appropriate version is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Save changes
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same principle applies to links, lists, headings, tables, and page sections.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About us&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A link navigates somewhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open settings&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A button performs an action.&lt;/p&gt;

&lt;p&gt;These elements might look similar after styling, but their purposes are different.&lt;/p&gt;

&lt;p&gt;AI can generate semantic HTML when asked. The problem is that it may choose elements based on how the output should look rather than what the elements actually represent.&lt;/p&gt;

&lt;p&gt;Understanding the difference requires knowledge of the browser platform and the purpose of the interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; HTML should describe what something is, not just how it should appear.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements" rel="noopener noreferrer"&gt;MDN — HTML Elements Reference&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Build a Structure That People Can Actually Navigate
&lt;/h2&gt;

&lt;p&gt;A web page isn't only consumed visually.&lt;/p&gt;

&lt;p&gt;Some users navigate through headings, landmarks, and document regions using a screen reader. Others use a keyboard or rely on browser features to move through the content.&lt;/p&gt;

&lt;p&gt;This is why document structure matters.&lt;/p&gt;

&lt;p&gt;Consider a basic page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;aria-label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/articles"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Articles&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Understanding HTML Semantics&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
        HTML provides structure and meaning to web content.
      &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Why semantics matter&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          Semantic elements help browsers and assistive
          technologies understand a document.
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;© 2026 Example Website&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elements such as &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; communicate the purpose of different regions.&lt;/p&gt;

&lt;p&gt;Headings also establish relationships between sections.&lt;/p&gt;

&lt;p&gt;One important detail: a &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; does not automatically become a named accessibility landmark. When it represents a distinct region users need to navigate to, give it an accessible name, usually through a heading.&lt;/p&gt;

&lt;p&gt;This isn't about adding as many semantic elements as possible. It's about choosing the right structure for the content.&lt;/p&gt;

&lt;p&gt;A page with ten unnecessary sections isn't automatically better than a page with three meaningful ones.&lt;/p&gt;

&lt;p&gt;AI can generate a structure, but it doesn't automatically know which parts of a particular document deserve to be grouped together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; A good HTML structure makes sense to people, browsers, and assistive technologies.&lt;/p&gt;

&lt;p&gt;References: &lt;a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Structuring_content/Structuring_documents" rel="noopener noreferrer"&gt;MDN — Structuring Documents&lt;/a&gt; · &lt;a href="https://www.w3.org/WAI/tutorials/page-structure/" rel="noopener noreferrer"&gt;W3C — Page Structure&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make Content Understandable Beyond Its Visual Appearance
&lt;/h2&gt;

&lt;p&gt;A page can look beautiful while communicating very little to machines or users who cannot see its visual presentation.&lt;/p&gt;

&lt;p&gt;Think about a product listing containing ten images, prices, and buttons.&lt;/p&gt;

&lt;p&gt;If the HTML contains only generic containers and images without meaningful text, it becomes harder for different technologies to understand what the content represents.&lt;/p&gt;

&lt;p&gt;The same applies to page metadata.&lt;/p&gt;

&lt;p&gt;A descriptive document title is more useful than a generic one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;HTML Semantics: A Practical Guide&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Learn how semantic HTML improves document structure,
    accessibility, and maintainability."&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The title and metadata help describe the document.&lt;/p&gt;

&lt;p&gt;Google Search can use the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, visible page headings, and other signals when generating search result titles. However, providing good metadata does not guarantee a particular ranking or an exact search result title.&lt;/p&gt;

&lt;p&gt;The content itself matters just as much.&lt;/p&gt;

&lt;p&gt;For example, a product page should communicate the product name, relevant details, price, and available actions through actual content rather than relying entirely on images or decorative elements.&lt;/p&gt;

&lt;p&gt;A developer has to understand what information matters and how it should be represented.&lt;/p&gt;

&lt;p&gt;AI can generate metadata and markup, but it cannot independently guarantee that the information accurately represents the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; HTML should communicate the meaning of the content, not merely display it.&lt;/p&gt;

&lt;p&gt;References: &lt;a href="https://developers.google.com/search/docs/appearance/title-link" rel="noopener noreferrer"&gt;Google Search Central — Title Links&lt;/a&gt; · &lt;a href="https://developers.google.com/search/docs/fundamentals/get-started-developers" rel="noopener noreferrer"&gt;Google Search Central — SEO Guide&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Provide Meaningful Experiences for Users Who Cannot See the Page
&lt;/h2&gt;

&lt;p&gt;Accessibility is one of those areas where an interface can look completely correct while still having serious problems.&lt;/p&gt;

&lt;p&gt;A developer can create a beautiful image gallery, but what happens when someone using a screen reader visits it?&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"product.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The markup includes alternative text, but it doesn't communicate anything useful about the image.&lt;/p&gt;

&lt;p&gt;A better example would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"running-shoes.jpg"&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Black running shoes with white soles, shown from the side"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The description communicates relevant visual information.&lt;/p&gt;

&lt;p&gt;There is another important distinction: not every image needs descriptive alternative text.&lt;/p&gt;

&lt;p&gt;Decorative images that don't provide meaningful information should generally use an empty &lt;code&gt;alt&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"decorative-pattern.png"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents screen readers from announcing irrelevant content.&lt;/p&gt;

&lt;p&gt;The same thinking applies to other elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use meaningful text for links.&lt;/li&gt;
&lt;li&gt;Provide labels for controls.&lt;/li&gt;
&lt;li&gt;Preserve logical heading order.&lt;/li&gt;
&lt;li&gt;Make interactive elements keyboard-accessible.&lt;/li&gt;
&lt;li&gt;Avoid communicating important information through color alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can generate many of these attributes, but it doesn't necessarily know what an image contributes to a particular page or what information a user needs.&lt;/p&gt;

&lt;p&gt;Accessibility is not a box you check by adding &lt;code&gt;alt&lt;/code&gt; to every image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; You need to understand the content before deciding how to make it accessible.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://www.w3.org/WAI/tutorials/images/" rel="noopener noreferrer"&gt;W3C WAI — Images Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Design Forms Around People, Not Just Input Fields
&lt;/h2&gt;

&lt;p&gt;Forms are among the most common places where poor HTML decisions affect real users.&lt;/p&gt;

&lt;p&gt;AI can generate a form with every input type imaginable. But a useful form is not defined by how many fields it contains.&lt;/p&gt;

&lt;p&gt;It is defined by how easily someone can complete the task.&lt;/p&gt;

&lt;p&gt;For example, consider a simple registration form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/register"&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;fieldset&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;legend&amp;gt;&lt;/span&gt;Create your account&lt;span class="nt"&gt;&amp;lt;/legend&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Full name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
      &lt;span class="na"&gt;autocomplete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
      &lt;span class="na"&gt;autocomplete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;
      &lt;span class="na"&gt;autocomplete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"new-password"&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Create account&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/fieldset&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice a few details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Labels are explicitly connected to their inputs.&lt;/li&gt;
&lt;li&gt;The appropriate autocomplete values help browser autofill.&lt;/li&gt;
&lt;li&gt;Required fields are marked clearly.&lt;/li&gt;
&lt;li&gt;Related controls are grouped using &lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Native form behavior is preserved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML also provides built-in validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;required&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser can check whether the field is empty or whether the entered value has an appropriate email format.&lt;/p&gt;

&lt;p&gt;However, client-side validation is not a security mechanism. The server must validate submitted data independently.&lt;/p&gt;

&lt;p&gt;The W3C Forms Tutorial also emphasizes clear instructions, understandable error messages, and giving users a chance to review or correct their input.&lt;/p&gt;

&lt;p&gt;These details are easy to overlook when the only goal is generating a form that looks correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; A good form asks for the right information, explains what is expected, and helps users recover from mistakes.&lt;/p&gt;

&lt;p&gt;References: &lt;a href="https://www.w3.org/WAI/tutorials/forms/" rel="noopener noreferrer"&gt;W3C — Forms Tutorial&lt;/a&gt; · &lt;a href="https://www.w3.org/WAI/tutorials/forms/labels/" rel="noopener noreferrer"&gt;W3C — Labeling Controls&lt;/a&gt; · &lt;a href="https://www.w3.org/WAI/tutorials/forms/validation/" rel="noopener noreferrer"&gt;W3C — Input Validation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Understand That Localization Is More Than Changing Words
&lt;/h2&gt;

&lt;p&gt;A website can be translated into twenty languages and still feel foreign to users in every one of them.&lt;/p&gt;

&lt;p&gt;That's because localization involves more than replacing English sentences with translated alternatives.&lt;/p&gt;

&lt;p&gt;It also includes writing direction, date formats, currencies, terminology, cultural references, and the way information is presented.&lt;/p&gt;

&lt;p&gt;For example, a page intended for Arabic readers should communicate its language and direction correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rtl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;مرحباً بك&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;مرحباً بك&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;نحن سعداء بزيارتك.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;lang&lt;/code&gt; attribute identifies the language of the document, while &lt;code&gt;dir&lt;/code&gt; establishes its text direction.&lt;/p&gt;

&lt;p&gt;For content that can contain text in different writing directions, the &lt;code&gt;&amp;lt;bdi&amp;gt;&lt;/code&gt; element can help isolate text whose direction should be determined independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  Username:
  &lt;span class="nt"&gt;&amp;lt;bdi&amp;gt;&lt;/span&gt;developer_محمد&lt;span class="nt"&gt;&amp;lt;/bdi&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters when displaying user-generated names or text that might mix left-to-right and right-to-left characters.&lt;/p&gt;

&lt;p&gt;But technical direction is only one part of localization.&lt;/p&gt;

&lt;p&gt;An expression that sounds friendly in one language may sound too informal or even inappropriate in another. A symbol or color can also carry different meanings depending on the audience.&lt;/p&gt;

&lt;p&gt;AI can translate words and generate locale-aware markup. Understanding whether the complete experience feels natural in a particular culture requires local knowledge and human review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; A localized website should feel like it was designed for its audience, not simply translated for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Preserve the Browser's Native Capabilities
&lt;/h2&gt;

&lt;p&gt;Modern frontend development often involves JavaScript frameworks, custom components, and complex application architectures.&lt;/p&gt;

&lt;p&gt;Sometimes, developers forget that the browser already provides a lot of useful functionality.&lt;/p&gt;

&lt;p&gt;A simple link can navigate between pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/articles"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Read articles
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A native form can submit information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/search"&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Search articles&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"search"&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"search"&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Search&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither example requires JavaScript to provide its basic browser behavior.&lt;/p&gt;

&lt;p&gt;You can add JavaScript later to improve the experience, but the essential functionality already exists.&lt;/p&gt;

&lt;p&gt;This is closely related to &lt;strong&gt;progressive enhancement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple: start with meaningful HTML that provides the core experience, then add CSS and JavaScript to improve it.&lt;/p&gt;

&lt;p&gt;For example, a navigation link should still be a useful link before any client-side routing enhancement is added.&lt;/p&gt;

&lt;p&gt;Not every interface needs to be a fully custom JavaScript component.&lt;/p&gt;

&lt;p&gt;Sometimes the native element is the better solution.&lt;/p&gt;

&lt;p&gt;The PDF's discussion of smart reuse is relevant here. Originality doesn't require rebuilding everything from scratch. It often comes from combining existing tools and capabilities in a more appropriate way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; Knowing when not to write additional code is also a development skill.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://web.dev/learn/forms/" rel="noopener noreferrer"&gt;web.dev — Learn Forms&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Create Something Original Without Ignoring Existing Standards
&lt;/h2&gt;

&lt;p&gt;This is probably the most interesting part of the discussion.&lt;/p&gt;

&lt;p&gt;What does originality actually mean in software development?&lt;/p&gt;

&lt;p&gt;Does writing an entirely new HTML structure make a developer original? Does avoiding existing patterns automatically make a project better?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;The PDF introduces an important distinction: originality is not simply creating something that has never existed before. It can come from the creator's distinctive contribution and the way existing knowledge is combined.&lt;/p&gt;

&lt;p&gt;I think this idea applies directly to HTML development.&lt;/p&gt;

&lt;p&gt;Consider the following three dimensions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product-focused originality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The structure and content should serve the specific product. A documentation website, an online store, and a portfolio do not need the same document structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Person-focused originality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The content, writing style, presentation, and decisions should reflect a meaningful identity rather than simply copying a generic template.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social and strategic originality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The implementation should make sense for the intended audience, the team, and the goals of the project.&lt;/p&gt;

&lt;p&gt;For example, using &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; to create an FAQ section is not a completely new invention.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"faq-heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"faq-heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Frequently Asked Questions&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;What is semantic HTML?&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      Semantic HTML uses elements that describe
      the meaning and purpose of content.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;Why should I use it?&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      It helps browsers, developers, and assistive
      technologies understand the document.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The originality is not in inventing a new element. It's in recognizing that a native HTML feature is the right solution for a particular problem.&lt;/p&gt;

&lt;p&gt;A developer who understands HTML can combine existing elements, patterns, and ideas in ways that produce a more useful experience.&lt;/p&gt;

&lt;p&gt;AI can suggest combinations, but choosing the right combination depends on understanding the product and its users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; Originality doesn't mean avoiding existing solutions. It means knowing how to use them in a way that creates something valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Take Responsibility for the Final Result
&lt;/h2&gt;

&lt;p&gt;This is where technical knowledge, experience, and professional judgment come together.&lt;/p&gt;

&lt;p&gt;AI can produce a complete HTML document, but that doesn't mean the document is ready for production.&lt;/p&gt;

&lt;p&gt;Someone still needs to check whether:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The markup follows the HTML standard.&lt;/li&gt;
&lt;li&gt;Interactive elements behave correctly.&lt;/li&gt;
&lt;li&gt;The document has a logical structure.&lt;/li&gt;
&lt;li&gt;Forms are usable and provide appropriate feedback.&lt;/li&gt;
&lt;li&gt;Accessibility requirements have been considered.&lt;/li&gt;
&lt;li&gt;The content and metadata are accurate.&lt;/li&gt;
&lt;li&gt;The implementation fits the existing codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And importantly, someone needs to take responsibility when something goes wrong.&lt;/p&gt;

&lt;p&gt;A useful starting point is validating the generated markup with the &lt;a href="https://validator.w3.org/nu/" rel="noopener noreferrer"&gt;Nu HTML Checker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But passing validation doesn't guarantee a good user experience. You should also test the page using a keyboard, screen reader, different browsers, and realistic content.&lt;/p&gt;

&lt;p&gt;There is another part of responsibility that often gets overlooked: working with other developers.&lt;/p&gt;

&lt;p&gt;The PDF makes a valuable point about shared coding conventions. A developer's originality should not mean introducing a completely different style into every project.&lt;/p&gt;

&lt;p&gt;Imagine joining an established codebase where every page follows consistent naming, indentation, component boundaries, and document conventions.&lt;/p&gt;

&lt;p&gt;Adding your own personal style everywhere might feel creative, but it can make the code harder for the next developer to understand.&lt;/p&gt;

&lt;p&gt;A professional developer knows when to follow an existing pattern and when there is a strong reason to improve it.&lt;/p&gt;

&lt;p&gt;That decision often requires discussion, explanation, and collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The point:&lt;/strong&gt; Generating code is an activity. Owning the quality and consequences of that code is a responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, What Makes a Developer Valuable in the AI Era?
&lt;/h2&gt;

&lt;p&gt;I don't think the answer is writing HTML faster than an AI model.&lt;/p&gt;

&lt;p&gt;AI can generate basic markup, create forms, suggest semantic elements, and explain unfamiliar parts of the standard. It can save a considerable amount of time on repetitive work.&lt;/p&gt;

&lt;p&gt;But speed alone doesn't define a good developer.&lt;/p&gt;

&lt;p&gt;The more important skills are becoming increasingly clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining the right problem before implementation.&lt;/li&gt;
&lt;li&gt;Understanding the technology beyond copying examples.&lt;/li&gt;
&lt;li&gt;Combining existing solutions in useful ways.&lt;/li&gt;
&lt;li&gt;Making thoughtful architectural and design decisions.&lt;/li&gt;
&lt;li&gt;Communicating with teammates and understanding users.&lt;/li&gt;
&lt;li&gt;Maintaining code that other people can work with.&lt;/li&gt;
&lt;li&gt;Continuously learning and developing deeper expertise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One idea from the PDF is especially relevant here: technical execution is becoming easier to automate, while the value of judgment, problem-solving, and meaningful contribution becomes more important.&lt;/p&gt;

&lt;p&gt;That doesn't mean technical knowledge is becoming irrelevant. Quite the opposite.&lt;/p&gt;

&lt;p&gt;The deeper your understanding of HTML, browser behavior, accessibility, and web standards, the better you can evaluate generated code and recognize when something is wrong.&lt;/p&gt;

&lt;p&gt;AI can help you move faster, but understanding what deserves to be built is still a major part of the job.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
      <category>web3</category>
    </item>
    <item>
      <title>10 Things Even AI Can't Do in Frontend Development (At Least Not on Its Own)</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Sun, 08 Nov 2026 00:31:46 +0000</pubDate>
      <link>https://dev.to/devunionx/10-things-even-ai-cant-do-in-frontend-development-at-least-not-on-its-own-3893</link>
      <guid>https://dev.to/devunionx/10-things-even-ai-cant-do-in-frontend-development-at-least-not-on-its-own-3893</guid>
      <description>&lt;p&gt;AI can build a React component, generate a landing page, write CSS, connect an API, and even create an entire frontend from a short description.&lt;/p&gt;

&lt;p&gt;A few years ago, getting that much code generated automatically would have sounded unrealistic. Today, it's part of a normal development workflow.&lt;/p&gt;

&lt;p&gt;But here's something worth remembering: &lt;strong&gt;generating a working interface and building a good user experience are two very different things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI-generated page might look impressive in a screenshot. Open it, resize the browser, navigate with a keyboard, test it on a slower connection, or use it with real content. That's usually when the missing details start to appear.&lt;/p&gt;

&lt;p&gt;I've been thinking about this from a frontend developer's perspective. AI is becoming a useful part of the job, but there are still areas where generated code needs human judgment, experience, and a proper review process.&lt;/p&gt;

&lt;p&gt;Here are ten of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understand What the User Actually Needs
&lt;/h2&gt;

&lt;p&gt;AI is very good at following instructions. The problem is that users don't always know how to describe what they need.&lt;/p&gt;

&lt;p&gt;A product owner might ask for a dashboard with five charts, three filters, and a sidebar. AI can generate that layout without much trouble.&lt;/p&gt;

&lt;p&gt;But does the dashboard actually help anyone make a decision?&lt;/p&gt;

&lt;p&gt;Maybe users only need two important metrics. Maybe the filters are unnecessary. Maybe the information should be organized around tasks rather than categories.&lt;/p&gt;

&lt;p&gt;These are product decisions, not coding problems.&lt;/p&gt;

&lt;p&gt;A frontend developer needs to understand the reason behind a feature before deciding how to implement it. That includes business goals, user behavior, accessibility needs, and the context in which the interface will be used.&lt;/p&gt;

&lt;p&gt;AI can suggest solutions based on the information it receives. It cannot reliably discover missing requirements or know which assumptions are wrong without additional evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can implement a requested feature. Understanding whether that feature should exist in the first place requires product thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create a Distinctive Design, Not Just Another Familiar Interface
&lt;/h2&gt;

&lt;p&gt;There is a reason so many AI-generated dashboards and landing pages look similar.&lt;/p&gt;

&lt;p&gt;The same gradients, rounded cards, purple buttons, oversized headings, and familiar layouts appear again and again.&lt;/p&gt;

&lt;p&gt;These patterns aren't necessarily bad. In fact, many are perfectly reasonable design choices. The problem starts when every product ends up looking like a variation of the same template.&lt;/p&gt;

&lt;p&gt;A good interface needs more than visual consistency. It needs an identity.&lt;/p&gt;

&lt;p&gt;A developer working with a designer considers questions that are difficult to reduce to a prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should users notice first?&lt;/li&gt;
&lt;li&gt;Which elements deserve visual emphasis?&lt;/li&gt;
&lt;li&gt;Does the design communicate the personality of the product?&lt;/li&gt;
&lt;li&gt;Is the layout appropriate for the audience?&lt;/li&gt;
&lt;li&gt;Does the interface feel different for a meaningful reason?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 2026 study comparing AI-generated and human-created interface prototypes found that participants could evaluate generated interfaces positively on practical usability dimensions, while the more experience-oriented dimensions, such as originality and innovation, were less convincing. It's one study, not a universal verdict, but it illustrates an important distinction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2605.15124" rel="noopener noreferrer"&gt;Read the study: Usable but Conventional — An Empirical Study on the UX of AI-Generated Interface Prototypes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;AI can give you a good starting point. Turning that starting point into a recognizable product experience takes design direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Make Animations Feel Natural
&lt;/h2&gt;

&lt;p&gt;Animations are easy to underestimate.&lt;/p&gt;

&lt;p&gt;A button changes color. A modal appears. A card moves into place. Technically, everything works.&lt;/p&gt;

&lt;p&gt;But good motion design is not simply about making elements move. It communicates relationships, provides feedback, and helps users understand changes in the interface.&lt;/p&gt;

&lt;p&gt;AI-generated code often starts with generic transitions. That is fine for a prototype, but applying the same duration and easing curve to every interaction can make an application feel mechanical.&lt;/p&gt;

&lt;p&gt;Consider the difference between a quick button response and a page transition. They shouldn't necessarily have the same timing or visual weight.&lt;/p&gt;

&lt;p&gt;Performance is another part of the problem. Animating layout-heavy properties such as width, height, or position can cause additional layout work. Sometimes a transform-based animation is a better choice.&lt;/p&gt;

&lt;p&gt;There is also a simple accessibility detail that should not be forgotten:&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&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;220ms&lt;/span&gt; &lt;span class="nb"&gt;ease&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="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-4px&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;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&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;transition&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;.card&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transform&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;prefers-reduced-motion&lt;/code&gt; media query lets the interface respect users who have enabled reduced motion in their operating system.&lt;/p&gt;

&lt;p&gt;The goal isn't to remove every animation. It's to make sure that unnecessary movement doesn't get in the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can generate transitions. Deciding how motion should communicate an interaction, remain performant, and respect user preferences takes more than generating CSS.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/%40media/prefers-reduced-motion" rel="noopener noreferrer"&gt;MDN — prefers-reduced-motion&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Personalize an Experience Without Making It Feel Intrusive
&lt;/h2&gt;

&lt;p&gt;Personalization is one of the most interesting areas of modern frontend development.&lt;/p&gt;

&lt;p&gt;An application can recommend content, remember preferences, adapt its interface, and respond to previous interactions.&lt;/p&gt;

&lt;p&gt;AI can help implement these features, but there is a subtle problem: &lt;strong&gt;more personalization does not automatically mean a better experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a fitness application that recommends a difficult workout because the user hasn't exercised recently.&lt;/p&gt;

&lt;p&gt;That recommendation might be based on real activity data. But perhaps the user is recovering from an injury, travelling, or simply taking a planned break.&lt;/p&gt;

&lt;p&gt;The application has information, but it doesn't necessarily have enough context to make a useful decision.&lt;/p&gt;

&lt;p&gt;Personalization should have a clear purpose. It should solve a problem rather than demonstrate how much information an application has collected.&lt;/p&gt;

&lt;p&gt;Good implementations also give users control over their preferences and explain why certain recommendations appear.&lt;/p&gt;

&lt;p&gt;For example, a recommendation such as:&lt;/p&gt;

&lt;p&gt;"You saved a similar article last week. Here are three related resources."&lt;/p&gt;

&lt;p&gt;Feels more relevant than a random recommendation with no explanation.&lt;/p&gt;

&lt;p&gt;Developers need to decide what data is appropriate, which recommendations are useful, and when personalization becomes uncomfortable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can recognize patterns. Deciding whether those patterns should influence someone's experience requires context and judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Understand Localization Beyond Translation
&lt;/h2&gt;

&lt;p&gt;Translating an interface is not the same as localizing it.&lt;/p&gt;

&lt;p&gt;AI can translate a collection of interface strings into multiple languages very quickly. However, a technically correct translation can still sound unnatural or communicate the wrong meaning.&lt;/p&gt;

&lt;p&gt;Idioms, humor, cultural references, tone, and local expectations are difficult to handle with literal translations.&lt;/p&gt;

&lt;p&gt;The same problem applies to visual design.&lt;/p&gt;

&lt;p&gt;A layout designed for a left-to-right language may need adjustments for Arabic or Hebrew. Dates, currencies, address formats, number formatting, and even familiar symbols can differ between markets.&lt;/p&gt;

&lt;p&gt;For example, an interface should not assume that every language uses the same text direction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;"rtl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;مرحباً بك&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;متابعة&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CSS logical properties also make layouts easier to adapt:&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&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;padding-inline&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="py"&gt;margin-inline-start&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="py"&gt;border-inline-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nx"&gt;#6366f1&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;Instead of hardcoding &lt;code&gt;left&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt;, logical properties work with the document's writing direction.&lt;/p&gt;

&lt;p&gt;The W3C explains that localization involves adapting an application to the language, cultural, and other requirements of a target market. It goes well beyond translating text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/International/questions/qa-i18n" rel="noopener noreferrer"&gt;W3C — Localization vs. Internationalization&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can translate strings. Making a product feel native to another audience requires cultural understanding and real local feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Build Accessibility Into the Experience
&lt;/h2&gt;

&lt;p&gt;This is one of the most important points on the list.&lt;/p&gt;

&lt;p&gt;A frontend can look perfect and still be difficult to use for someone navigating with a keyboard or screen reader.&lt;/p&gt;

&lt;p&gt;AI-generated interfaces sometimes contain buttons without meaningful labels, poor color contrast, confusing heading structures, missing alternative text, or controls that are difficult to operate without a mouse.&lt;/p&gt;

&lt;p&gt;The issue is that accessibility is not always visible.&lt;/p&gt;

&lt;p&gt;A screenshot cannot tell you whether a screen reader announces a button correctly or whether a keyboard user can reach every important interaction.&lt;/p&gt;

&lt;p&gt;Consider this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"submitForm()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Submit
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may look like a button, but it does not provide the native keyboard and accessibility behavior of an actual button.&lt;/p&gt;

&lt;p&gt;A better implementation is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Submit
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Native HTML elements already provide important semantics and interaction behavior.&lt;/p&gt;

&lt;p&gt;For more complex interfaces, developers also need to manage focus, labels, keyboard navigation, error messages, and dynamic content.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/TR/WCAG22/" rel="noopener noreferrer"&gt;WCAG 2.2 guidelines&lt;/a&gt; organize accessibility around four principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perceivable:&lt;/strong&gt; Users must be able to perceive the information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operable:&lt;/strong&gt; Users must be able to interact with the interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understandable:&lt;/strong&gt; Content and behavior should be understandable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust:&lt;/strong&gt; Content should work with current and future assistive technologies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recent research continues to identify accessibility issues in AI-generated interfaces. A 2026 IEEE study of AI-generated UI components reported problems including missing labels, incorrect ARIA usage, focus issues, and keyboard navigation failures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ieeexplore.ieee.org/abstract/document/11670366/" rel="noopener noreferrer"&gt;Read the IEEE study&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Automated accessibility tools are useful, but they are not a replacement for manual testing with keyboards and assistive technologies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can help write accessible markup. Making sure the whole experience is accessible requires testing with real interaction methods and users.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Make Responsive Design Work Beyond a Screenshot
&lt;/h2&gt;

&lt;p&gt;A layout that looks good at 1440 pixels is not automatically responsive.&lt;/p&gt;

&lt;p&gt;Real users have different devices, browser settings, text sizes, orientations, input methods, and screen dimensions.&lt;/p&gt;

&lt;p&gt;A navigation bar that works on a desktop may become unusable on a narrow screen. A heading may overflow when translated. A card may look fine with short sample text but break when real content arrives.&lt;/p&gt;

&lt;p&gt;AI can generate media queries, flexible grids, and responsive components. But it doesn't automatically prove that the result works across the situations your users encounter.&lt;/p&gt;

&lt;p&gt;For example, this is a reasonable starting point:&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-grid&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;auto-fit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;min&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="m"&gt;16rem&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nl"&gt;gap&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The layout adapts to the available space without requiring a separate breakpoint for every device.&lt;/p&gt;

&lt;p&gt;But responsive design is not just about screen width.&lt;/p&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the interface still work with larger text?&lt;/li&gt;
&lt;li&gt;Are buttons comfortable to use on touchscreens?&lt;/li&gt;
&lt;li&gt;Does the navigation support keyboard interaction?&lt;/li&gt;
&lt;li&gt;Does the layout handle long translations?&lt;/li&gt;
&lt;li&gt;What happens in landscape orientation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These details need to be tested.&lt;/p&gt;

&lt;p&gt;MDN's &lt;a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/CSS_layout/Responsive_Design" rel="noopener noreferrer"&gt;Responsive Design guide&lt;/a&gt; covers the platform features used to build layouts that adapt to different environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can write responsive CSS. Verifying the experience across real devices, content, and interaction methods is a separate job.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Optimize Performance Based on Real Users
&lt;/h2&gt;

&lt;p&gt;AI can suggest code optimizations, lazy loading, code splitting, caching, and image compression.&lt;/p&gt;

&lt;p&gt;However, performance is not something you can judge by looking at the source code alone.&lt;/p&gt;

&lt;p&gt;A page can load quickly on a developer's laptop and feel painfully slow on an older phone or a poor network connection.&lt;/p&gt;

&lt;p&gt;The actual experience depends on many things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Device capabilities.&lt;/li&gt;
&lt;li&gt;Network conditions.&lt;/li&gt;
&lt;li&gt;JavaScript execution.&lt;/li&gt;
&lt;li&gt;Third-party scripts.&lt;/li&gt;
&lt;li&gt;Image and font loading.&lt;/li&gt;
&lt;li&gt;Layout and rendering work.&lt;/li&gt;
&lt;li&gt;User interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why modern frontend performance uses real-world measurements.&lt;/p&gt;

&lt;p&gt;Google's Core Web Vitals provide three important signals:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;Good target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;Loading performance&lt;/td&gt;
&lt;td&gt;2.5 seconds or less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;Interaction responsiveness&lt;/td&gt;
&lt;td&gt;Less than 200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;Visual stability&lt;/td&gt;
&lt;td&gt;Less than 0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These targets are useful, but hitting them in a local test doesn't guarantee that every user has the same experience.&lt;/p&gt;

&lt;p&gt;You need both controlled testing during development and field data from actual users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/search/docs/appearance/core-web-vitals" rel="noopener noreferrer"&gt;Google — Core Web Vitals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can suggest performance improvements. Knowing which improvement matters requires profiling, measurement, and an understanding of the application's real usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Debug Problems That Only Exist in Production
&lt;/h2&gt;

&lt;p&gt;A bug report that says "the page sometimes freezes" is not very helpful.&lt;/p&gt;

&lt;p&gt;What browser was being used? Which device? What happened immediately before the freeze? Was the network slow? Did a third-party script fail? Was the user working with unusual data?&lt;/p&gt;

&lt;p&gt;These questions matter.&lt;/p&gt;

&lt;p&gt;AI can analyze logs, explain stack traces, and suggest possible fixes. That's genuinely useful. But it can only reason from the information available to it.&lt;/p&gt;

&lt;p&gt;Production problems are often difficult because several things happen together.&lt;/p&gt;

&lt;p&gt;For example, a race condition might only appear when a user quickly changes filters while a previous API request is still running.&lt;/p&gt;

&lt;p&gt;A basic implementation might look like 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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`/api/products?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to load products&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function is reasonable, but it doesn't handle the situation where users trigger multiple searches quickly and responses return in a different order.&lt;/p&gt;

&lt;p&gt;A more complete implementation might use &lt;code&gt;AbortController&lt;/code&gt; to cancel outdated requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`/api/products?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&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;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to load products&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AbortError&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&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;Even this solution is only one part of the problem. The application still needs correct loading states, error handling, and a decision about what to display when a request fails.&lt;/p&gt;

&lt;p&gt;Production debugging requires logs, monitoring, reproduction steps, browser knowledge, and an understanding of the complete system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can help investigate a bug. It cannot reliably diagnose an environment it cannot observe.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Take Responsibility for Security and Long-Term Code Quality
&lt;/h2&gt;

&lt;p&gt;A frontend project is not finished when the interface compiles.&lt;/p&gt;

&lt;p&gt;The code needs to be understandable, secure, maintainable, and compatible with the rest of the application.&lt;/p&gt;

&lt;p&gt;AI can generate a component quickly, but it may not know all the architectural decisions behind an existing codebase. It might introduce unnecessary dependencies, duplicate existing logic, bypass established patterns, or place too much responsibility inside a single component.&lt;/p&gt;

&lt;p&gt;Security deserves particular attention.&lt;/p&gt;

&lt;p&gt;For example, consider rendering user-provided content:&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="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can create a cross-site scripting vulnerability when untrusted input is interpreted as HTML.&lt;/p&gt;

&lt;p&gt;For plain text, use a safer approach:&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="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In framework-based applications, use the framework's normal escaped text-rendering mechanisms. Avoid bypassing those protections with raw HTML unless the content has been properly sanitized.&lt;/p&gt;

&lt;p&gt;There is another important rule: frontend code is visible and controllable by the user. Business-critical authorization, secrets, and security decisions must not rely on client-side checks.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Web_Frontend_Security_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP Web Frontend Security Cheat Sheet&lt;/a&gt; explains why client-side input, API responses, browser storage, and third-party data should all be treated carefully.&lt;/p&gt;

&lt;p&gt;Long-term quality requires more than passing tests today. It means being able to understand the code six months later, update dependencies safely, investigate regressions, and add features without breaking unrelated parts of the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt; AI can generate and refactor code. Developers remain responsible for the security boundaries, architecture, and consequences of shipping it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does This Mean AI Is Bad at Frontend Development?
&lt;/h2&gt;

&lt;p&gt;Not at all.&lt;/p&gt;

&lt;p&gt;I use AI as a development tool, and there are plenty of situations where it saves time.&lt;/p&gt;

&lt;p&gt;It is useful for generating boilerplate, explaining unfamiliar code, creating prototypes, suggesting CSS solutions, writing tests, and exploring implementation alternatives.&lt;/p&gt;

&lt;p&gt;The problem starts when we confuse speed with quality.&lt;/p&gt;

&lt;p&gt;A generated component can be technically correct and still create a poor experience. A design can look professional and still be inaccessible. A translation can be understandable and still feel unnatural.&lt;/p&gt;

&lt;p&gt;The better approach is to give AI the repetitive work while keeping developers involved in the decisions that affect users.&lt;/p&gt;

&lt;p&gt;A practical workflow looks something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the user problem and requirements before generating code.&lt;/li&gt;
&lt;li&gt;Use AI to create a first implementation or explore alternatives.&lt;/li&gt;
&lt;li&gt;Review the code for accessibility, responsiveness, security, and maintainability.&lt;/li&gt;
&lt;li&gt;Test the experience with real content, devices, and interaction methods.&lt;/li&gt;
&lt;li&gt;Measure performance and fix problems based on actual evidence.&lt;/li&gt;
&lt;li&gt;Keep human review in the process before shipping.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI becomes much more useful when it is part of a feedback loop rather than the final decision-maker.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Did you notice anything wrong with Flutter?</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:12:17 +0000</pubDate>
      <link>https://dev.to/devunionx/did-you-notice-anything-wrong-with-flutter-ga7</link>
      <guid>https://dev.to/devunionx/did-you-notice-anything-wrong-with-flutter-ga7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf" class="crayons-story__hidden-navigation-link"&gt;5 Things AI Still Gets Wrong When Building Flutter Apps&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devunionx" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" alt="devunionx profile" class="crayons-avatar__image" width="400" height="400"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devunionx" class="crayons-story__secondary fw-medium m:hidden"&gt;
              DevUnionX
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                DevUnionX
                
                
              
              &lt;div id="story-author-preview-content-4979175" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devunionx" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" class="crayons-avatar__image" alt="" width="400" height="400"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;DevUnionX&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 5&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf" id="article-link-4979175"&gt;
          5 Things AI Still Gets Wrong When Building Flutter Apps
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/flutter"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;flutter&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/dart"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;dart&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mobile"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mobile&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/motivation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;motivation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>5 Things AI Still Gets Wrong When Building Flutter Apps</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:10:47 +0000</pubDate>
      <link>https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf</link>
      <guid>https://dev.to/devunionx/5-things-ai-still-gets-wrong-when-building-flutter-apps-24bf</guid>
      <description>&lt;p&gt;AI can generate a Flutter screen in seconds. It can create widgets, connect APIs, suggest animations, and even put together an entire prototype from a short prompt.&lt;/p&gt;

&lt;p&gt;That's impressive. And honestly, it makes development much faster.&lt;/p&gt;

&lt;p&gt;But there's a difference between generating an interface and building an app that people actually enjoy using.&lt;/p&gt;

&lt;p&gt;I've noticed that many AI-generated Flutter interfaces can look convincing in a screenshot. The problems become more obvious when you start interacting with them. Animations feel unnatural, recommendations lack context, translations sound strange, and accessibility is often treated as an afterthought.&lt;/p&gt;

&lt;p&gt;The issue isn't that AI is useless at these tasks. It can help with all of them. The problem is that a generated solution doesn't automatically understand the people who will use it.&lt;/p&gt;

&lt;p&gt;Here are five areas where AI-assisted Flutter development still needs a lot of human judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Animations That Work, But Don't Feel Natural
&lt;/h2&gt;

&lt;p&gt;One of the first things I notice in AI-generated mobile interfaces is the animation.&lt;/p&gt;

&lt;p&gt;A button fades in. A card slides onto the screen. A dialog appears with a default transition. Everything technically works, but something feels off.&lt;/p&gt;

&lt;p&gt;The problem is usually not the animation itself. It's how the animations work together.&lt;/p&gt;

&lt;p&gt;Good motion design has a purpose. It helps users understand what happened, where something came from, and what they should focus on next.&lt;/p&gt;

&lt;p&gt;For example, pressing a button should provide quick feedback. Opening a new screen might need a more noticeable transition. Removing an item from a list should feel different from adding one.&lt;/p&gt;

&lt;p&gt;AI-generated code often uses similar durations and curves across unrelated interactions. The result can feel repetitive and mechanical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance matters too
&lt;/h3&gt;

&lt;p&gt;Consider this simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AnimatedContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;duration:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;milliseconds:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="n"&gt;isExpanded&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="n"&gt;isExpanded&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Product'&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's nothing inherently wrong with &lt;code&gt;AnimatedContainer&lt;/code&gt;. It's a useful Flutter widget for animating changes to properties such as size, decoration, and padding.&lt;/p&gt;

&lt;p&gt;However, changing layout-related properties can trigger additional layout work. In more complex interfaces, that can become expensive.&lt;/p&gt;

&lt;p&gt;For movement that doesn't need surrounding widgets to change their layout, a transform-based animation may be a better choice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AnimatedScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;scale:&lt;/span&gt; &lt;span class="n"&gt;isSelected&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;1.05&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;duration:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;milliseconds:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;curve:&lt;/span&gt; &lt;span class="n"&gt;Curves&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;easeOutCubic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ProductCard&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 doesn't mean transforms are always faster. Rendering performance depends on the complete widget tree and the work required to paint each frame. Profile the actual application instead of assuming one animation approach is always better.&lt;/p&gt;

&lt;p&gt;Flutter provides several tools for this, including &lt;code&gt;AnimatedBuilder&lt;/code&gt;, &lt;code&gt;AnimatedOpacity&lt;/code&gt;, &lt;code&gt;SlideTransition&lt;/code&gt;, and physics-based animations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't forget reduced motion
&lt;/h3&gt;

&lt;p&gt;Another detail that's easy to miss is the user's motion preference.&lt;/p&gt;

&lt;p&gt;Flutter exposes accessibility information that developers can use when deciding whether to simplify custom animations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;shouldReduceMotion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;disableAnimations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disableAnimationsOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;reduceMotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WidgetsBinding&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;platformDispatcher&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessibilityFeatures&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduceMotion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;disableAnimations&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;reduceMotion&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;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AnimatedScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;scale:&lt;/span&gt; &lt;span class="n"&gt;isSelected&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;1.05&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;duration:&lt;/span&gt; &lt;span class="n"&gt;shouldReduceMotion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zero&lt;/span&gt;
      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;milliseconds:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ProductCard&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;There is an important platform detail here: &lt;code&gt;disableAnimations&lt;/code&gt; corresponds to Android's animation-removal setting, while &lt;code&gt;reduceMotion&lt;/code&gt; is exposed separately on iOS. They are not interchangeable flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; AI can generate an animation, but deciding whether it feels right, performs well, and respects the user's preferences still requires careful testing and design judgment.&lt;/p&gt;

&lt;p&gt;Useful references: &lt;a href="https://docs.flutter.dev/ui/animations" rel="noopener noreferrer"&gt;Flutter Animations&lt;/a&gt; · &lt;a href="https://docs.flutter.dev/perf/best-practices" rel="noopener noreferrer"&gt;Flutter Performance Best Practices&lt;/a&gt; · &lt;a href="https://api.flutter.dev/flutter/dart-ui/AccessibilityFeatures-class.html" rel="noopener noreferrer"&gt;AccessibilityFeatures API&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Personalization Without Understanding the User
&lt;/h2&gt;

&lt;p&gt;Personalization is one of the most attractive promises of AI-powered applications.&lt;/p&gt;

&lt;p&gt;Imagine a fitness app that recommends a workout based on your activity, schedule, and previous sessions.&lt;/p&gt;

&lt;p&gt;That sounds useful. But there's a big difference between showing a recommendation based on a few conditions and providing something that genuinely fits the user's situation.&lt;/p&gt;

&lt;p&gt;For example, an app might recommend a difficult workout because the user hasn't exercised for several days.&lt;/p&gt;

&lt;p&gt;But what if they haven't exercised because they're recovering from an injury?&lt;/p&gt;

&lt;p&gt;What if they have been travelling?&lt;/p&gt;

&lt;p&gt;What if they simply want a rest day?&lt;/p&gt;

&lt;p&gt;The application might have enough data to generate a recommendation, but not enough context to make that recommendation appropriate.&lt;/p&gt;

&lt;h3&gt;
  
  
  More data doesn't automatically mean better personalization
&lt;/h3&gt;

&lt;p&gt;A common mistake is assuming that collecting more user data will automatically improve the experience.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Good personalization needs to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the user actually wants to achieve.&lt;/li&gt;
&lt;li&gt;Which information the user has agreed to share.&lt;/li&gt;
&lt;li&gt;Whether the available data is recent and reliable.&lt;/li&gt;
&lt;li&gt;Whether a recommendation is useful at this particular moment.&lt;/li&gt;
&lt;li&gt;Whether the user can adjust or disable personalization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider the difference between these two notifications:&lt;/p&gt;

&lt;p&gt;"You might like this product."&lt;/p&gt;

&lt;p&gt;"You saved a similar product last week. The item is now available at a lower price."&lt;/p&gt;

&lt;p&gt;The second notification has a clear reason for appearing. It connects information to a useful situation.&lt;/p&gt;

&lt;p&gt;But even that recommendation should respect the user's preferences. Someone who doesn't want promotional notifications shouldn't receive them simply because an algorithm thinks the timing is perfect.&lt;/p&gt;

&lt;p&gt;AI can help identify patterns and generate recommendations. The product team still needs to decide which data is appropriate, what the recommendation is supposed to achieve, and when it should be shown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; Personalization should make an application feel more useful, not make users feel watched.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Translation Is Not the Same as Localization
&lt;/h2&gt;

&lt;p&gt;AI has made translating application content incredibly easy.&lt;/p&gt;

&lt;p&gt;You can provide a collection of English strings and ask a model to translate them into ten different languages. In many cases, the result will be understandable.&lt;/p&gt;

&lt;p&gt;But understandable isn't always natural.&lt;/p&gt;

&lt;p&gt;Consider an application that uses a casual, friendly tone in English. A literal translation into another language might sound overly formal, awkward, or even rude.&lt;/p&gt;

&lt;p&gt;Idioms, jokes, cultural references, and informal expressions are particularly difficult to translate without losing their original meaning.&lt;/p&gt;

&lt;p&gt;And this problem goes beyond text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Localization affects the entire interface
&lt;/h3&gt;

&lt;p&gt;A properly localized Flutter application needs to account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Date and time formats.&lt;/li&gt;
&lt;li&gt;Currency and number formatting.&lt;/li&gt;
&lt;li&gt;Pluralization and grammatical differences.&lt;/li&gt;
&lt;li&gt;Right-to-left languages such as Arabic and Hebrew.&lt;/li&gt;
&lt;li&gt;Different text lengths.&lt;/li&gt;
&lt;li&gt;Cultural expectations and terminology.&lt;/li&gt;
&lt;li&gt;Symbols, colors, and visual communication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a layout that assumes every language reads from left to right may feel awkward in an Arabic interface.&lt;/p&gt;

&lt;p&gt;Flutter already provides tools for handling much of the technical side of localization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;localizationsDelegates:&lt;/span&gt;
      &lt;span class="n"&gt;AppLocalizations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;localizationsDelegates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;supportedLocales:&lt;/span&gt;
      &lt;span class="n"&gt;AppLocalizations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supportedLocales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomePage&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;You can also use directional layout properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsetsDirectional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;start:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;end:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Welcome back!'&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;Using &lt;code&gt;EdgeInsetsDirectional&lt;/code&gt; instead of hardcoding &lt;code&gt;left&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt; helps layouts adapt to the current text direction.&lt;/p&gt;

&lt;p&gt;Flutter's localization system can handle locale-specific messages and default text direction, but it cannot decide whether a phrase sounds culturally appropriate or whether a particular design choice makes sense in a specific market.&lt;/p&gt;

&lt;p&gt;That still requires review by people who understand the language and culture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; A translated application speaks another language. A localized application feels like it belongs in that language.&lt;/p&gt;

&lt;p&gt;Useful reference: &lt;a href="https://docs.flutter.dev/ui/internationalization" rel="noopener noreferrer"&gt;Internationalizing Flutter Apps&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Privacy, Transparency, and User Control
&lt;/h2&gt;

&lt;p&gt;This is probably the most important issue on the list.&lt;/p&gt;

&lt;p&gt;When an application introduces AI features, it often starts collecting or processing more information. Depending on the product, this could include user preferences, activity history, documents, conversations, location, or other personal information.&lt;/p&gt;

&lt;p&gt;The technical implementation might work perfectly. But does the user understand what's happening?&lt;/p&gt;

&lt;p&gt;Imagine using an AI assistant inside a Flutter application.&lt;/p&gt;

&lt;p&gt;You ask it to write an email. It generates a response and sends it automatically without asking for confirmation.&lt;/p&gt;

&lt;p&gt;Maybe the message is correct. Maybe it isn't.&lt;/p&gt;

&lt;p&gt;Either way, the application has taken away an important decision from the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Users should know what AI is doing
&lt;/h3&gt;

&lt;p&gt;A good AI-powered interface should make a few things clear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What information is being used?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users should understand which data is relevant to a feature and have meaningful control over optional data collection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this recommendation appearing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple explanation can make an AI recommendation feel less random.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;"Recommended because you frequently read articles about Flutter."&lt;/p&gt;

&lt;p&gt;This is much more useful than showing an unexplained recommendation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can the user review the result?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generating content and publishing it are two different actions. The user should remain in control of important decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an action be reversed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For operations that can be undone, provide an undo option. For irreversible or sensitive actions, request confirmation first.&lt;/p&gt;

&lt;p&gt;For example, a confirmation dialog before sending an AI-generated message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;confirmAndSend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;context:&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dialogContext&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="n"&gt;AlertDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Send this message?'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;content:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="s"&gt;'Please review the generated message before sending.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;actions:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="n"&gt;TextButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dialogContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Cancel'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="n"&gt;FilledButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;Navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dialogContext&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="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Send'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Perform the actual send operation here.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another small detail is loading feedback.&lt;/p&gt;

&lt;p&gt;An AI request may take several seconds. Showing a spinner without any explanation can make the application feel frozen.&lt;/p&gt;

&lt;p&gt;A better experience tells the user what's happening, handles errors clearly, and gives them a way to cancel or retry when appropriate.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Analyzing your document..."&lt;/li&gt;
&lt;li&gt;"Generating your summary..."&lt;/li&gt;
&lt;li&gt;"Almost done..."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For longer operations, progress indicators or streamed responses can make waiting easier to understand.&lt;/p&gt;

&lt;p&gt;The important thing is to avoid pretending that progress is measurable when it isn't. An honest loading state is better than a progress bar showing a made-up percentage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; An AI feature should never make users feel that the application is acting behind their back.&lt;/p&gt;

&lt;p&gt;Useful reference: &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Accessibility Is Still Too Often an Afterthought
&lt;/h2&gt;

&lt;p&gt;An application can look beautiful and still be difficult or impossible for some people to use.&lt;/p&gt;

&lt;p&gt;This is especially noticeable in AI-generated interfaces, where the visual appearance is often prioritized over the experience of people using assistive technologies.&lt;/p&gt;

&lt;p&gt;Flutter has built-in accessibility support, but generating widgets doesn't automatically guarantee that an application is accessible.&lt;/p&gt;

&lt;p&gt;One important part of Flutter's accessibility system is the &lt;strong&gt;Semantics Tree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Flutter uses this tree to describe the meaning and behavior of interface elements to assistive technologies such as TalkBack and VoiceOver.&lt;/p&gt;

&lt;p&gt;For example, a custom icon might look like a button, but a screen reader needs to know what it does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Semantics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;button:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;'Save article'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;hint:&lt;/span&gt; &lt;span class="s"&gt;'Adds this article to your reading list'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;onTap:&lt;/span&gt; &lt;span class="n"&gt;onSave&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ExcludeSemantics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;GestureDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;onTap:&lt;/span&gt; &lt;span class="n"&gt;onSave&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bookmark_border&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The visual icon alone doesn't communicate its purpose. The semantics information provides an accessible name and action.&lt;/p&gt;

&lt;p&gt;For standard controls, prefer Flutter's built-in widgets whenever possible. For example, an &lt;code&gt;IconButton&lt;/code&gt; with a meaningful &lt;code&gt;tooltip&lt;/code&gt; already provides useful accessibility information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Five accessibility details worth checking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Screen readers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Test the application with TalkBack on Android and VoiceOver on iOS. Make sure controls have meaningful labels and that the reading order makes sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Text scaling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't assume that every user has the default system font size. Flutter respects operating-system text scaling, so layouts should remain usable when text becomes significantly larger.&lt;/p&gt;

&lt;p&gt;Avoid fixed-height containers that cut off their content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Contrast&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Text and interactive controls need sufficient contrast. WCAG 2.2 recommends a contrast ratio of at least 4.5:1 for normal text and 3:1 for large text under its minimum-contrast criterion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Touch targets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small buttons can be difficult to use, especially for people with motor impairments. Flutter's accessibility guidance recommends minimum tap target sizes of 48 × 48 logical pixels on Android and 44 × 44 points on iOS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Keyboard and interaction support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't make important functionality available only through a specific gesture. Interactive elements should have appropriate focus behavior and accessible actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test accessibility instead of assuming it's correct
&lt;/h3&gt;

&lt;p&gt;Flutter provides an Accessibility Guideline API that can be used in widget tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter_test/flutter_test.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;testWidgets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Checks basic accessibility guidelines'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;semanticsHandle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ensureSemantics&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pumpWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;expectLater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;meetsGuideline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labeledTapTargetGuideline&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;expectLater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;meetsGuideline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;androidTapTargetGuideline&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;expectLater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;tester&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;meetsGuideline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textContrastGuideline&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;semanticsHandle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&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;These checks are useful, but they don't replace manual testing with real assistive technologies.&lt;/p&gt;

&lt;p&gt;A widget test can detect certain problems. It cannot tell you whether the entire application feels understandable to someone navigating it with a screen reader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; Accessibility isn't a final polish task. It should be part of the design and development process from the beginning.&lt;/p&gt;

&lt;p&gt;Useful references: &lt;a href="https://docs.flutter.dev/ui/accessibility" rel="noopener noreferrer"&gt;Flutter Accessibility&lt;/a&gt; · &lt;a href="https://docs.flutter.dev/ui/accessibility/accessibility-testing" rel="noopener noreferrer"&gt;Flutter Accessibility Testing&lt;/a&gt; · &lt;a href="https://www.w3.org/TR/WCAG22/" rel="noopener noreferrer"&gt;WCAG 2.2&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So, Should We Stop Using AI for Flutter Development?
&lt;/h2&gt;

&lt;p&gt;Absolutely not.&lt;/p&gt;

&lt;p&gt;AI is genuinely useful. It can speed up repetitive development tasks, generate boilerplate, explain unfamiliar APIs, build prototypes, suggest test cases, and help developers explore different implementation approaches.&lt;/p&gt;

&lt;p&gt;The mistake is expecting generated code to be a finished product.&lt;/p&gt;

&lt;p&gt;A generated screen might compile, but that doesn't mean its animations are good.&lt;/p&gt;

&lt;p&gt;A translated message might be grammatically correct, but that doesn't mean it sounds natural.&lt;/p&gt;

&lt;p&gt;A recommendation might be based on data, but that doesn't mean it's useful.&lt;/p&gt;

&lt;p&gt;And a button might look clickable, but that doesn't mean someone using a screen reader can understand it.&lt;/p&gt;

&lt;p&gt;I think the most practical approach is to treat AI as another tool in the development workflow, not as a replacement for product thinking.&lt;/p&gt;

&lt;p&gt;Let AI help with the first implementation. Then review it from the perspective of someone who has never seen the application before.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this interaction feel natural?&lt;/li&gt;
&lt;li&gt;Does this feature actually solve a user problem?&lt;/li&gt;
&lt;li&gt;Does the interface make sense in other languages?&lt;/li&gt;
&lt;li&gt;Does the user understand how their data is being used?&lt;/li&gt;
&lt;li&gt;Can people with different abilities use the application comfortably?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions matter much more than whether the AI-generated code looks impressive.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Node.js in 2026: The Event Loop, Safe Singletons, and Modern Parallelism</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Fri, 30 Oct 2026 15:56:32 +0000</pubDate>
      <link>https://dev.to/devunionx/nodejs-in-2026-the-event-loop-safe-singletons-and-modern-parallelism-20f</link>
      <guid>https://dev.to/devunionx/nodejs-in-2026-the-event-loop-safe-singletons-and-modern-parallelism-20f</guid>
      <description>&lt;p&gt;Node.js has evolved significantly, but its core architecture remains built around one important principle: &lt;strong&gt;keep the main JavaScript thread non-blocking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As applications become more complex, understanding asynchronous execution alone is no longer enough. Developers also need to understand event loop performance, shared state, request isolation, and parallel processing.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore how these concepts work together and how to build scalable Node.js applications in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding the Node.js Event Loop
&lt;/h2&gt;

&lt;p&gt;Node.js runs JavaScript on a single main thread by default. However, this doesn't mean it can only handle one operation at a time.&lt;/p&gt;

&lt;p&gt;It relies on &lt;strong&gt;libuv&lt;/strong&gt;, a C library that manages asynchronous I/O and provides a thread pool for operations that cannot be handled directly through non-blocking operating system APIs.&lt;/p&gt;

&lt;p&gt;This architecture allows Node.js to handle multiple network requests, file operations, and other asynchronous tasks without waiting for each one to finish.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Loop Phases
&lt;/h3&gt;

&lt;p&gt;The event loop processes callbacks through several phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timers:&lt;/strong&gt; Executes eligible &lt;code&gt;setTimeout()&lt;/code&gt; and &lt;code&gt;setInterval()&lt;/code&gt; callbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pending Callbacks:&lt;/strong&gt; Handles certain deferred system-level I/O callbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poll:&lt;/strong&gt; Processes incoming I/O events and waits for new events when necessary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check:&lt;/strong&gt; Executes &lt;code&gt;setImmediate()&lt;/code&gt; callbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close Callbacks:&lt;/strong&gt; Handles events such as socket closures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;idle&lt;/code&gt; and &lt;code&gt;prepare&lt;/code&gt; phases also exist but are primarily internal to Node.js.&lt;/p&gt;

&lt;p&gt;An important change arrived with &lt;strong&gt;Node.js 20&lt;/strong&gt;, through libuv 1.45.0: timers are now processed after the poll phase on each event loop iteration, rather than both before and after it. This can affect the interaction between timers and &lt;code&gt;setImmediate()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  setTimeout() vs setImmediate()
&lt;/h3&gt;

&lt;p&gt;These two functions are often confused.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;setImmediate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Immediate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When called from the main module, their execution order is not guaranteed.&lt;/p&gt;

&lt;p&gt;However, inside an I/O callback, &lt;code&gt;setImmediate()&lt;/code&gt; executes before the timer callback:&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;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&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;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout&lt;/span&gt;&lt;span class="dl"&gt;"&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="nf"&gt;setImmediate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Immediate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding this difference helps prevent timing-related bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microtasks and process.nextTick()
&lt;/h3&gt;

&lt;p&gt;Promises use the microtask queue, while &lt;code&gt;process.nextTick()&lt;/code&gt; uses a separate next-tick queue.&lt;/p&gt;

&lt;p&gt;Both are processed at specific points before Node.js continues normal event loop execution.&lt;/p&gt;

&lt;p&gt;However, recursively scheduling &lt;code&gt;process.nextTick()&lt;/code&gt; can prevent the event loop from reaching I/O operations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;recursiveTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextTick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;recursiveTask&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;recursiveTask&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 an example of &lt;strong&gt;event loop starvation&lt;/strong&gt;. Avoid creating endless chains of high-priority callbacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Event Loop Performance: What Should You Monitor?
&lt;/h2&gt;

&lt;p&gt;Knowing how the event loop works is useful, but measuring its performance is even more important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event Loop Delay&lt;/strong&gt; measures how late the event loop executes scheduled callbacks compared with their expected execution time.&lt;/p&gt;

&lt;p&gt;High delay can indicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU-intensive JavaScript operations.&lt;/li&gt;
&lt;li&gt;Synchronous file system operations.&lt;/li&gt;
&lt;li&gt;Expensive JSON processing.&lt;/li&gt;
&lt;li&gt;Complex regular expressions.&lt;/li&gt;
&lt;li&gt;Excessive callback execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Node.js provides &lt;code&gt;monitorEventLoopDelay()&lt;/code&gt; through the built-in &lt;code&gt;perf_hooks&lt;/code&gt; module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;monitorEventLoopDelay&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:perf_hooks&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;histogram&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;monitorEventLoopDelay&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resolution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;histogram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p99&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;histogram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Event Loop Delay P99: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p99&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt; ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;histogram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Monitoring event loop delay alongside CPU usage, memory consumption, and request latency provides a much clearer picture of application health.&lt;/p&gt;

&lt;p&gt;Another important component is the &lt;strong&gt;libuv thread pool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some file system, DNS, cryptographic, and compression operations use this pool. Its default size is four threads, and it can be configured using &lt;code&gt;UV_THREADPOOL_SIZE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When too many expensive operations compete for these threads, otherwise unrelated tasks may experience delays.&lt;/p&gt;

&lt;p&gt;Remember: asynchronous does not automatically mean unlimited scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Evolution of the Singleton Pattern
&lt;/h2&gt;

&lt;p&gt;The Singleton pattern is a familiar design pattern that ensures a resource is created once and reused.&lt;/p&gt;

&lt;p&gt;In Node.js, module caching makes this relatively easy.&lt;/p&gt;

&lt;p&gt;For example, CommonJS caches modules after their first load. Subsequent calls to &lt;code&gt;require()&lt;/code&gt; for the same resolved file return the cached module.&lt;/p&gt;

&lt;p&gt;With modern ES modules, module-level variables are also a convenient way to share resources.&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;// database.js&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createDatabaseConnection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other modules importing this resource can reuse the same instance within that runtime.&lt;/p&gt;

&lt;p&gt;However, this simplicity introduces an important problem: &lt;strong&gt;shared mutable state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine multiple HTTP requests using the same singleton service. If the service stores request-specific information in its properties, one request may accidentally affect another.&lt;/p&gt;

&lt;p&gt;This is especially dangerous when dealing with authentication, user sessions, tenant information, and temporary request data.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: AsyncLocalStorage
&lt;/h3&gt;

&lt;p&gt;Node.js provides &lt;code&gt;AsyncLocalStorage&lt;/code&gt; to maintain isolated context across asynchronous operations.&lt;/p&gt;

&lt;p&gt;It allows request-specific information to follow an asynchronous execution chain without passing it manually through every function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AsyncLocalStorage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:async_hooks&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;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&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;const&lt;/span&gt; &lt;span class="nx"&gt;requestContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AsyncLocalStorage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Express middleware&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;requestContext&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;next&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;Any service can access the current request context:&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;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&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;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requestContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;requestId&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="nx"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;message&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides request-level context while allowing shared services to remain singletons.&lt;/p&gt;

&lt;p&gt;A useful distinction: &lt;strong&gt;AsyncLocalStorage isolates context, not arbitrary mutable objects.&lt;/strong&gt; Keep request data inside its own context and avoid placing user-specific state on shared singleton instances.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Async Initialization: Avoid Duplicate Instances
&lt;/h2&gt;

&lt;p&gt;Singletons also introduce another common problem: asynchronous initialization.&lt;/p&gt;

&lt;p&gt;Consider a database client that takes time to initialize.&lt;/p&gt;

&lt;p&gt;If multiple requests call the initialization function before the first operation finishes, the application may accidentally create multiple connections.&lt;/p&gt;

&lt;p&gt;A simple solution is to cache the initialization Promise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&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;getDatabaseClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;clientPromise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;clientPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createDatabaseClient&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;clientPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&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;return&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, concurrent callers receive the same Promise and wait for the same initialization process.&lt;/p&gt;

&lt;p&gt;Resetting the Promise after failure also allows a later call to retry initialization.&lt;/p&gt;

&lt;p&gt;For production applications, remember to combine this approach with proper connection lifecycle management and reconnection handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Moving Beyond One Thread: Worker Threads
&lt;/h2&gt;

&lt;p&gt;The event loop is excellent for handling asynchronous I/O, but CPU-intensive JavaScript can still block the main thread.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image processing.&lt;/li&gt;
&lt;li&gt;Large data transformations.&lt;/li&gt;
&lt;li&gt;Complex mathematical calculations.&lt;/li&gt;
&lt;li&gt;Machine learning inference.&lt;/li&gt;
&lt;li&gt;Expensive parsing operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these workloads, Node.js provides the built-in &lt;code&gt;worker_threads&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;Workers execute JavaScript in separate threads, each with its own V8 instance and event loop.&lt;/p&gt;

&lt;p&gt;Importantly, &lt;strong&gt;Worker Threads and the libuv thread pool are not the same thing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The libuv pool handles certain background operations. Worker Threads allow developers to execute their own JavaScript workloads in parallel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Worker Pools Matter
&lt;/h3&gt;

&lt;p&gt;Creating a new worker for every incoming request is usually inefficient.&lt;/p&gt;

&lt;p&gt;Worker startup introduces memory and initialization overhead. Instead, a better approach is to maintain a fixed number of workers and distribute tasks between them.&lt;/p&gt;

&lt;p&gt;This is known as the &lt;strong&gt;Worker Pool pattern&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;Incoming Tasks
      |
      v
  Task Queue
      |
      v
  Worker Pool
   /   |   \
  v    v    v
 W1   W2   W3
   \   |   /
      Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A worker pool reuses existing threads rather than creating new ones for every task.&lt;/p&gt;

&lt;p&gt;For ordinary network requests, database queries, and asynchronous file operations, Node.js's built-in asynchronous APIs are generally the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Sharing Data Between Worker Threads
&lt;/h2&gt;

&lt;p&gt;Workers need a way to communicate and exchange information.&lt;/p&gt;

&lt;p&gt;Node.js provides two common approaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Message Passing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Workers can exchange messages using &lt;code&gt;postMessage()&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="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;process-data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;Objects are generally transferred using structured cloning. This provides isolation because each worker receives its own copy.&lt;/p&gt;

&lt;p&gt;For large buffers, transferable &lt;code&gt;ArrayBuffer&lt;/code&gt; objects can avoid unnecessary copying by transferring ownership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. SharedArrayBuffer and Atomics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For scenarios requiring shared memory, Node.js supports &lt;code&gt;SharedArrayBuffer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Multiple threads can access the same memory region without copying data.&lt;/p&gt;

&lt;p&gt;However, this introduces synchronization challenges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sharedBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SharedArrayBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&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;sharedArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Int32Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sharedBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;Atomics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sharedArray&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Atomics&lt;/code&gt; provides operations that help coordinate access to shared memory.&lt;/p&gt;

&lt;p&gt;Without proper synchronization, concurrent writes can produce inconsistent results and difficult-to-debug race conditions.&lt;/p&gt;

&lt;p&gt;For most applications, message passing is the simpler starting point. Use shared memory only when its performance benefits justify the additional complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Framework Choices in 2026
&lt;/h2&gt;

&lt;p&gt;The Node.js ecosystem offers several approaches to building backend applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Express&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Express remains a flexible option with a large ecosystem and minimal architectural restrictions. It works well for smaller services, prototypes, and existing applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fastify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fastify focuses on performance, schema-based validation, and efficient request handling. It is worth considering for high-throughput APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NestJS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NestJS provides a structured architecture with dependency injection, modules, decorators, and lifecycle management. It is particularly useful for large TypeScript applications and teams.&lt;/p&gt;

&lt;p&gt;There is no universally best framework.&lt;/p&gt;

&lt;p&gt;The right choice depends on performance requirements, application complexity, team experience, and maintainability. Always benchmark using your actual workload rather than relying entirely on generic benchmark results.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Singleton Patterns in Serverless Applications
&lt;/h2&gt;

&lt;p&gt;Singleton behavior becomes more interesting in serverless environments such as AWS Lambda.&lt;/p&gt;

&lt;p&gt;A serverless execution environment may be reused across multiple invocations. Therefore, module-level variables and singleton instances can survive between requests.&lt;/p&gt;

&lt;p&gt;This can be useful for expensive resources such as database clients and SDK instances.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;S3Client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@aws-sdk/client-s3&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;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;S3Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AWS_REGION&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;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Reuse the existing client&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating a new SDK client for every invocation is often unnecessary.&lt;/p&gt;

&lt;p&gt;However, never store user-specific mutable information in a global singleton.&lt;/p&gt;

&lt;p&gt;A useful rule is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reuse expensive infrastructure clients where supported.&lt;/li&gt;
&lt;li&gt;Keep request-specific data local to each invocation.&lt;/li&gt;
&lt;li&gt;Never assume module-level state is durable.&lt;/li&gt;
&lt;li&gt;Use lazy initialization for expensive optional dependencies.&lt;/li&gt;
&lt;li&gt;Keep deployment bundles small to reduce cold-start overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also remember that multiple serverless execution environments can run independently. A singleton is never a replacement for shared, durable distributed storage.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>webdev</category>
      <category>node</category>
      <category>aws</category>
    </item>
    <item>
      <title>just added a new versiyon of css features</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Tue, 27 Oct 2026 18:40:12 +0000</pubDate>
      <link>https://dev.to/devunionx/just-added-a-new-versiyon-of-css-features-22ie</link>
      <guid>https://dev.to/devunionx/just-added-a-new-versiyon-of-css-features-22ie</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p" class="crayons-story__hidden-navigation-link"&gt;The 10 Best New CSS Features in 2026 Already Supported in All Major Browsers&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devunionx" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" alt="devunionx profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devunionx" class="crayons-story__secondary fw-medium m:hidden"&gt;
              DevUnionX
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                DevUnionX
                
                
              
              &lt;div id="story-author-preview-content-4930224" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devunionx" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;DevUnionX&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p" id="article-link-4930224"&gt;
          The 10 Best New CSS Features in 2026 Already Supported in All Major Browsers
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/website"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;website&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/html"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;html&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/css"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;css&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;8&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            16 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>The 10 Best New CSS Features in 2026 Already Supported in All Major Browsers</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Tue, 27 Oct 2026 18:37:46 +0000</pubDate>
      <link>https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p</link>
      <guid>https://dev.to/devunionx/the-10-best-new-css-features-in-2026-already-supported-in-all-major-browsers-177p</guid>
      <description>&lt;p&gt;CSS has evolved far beyond styling colors, spacing, and layouts. Modern CSS can respond to a component's available space, react to elements inside a selector, generate more consistent color palettes, improve typography, and handle UI behavior that once required JavaScript.&lt;/p&gt;

&lt;p&gt;But there is an important distinction: &lt;strong&gt;a feature being available in 2026 does not mean it was invented in 2026, or that every browser version supports it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this updated guide, we'll look at ten practical groups of CSS features worth knowing in 2026, including several from my &lt;a href="https://dev.to/devunionx/the-10-best-new-css-features-in-2025-already-supported-in-all-major-browsers-19m3"&gt;2025 CSS roundup&lt;/a&gt;. We'll also explore three newer capabilities that deserve attention but should be introduced progressively.&lt;/p&gt;

&lt;p&gt;The support notes use &lt;a href="https://web.dev/baseline/2026" rel="noopener noreferrer"&gt;Web Platform Baseline&lt;/a&gt; and current &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS" rel="noopener noreferrer"&gt;MDN documentation&lt;/a&gt;. Baseline is a useful starting point for cross-browser decisions, but it doesn't guarantee compatibility with older browsers, embedded webviews, or every detail of a feature.&lt;/p&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Container Queries: Make Components Responsive to Their Own Space
&lt;/h2&gt;

&lt;p&gt;Traditional media queries respond to the viewport. That's useful for page layouts, but it can become awkward when the same component appears in different places.&lt;/p&gt;

&lt;p&gt;Imagine a product card used in a full-width grid, a narrow sidebar, and a mobile layout. A viewport media query tells the card how wide the screen is, not how much room the card actually has.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container queries solve this problem by letting a component respond to its container's size.&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;.product-card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&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;.product-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="nb"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&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="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;34rem&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__content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9rem&lt;/span&gt; &lt;span class="m"&gt;1fr&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;p&gt;The card's content switches to a two-column layout when the container becomes wide enough. The same component can now work in different layouts without relying on viewport-specific breakpoints.&lt;/p&gt;

&lt;p&gt;This is especially useful for reusable components in design systems, dashboards, product grids, and component-driven React applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; You can make components more independent of the page layout in which they are used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Container size queries are widely available in modern browsers. See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Containment/Container_size_and_style_queries" rel="noopener noreferrer"&gt;MDN's container queries guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Container Style Queries: Let Components React to Their Context
&lt;/h2&gt;

&lt;p&gt;Size queries ask, "How much space does my container have?"&lt;/p&gt;

&lt;p&gt;Style queries ask a different question: "What styling context does my container provide?"&lt;/p&gt;

&lt;p&gt;For example, a component might need a different appearance when its parent declares a dark theme or a compact layout. Container style queries can check a custom property on the container and apply styles to its descendants.&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-context&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="l"&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;.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="nx"&gt;#111827&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="nx"&gt;#f9fafb&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="nx"&gt;#374151&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;Here, the &lt;code&gt;.card&lt;/code&gt; can react to the value of &lt;code&gt;--theme&lt;/code&gt; on an ancestor container rather than requiring JavaScript to attach another class to every card.&lt;/p&gt;

&lt;p&gt;You can use the same principle for design-system variants, compact components, and other context-dependent styling decisions.&lt;/p&gt;

&lt;p&gt;One important detail: style queries can use custom properties, but their support and syntax should still be checked against the browser versions your application targets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; CSS can express more component-level styling rules without making every variation a JavaScript-managed state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Container style queries became Baseline Newly Available in 2026. That makes them worth learning, but older browser versions may not support them. See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Containment/Container_size_and_style_queries" rel="noopener noreferrer"&gt;MDN&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The &lt;code&gt;:has()&lt;/code&gt; Selector: CSS Can React to Descendants
&lt;/h2&gt;

&lt;p&gt;For a long time, styling an element based on what it contained often meant adding a class with JavaScript.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;:has()&lt;/code&gt; pseudo-class gives CSS a way to select an element based on matching descendants or related elements.&lt;/p&gt;

&lt;p&gt;For example, you can highlight an entire form group when one of its inputs is invalid:&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;.form-group&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nd"&gt;:invalid&lt;/span&gt;&lt;span class="o"&gt;)&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="nx"&gt;crimson&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="nx"&gt;#fff5f5&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="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;)&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&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&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 first selector reacts to the state of an input inside the form group. The second changes a card's layout when it contains an image.&lt;/p&gt;

&lt;p&gt;You can also combine &lt;code&gt;:has()&lt;/code&gt; with other selectors to build more expressive UI rules:&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;.form-group&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nd"&gt;:focus-visible&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;label&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="nx"&gt;#6d28d9&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 useful for forms, navigation, selected cards, and UI states that can be described through the DOM.&lt;/p&gt;

&lt;p&gt;There is one limitation worth remembering: &lt;code&gt;:has()&lt;/code&gt; doesn't replace all JavaScript state management. Use JavaScript when the behavior involves application logic, asynchronous data, or state that cannot be inferred reliably from the document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; It reduces the need for extra classes and DOM-manipulation code when the desired style depends on element relationships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;:has()&lt;/code&gt; is widely available in modern browsers. It was also one of the most-used features in the &lt;a href="https://2026.stateofcss.com/en-US/features/" rel="noopener noreferrer"&gt;State of CSS 2026 survey&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. CSS Nesting, Cascade Layers, and &lt;code&gt;:where()&lt;/code&gt;: Keep Large Stylesheets Manageable
&lt;/h2&gt;

&lt;p&gt;CSS projects become difficult to maintain when component rules are scattered throughout a stylesheet, specificity keeps increasing, and third-party styles conflict with application styles.&lt;/p&gt;

&lt;p&gt;Three established features can help: native CSS nesting, cascade layers, and the &lt;code&gt;:where()&lt;/code&gt; selector.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native CSS nesting
&lt;/h3&gt;

&lt;p&gt;You can group related selectors inside a parent rule:&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&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="nx"&gt;#e5e7eb&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.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;.card__title&lt;/span&gt; &lt;span class="err"&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="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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt; &lt;span class="nf"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The card's title and hover styles now live beside the styles they belong to. This is built into CSS, so a preprocessor such as Sass is not required just to nest selectors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cascade layers
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;@layer&lt;/code&gt; to define a deliberate order for your stylesheet:&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="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.15&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;@layer&lt;/span&gt; &lt;span class="n"&gt;components&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;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="m"&gt;1rem&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-red&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="nx"&gt;crimson&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;For normal declarations, later named layers take precedence over earlier layers, regardless of selector specificity. There is an important caveat: normal declarations outside named layers take precedence over normal layered declarations. For predictable results, plan how your project uses layered and unlayered styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduce specificity with &lt;code&gt;:where()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;:where()&lt;/code&gt; pseudo-class has zero specificity:&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="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.link&lt;/span&gt;&lt;span class="o"&gt;)&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="nl"&gt;text-decoration&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it useful for resets, default styles, and shared design-system rules that should be easy to override.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; These features help make CSS easier to read, organize, and maintain as a project grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; CSS nesting, cascade layers, and &lt;code&gt;:where()&lt;/code&gt; are widely available in modern browsers. See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting" rel="noopener noreferrer"&gt;MDN's CSS nesting documentation&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@layer" rel="noopener noreferrer"&gt;cascade layers guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Better Typography: &lt;code&gt;text-wrap&lt;/code&gt;, &lt;code&gt;font-size-adjust&lt;/code&gt;, and Ruby Layout
&lt;/h2&gt;

&lt;p&gt;Good typography is more than choosing a font. Line breaks, fallback fonts, and annotations can all affect readability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balance headings with &lt;code&gt;text-wrap: balance&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A heading can look awkward when a single word is left on its own line. &lt;code&gt;text-wrap: balance&lt;/code&gt; asks the browser to distribute text across lines more evenly.&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="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;balance&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 especially useful for titles, hero headings, and short text blocks. Avoid applying it indiscriminately to every long paragraph: balancing text has a computational cost, and browsers limit how many lines they balance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve paragraph wrapping with &lt;code&gt;text-wrap: pretty&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;For longer text, &lt;code&gt;text-wrap: pretty&lt;/code&gt; asks the browser to favor more pleasing line breaks, including reducing awkward short final lines.&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;.article-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pretty&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 a useful enhancement for blogs, documentation, and editorial websites. However, support for this value varies more than support for &lt;code&gt;text-wrap: balance&lt;/code&gt;, so test the browsers your readers use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep fallback fonts more consistent with &lt;code&gt;font-size-adjust&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When a preferred font is unavailable or hasn't loaded, the fallback may have very different lowercase letter proportions.&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="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"MyWebFont"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size-adjust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.52&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 value is only an example; choose one appropriate to your intended font metrics. This property adjusts font sizing to help preserve visual proportions when different fonts are rendered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Ruby layout for annotated text
&lt;/h3&gt;

&lt;p&gt;For languages and learning materials that use ruby annotations, such as Japanese furigana, the &lt;code&gt;ruby-align&lt;/code&gt; and &lt;code&gt;ruby-position&lt;/code&gt; properties can provide more control.&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="nt"&gt;ruby&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;ruby-align&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="nl"&gt;ruby-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;over&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 a specialized feature rather than a universal requirement, but it is valuable for multilingual education and reference content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; These properties make it possible to improve readability and text layout with less manual adjustment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;text-wrap&lt;/code&gt; is broadly available, but individual values can differ in support. &lt;code&gt;font-size-adjust&lt;/code&gt; and Ruby layout properties are also available in current browsers; check their precise compatibility before relying on a particular value. Useful references: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/text-wrap" rel="noopener noreferrer"&gt;text-wrap&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/font-size-adjust" rel="noopener noreferrer"&gt;font-size-adjust&lt;/a&gt;, and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/ruby-position" rel="noopener noreferrer"&gt;ruby-position&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. More Stable Layouts and Faster Long Pages: &lt;code&gt;aspect-ratio&lt;/code&gt; and &lt;code&gt;content-visibility&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Two features can make visual content more predictable and reduce unnecessary rendering work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reserve the right shape with &lt;code&gt;aspect-ratio&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When an image container has a known aspect ratio, the browser can reserve the correct space before the image is displayed.&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;.thumbnail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&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="o"&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;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.thumbnail&lt;/span&gt; &lt;span class="nt"&gt;img&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;block&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;height&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="nb"&gt;cover&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 handy for video thumbnails, product images, article cards, and galleries. Consistent dimensions help keep surrounding content from jumping around.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skip unnecessary rendering work with &lt;code&gt;content-visibility&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Long pages often contain large sections that are far outside the visible area. &lt;code&gt;content-visibility: auto&lt;/code&gt; allows the browser to skip much of the rendering work for off-screen content until it becomes relevant.&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;.article-section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;content-visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;contain-intrinsic-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;42rem&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 intrinsic size provides a placeholder estimate so the browser can account for the section's space while its contents are not being rendered normally.&lt;/p&gt;

&lt;p&gt;This can help with long articles, large repeated lists, and other pages with expensive off-screen content. It's not a substitute for measuring performance, though: choose a sensible placeholder size and test scrolling, anchor links, and layout stability with realistic content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; &lt;code&gt;aspect-ratio&lt;/code&gt; helps create predictable layouts, while &lt;code&gt;content-visibility&lt;/code&gt; can reduce work on pages with a lot of content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Both features are widely available in modern browsers. References: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/aspect-ratio" rel="noopener noreferrer"&gt;aspect-ratio&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/content-visibility" rel="noopener noreferrer"&gt;content-visibility&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Modern Color: &lt;code&gt;oklch()&lt;/code&gt;, &lt;code&gt;color-mix()&lt;/code&gt;, &lt;code&gt;light-dark()&lt;/code&gt;, and Relative Colors
&lt;/h2&gt;

&lt;p&gt;Color management is another area where CSS has become considerably more capable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;oklch()&lt;/code&gt; for more controlled color palettes
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;oklch()&lt;/code&gt; represents a color using perceptual lightness, chroma, and hue. This can make it easier to generate coherent variants of a brand color than manually guessing a collection of unrelated hex values.&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;oklch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;62%&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt; &lt;span class="m"&gt;255&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;Changing the lightness while keeping chroma and hue stable can produce more consistent visual variations, although the resulting color should still be checked for gamut and contrast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mix colors with &lt;code&gt;color-mix()&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&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="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&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="nd"&gt;:hover&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="nf"&gt;color-mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;oklch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;85%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;white&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 lets you generate color variations in CSS rather than maintaining a separate hard-coded value for every state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Support light and dark themes with &lt;code&gt;light-dark()&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="py"&gt;--surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light-dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;#171717&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light-dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;#171717&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;#f5f5f5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&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="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--surface&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="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--text&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 &lt;code&gt;color-scheme&lt;/code&gt; declaration tells the browser that the page supports both schemes. &lt;code&gt;light-dark()&lt;/code&gt; then chooses a value based on the active color scheme.&lt;/p&gt;

&lt;h3&gt;
  
  
  Derive colors from an existing color
&lt;/h3&gt;

&lt;p&gt;Relative color syntax lets you create a new color from an existing one:&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;oklch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;62%&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;oklch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;h&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, the lightness is increased while chroma and hue are retained. The exact result still depends on the source color and the target color space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; These features help build consistent themes and interactive color states with fewer duplicated values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;oklch()&lt;/code&gt;, &lt;code&gt;color-mix()&lt;/code&gt;, and &lt;code&gt;light-dark()&lt;/code&gt; are available in current mainstream browsers. Relative color syntax should be checked for the browser versions you support. Always test color contrast rather than assuming that a perceptually uniform color space guarantees accessibility. References: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_colors" rel="noopener noreferrer"&gt;OKLCH and color functions&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/color_value/light-dark" rel="noopener noreferrer"&gt;light-dark()&lt;/a&gt;, and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Colors/Using_relative_colors" rel="noopener noreferrer"&gt;relative colors&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Better Forms with &lt;code&gt;field-sizing&lt;/code&gt; and &lt;code&gt;accent-color&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Form controls are essential to most applications, but custom styling can become complicated when developers rebuild native inputs from scratch.&lt;/p&gt;

&lt;p&gt;Two properties offer simpler alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let fields size themselves around their content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.comment-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;min-height&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;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14rem&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a supported browser, a textarea can grow or shrink with its content instead of remaining at a fixed preferred size. Minimum and maximum constraints help keep it usable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt;
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"comment-box"&lt;/span&gt;
  &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;
  &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Write a comment..."&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can reduce the need for JavaScript that measures text and updates the field's height.&lt;/p&gt;

&lt;h3&gt;
  
  
  Match native controls to your theme
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"checkbox"&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"radio"&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"range"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;accent-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#7c3aed&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 changes the accent color of supported native controls while preserving their standard behavior. For many forms, that's a better starting point than hiding native inputs and recreating their appearance and interactions manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Native form controls can look more consistent with your design while retaining familiar behavior and accessibility features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;accent-color&lt;/code&gt; is widely supported. &lt;code&gt;field-sizing&lt;/code&gt; became Baseline Newly Available in 2026, so it may not work on older browser versions. Keep the default field behavior usable as a fallback. References: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/field-sizing" rel="noopener noreferrer"&gt;field-sizing&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/accent-color" rel="noopener noreferrer"&gt;accent-color&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. More Declarative UI with &lt;code&gt;:open&lt;/code&gt;, Exclusive Accordions, and Popovers
&lt;/h2&gt;

&lt;p&gt;HTML already provides useful building blocks for interactive interfaces. Modern CSS and browser features make it easier to style these controls without implementing every state from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style open elements with &lt;code&gt;:open&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="nd"&gt;:open&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;summary&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="nx"&gt;#7c3aed&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;:open&lt;/code&gt; pseudo-class can select elements in an open state, including relevant &lt;code&gt;details&lt;/code&gt; and &lt;code&gt;dialog&lt;/code&gt; elements.&lt;/p&gt;

&lt;p&gt;For a straightforward disclosure widget, the traditional attribute selector is also a useful fallback:&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="nt"&gt;details&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;open&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;summary&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="nx"&gt;#7c3aed&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;
  
  
  Create exclusive accordions with native HTML
&lt;/h3&gt;

&lt;p&gt;When only one item in an accordion group should stay open, the &lt;code&gt;name&lt;/code&gt; attribute on &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; can provide that behavior without a custom JavaScript controller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;details&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"faq"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;What is container querying?&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;It lets a component respond to its container's size.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;details&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"faq"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;What is CSS nesting?&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;It lets related selectors be written inside a parent rule.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give the related &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; elements the same &lt;code&gt;name&lt;/code&gt; value to place them in the same exclusive group.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the Popover API for simple overlays
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;popovertarget=&lt;/span&gt;&lt;span class="s"&gt;"help-panel"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Open help
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"help-panel"&lt;/span&gt; &lt;span class="na"&gt;popover&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Helpful information goes here.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser handles showing and hiding the popover through the built-in HTML behavior. An automatically dismissed popover can close when the user clicks outside it or presses Escape, depending on its configuration.&lt;/p&gt;

&lt;p&gt;The Popover API is not a replacement for a modal dialog in every situation. A modal has different focus and interaction requirements; use &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; and its appropriate behavior when a truly modal interaction is needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Native HTML behavior can replace fragile custom interaction code, while CSS handles the appearance of each state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;:open&lt;/code&gt; became Baseline Newly Available in 2026. The Popover API is available in current major browsers, but version support differs. For older targets, use the appropriate fallback or keep the essential interaction independent of the newer selector. References: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/%3Aopen" rel="noopener noreferrer"&gt;&lt;code&gt;:open&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details" rel="noopener noreferrer"&gt;HTML &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;&lt;/a&gt;, and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Popover_API" rel="noopener noreferrer"&gt;Popover API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Small Improvements That Make Interfaces Feel More Polished
&lt;/h2&gt;

&lt;p&gt;Not every useful CSS feature transforms an entire architecture. Sometimes, a tiny improvement solves a persistent UX problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevent scrollbar-related layout shifts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.scroll-panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;scrollbar-gutter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stable&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;On systems that use classic scrollbars, reserving the gutter can help prevent content from shifting when a scrollbar appears. Overlay scrollbars behave differently, so the visible result depends on the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style the scrollbar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.scroll-panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scrollbar-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#64748b&lt;/span&gt; &lt;span class="nx"&gt;#e2e8f0&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 sets the thumb and track colors in browsers that support &lt;code&gt;scrollbar-color&lt;/code&gt;. Keep adequate contrast and avoid making the scrollbar difficult to see or operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Highlight text reached through a text fragment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;::target-text&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="nx"&gt;#fef08a&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="nx"&gt;#111827&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;When a supported text-fragment link navigates to a specific part of a page, &lt;code&gt;::target-text&lt;/code&gt; lets you style the matched text. This can be helpful for documentation and long articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep ruby annotations readable
&lt;/h3&gt;

&lt;p&gt;For text that uses ruby annotations, &lt;code&gt;ruby-align&lt;/code&gt; and &lt;code&gt;ruby-position&lt;/code&gt; provide finer control over alignment and placement. These are especially useful for Japanese learning materials and similar content, rather than a requirement for most websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; These improvements refine usability, navigation, and content presentation without requiring a larger JavaScript framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; &lt;code&gt;scrollbar-gutter&lt;/code&gt; and &lt;code&gt;font-size-adjust&lt;/code&gt; are Baseline 2024 features, while &lt;code&gt;scrollbar-color&lt;/code&gt; and &lt;code&gt;::target-text&lt;/code&gt; became Baseline Newly Available in later cycles. Ruby properties also have broad support in current browsers, but individual values can vary. See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/scrollbar-gutter" rel="noopener noreferrer"&gt;scrollbar-gutter&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/scrollbar-color" rel="noopener noreferrer"&gt;scrollbar-color&lt;/a&gt;, and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::target-text" rel="noopener noreferrer"&gt;::target-text&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three More Capabilities to Adopt Progressively
&lt;/h2&gt;

&lt;p&gt;The ten groups above cover many practical improvements. Three additional capabilities are worth experimenting with, but they deserve more care when supporting a broad range of browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. CSS Anchor Positioning: Position UI Relative to Another Element
&lt;/h3&gt;

&lt;p&gt;Tooltips, menus, and small popovers often need to stay attached to a trigger button. Traditionally, developers used JavaScript to measure element positions and update them during scrolling or resizing.&lt;/p&gt;

&lt;p&gt;CSS Anchor Positioning lets a positioned element refer to another element through an anchor relationship.&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;.trigger&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;anchor-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l"&gt;--help-trigger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.tooltip&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;position-anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l"&gt;--help-trigger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;margin-top&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a simplified example of the relationship; real interfaces may also need fallbacks for collisions with the viewport or other layout constraints.&lt;/p&gt;

&lt;p&gt;Some anchor-positioning capabilities reached Baseline Newly Available during 2026, but support for the wider set of positioning and fallback behaviors is not identical across all browsers. Don't assume that one supported declaration guarantees all the advanced behavior you want.&lt;/p&gt;

&lt;p&gt;For production use, provide a sensible fallback and feature-detect the functionality you rely on:&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;.tooltip&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&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;left&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="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position-anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l"&gt;--help-trigger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.tooltip&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;position-anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l"&gt;--help-trigger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best use cases:&lt;/strong&gt; Tooltips, dropdown menus, contextual labels, and other UI elements positioned relative to a trigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support note:&lt;/strong&gt; Check the precise feature and browser versions using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning" rel="noopener noreferrer"&gt;MDN's anchor-positioning documentation&lt;/a&gt; before replacing a mature positioning library.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Scroll-Driven Animations: Let Scrolling Control the Animation
&lt;/h3&gt;

&lt;p&gt;Traditional CSS animations progress with time. Scroll-driven animations can tie an animation's progress to scrolling or to an element entering the viewport.&lt;/p&gt;

&lt;p&gt;For example, you can enhance a content-reveal effect without making it a requirement for the page to work:&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;.reveal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&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;transform&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="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;animation-timeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.reveal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt; &lt;span class="nb"&gt;linear&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;animation-timeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="py"&gt;animation-range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="nb"&gt;cover&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="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&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="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;translateY&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="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&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;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;translateY&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="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 normal state remains visible when the browser doesn't support scroll-driven animation timelines. Supported browsers receive the additional effect.&lt;/p&gt;

&lt;p&gt;Use motion thoughtfully. Animations should help users understand changes rather than distract them, and you should consider reduced-motion preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use cases:&lt;/strong&gt; Reading-progress indicators, subtle content reveals, scroll-linked visual effects, and other experiences that benefit from a scroll-based timeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support note:&lt;/strong&gt; Scroll-driven animations remain a feature to adopt progressively. Check &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Scroll-driven_animations" rel="noopener noreferrer"&gt;MDN's documentation&lt;/a&gt; and use feature detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. &lt;code&gt;transition-behavior: allow-discrete&lt;/code&gt;: Transition Properties Such as &lt;code&gt;display&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Not every CSS property can interpolate smoothly between two values. Properties with discrete values, such as &lt;code&gt;display&lt;/code&gt;, normally switch from one value to another rather than gradually changing.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;transition-behavior&lt;/code&gt; property adds an &lt;code&gt;allow-discrete&lt;/code&gt; option for certain discrete transitions:&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="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;allow-discrete&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.panel.is-hidden&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be useful when combining visibility changes with opacity transitions. Entry animations from &lt;code&gt;display: none&lt;/code&gt; often need additional setup, such as &lt;code&gt;@starting-style&lt;/code&gt;; consult the relevant documentation rather than assuming the simple example covers every case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use cases:&lt;/strong&gt; Small UI transitions where content appears or disappears, including some popover and panel effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support note:&lt;/strong&gt; &lt;code&gt;transition-behavior&lt;/code&gt; is not yet Baseline across all major browsers. Keep the basic show/hide functionality working without it. See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/transition-behavior" rel="noopener noreferrer"&gt;MDN's transition-behavior reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Related Platform Feature: The Navigation API
&lt;/h2&gt;

&lt;p&gt;The 2026 research also covers the Navigation API. It is worth knowing about, but it is a &lt;strong&gt;JavaScript web API, not a CSS feature&lt;/strong&gt;, so it shouldn't be presented as another CSS property.&lt;/p&gt;

&lt;p&gt;The Navigation API provides browser navigation events and methods that can simplify certain client-side routing implementations. Whether it's a good fit depends on your routing architecture, browser targets, and framework.&lt;/p&gt;

&lt;p&gt;For a broader look, see &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API" rel="noopener noreferrer"&gt;MDN's Navigation API documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use These Features in Production
&lt;/h2&gt;

&lt;p&gt;Learning a new property is only half the job. The other half is deciding when to use it and how to handle browsers that don't support it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start with the support status
&lt;/h3&gt;

&lt;p&gt;Web Platform Baseline distinguishes widely available features, newly available features, and features with limited availability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Widely available:&lt;/strong&gt; A good starting point for most new projects, while still considering your actual browser targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newly available:&lt;/strong&gt; Supported in recent Baseline browsers, but older browser releases may lack support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited availability:&lt;/strong&gt; Use feature detection or a fallback when the feature matters to your design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Baseline is a compatibility signal, not a guarantee that every user will see identical results. Older devices, embedded webviews, assistive technology, and specific feature details may require additional testing.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility" rel="noopener noreferrer"&gt;official Baseline overview&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Prefer progressive enhancement
&lt;/h3&gt;

&lt;p&gt;Start with a working interface. Add the advanced behavior only when the browser supports it.&lt;/p&gt;

&lt;p&gt;For CSS, &lt;code&gt;@supports&lt;/code&gt; is often enough:&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&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&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;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fallback should preserve essential readability and functionality. A visual enhancement shouldn't make the entire component unusable when it's unavailable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Measure performance instead of assuming
&lt;/h3&gt;

&lt;p&gt;A feature can reduce code without automatically improving performance in every situation. &lt;code&gt;content-visibility&lt;/code&gt;, for example, is most helpful when it avoids work on substantial off-screen content. Adding it everywhere without measuring can lead to disappointing results.&lt;/p&gt;

&lt;p&gt;Test actual workloads using browser developer tools and realistic content. Pay attention to rendering, scrolling, input responsiveness, and layout shifts.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Avoid JavaScript when CSS or native HTML already solves the problem
&lt;/h3&gt;

&lt;p&gt;You don't need JavaScript for every visual state. Container queries can handle component sizing, &lt;code&gt;:has()&lt;/code&gt; can respond to DOM relationships, and native controls can provide useful behavior without custom event handlers.&lt;/p&gt;

&lt;p&gt;But CSS isn't a replacement for application logic. Keep state, validation rules, data fetching, and other complex interactions in the parts of your application that are designed to manage them.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>website</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>read and learn, use better ereactnative for your app</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Mon, 26 Oct 2026 17:51:31 +0000</pubDate>
      <link>https://dev.to/devunionx/read-and-learn-use-better-ereactnative-for-your-app-4jg5</link>
      <guid>https://dev.to/devunionx/read-and-learn-use-better-ereactnative-for-your-app-4jg5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7" class="crayons-story__hidden-navigation-link"&gt;5 Things AI Cannot Do at React Native&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devunionx" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" alt="devunionx profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devunionx" class="crayons-story__secondary fw-medium m:hidden"&gt;
              DevUnionX
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                DevUnionX
                
                
              
              &lt;div id="story-author-preview-content-4923511" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devunionx" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;DevUnionX&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 26&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7" id="article-link-4923511"&gt;
          5 Things AI Cannot Do at React Native
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reactnative"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reactnative&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mobile"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mobile&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>5 Things AI Cannot Do at React Native</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Mon, 26 Oct 2026 17:51:09 +0000</pubDate>
      <link>https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7</link>
      <guid>https://dev.to/devunionx/5-things-ai-cannot-do-at-react-native-2of7</guid>
      <description>&lt;h2&gt;
  
  
  1. Compute and Power Constraints
&lt;/h2&gt;

&lt;p&gt;Mobile CPUs/GPUs are orders of magnitude slower than datacenter hardware. Running complex models continuously can overheat devices and deplete batteries. For example, on-device object detection may take tens of milliseconds per frame, far slower than server GPUs. One case study found that enabling GPU delegation reduced inference from ~28 ms to ~11 ms per image, illustrating how hardware accelerators help but only partially bridge the gap. In practice, heavy inference slows the UI and degrades UX. Developers must mitigate this by using quantized (INT8) or pruned models, leveraging mobile NN accelerators (NNAPI on Android, Metal on iOS), and limiting workload (e.g. reducing camera frame rate or downscaling images). Offloading to edge/ cloud (e.g. sending data to a server) avoids local load but adds network latency. In sum, AI features that demand high throughput or low latency (e.g. real-time video analysis) are often beyond pure on-device execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Model Size and Architecture
&lt;/h2&gt;

&lt;p&gt;State-of-the-art AI (LLMs, deep vision nets) contains hundreds of megabytes or more. Mobile storage is limited and models can’t be compressed by standard obfuscation. Large models inflate app size and may not fit in RAM. In one comparison, TensorFlow Lite’s library was ~20 MB smaller than PyTorch Mobile’s (minimized) binary, underscoring how framework choice affects footprint. Very large models simply won’t load on most devices. This means some AI tasks (e.g. on-device GPT-3) are infeasible. Mitigations include using compact models (MobileNet, DistilBERT) or on-device-specialized frameworks (LiteRT/TFLite, Core ML) that optimize size and performance. Techniques like pruning and quantization shrink models. Developers may also download models on demand or load from storage if necessary. Nonetheless, any feature requiring a “heavy” model forces trade-offs (e.g. degrade to simpler heuristic, or rely on cloud inference).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Connectivity and Latency
&lt;/h2&gt;

&lt;p&gt;Complex AI often needs backend support. For large models or up-to-date data (e.g. user personalization), cloud APIs are used. But sending images or audio adds round-trip delays and requires bandwidth. One developer notes that even fast cloud inference suffers “massive overhead” serializing data, transmitting it, and encrypting it. Without a network (offline mode), these AI features fail outright. Conversely, on-device inference avoids connectivity needs and protects privacy, but then accuracy/complexity may suffer. A practical strategy is hybrid (“edge vs cloud”): run lightweight models locally and escalate harder tasks to the cloud if connected. Caching previous results, using quantized models for offline fallback, or pre-downloading data (e.g. language packs) can help. For non-real-time tasks, background syncing to the cloud when on Wi-Fi is another pattern. In short, AI features must gracefully degrade when offline or slow, for UX continuity.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Integration and Platform Constraints
&lt;/h2&gt;

&lt;p&gt;React Native does not natively run AI models in JavaScript at production speeds. Developers must integrate ML frameworks via native modules or JSI. As one example showed, implementing a TFLite image classifier in React Native required ~50 lines of Android (Kotlin) and iOS (Swift) code to preprocess frames and invoke the interpreter each time. This bridging adds development complexity and can be a maintenance burden. Cross-platform differences compound it: Android typically uses LiteRT/TFLite or PyTorch Mobile, while iOS favors Core ML or Metal-based inference. Code must handle both paths. Moreover, traditional RN bridge calls are asynchronous and could add latency; the new Hermes/JSI architecture (as used in react-native-vision-camera) helps by running code as native “worklets” to cut overhead. Still, any bug in the native side can crash the app. Developers mitigate integration pain by relying on well-maintained libraries (e.g. &lt;code&gt;react-native-tflite&lt;/code&gt;, &lt;code&gt;react-native-vision-camera&lt;/code&gt; frame processors) and using architecture patterns that isolate ML logic. Employing Hermes or TurboModules also improves performance. But in general, RN’s JavaScript core cannot perform heavy AI by itself – native collaboration is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Privacy and Security
&lt;/h2&gt;

&lt;p&gt;AI features often process sensitive data (camera, microphone, personal info). Offloading to the cloud risks leaking user data unless encrypted – and even then, trust is a concern. On-device ML “avoids sending user-private data through the network”, which is great for privacy (e.g. facial analysis can stay local). However, embedding models on the device introduces intellectual property risk: attackers could extract or reverse-engineer your model. Studies warn that on-device ML models are targets for extraction attacks, exposing both the model and possibly training data. Developers should weigh these: for highly sensitive data (health, finance) on-device inference is safer for users, whereas for proprietary models cloud execution can better protect model IP. Mitigations include on-device encryption of model files, obfuscating code, or using secure enclaves/TrustZones. In either case, clear user consent and compliance (GDPR, etc.) are essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Native Modules &amp;amp; Bridging (TurboModules)
&lt;/h2&gt;

&lt;p&gt;React Native’s native modules require manual specification and binding code. For example, creating a &lt;strong&gt;TurboModule&lt;/strong&gt; involves writing a typed specification in TypeScript or Flow, running RN’s Codegen, and implementing native code on each platform. AI can generate a basic template, but it cannot reliably configure the native build environment or resolve platform-specific details. Official docs emphasize that a TurboModule is defined by “your specification, the native code you write, and the Codegen interfaces generated from your specification”.&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;// specs/NativeLocalStorage.ts (TypeScript spec for a TurboModule)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;TurboModule&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&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;TurboModuleRegistry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Spec&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;TurboModule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&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="nx"&gt;key&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="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&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="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&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="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&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;TurboModuleRegistry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getEnforcing&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Spec&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NativeLocalStorage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beyond codegen, many subtleties arise. For instance, Apple’s Swift language cannot call C++ (JSI) APIs directly, so bridging requires an Objective-C++ “glue” layer. React Native’s documentation specifically notes that iOS Swift modules need an adapter pattern with minimal Objective-C++ code to interoperate with RN’s C++ core. A human developer must correctly set up bridging headers, adjust symbol linkage, and handle issues (nil pointers, load-order quirks) that an AI model won’t foresee. In practice, you might define an Objective-C++ wrapper that calls Swift code, as in the React Native guide (e.g. creating a &lt;code&gt;NativeLocalStorage.mm&lt;/code&gt; that instantiates a Swift class). AI can’t test this on-device or catch linkage errors, so solving such integration bugs falls to developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migration Tip:&lt;/strong&gt; When migrating to the new architecture, enable TurboModules and Fabric carefully. For Android, set &lt;code&gt;newArchEnabled=true&lt;/code&gt; in &lt;code&gt;gradle.properties&lt;/code&gt;; for iOS, add &lt;code&gt;ENV['RCT_NEW_ARCH_ENABLED'] = '1'&lt;/code&gt; to the Podfile. Then rebuild and watch for crashes or missing modules (issues often show up in Xcode or Logcat).&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Profiling and Optimization
&lt;/h2&gt;

&lt;p&gt;React Native apps require manual performance tuning. The official docs state that RN “cannot determine the best optimization approach for you” in all cases – some problems need custom fixes. For example, large lists in a &lt;code&gt;FlatList&lt;/code&gt; must be configured with props like &lt;code&gt;windowSize&lt;/code&gt;, &lt;code&gt;initialNumToRender&lt;/code&gt;, and &lt;code&gt;updateCellsBatchingPeriod&lt;/code&gt; to balance rendering and memory. The performance guide lists defaults (e.g. &lt;code&gt;windowSize = 21&lt;/code&gt;) and notes that increasing it can reduce blank areas but raise memory use. Adjusting these requires testing on target devices; AI cannot predict the optimal settings for your data. Likewise, stripping out debug code (e.g. &lt;code&gt;console.log&lt;/code&gt;) is often necessary. The docs even recommend using a Babel plugin to remove logs before production builds. &lt;/p&gt;

&lt;p&gt;Moreover, RN runs two frame loops: the JS thread and the native UI thread. The docs explain that animations performed on the native thread (e.g. using &lt;code&gt;@react-navigation/native-stack&lt;/code&gt;) are smoother and not blocked by JS work. An AI model might suggest a JS-based animation, but a human developer can recognize when to switch to a native-driven animator or optimize JavaScript batching. As React Native notes, “native stack navigators… provide better performance… because the transition animations are executed on the native main UI thread”. Achieving 60 FPS often means profiling with device tools (Android Studio Profiler, Xcode Instruments), something only a human can operate. Even RN’s in-app Perf Monitor is just a guide – developers are advised to use native profilers for accurate metrics. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt; To tune a heavy list, try increasing &lt;code&gt;maxToRenderPerBatch&lt;/code&gt; and &lt;code&gt;updateCellsBatchingPeriod&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FlatList&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;windowSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;initialNumToRender&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;maxToRenderPerBatch&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;updateCellsBatchingPeriod&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test on device to ensure scrolling remains smooth. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt; Profile on real hardware and iteratively tune. Use the React Profiler (in DevTools) to identify JS bottlenecks and native tools (CPU/GPU traces) for UI lags. Automating this reasoning is beyond current AI, so human analysis is key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Debugging &amp;amp; Tooling
&lt;/h2&gt;

&lt;p&gt;Debugging React Native issues often requires human-driven, platform-specific tools. You can’t simply ask an AI to attach Xcode breakpoints or parse &lt;code&gt;adb logcat&lt;/code&gt; output in real time. Official docs explain that for native code, one typically “launches the app from Android Studio or Xcode and takes advantage of native debugging features (setting breakpoints, etc.)”. Likewise, checking platform logs uses CLI commands (&lt;code&gt;npx react-native log-android&lt;/code&gt; or &lt;code&gt;log-ios&lt;/code&gt;) or IDE consoles. For example, native modules should log via Android’s &lt;code&gt;Log.d&lt;/code&gt; or iOS’s &lt;code&gt;NSLog&lt;/code&gt;, which developers then view in Logcat or Xcode. These live-run tasks – attaching to a process, stepping through C++ code, observing thread contention – cannot be done by a static AI model. &lt;/p&gt;

&lt;p&gt;Moreover, diagnosing memory leaks or concurrency bugs requires monitoring. RN’s Dev Menu can show a simple perf overlay, but as docs caution, it’s only a guide and “native tooling under Android Studio and Xcode” is recommended for accurate analysis. Tools like Flipper or the Chrome debugger help inspect the JS side, but many timing issues or crashes stem from native threads or JSI. AI code suggestions won’t capture the actual runtime state. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging Tip:&lt;/strong&gt; If your app freezes, attach the native debugger. In Android Studio use &lt;em&gt;Run → Attach debugger&lt;/em&gt;, and in Xcode use &lt;em&gt;Debug → Attach to Process&lt;/em&gt;. Then set breakpoints in Java/Kotlin or Objective-C++ code. This hands-on step-by-step inspection is something only a developer can perform. Rely on LogBox and console logs for JS errors, but remember that true native crashes (e.g. EXC_BAD_ACCESS) need native debugging, not just console output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: remove console logs for production&lt;/span&gt;
&lt;span class="c1"&gt;// Babel config in .babelrc or babel.config.js&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;env&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;plugins&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transform-remove-console&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Configuring the build is another manual task; RN docs recommend removing logs for release builds to avoid JS thread bottlenecks.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  New Architecture Migration &amp;amp; UI Quirks
&lt;/h2&gt;

&lt;p&gt;With React Native’s new architecture (Fabric and TurboModules), developers must adopt new patterns that AI can’t auto-insert. As the RN team notes, the new architecture allows synchronous layout measurement and concurrent rendering features. For example, instead of using the asynchronous &lt;code&gt;onLayout&lt;/code&gt; callback (which may cause visual jumps), developers can use &lt;code&gt;useLayoutEffect&lt;/code&gt; to synchronously measure views in Fabric, eliminating intermediate states. AI tools won’t automatically refactor your code to this model or understand the subtle timing benefits. &lt;/p&gt;

&lt;p&gt;Similarly, enabling features like React 18 automatic batching requires opting into the new renderer. The documentation highlights that &lt;code&gt;useLayoutEffect&lt;/code&gt; in the new architecture performs measurements “in a single commit, avoiding the visual ‘jump’” seen in the legacy flow. Knowing when to use these new patterns versus old callbacks is something a seasoned developer decides during optimization. &lt;/p&gt;

&lt;p&gt;Finally, the new architecture’s strict typing and codegen add hurdles. For instance, Swift-based AppDelegates cannot directly work with JSI C++ code, as noted earlier. Setting the &lt;code&gt;newArchEnabled&lt;/code&gt; flag requires touching multiple files (Gradle and Podfile edits) and understanding build nuances. If something goes wrong (e.g. a missing TurboModule causes startup to fail), a human must trace through native codegen logs. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migration Example:&lt;/strong&gt; Suppose you enabled Fabric (&lt;code&gt;newArchEnabled=true&lt;/code&gt;). You may find certain libraries need manual updates to their codegen specs. Check RN’s “What can I expect from enabling the New Architecture?” guide for version-specific notes. Always test on both iOS and Android after toggling the flag. Issues like symbols not found (&lt;code&gt;RCTCxxBridge&lt;/code&gt; errors) often require adjusting Podfile or rebuilding native modules. &lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Quirks and Build Configuration
&lt;/h2&gt;

&lt;p&gt;Each platform and OS version can introduce unique issues that AI can’t anticipate. For example, iOS’s new privacy permission dialogs or Android’s scoped storage changes often require platform-specific code or manifest edits. React Native’s native modules sometimes behave differently on device vs simulator. Only by testing on real hardware can a developer catch these quirks. The official docs do not enumerate every nuance (e.g. Bluetooth permissions, background task constraints), so developers rely on forums and GitHub issues for fixes. &lt;/p&gt;

&lt;p&gt;Another example is build configuration: adjusting the Android &lt;code&gt;AndroidManifest.xml&lt;/code&gt;, editing the iOS &lt;code&gt;Info.plist&lt;/code&gt;, setting up push notification certificates, or configuring Google services JSON. These steps are manual and tightly coupled to the native environment. An AI model cannot set up your Xcode signing, Gradle keystores, or handle merge conflicts in &lt;code&gt;android/app/build.gradle&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Tip:&lt;/strong&gt; Use the React Native &lt;a href="https://react-native-community.github.io/upgrade-helper/" rel="noopener noreferrer"&gt;Upgrade Helper&lt;/a&gt; to compare changes when bumping versions. For AndroidX or library incompatibilities, consult GitHub threads. AI-generated suggestions might miss these details. Document and script your platform-specific changes (e.g., CocoaPods post-install hooks or Gradle plugin settings) to avoid errors. &lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>mobile</category>
      <category>web</category>
    </item>
    <item>
      <title>do you believe your sql skill?</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Wed, 16 Sep 2026 21:56:47 +0000</pubDate>
      <link>https://dev.to/devunionx/do-you-believe-your-sql-skill-1g0b</link>
      <guid>https://dev.to/devunionx/do-you-believe-your-sql-skill-1g0b</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8" class="crayons-story__hidden-navigation-link"&gt;5 Things AI Cannot Do at PostgreSQL&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devunionx" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" alt="devunionx profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devunionx" class="crayons-story__secondary fw-medium m:hidden"&gt;
              DevUnionX
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                DevUnionX
                
                
              
              &lt;div id="story-author-preview-content-4670695" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devunionx" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3180316%2F804c7ae5-1a93-4c38-b9ec-023a59a621a8.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;DevUnionX&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 16&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8" id="article-link-4670695"&gt;
          5 Things AI Cannot Do at PostgreSQL
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/postgressql"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;postgressql&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sql"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sql&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sqlserver"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sqlserver&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>5 Things AI Cannot Do at PostgreSQL</title>
      <dc:creator>DevUnionX</dc:creator>
      <pubDate>Wed, 16 Sep 2026 21:55:53 +0000</pubDate>
      <link>https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8</link>
      <guid>https://dev.to/devunionx/5-things-ai-cannot-do-at-postgresql-4kj8</guid>
      <description>&lt;p&gt;AI has become surprisingly good at PostgreSQL. Give it a schema and it can write a query in seconds. Paste an &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; result into a chat and it may suggest an index or point to an expensive join.&lt;/p&gt;

&lt;p&gt;That is useful. But there is a difference between &lt;strong&gt;writing PostgreSQL code&lt;/strong&gt; and &lt;strong&gt;understanding why the database should work that way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After looking at the practical side of PostgreSQL, five gaps stand out. They are less about syntax and more about context, trade-offs, investigation, responsibility, and situations where there is no obvious answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI Cannot Understand Your Business Logic
&lt;/h2&gt;

&lt;p&gt;This is probably the easiest mistake to make because the SQL can look completely correct.&lt;/p&gt;

&lt;p&gt;Imagine someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Show total customer revenue for this year.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI can produce a query immediately. But what does “revenue” mean in your application?&lt;/p&gt;

&lt;p&gt;Does it include refunds? Discounts? Tax? Returned products? An order created in December but refunded in January?&lt;/p&gt;

&lt;p&gt;Those are &lt;strong&gt;business questions&lt;/strong&gt;, not SQL questions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query is valid. It can still be completely wrong.&lt;/p&gt;

&lt;p&gt;A developer who knows the system will ask which table is authoritative, what the order data represents, and whether &lt;code&gt;total&lt;/code&gt; is gross or net. AI may not know any of that unless the context is provided.&lt;/p&gt;

&lt;p&gt;That creates a dangerous type of result: a query that looks reasonable enough to survive a quick code review while producing the wrong answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. AI Cannot Make the Architecture Trade-Off for You
&lt;/h2&gt;

&lt;p&gt;PostgreSQL gives you many options. You can add indexes, partition tables, change memory settings, introduce replicas, redesign a schema, or add an extension for a specialized workload.&lt;/p&gt;

&lt;p&gt;The difficult part is not knowing these options exist. It is deciding &lt;strong&gt;which cost you are willing to pay&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Take indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_orders_customer_id&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An AI assistant may suggest this after seeing a slow query. It might help, but every index also consumes storage and adds maintenance work. On a write-heavy system, too many indexes can hurt &lt;code&gt;INSERT&lt;/code&gt; and &lt;code&gt;UPDATE&lt;/code&gt; performance.&lt;/p&gt;

&lt;p&gt;The same thing happens with larger architecture decisions. A time-series workload may push you toward partitioning or an extension. A busy application may need pooling or read replicas. Memory settings depend on total RAM, concurrent workloads, and query behavior.&lt;/p&gt;

&lt;p&gt;AI can list the choices. &lt;strong&gt;A person still has to decide what matters most&lt;/strong&gt; for this particular system.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. AI Cannot Reliably Find the Root Cause of a Production Incident
&lt;/h2&gt;

&lt;p&gt;This is where database work becomes much less like writing code.&lt;/p&gt;

&lt;p&gt;Suppose an application suddenly becomes slow. CPU is only 25%. Memory looks fine. The network seems normal.&lt;/p&gt;

&lt;p&gt;Then you notice old row versions, unusual vacuum behavior, stale statistics, and blocked sessions.&lt;/p&gt;

&lt;p&gt;Now you have a detective story.&lt;/p&gt;

&lt;p&gt;PostgreSQL uses &lt;strong&gt;MVCC&lt;/strong&gt;, so concurrent transactions work with snapshots and older row versions may remain until they can be cleaned up. PostgreSQL also has several isolation levels, row and table locks, deadlocks, and serialization failures.&lt;/p&gt;

&lt;p&gt;AI can read logs, summarize &lt;code&gt;pg_stat_statements&lt;/code&gt;, and explain an execution plan. The difficult part is connecting several weak signals into one explanation.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;wait_event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;wait_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;query&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_stat_activity&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;wait_event&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That output is evidence. It is not the diagnosis.&lt;/p&gt;

&lt;p&gt;Maybe PostgreSQL is the problem. Maybe an ORM created an N+1 query pattern. Maybe a deployment changed transaction behavior. Maybe a cleanup job created severe bloat.&lt;/p&gt;

&lt;p&gt;This is exactly the kind of PostgreSQL troubleshooting where symptoms can point in several directions at once. The provided research highlights how vacuum behavior, statistics, locks, storage, and application behavior can interact in ways that are not obvious from a single metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. AI Cannot Take Responsibility for Security Decisions
&lt;/h2&gt;

&lt;p&gt;PostgreSQL has roles, grants, and row-level security. AI can help write policies and spot obviously broad permissions.&lt;/p&gt;

&lt;p&gt;But security is not only a SQL problem.&lt;/p&gt;

&lt;p&gt;Imagine the requirement is: “Support agents can see customer records.”&lt;/p&gt;

&lt;p&gt;Should they see addresses? Payment information? Internal notes? Deleted accounts? Customers from another region?&lt;/p&gt;

&lt;p&gt;An AI model could generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;support_agent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;support_agent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SQL is fine. The policy could still be terrible.&lt;/p&gt;

&lt;p&gt;Real security decisions involve risk tolerance, internal rules, auditing, incident response, and sometimes legal obligations. AI can help draft controls, but humans still decide what risk is acceptable and what happens when something goes wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can suggest a control. It cannot own the consequences of choosing it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. AI Cannot Invent the Right Answer When the Problem Is New
&lt;/h2&gt;

&lt;p&gt;This is probably the most interesting limitation.&lt;/p&gt;

&lt;p&gt;AI is very good at combining known patterns. PostgreSQL has decades of documentation, discussions, bug reports, and production experience for a model to learn from.&lt;/p&gt;

&lt;p&gt;But sometimes there is no established answer.&lt;/p&gt;

&lt;p&gt;The research report points to ongoing PostgreSQL discussions around issues such as global indexes for partitioned tables. These problems involve deep trade-offs and active experimentation rather than one universal best practice.&lt;/p&gt;

&lt;p&gt;When a production system has an unusual workload and a failure mode nobody has seen before, you have to experiment.&lt;/p&gt;

&lt;p&gt;Build a small reproduction. Change one variable. Compare plans. Maybe the first idea fails.&lt;/p&gt;

&lt;p&gt;That loop of &lt;strong&gt;hypothesis → experiment → failure → adjustment&lt;/strong&gt; is still a major part of database engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Is a PostgreSQL Tool, Not a PostgreSQL Engineer
&lt;/h2&gt;

&lt;p&gt;None of this means AI is bad at PostgreSQL. Quite the opposite.&lt;/p&gt;

&lt;p&gt;It is excellent for repetitive work. It can generate SQL, explain commands, draft migrations, summarize logs, and give you another angle when you are stuck.&lt;/p&gt;

&lt;p&gt;The important distinction is &lt;strong&gt;assistance versus authority&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I would happily ask AI to draft:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;last_login_at&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would not blindly run a risky production migration just because the generated SQL looks correct.&lt;/p&gt;

&lt;p&gt;PostgreSQL is full of decisions where correctness depends on context: schema design, indexing, concurrency, vacuum behavior, permissions, and operational constraints. PostgreSQL's current documentation also treats concurrency as a broader system involving isolation, locks, deadlocks, and serialization failures rather than a single setting or command.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Part Still Matters
&lt;/h2&gt;

&lt;p&gt;The interesting thing about AI and PostgreSQL is that the technology does not necessarily remove the need for database engineers. It changes where their time is spent.&lt;/p&gt;

&lt;p&gt;Writing a basic query may take seconds now.&lt;/p&gt;

&lt;p&gt;Understanding whether that query belongs in production can take much longer.&lt;/p&gt;

&lt;p&gt;AI can generate the first version. A developer can then test it, question its assumptions, compare the execution plan, check the business rules, and decide whether the result actually makes sense.&lt;/p&gt;

&lt;p&gt;That is probably the most useful way to think about AI in PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use AI to move faster, but do not confuse a plausible answer with a verified one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The database still needs someone who understands the system behind the SQL.&lt;/p&gt;

</description>
      <category>postgressql</category>
      <category>sql</category>
      <category>sqlserver</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
