<?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: Shwetha</title>
    <description>The latest articles on DEV Community by Shwetha (@namingthingsishard).</description>
    <link>https://dev.to/namingthingsishard</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%2F1278343%2F5330e020-d565-4b02-b427-d548f23bbe37.jpeg</url>
      <title>DEV Community: Shwetha</title>
      <link>https://dev.to/namingthingsishard</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/namingthingsishard"/>
    <language>en</language>
    <item>
      <title>A Tamil filter-coffee stall board</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:50:27 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/a-tamil-filter-coffee-stall-board-54ko</link>
      <guid>https://dev.to/namingthingsishard/a-tamil-filter-coffee-stall-board-54ko</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Comfort food isn’t only taste. It’s the stall board you already know how to read, the pour you watch without thinking, the quiet veena music if you want it. This is also partly a shoutout to my parents for numerous filter coffee mornings.&lt;/p&gt;

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

&lt;p&gt;For the DEV Frontend Challenge: Comfort Food Edition — Perfect Landing — I built Filter Coffee: a Tamil filter-coffee stall board. Pick a line, walk the ritual, watch the stretch pour. Optional veena if you want music.&lt;/p&gt;

&lt;p&gt;Live Demo: &lt;a href="https://filter-coffee.netlify.app" rel="noopener noreferrer"&gt;https://filter-coffee.netlify.app&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/TheVoraciousReader/filter-coffee" rel="noopener noreferrer"&gt;https://github.com/TheVoraciousReader/filter-coffee&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Filter Coffee stall board
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tph83kjsim9o3obru81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tph83kjsim9o3obru81.png" alt="Filter Coffee Stall Board" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The board, not a dashboard
&lt;/h3&gt;

&lt;p&gt;First viewport is one composition: a painted shop menu. Shrikhand, Catamaran, and Noto Sans Tamil sit on board paint and brass. Weighted steel/brass art waits on the counter.&lt;/p&gt;

&lt;p&gt;On mobile, the board and cups appear first, then the ritual begins so that the context stays in the first viewport.&lt;/p&gt;
&lt;h3&gt;
  
  
  Flow is simple:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Pick a line on the board&lt;/li&gt;
&lt;li&gt;Step through the ritual (filter → decoction → milk → pour → sip)&lt;/li&gt;
&lt;li&gt;On step 4, the stretch pour plays&lt;/li&gt;
&lt;li&gt;Optionally, tap “Hear music”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CSS does the atmosphere: custom properties for paint, brass, focus, and type; a two-column shop layout from ~900px that stacks on small screens; menu rows as a dotted-line grid; SVG pour / froth / steam keyed with CSS animations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Accessibility (the bit I cared about most)
&lt;/h2&gt;

&lt;p&gt;Comfort food should feel welcoming. So should the page.&lt;/p&gt;
&lt;h3&gt;
  
  
  Keyboard &amp;amp; focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Skip link jumps straight to the board&lt;/li&gt;
&lt;li&gt;Real buttons for the menu and ritual — not clickable divs&lt;/li&gt;
&lt;li&gt;Visible focus rings (brass, not browser default)&lt;/li&gt;
&lt;li&gt;Tour mode disables other lines, so you don’t wander mid-ritual&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Screen readers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;aria-live&lt;/code&gt; announces step changes as you move through the ritual&lt;/li&gt;
&lt;li&gt;Detail panel updates politely when you pick a line&lt;/li&gt;
&lt;li&gt;Illustration is &lt;code&gt;role="img"&lt;/code&gt; with a label that changes for the pour&lt;/li&gt;
&lt;li&gt;Decorative bits stay &lt;code&gt;aria-hidden&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Bilingual, on purpose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tamil sits next to English with &lt;code&gt;lang="ta"&lt;/code&gt; so pronunciation isn’t guessed wrong&lt;/li&gt;
&lt;li&gt;The sound toggle uses &lt;code&gt;aria-pressed&lt;/code&gt; — on/off is clear without staring at the label&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Motion &amp;amp; sound
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;prefers-reduced-motion&lt;/code&gt; calms the pour. Music is opt-in only. You’re in control.&lt;/p&gt;
&lt;h3&gt;
  
  
  Semantics over chrome
&lt;/h3&gt;

&lt;p&gt;One &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, a labeled menu list, an aside for the counter. Progress text for the tour (“2 / 5”) isn’t just visual fluff.&lt;/p&gt;

&lt;p&gt;No perfect scorecard — just the stuff that makes a stall board usable if you’re not mousing around with perfect vision and speakers blasting.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; as the build tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; for type safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; for interactivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm&lt;/strong&gt; for package management&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Run it for yourself
&lt;/h3&gt;

&lt;p&gt;To poke at it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veena clip: &lt;a href="https://freesound.org/people/iskweldog/sounds/216060/" rel="noopener noreferrer"&gt;Veena_Recording by iskweldog (CC0)&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing
&lt;/h3&gt;

&lt;p&gt;I wanted the landing to feel like standing at the stall — paint, brass, Tamil and English side by side — and still hold up if you only have a keyboard, a screen reader, or reduced motion settings enabled. &lt;/p&gt;

&lt;p&gt;If you try it, I’d love feedback on the ritual flow and anything that still trips assistive tech.&lt;/p&gt;

&lt;p&gt;Built for the &lt;strong&gt;&lt;em&gt;Comfort Food Edition · Perfect Landing&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>a11y</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Fixing your site's metadata: a practical checklist</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Thu, 06 Aug 2026 18:32:23 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/fixing-your-sites-metadata-a-practical-checklist-3ka0</link>
      <guid>https://dev.to/namingthingsishard/fixing-your-sites-metadata-a-practical-checklist-3ka0</guid>
      <description>&lt;p&gt;You've done it. You're finally done building the website or application you've been working on for quite a while. Proud and elated, you go to share this on your socials or to your buddies — uh oh, what's this now? The preview in WhatsApp shows no headline, your avatar is cropped and dimensions seem wrong. I've been there too. The site looked fine in the browser.&lt;/p&gt;

&lt;p&gt;The problem was everything outside the browser: link previews, search snippets, and tab icons all use a separate metadata layer most of us skip until something breaks.&lt;/p&gt;

&lt;p&gt;So, how do you fix this? Use this as a pre-launch checklist — or run it on a site that's already live but sharing badly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ran into on my own portfolio
&lt;/h2&gt;

&lt;p&gt;When I ran this audit on &lt;a href="https://www.shwethaadiraj.com" rel="noopener noreferrer"&gt;shwethaadiraj.com&lt;/a&gt;, the site rendered fine — but sharing it told a different story. I had pointed both the favicon and Open Graph image at my profile avatar. At tab size the illustration was unreadable; in link previews it got cropped awkwardly.&lt;/p&gt;

&lt;p&gt;An OG validator then flagged two things I hadn't considered: the image was &lt;strong&gt;512×512&lt;/strong&gt; (most platforms expect &lt;strong&gt;1200×630&lt;/strong&gt;), and there was &lt;strong&gt;no headline or CTA on the image itself&lt;/strong&gt; — so Slack and LinkedIn showed a plain square with none of the context from my meta title. I replaced the favicon with a simplified monogram, regenerated the OG image at the correct aspect ratio with my name, tagline, and site URL on it, and re-ran the debuggers. Even then, previews didn't update until I hit &lt;strong&gt;Scrape Again&lt;/strong&gt; — platforms cache OG data aggressively, so fixes on your end won't show up until you bust that cache.&lt;/p&gt;

&lt;p&gt;None of this required rethinking the app. It was a metadata pass — the kind of work that's easy to defer and annoying to discover at the share button.&lt;/p&gt;

&lt;p&gt;Before we get into the specifics, here's a primer on what metadata can actually impact:&lt;/p&gt;

&lt;h2&gt;
  
  
  What is metadata for?
&lt;/h2&gt;

&lt;p&gt;Metadata, simply put, is data about data. Search engines, crawlers and social sites all parse different metadata from your app.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search &amp;amp; Discovery:&lt;/strong&gt; The title and description in your app's &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags tell search engines, crawlers, and AI chatbots how relevant your content is to a user's query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Platforms:&lt;/strong&gt; Open Graph (OG) and Twitter/X cards give you more control over how your app is presented when shared on social platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser:&lt;/strong&gt; Adding favicons and apple touch icons helps consolidate your brand identity across browser tabs, notifications and bookmarks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The metadata audit checklist
&lt;/h2&gt;

&lt;p&gt;A page can render properly and function well but it can still fail when it comes to browser, socials or search engine checks. Run this audit on every public-facing page on your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Favicon and touch icons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does the browser tab show a clear icon at 16×16 and 32×32?&lt;/li&gt;
&lt;li&gt;Is there a dedicated Apple touch icon (typically 180×180) for “Add to Home Screen”?&lt;/li&gt;
&lt;li&gt;Is the favicon a simplified mark, not a full photo or illustration?&lt;/li&gt;
&lt;li&gt;Are favicon URLs absolute (or resolvable via a consistent base URL)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Large images or detailed illustrations lose detail at tab size. Users with many tabs rely on favicons to find your site. A blurry or generic icon makes the site look unfinished even when the page itself is polished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the site in a browser and inspect the tab icon.&lt;/li&gt;
&lt;li&gt;Visit the favicon URL directly (e.g. &lt;code&gt;/icon&lt;/code&gt; or &lt;code&gt;/favicon.ico&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;On mobile, add the site to the home screen and check the icon.&lt;/li&gt;
&lt;li&gt;Use a &lt;a href="https://realfavicongenerator.net/favicon_checker" rel="noopener noreferrer"&gt;favicon checker&lt;/a&gt; or DevTools → Application → Manifest / Icons if you ship a PWA manifest.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Page title and description
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does every route have a unique &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What is the length of the titles? Are they concise and readable?&lt;/li&gt;
&lt;li&gt;Does every page have a description summarizing content of that specific page?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Title and description are what show up in Google results and often in link previews when OG tags are missing. Duplicate or empty metadata makes pages compete with each other and look spammy in search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View page source and search for &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;name="description"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Paste the URL into a &lt;a href="https://www.opengraph.xyz" rel="noopener noreferrer"&gt;search preview tool&lt;/a&gt; and confirm the title/description match what you expect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Canonical URL
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does every page declare one canonical URL via &lt;code&gt;&amp;lt;link rel="canonical"&amp;gt;&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;For your app or any routes in it, is it &lt;code&gt;app.com/blog/&lt;/code&gt; or &lt;code&gt;app.com/blog&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Search engines treat duplicate URLs (http/https, www/bare, trailing slash variants) as separate pages. Canonical URL tells them which version to index and pass ranking signals to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View source on each page type and find &lt;code&gt;link rel="canonical"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the href matches the URL you'd share publicly.&lt;/li&gt;
&lt;li&gt;Try alternate forms (with/without www, with trailing slash) and check redirects or canonical tags.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Open Graph and social link previews
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does your page have &lt;code&gt;og:title&lt;/code&gt;, &lt;code&gt;og:description&lt;/code&gt;, and &lt;code&gt;og:url&lt;/code&gt;, and do they match the page content?&lt;/li&gt;
&lt;li&gt;Are the image dimensions in &lt;code&gt;og:image&lt;/code&gt; 1200×630 (1.91:1)?&lt;/li&gt;
&lt;li&gt;Does the image include readable headline and/or CTA text — many validators flag “no conversion text” because platforms often show the image without your meta title overlay.&lt;/li&gt;
&lt;li&gt;Are &lt;code&gt;twitter:title&lt;/code&gt;, &lt;code&gt;twitter:description&lt;/code&gt;, and &lt;code&gt;twitter:image&lt;/code&gt; defined and aligned with Open Graph tags?&lt;/li&gt;
&lt;li&gt;Does &lt;code&gt;twitter:card&lt;/code&gt; match your image: &lt;code&gt;summary_large_image&lt;/code&gt; for wide OG art, &lt;code&gt;summary&lt;/code&gt; only for small square cards?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; These tags control how your link appears on Slack, LinkedIn, iMessage, and X. Wrong aspect ratio gets cropped; missing image means no preview. X can fall back to OG tags, but explicit Twitter tags and the right card type avoid inconsistent layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.opengraph.xyz" rel="noopener noreferrer"&gt;opengraph.xyz&lt;/a&gt; — paste URL, inspect warnings.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.facebook.com/tools/debug/" rel="noopener noreferrer"&gt;Facebook Sharing Debugger&lt;/a&gt; — use “Scrape Again” after fixes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/post-inspector/" rel="noopener noreferrer"&gt;LinkedIn Post Inspector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cards-dev.twitter.com/validator" rel="noopener noreferrer"&gt;Twitter Card Validator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open your &lt;code&gt;og:image&lt;/code&gt; URL directly in the browser — confirm it loads and reads at thumbnail size.&lt;/li&gt;
&lt;li&gt;Compare previews across at least two platforms for the same URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Robots and indexing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does your &lt;code&gt;robots.txt&lt;/code&gt; allow crawling of public pages and block only private or paywalled content?&lt;/li&gt;
&lt;li&gt;Is the sitemap URL declared in &lt;code&gt;robots.txt&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Accidentally blocking &lt;code&gt;/&lt;/code&gt; or omitting the sitemap slows discovery. Blocking too little exposes internal paths to crawlers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;code&gt;/robots.txt&lt;/code&gt; on production.&lt;/li&gt;
&lt;li&gt;View source for &lt;code&gt;&amp;lt;meta name="robots"&amp;gt;&lt;/code&gt; on key pages.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt; → Pages / Sitemaps (if you use it).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Sitemap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Does &lt;code&gt;/sitemap.xml&lt;/code&gt; exist and return valid XML?&lt;/li&gt;
&lt;li&gt;Do new routes get added when you ship pages?&lt;/li&gt;
&lt;li&gt;Is the URL in your sitemap matching canonical URL structure?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Sitemaps help search engines find pages that aren't heavily linked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to verify&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;/sitemap.xml&lt;/code&gt; in the browser.&lt;/li&gt;
&lt;li&gt;Count URLs vs what you expect to be public.&lt;/li&gt;
&lt;li&gt;Resubmit in &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Search Console&lt;/a&gt; after major additions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Going further: agentic browsing
&lt;/h2&gt;

&lt;p&gt;Once the basics above are solid, there's a second audience worth optimizing for: AI agents browsing on behalf of users. That means accessibility tree completeness, &lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;, layout stability, and eventually APIs like WebMCP. I wrote a separate post on this — &lt;a href="https://www.shwethaadiraj.com/blog/your-website-new-audience" rel="noopener noreferrer"&gt;Your Website's New Audience: AI Agents&lt;/a&gt; — but the order matters: get favicons, Open Graph, and canonical URLs right first, then layer agent-ready improvements on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;When building any new application, people focus on the app itself — metadata gets deferred until you share a link and it looks unpolished. You don't need every advanced technique on day one — get titles and descriptions, canonical URLs, favicons, and Open Graph images right first; &lt;code&gt;robots.txt&lt;/code&gt; and sitemap next. That covers the failures people actually notice.&lt;/p&gt;

&lt;p&gt;I've been experimenting with a &lt;a href="https://github.com/TheVoraciousReader/skills/blob/main/seo-and-metadata/SKILL.md" rel="noopener noreferrer"&gt;Cursor agent skill&lt;/a&gt; that runs this checklist against a real codebase — try it on your project and let me know how it works.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>metadata</category>
    </item>
    <item>
      <title>How to use feature flags effectively</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Tue, 21 Jul 2026 17:45:37 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/how-to-use-feature-flags-effectively-17ae</link>
      <guid>https://dev.to/namingthingsishard/how-to-use-feature-flags-effectively-17ae</guid>
      <description>&lt;p&gt;Shipping code is &lt;strong&gt;stressful&lt;/strong&gt;. You have a full test suite of end-to-end tests, linting and manual verification only for something to crash in production. &lt;/p&gt;

&lt;p&gt;Here is where feature flags enter the picture. It enables developers to safely deploy ideas in production, roll out features to a particular subset of users and disable it in case anything goes wrong &lt;em&gt;without&lt;/em&gt; a redeployment. Let's explore some ways on how to use them effectively:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Don't clutter your code by mixing up feature flag logic
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//🚫 DON'T: complicated if/elses&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableAnalytics&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isAdmin&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AdminAnalytics&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserAnalytics&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &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;isAdmin&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AdminOverview&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserOverview&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//✅ DO: isolated flag logic&lt;/span&gt;
&lt;span class="c1"&gt;// flagEvaluator.js&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;getDashboardComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BaseComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableAnalytics&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Analytics&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Overview&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isAdmin&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;AdminWrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;BaseComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;UserWrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;BaseComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Dashboard.jsx&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;getDashboardComponent&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;./flagEvaluator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DashboardComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getDashboardComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flags&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DashboardComponent&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Make ownership clear
&lt;/h2&gt;

&lt;p&gt;Assuming a codebase worked on by a team of multiple people, all feature flags must always have a code owner. This helps massively as they now effectively manage the feature. Having an ambiguous boundary here wastes manpower and resources on who to contact if something goes wrong or for any cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Always test "ON" and "OFF" mode
&lt;/h2&gt;

&lt;p&gt;Generally, when introducing any feature flags, there is more care given to the code paths newly introduced. Always test your "OFF" mode as thoroughly as well - there's always a chance you might need to turn it off due to some issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Clean up old or redundant flags
&lt;/h2&gt;

&lt;p&gt;All flags, whether shipped or redundant need to be cleaned up - it reduces tech debt and overhead. Ideally, have a system that alerts codeowners of old flags (example criteria - flags not used in say 30 days) and have them take an action against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Follow naming conventions
&lt;/h2&gt;

&lt;p&gt;A feature flag name does not need to be too descriptive, but it should be able to give any reviewer broader context on what the change does. For example, &lt;code&gt;enable_new_checkout_flow_mobile&lt;/code&gt; would be preferred over &lt;code&gt;new_checkout_flow&lt;/code&gt;. You can even include a tag descriptive of whether it is an experiment vs permissive flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Page performance should not be hampered by feature flags
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// home-page.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Multiple async calls for each flag&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;showDiscountBanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetchFlag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;show_discount_banner&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;enableSupportChat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetchFlag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;enable_support_chat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;showBanner&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Banner&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;enableChat&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChatWidget&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how in this example, nothing shows up on the home page until at least one of the feature flags are evaluated. My go to solution would be to aggressively cache your flags per user and resolving the flags on the server. Plus, always batch your feature flag calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share your experience
&lt;/h2&gt;

&lt;p&gt;I’d love to hear how feature flags have played out in your projects. Drop a comment with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug stories&lt;/strong&gt;: Ever had a flag cause chaos in production? How did you fix it?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tooling</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your Website’s New Audience: AI Agents</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Mon, 20 Jul 2026 05:08:35 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/your-websites-new-audience-ai-agents-4k9d</link>
      <guid>https://dev.to/namingthingsishard/your-websites-new-audience-ai-agents-4k9d</guid>
      <description>&lt;p&gt;Web performance has traditionally always been about human user experience. In recent time, that has evolved to include AI agents as well. AI agents can be thought of as anonymous and agentic systems that browse, consume and interact the web &lt;em&gt;on behalf&lt;/em&gt; of users. As more and more people continue to use AI agents or search engines pushing AI mode, it is recommended to optimize for agentic browsing as well.&lt;/p&gt;

&lt;p&gt;Google has recently included an &lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/scoring" rel="noopener noreferrer"&gt;agentic browsing&lt;/a&gt; category for both lighthouse and pagespeed insights, although they are currently experimental.&lt;/p&gt;

&lt;p&gt;How do we do that? Broadly speaking, there are a few basic steps that can be covered here:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Accessibility Tree:
&lt;/h2&gt;

&lt;p&gt;When agents browse your page, they do not typically "see" the page as a human would. They parse the DOM structure to analyze element roles, names and relationships. If any part of the tree is incomplete, it may lead to broken data and checkout flows. Google Lighthouse today measures this by the following methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every interactive element (button, input, link) needs to have a text node or &lt;code&gt;aria-label&lt;/code&gt; assigned to it so they are "visible" to agents.&lt;/li&gt;
&lt;li&gt;Parent - child relationships or sibling relations must be clear in the tree. For example, a label must be clearly tied to an input and so on. This is for better context of the general page structure and executing workflows.&lt;/li&gt;
&lt;li&gt;Interactive elements should NOT be hidden - A clickable Submit button hidden via CSS or &lt;code&gt;aria-label&lt;/code&gt; confuses agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Proper Metadata:
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; present at the root of your domain summarizes key pages and sections for the agent to browse for any given task without having to hit every page unnecessarily. There are more advanced techniques here like &lt;a href="https://searchengineland.com/schema-markup-optimize-agentic-web-479080" rel="noopener noreferrer"&gt;schema.org&lt;/a&gt; and llms-full.txt for a more enhanced summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Cumulative Layout Shift (CLS):
&lt;/h2&gt;

&lt;p&gt;Cumulative Layout Shift is already a part of traditional web performance metrics but for agents, it is even more crucial as layout stability ensures that the agent does not misclick or misfire anything in a given workflow or task.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. WebMCP Adoption:
&lt;/h2&gt;

&lt;p&gt;With WebMCP, agents are provided with APIs that enable them to directly take any action based on the user prompt. There are currently two ways to implement this - a declarative API, defined directly with HTML forms or imperative API, with JavaScript. This is currently available under an &lt;a href="https://developer.chrome.com/blog/ai-webmcp-origin-trial" rel="noopener noreferrer"&gt;origin trial&lt;/a&gt; - meaning you can actually try this out today in production with real users. This has practical use cases - like ecommerce, travel and general automation of day-to-day tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking if your website is agent ready
&lt;/h2&gt;

&lt;p&gt;One really good resource I've found for checking this is &lt;a href="https://isitagentready.com/" rel="noopener noreferrer"&gt;https://isitagentready.com/&lt;/a&gt; - it gives you actionable insights and a prompt by checking against these aforementioned standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;I'm not sure the future of the web will be fully autonomous (or if we would have evolved to some new interface) but for the moment, the best strategy is: build your page for humans and optimize the basics first - accessibility, structure, metadata, stability of the page. Then if and when the need arises, WebMCP and other technologies could be gradually introduced.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>From Hooks To Actions: What's New In React 19</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Tue, 25 Nov 2025 17:01:28 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/from-hooks-to-actions-whats-new-in-react-19-4gn4</link>
      <guid>https://dev.to/namingthingsishard/from-hooks-to-actions-whats-new-in-react-19-4gn4</guid>
      <description>&lt;p&gt;With the release of React 19.2, let's explore in brief how you can leverage the latest React features in your applications. Just a heads up, this blog post is more theory heavy. In case you want to see some working examples, I've linked a video in the references as well as the official documentation so that you can experiment with these features on your own time as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. React Compiler
&lt;/h2&gt;

&lt;p&gt;This is the one that's most exciting and anticipated by people in my opinion. React compiler is a build tool that automatically optimizes your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;: review component logic and separate out states or apply memoization manually&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt;: configure in your bundler and see the magic&lt;/p&gt;

&lt;p&gt;There are &lt;em&gt;some&lt;/em&gt; caveats here however. Your app needs to follow Rules of React or the compiler will err on the safe side and choose to not apply any memoization automatically in such cases. Also, there may be unintended consequences to optimizing - there may be some bugs due to memoization that weren't there before.&lt;/p&gt;

&lt;p&gt;So, how can you safely roll this out?&lt;/p&gt;

&lt;p&gt;The React team recommends incremental adoption and has various configurations to support the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature flag
&lt;/h3&gt;

&lt;p&gt;Dynamically control if the compiler is enabled or not; maybe you can roll it out to some user groups or segments and measure performance&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//in your bundler config
gating: {
  source: 'ReactCompilerFeatureFlags', //file name
  importSpecifierName: 'isCompilerEnabled', //function name
},

// ReactCompilerFeatureFlags.js
export function isCompilerEnabled() {
  // Use your feature flag system
  return getFeatureFlag('react-compiler-enabled');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opt in approach
&lt;/h3&gt;

&lt;p&gt;By setting &lt;code&gt;compilationMode: 'annotation'&lt;/code&gt;, you can then opt in to compiler behaviour for necessary components with the &lt;code&gt;"use memo"&lt;/code&gt; directive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opt out approach
&lt;/h3&gt;

&lt;p&gt;By default, with just React Compiler enabled, you would have an opt out approach where you can specify components which are not to be processed by the compiler using &lt;code&gt;"use no memo"&lt;/code&gt; directive&lt;/p&gt;

&lt;h2&gt;
  
  
  2. React performance tracks
&lt;/h2&gt;

&lt;p&gt;With React 19.2, a custom set of performance tracks have been added for profiling, debugging and general monitoring in the performance tab of devtools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scheduler view&lt;/strong&gt; : What is React working on? &lt;br&gt;
Blocking (user interactions) / Transitions / Suspense / Idle&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Components view&lt;/strong&gt; : What components are being rendered by react in how much time?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwwxb312q4jpnj34f3m9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwwxb312q4jpnj34f3m9.png" alt="React performance tracks overview" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Activity API
&lt;/h2&gt;

&lt;p&gt;Activity API lets you break your app into activities. It can be helpful for cases where you might want to conditionally render components or preload parts of your app.&lt;/p&gt;

&lt;p&gt;It has two modes : hidden, visible.&lt;/p&gt;

&lt;p&gt;Hidden mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"saves" internal state for later&lt;/li&gt;
&lt;li&gt;when you toggle to visible mode again, previous state is restored&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visible mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component loads with restored state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why is it different from adding display none on elements?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React does do this for visually hiding the components but there is an added benefit here - hidden mode elements rerender at a lower priority, i.e, updates are deferred until thread is idle.&lt;/p&gt;

&lt;p&gt;Some common use cases can be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preload some slow parts of your app on lower priority&lt;/li&gt;
&lt;li&gt;Prerender some content that you know will appear next in a series of steps&lt;/li&gt;
&lt;li&gt;Restore hidden components state as you don't unmount the component&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. View transitions API
&lt;/h2&gt;

&lt;p&gt;Fair warning here, this is currently an experimental feature, available in React Canary &amp;amp; Experimental channels.&lt;/p&gt;

&lt;p&gt;View transition lets you animate elements inside a transition. So, if you have a startTransition on any action already, you can wrap the relevant component in a ViewTransition and smooth out the user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use API
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;use&lt;/code&gt; is a React API that can consume &lt;code&gt;context&lt;/code&gt; or &lt;code&gt;Promise&lt;/code&gt; values. The added advantage with &lt;code&gt;use&lt;/code&gt; is that it can be called within loops or conditionals. If used with a &lt;code&gt;Promise&lt;/code&gt;, it pairs along with &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;ErrorBoundary&amp;gt;&lt;/code&gt; components to provide an optimal user journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. useEffectEvent
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useEffectEvent&lt;/code&gt; is a new React Hook that lets you extract non-reactive logic from your Effects into a reusable function. This is super helpful for cases where you might want latest props and state values but not for the effect to run again on changes of those values.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;React Compiler Documentation - &lt;a href="https://react.dev/learn/react-compiler" rel="noopener noreferrer"&gt;https://react.dev/learn/react-compiler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;React 19 blog - &lt;a href="https://react.dev/blog/2024/12/05/react-19" rel="noopener noreferrer"&gt;https://react.dev/blog/2024/12/05/react-19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;React Conf 2025 - &lt;a href="https://www.youtube.com/watch?v=zyVRg2QR6LA" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=zyVRg2QR6LA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Jack Herrington's React 19.2 explainer with working code - &lt;a href="https://www.youtube.com/watch?v=KI4gjUrOfOs" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=KI4gjUrOfOs&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the comments, do let me know which feature you found most exciting or what you've tried out so far!&lt;/p&gt;

</description>
      <category>react</category>
      <category>react19</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My VSCode Config</title>
      <dc:creator>Shwetha</dc:creator>
      <pubDate>Sun, 18 Feb 2024 19:20:23 +0000</pubDate>
      <link>https://dev.to/namingthingsishard/my-vscode-config-4ohp</link>
      <guid>https://dev.to/namingthingsishard/my-vscode-config-4ohp</guid>
      <description>&lt;p&gt;Hi fellow devs,&lt;/p&gt;

&lt;p&gt;For my first post, I'm just documenting my VSCode configurations here for posterity's sake or just for my reference later. Keep in mind that this list is going to be language agnostic and more so utility/aesthetic suggestions (though these are inevitably tied to what languages I work with, so take that as you will). Please feel free to suggest any good extensions that I've missed out on or your absolute must-haves!&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=geeebe.duplicate" rel="noopener noreferrer"&gt;Duplicate selection or line&lt;/a&gt; - keyboard shortcut for duplication (cmd/ctrl+d)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" rel="noopener noreferrer"&gt;GitLens&lt;/a&gt; - essential when working with teams&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens" rel="noopener noreferrer"&gt;Error Lens&lt;/a&gt; - inlines errors for better dev experience&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost" rel="noopener noreferrer"&gt;Import Cost&lt;/a&gt; - tells you the size of imported package, pretty useful for performance improvements&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=niradler.kill-process" rel="noopener noreferrer"&gt;Kill Process&lt;/a&gt; - kill a process from vscode menu&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=kruemelkatze.vscode-dashboard" rel="noopener noreferrer"&gt;Project Dashboard&lt;/a&gt; - quick overview of all your projects for easy navigation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=tintinweb.vscode-decompiler" rel="noopener noreferrer"&gt;Decompiler&lt;/a&gt; - decompiles stuff, useful for debugging&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=fudd.toggle-zen-mode" rel="noopener noreferrer"&gt;Toggle Zen Mode&lt;/a&gt; - adds a button for enabling zen mode so you don't have to remember the shortcut&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=chunsen.bracket-select" rel="noopener noreferrer"&gt;Bracket Select&lt;/a&gt; - quickly select code in between brackets&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag" rel="noopener noreferrer"&gt;Auto Rename Tag&lt;/a&gt; - rename pair of tags automatically&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons" rel="noopener noreferrer"&gt;vscode-icons&lt;/a&gt; - icons for most file extensions you can think of&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula" rel="noopener noreferrer"&gt;Dracula Official&lt;/a&gt; - my preferred VSCode theme&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, on to aliases. This isn't part of VSCode; it's git. But I've included it here anyway as the two do complement each other. Here's the alias section of my .gitconfig file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[alias]
    ac = !git add -A &amp;amp;&amp;amp; git commit -m
    cd = !git checkout develop
    cm = !git checkout master
    pd = !git pull origin develop
    pm = !git pull origin master
    cn = !git checkout -b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2018/01/visual-studio-code/" rel="noopener noreferrer"&gt;https://www.smashingmagazine.com/2018/01/visual-studio-code/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's all for my first post folks. Thanks for reading and have a nice day! ✨&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>config</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
