<?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: Safdar Ali</title>
    <description>The latest articles on DEV Community by Safdar Ali (@safdarali25).</description>
    <link>https://dev.to/safdarali25</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2398981%2F54da62cd-54f1-41f2-8343-10121c73537c.jpg</url>
      <title>DEV Community: Safdar Ali</title>
      <link>https://dev.to/safdarali25</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/safdarali25"/>
    <language>en</language>
    <item>
      <title>I Built a Free Video Thumbnail Generator That Never Uploads Your Files</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sun, 07 Jun 2026 00:01:42 +0000</pubDate>
      <link>https://dev.to/safdarali25/i-built-a-free-video-thumbnail-generator-that-never-uploads-your-files-56pp</link>
      <guid>https://dev.to/safdarali25/i-built-a-free-video-thumbnail-generator-that-never-uploads-your-files-56pp</guid>
      <description>&lt;p&gt;Every creator hits the same wall: you finished the video, exported the MP4, uploaded to YouTube — and &lt;strong&gt;forgot the custom thumbnail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your best frame is already inside that file. You just need to grab it.&lt;/p&gt;

&lt;p&gt;Most online tools make you &lt;strong&gt;upload the entire video to their server&lt;/strong&gt;. That is slow for large files, risky for unreleased content, and often ends with a watermark unless you pay.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://framesnap.safdarali.in" rel="noopener noreferrer"&gt;FrameSnap&lt;/a&gt;&lt;/strong&gt; — a free browser tool that extracts thumbnails locally. No account. No watermark. Your video never leaves your device.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with "free" thumbnail tools
&lt;/h2&gt;

&lt;p&gt;Search for &lt;em&gt;free video thumbnail generator online&lt;/em&gt; and you get dozens of results. Most fall into two camps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server-upload converters&lt;/strong&gt; — your file goes to their cloud, gets processed, comes back with a logo on the free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design apps&lt;/strong&gt; — great for templates and text overlays, overkill when you already have a strong frame in your footage.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Creators actually need something simpler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scrub to the right moment&lt;/li&gt;
&lt;li&gt;Export at &lt;strong&gt;1280×720&lt;/strong&gt; for YouTube&lt;/li&gt;
&lt;li&gt;Download &lt;strong&gt;PNG or JPG&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Optionally grab &lt;strong&gt;6–25 frames&lt;/strong&gt; to compare before deciding&lt;/li&gt;
&lt;li&gt;Do it &lt;strong&gt;without sending client footage to a random SaaS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters if you record courses, agency work, or anything under NDA.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why client-side wins here
&lt;/h2&gt;

&lt;p&gt;Modern browsers can decode MP4, WebM, and MOV through the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element. The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" rel="noopener noreferrer"&gt;Canvas API&lt;/a&gt; can draw any frame to a bitmap. Download via blob URL. Done.&lt;/p&gt;

&lt;p&gt;The flow in FrameSnap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User selects file → video loads in memory → set currentTime → drawImage to canvas → export PNG/JPG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API route handles the video. No S3 bucket. No queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs I accepted:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Works great&lt;/th&gt;
&lt;th&gt;Does not work&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local MP4, WebM, MOV, MKV&lt;/td&gt;
&lt;td&gt;YouTube watch-page URLs (platform blocks direct access)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct &lt;code&gt;.mp4&lt;/code&gt; URLs&lt;/td&gt;
&lt;td&gt;DRM-protected streams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch export via auto-snap intervals&lt;/td&gt;
&lt;td&gt;Replacing Photoshop for layered design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the 80% case — &lt;em&gt;"I have an exported MP4 and need a still"&lt;/em&gt; — client-side is faster and more private than upload-and-wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  Features I cared about as a user
&lt;/h2&gt;

&lt;p&gt;These shaped the product more than any framework choice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-snap presets&lt;/strong&gt; — Quick 6 frames, or every 2%/4%/5% of video length. Picking one thumbnail from a 15-minute video by manual scrubbing is painful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download all as ZIP&lt;/strong&gt; — Compare candidates side-by-side before adding text in Canva.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original aspect ratio&lt;/strong&gt; — Portrait video stays portrait. No black bars from forcing everything into 16:9.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JPG quality slider&lt;/strong&gt; — YouTube's custom thumbnail limit is 2 MB. PNG screen recordings blow past that; JPG at 90% usually does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct MP4 URL tab&lt;/strong&gt; — If your file is hosted at &lt;code&gt;https://yoursite.com/demo.mp4&lt;/code&gt;, paste and go. Not a Google Drive preview link — an actual file URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack (for the curious)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js 16&lt;/a&gt;&lt;/strong&gt; — App Router, static blog with scheduled publishing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — the fun part is typed canvas math, not the boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas + HTML5 Video&lt;/strong&gt; — frame capture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://stuartk.com/jszip/" rel="noopener noreferrer"&gt;JSZip&lt;/a&gt;&lt;/strong&gt; — batch downloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — deploy at &lt;a href="https://framesnap.safdarali.in" rel="noopener noreferrer"&gt;framesnap.safdarali.in&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;100% client-side processing. The server only serves HTML/JS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://framesnap.safdarali.in" rel="noopener noreferrer"&gt;framesnap.safdarali.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drop an MP4 (or paste a direct video URL)&lt;/li&gt;
&lt;li&gt;Scrub or use auto-snap&lt;/li&gt;
&lt;li&gt;Export HD (1280×720) PNG/JPG&lt;/li&gt;
&lt;li&gt;Upload to YouTube Studio&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also wrote a longer comparison guide on the site: &lt;a href="https://framesnap.safdarali.in/blog/video-thumbnail-generator-online" rel="noopener noreferrer"&gt;Free Video Thumbnail Generator Online&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More export presets for Shorts/Reels covers&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts for power users&lt;/li&gt;
&lt;li&gt;Better error messages for codec edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it and it saves you ten minutes before your next upload, that is enough for me.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://framesnap.safdarali.in" rel="noopener noreferrer"&gt;FrameSnap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="https://framesnap.safdarali.in/blog" rel="noopener noreferrer"&gt;framesnap.safdarali.in/blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="https://safdarali.in" rel="noopener noreferrer"&gt;safdarali.in&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;@safdarali_&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X / Twitter:&lt;/strong&gt; &lt;a href="https://x.com/safdarali___" rel="noopener noreferrer"&gt;@safdarali___&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/safdarali25/" rel="noopener noreferrer"&gt;Safdar Ali&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Safdar-Ali-India" rel="noopener noreferrer"&gt;Safdar-Ali-India&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Support the project
&lt;/h2&gt;

&lt;p&gt;FrameSnap is free with no export limits. If it helps your workflow, you can &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;buy me a coffee ☕&lt;/a&gt; — it keeps side projects like this alive.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://safdarali.in" rel="noopener noreferrer"&gt;Safdar Ali&lt;/a&gt;. Feedback welcome in the comments — especially if you hit a codec or browser edge case I have not seen yet.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Build a Frontend Developer Portfolio That Stands Out</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sun, 31 May 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/safdarali25/how-to-build-a-frontend-developer-portfolio-that-stands-out-4d3k</link>
      <guid>https://dev.to/safdarali25/how-to-build-a-frontend-developer-portfolio-that-stands-out-4d3k</guid>
      <description>&lt;p&gt;I rebuilt &lt;strong&gt;&lt;a href="https://safdarali.in/" rel="noopener noreferrer"&gt;safdarali.in&lt;/a&gt;&lt;/strong&gt; on Next.js as a living document — not a static PDF, but a frontend developer portfolio that shows how I think about performance, content, and craft.&lt;/p&gt;

&lt;p&gt;Fast first paint.&lt;/p&gt;

&lt;p&gt;Clear navigation.&lt;/p&gt;

&lt;p&gt;Three meaningful projects instead of twelve cloned tutorials.&lt;/p&gt;

&lt;p&gt;Developers ask me every week:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should I put on my portfolio in 2026?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide is the exact framework I recommend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a Frontend Developer Portfolio Still Matters in 2026
&lt;/h2&gt;

&lt;p&gt;LinkedIn profiles are crowded.&lt;/p&gt;

&lt;p&gt;GitHub repositories rarely explain your thinking.&lt;/p&gt;

&lt;p&gt;Generic link-in-bio pages look identical.&lt;/p&gt;

&lt;p&gt;A portfolio remains the one place where you control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your story&lt;/li&gt;
&lt;li&gt;Your design&lt;/li&gt;
&lt;li&gt;Your technical decisions&lt;/li&gt;
&lt;li&gt;Your personal brand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Companies don't just hire code.&lt;/p&gt;

&lt;p&gt;They hire problem-solvers.&lt;/p&gt;

&lt;p&gt;Your portfolio is where you demonstrate that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Visitors Notice First
&lt;/h2&gt;

&lt;p&gt;Most visitors decide within seconds whether to continue exploring.&lt;/p&gt;

&lt;p&gt;They're looking for signals:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;What Good Looks Like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Role clarity&lt;/td&gt;
&lt;td&gt;Frontend Engineer • React • Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live proof&lt;/td&gt;
&lt;td&gt;Working project links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Fast loading pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honesty&lt;/td&gt;
&lt;td&gt;Clear ownership of work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contact&lt;/td&gt;
&lt;td&gt;Easy-to-find email or LinkedIn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Blog posts or case studies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The best portfolios answer two questions immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What do you build?&lt;/li&gt;
&lt;li&gt;How do you think?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common Portfolio Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Template Trap
&lt;/h3&gt;

&lt;p&gt;Using a template is fine.&lt;/p&gt;

&lt;p&gt;Publishing it without customization isn't.&lt;/p&gt;

&lt;p&gt;Hiring managers see the same templates repeatedly.&lt;/p&gt;

&lt;p&gt;Add your own voice, structure, and design decisions.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Too Many Tutorial Projects
&lt;/h3&gt;

&lt;p&gt;Five Netflix clones won't impress anyone.&lt;/p&gt;

&lt;p&gt;One production-style project with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;API integration&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Responsive design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;is far more valuable.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. GitHub as the Entire Portfolio
&lt;/h3&gt;

&lt;p&gt;Most visitors won't read your code first.&lt;/p&gt;

&lt;p&gt;Explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The problem&lt;/li&gt;
&lt;li&gt;Your solution&lt;/li&gt;
&lt;li&gt;The outcome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make projects understandable before visitors open GitHub.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Ignoring Mobile Users
&lt;/h3&gt;

&lt;p&gt;Many recruiters first visit portfolios from phones.&lt;/p&gt;

&lt;p&gt;A portfolio that looks amazing on desktop but breaks on mobile loses opportunities.&lt;/p&gt;

&lt;p&gt;Always test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile navigation&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Layout shifts&lt;/li&gt;
&lt;li&gt;Touch interactions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Generic Introductions
&lt;/h3&gt;

&lt;p&gt;Avoid:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Passionate developer who loves coding.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead write something specific:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Frontend Engineer specializing in React, Next.js, and performance-focused web applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Specificity wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Portfolio Sections Every Developer Needs
&lt;/h2&gt;

&lt;p&gt;You don't need 20 pages.&lt;/p&gt;

&lt;p&gt;These seven sections are enough:&lt;/p&gt;

&lt;h3&gt;
  
  
  Home
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Role&lt;/li&gt;
&lt;li&gt;Location&lt;/li&gt;
&lt;li&gt;Call-to-action&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;3–5 strong projects&lt;/li&gt;
&lt;li&gt;Live demos&lt;/li&gt;
&lt;li&gt;Tech stack&lt;/li&gt;
&lt;li&gt;Short case studies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Experience&lt;/li&gt;
&lt;li&gt;Background&lt;/li&gt;
&lt;li&gt;Personality&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Skills
&lt;/h3&gt;

&lt;p&gt;Group skills honestly.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Familiar With&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Blog
&lt;/h3&gt;

&lt;p&gt;Even a few technical articles help.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO traffic&lt;/li&gt;
&lt;li&gt;Personal branding&lt;/li&gt;
&lt;li&gt;Communication proof&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Contact
&lt;/h3&gt;

&lt;p&gt;Make it simple.&lt;/p&gt;

&lt;p&gt;Don't hide contact information behind multiple clicks.&lt;/p&gt;




&lt;h3&gt;
  
  
  Privacy Policy
&lt;/h3&gt;

&lt;p&gt;Especially important if your contact form stores user data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Frontend Portfolio Project Ideas
&lt;/h2&gt;

&lt;p&gt;The strongest projects solve real problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics Dashboard
&lt;/h3&gt;

&lt;p&gt;Shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charts&lt;/li&gt;
&lt;li&gt;Data visualization&lt;/li&gt;
&lt;li&gt;Complex UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Multi-Step Form
&lt;/h3&gt;

&lt;p&gt;Demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;li&gt;State management&lt;/li&gt;
&lt;li&gt;User experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Documentation Platform
&lt;/h3&gt;

&lt;p&gt;Shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search functionality&lt;/li&gt;
&lt;li&gt;Content architecture&lt;/li&gt;
&lt;li&gt;Navigation design&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  E-Commerce Application
&lt;/h3&gt;

&lt;p&gt;Demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product listings&lt;/li&gt;
&lt;li&gt;Cart management&lt;/li&gt;
&lt;li&gt;API integrations&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Component Library
&lt;/h3&gt;

&lt;p&gt;Excellent for frontend-focused roles.&lt;/p&gt;

&lt;p&gt;Shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reusability&lt;/li&gt;
&lt;li&gt;Design systems&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Write Better Project Case Studies
&lt;/h2&gt;

&lt;p&gt;Don't stop at screenshots.&lt;/p&gt;

&lt;p&gt;Explain:&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;What needed to be solved?&lt;/p&gt;

&lt;h3&gt;
  
  
  Your Role
&lt;/h3&gt;

&lt;p&gt;What exactly did you build?&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;p&gt;Which technologies did you use?&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Decision
&lt;/h3&gt;

&lt;p&gt;What tradeoff did you make?&lt;/p&gt;

&lt;h3&gt;
  
  
  Outcome
&lt;/h3&gt;

&lt;p&gt;What improved?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Faster load times&lt;/li&gt;
&lt;li&gt;Better UX&lt;/li&gt;
&lt;li&gt;Higher Lighthouse scores&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Next.js Portfolio Best Practices
&lt;/h2&gt;

&lt;p&gt;If you're building a modern portfolio, Next.js remains an excellent choice.&lt;/p&gt;

&lt;p&gt;Recommended patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Server Components
&lt;/h3&gt;

&lt;p&gt;Keep client-side JavaScript minimal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimize Images
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;next/image&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Metadata
&lt;/h3&gt;

&lt;p&gt;Every page should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Canonical URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add Structured Data
&lt;/h3&gt;

&lt;p&gt;Useful schemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Person&lt;/li&gt;
&lt;li&gt;Website&lt;/li&gt;
&lt;li&gt;BlogPosting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  SEO Tips for Developer Portfolios
&lt;/h2&gt;

&lt;p&gt;Many developers ignore SEO entirely.&lt;/p&gt;

&lt;p&gt;That creates opportunity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Target Specific Keywords
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;frontend developer portfolio&lt;/li&gt;
&lt;li&gt;react developer portfolio&lt;/li&gt;
&lt;li&gt;next.js developer portfolio&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Create Supporting Articles
&lt;/h3&gt;

&lt;p&gt;Write content around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Career growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Content creates long-term traffic.&lt;/p&gt;




&lt;h3&gt;
  
  
  Internal Linking
&lt;/h3&gt;

&lt;p&gt;Link:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blog → Projects&lt;/li&gt;
&lt;li&gt;Projects → Contact&lt;/li&gt;
&lt;li&gt;About → Projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This improves discoverability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Optimization Checklist
&lt;/h2&gt;

&lt;p&gt;Users notice speed.&lt;/p&gt;

&lt;p&gt;Recommended targets:&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;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;Under 2.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;Under 0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;Under 200ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total JS&lt;/td&gt;
&lt;td&gt;Keep minimal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quick wins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-host fonts&lt;/li&gt;
&lt;li&gt;Optimize images&lt;/li&gt;
&lt;li&gt;Lazy-load heavy components&lt;/li&gt;
&lt;li&gt;Avoid unnecessary animations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Personal Branding That Compounds
&lt;/h2&gt;

&lt;p&gt;Your portfolio should not exist in isolation.&lt;/p&gt;

&lt;p&gt;A strong ecosystem looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portfolio website&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;LinkedIn&lt;/li&gt;
&lt;li&gt;DEV Community&lt;/li&gt;
&lt;li&gt;YouTube (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each platform drives traffic to the others.&lt;/p&gt;

&lt;p&gt;Over time, this creates a compounding effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Portfolio Checklist
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;[ ] Clear role and value proposition&lt;/li&gt;
&lt;li&gt;[ ] Mobile-friendly design&lt;/li&gt;
&lt;li&gt;[ ] Fast page speed&lt;/li&gt;
&lt;li&gt;[ ] Live project links&lt;/li&gt;
&lt;li&gt;[ ] Working contact form&lt;/li&gt;
&lt;li&gt;[ ] SEO metadata&lt;/li&gt;
&lt;li&gt;[ ] Open Graph images&lt;/li&gt;
&lt;li&gt;[ ] At least one technical article&lt;/li&gt;
&lt;li&gt;[ ] Updated GitHub profile&lt;/li&gt;
&lt;li&gt;[ ] Custom domain configured&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;A frontend developer portfolio isn't decoration.&lt;/p&gt;

&lt;p&gt;It's proof.&lt;/p&gt;

&lt;p&gt;Proof of your skills.&lt;/p&gt;

&lt;p&gt;Proof of your decisions.&lt;/p&gt;

&lt;p&gt;Proof of how you solve problems.&lt;/p&gt;

&lt;p&gt;In 2026, templates and generic portfolios are everywhere.&lt;/p&gt;

&lt;p&gt;What still stands out is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast performance&lt;/li&gt;
&lt;li&gt;Real projects&lt;/li&gt;
&lt;li&gt;Honest case studies&lt;/li&gt;
&lt;li&gt;Strong communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build something you'd be proud to share.&lt;/p&gt;

&lt;p&gt;And keep improving it as you grow.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h2&gt;

&lt;p&gt;If this guide helped you and you'd like to support more content like this:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Buy me a coffee:&lt;/strong&gt; &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;https://buymeacoffee.com/safdarali&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Subscribe to my YouTube channel:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;https://www.youtube.com/@safdarali_?sub_confirmation=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I regularly share content about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;AI-assisted development&lt;/li&gt;
&lt;li&gt;Developer career growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your support helps me continue publishing free tutorials and in-depth articles.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>portfolio</category>
      <category>career</category>
    </item>
    <item>
      <title>Why Your Next.js 15 App Is Still Slow (And How to Fix React 19 Hydration Lag)</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sun, 31 May 2026 12:07:28 +0000</pubDate>
      <link>https://dev.to/safdarali25/why-your-nextjs-15-app-is-still-slow-and-how-to-fix-react-19-hydration-lag-3pce</link>
      <guid>https://dev.to/safdarali25/why-your-nextjs-15-app-is-still-slow-and-how-to-fix-react-19-hydration-lag-3pce</guid>
      <description>&lt;p&gt;A team upgraded to &lt;strong&gt;Next.js 15&lt;/strong&gt; and &lt;strong&gt;React 19&lt;/strong&gt;, enabled the React Compiler, and expected Lighthouse scores to magically improve.&lt;/p&gt;

&lt;p&gt;They didn't.&lt;/p&gt;

&lt;p&gt;LCP remained above &lt;strong&gt;3 seconds&lt;/strong&gt; on mobile.&lt;br&gt;
INP spiked whenever users interacted with filters.&lt;br&gt;
Hydration still felt sluggish.&lt;/p&gt;

&lt;p&gt;The stack was modern.&lt;/p&gt;

&lt;p&gt;The performance wasn't.&lt;/p&gt;

&lt;p&gt;After debugging multiple production applications, I've noticed the same pattern repeatedly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Upgrading frameworks doesn't automatically eliminate runtime bottlenecks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hydration still runs on the main thread.&lt;br&gt;
Client components still execute JavaScript.&lt;br&gt;
Layout shifts still hurt Core Web Vitals.&lt;/p&gt;

&lt;p&gt;Here's how I diagnosed and fixed these issues.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Upgrade Myth
&lt;/h2&gt;

&lt;p&gt;Many developers assume that upgrading to the latest stack automatically solves performance problems.&lt;/p&gt;

&lt;p&gt;While &lt;strong&gt;Next.js 15&lt;/strong&gt; and &lt;strong&gt;React 19&lt;/strong&gt; bring significant improvements, they don't magically fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layout shifts during hydration&lt;/li&gt;
&lt;li&gt;Excessive client-side JavaScript&lt;/li&gt;
&lt;li&gt;Large client component trees&lt;/li&gt;
&lt;li&gt;Unnecessary re-renders&lt;/li&gt;
&lt;li&gt;Delayed event handlers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Build succeeds"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Application feels fast"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;is where most performance issues live.&lt;/p&gt;


&lt;h2&gt;
  
  
  Before Optimization
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Real-World Metrics
&lt;/h3&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;Before&lt;/th&gt;
&lt;th&gt;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;3.8s&lt;/td&gt;
&lt;td&gt;&amp;lt; 2.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0.18&lt;/td&gt;
&lt;td&gt;&amp;lt; 0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;420ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 200ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client JS&lt;/td&gt;
&lt;td&gt;312 KB&lt;/td&gt;
&lt;td&gt;&amp;lt; 180 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lighthouse looked acceptable.&lt;/p&gt;

&lt;p&gt;Actual user experience did not.&lt;/p&gt;

&lt;p&gt;That's why I always start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome Performance Panel&lt;/li&gt;
&lt;li&gt;React Profiler&lt;/li&gt;
&lt;li&gt;Layout Shift Overlay&lt;/li&gt;
&lt;li&gt;Web Vitals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;instead of Lighthouse alone.&lt;/p&gt;


&lt;h1&gt;
  
  
  Fix #1: Eliminate Layout Shifts During Hydration
&lt;/h1&gt;

&lt;p&gt;The Largest Contentful Paint element was a dashboard chart.&lt;/p&gt;

&lt;p&gt;The server rendered a placeholder.&lt;/p&gt;

&lt;p&gt;When the client chart mounted, it resized the container and shifted the layout.&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLS increased&lt;/li&gt;
&lt;li&gt;LCP was delayed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Diagnosis
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chrome DevTools → Performance → Record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Experience → Layout Shift Regions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The purple overlays immediately revealed the culprit.&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Reserve space before hydration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;DashboardPage&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;stats&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;getDashboardStats&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"min-h-[280px] rounded-xl border p-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChartSlot&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;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;series&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additional improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch chart data on the server&lt;/li&gt;
&lt;li&gt;Pass serializable props only&lt;/li&gt;
&lt;li&gt;Lazy load chart libraries&lt;/li&gt;
&lt;li&gt;Keep container dimensions fixed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&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;Before&lt;/th&gt;
&lt;th&gt;After&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;3.8s&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0.18&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Fix #2: React 19 Hydration Lag and Poor INP
&lt;/h1&gt;

&lt;p&gt;INP measures how quickly the UI responds after interaction.&lt;/p&gt;

&lt;p&gt;A common App Router issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User clicks a filter&lt;/li&gt;
&lt;li&gt;Hydration is still running&lt;/li&gt;
&lt;li&gt;React delays the interaction&lt;/li&gt;
&lt;li&gt;INP spikes&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dashboard
 ├── Filters
 ├── Table
 └── Pagination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything lived inside one large client component.&lt;/p&gt;

&lt;p&gt;Hydration had to complete the entire tree before interactions felt responsive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Split hydration boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// filters&lt;/span&gt;
&lt;span class="c1"&gt;// table&lt;/span&gt;
&lt;span class="c1"&gt;// pagination&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;FilterBar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
&lt;span class="nx"&gt;DataTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hydrate filters first&lt;/li&gt;
&lt;li&gt;Stream table later&lt;/li&gt;
&lt;li&gt;Keep interactive components small&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move state into URL search params&lt;/li&gt;
&lt;li&gt;Render filtered results on the server&lt;/li&gt;
&lt;li&gt;Defer analytics using idle callbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&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;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;420ms&lt;/td&gt;
&lt;td&gt;168ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Fix #3: What React Compiler Doesn't Fix
&lt;/h1&gt;

&lt;p&gt;Many developers believe React Compiler removes the need for optimization.&lt;/p&gt;

&lt;p&gt;Not always.&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 tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;archive&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="nf"&gt;onArchive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rowId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;export&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="nf"&gt;exportRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rowId&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;A new object gets created every render.&lt;/p&gt;

&lt;p&gt;React Compiler may not optimize this if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mutable module state exists&lt;/li&gt;
&lt;li&gt;External references are involved&lt;/li&gt;
&lt;li&gt;Reference stability cannot be guaranteed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Manual Optimization Still Matters
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&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="na"&gt;archive&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="nf"&gt;onArchive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rowId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;export&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="nf"&gt;exportRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rowId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;rowId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onArchive&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;
  
  
  Rule of Thumb
&lt;/h3&gt;

&lt;p&gt;If your helper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads module scope&lt;/li&gt;
&lt;li&gt;Uses mutable state&lt;/li&gt;
&lt;li&gt;Depends on refs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verify in React Profiler before removing memoization.&lt;/p&gt;




&lt;h1&gt;
  
  
  React 19 Hydration Mismatch Example
&lt;/h1&gt;

&lt;p&gt;Another issue I frequently encounter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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;Server output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;May 31, 2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;31/05/2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hydration mismatch.&lt;/p&gt;




&lt;h3&gt;
  
  
  Better Approach
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;suppressHydrationWarning&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formattedDate&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or format the value on the server before rendering.&lt;/p&gt;

&lt;p&gt;Hydration retries create additional work and can negatively impact INP.&lt;/p&gt;




&lt;h1&gt;
  
  
  Production Optimization Checklist
&lt;/h1&gt;

&lt;p&gt;My workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Record a Performance Trace
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long Tasks&lt;/li&gt;
&lt;li&gt;Layout Shifts&lt;/li&gt;
&lt;li&gt;Main Thread Blocking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Use React Profiler
&lt;/h3&gt;

&lt;p&gt;Identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unnecessary re-renders&lt;/li&gt;
&lt;li&gt;Large hydration boundaries&lt;/li&gt;
&lt;li&gt;Expensive components&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Split Client Islands
&lt;/h3&gt;

&lt;p&gt;Hydrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Menus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;before heavier components.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reserve Layout Space
&lt;/h3&gt;

&lt;p&gt;Prevent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart jumps&lt;/li&gt;
&lt;li&gt;Image shifts&lt;/li&gt;
&lt;li&gt;Font reflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Test Like Real Users
&lt;/h3&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4G throttling&lt;/li&gt;
&lt;li&gt;CPU throttling&lt;/li&gt;
&lt;li&gt;Mobile viewport&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't trust desktop Lighthouse alone.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Metrics
&lt;/h1&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;Before&lt;/th&gt;
&lt;th&gt;After&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;3.8s&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0.18&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;420ms&lt;/td&gt;
&lt;td&gt;168ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client JS&lt;/td&gt;
&lt;td&gt;312 KB&lt;/td&gt;
&lt;td&gt;174 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Next.js 15 performance optimization isn't a version upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better hydration boundaries&lt;/li&gt;
&lt;li&gt;Smaller client components&lt;/li&gt;
&lt;li&gt;Stable layouts&lt;/li&gt;
&lt;li&gt;Reduced JavaScript&lt;/li&gt;
&lt;li&gt;Measured improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React 19 is powerful.&lt;/p&gt;

&lt;p&gt;But if your application still hydrates a massive client tree on page load, users will feel it.&lt;/p&gt;

&lt;p&gt;The fastest apps aren't the ones running the newest framework versions.&lt;/p&gt;

&lt;p&gt;They're the ones doing the least work.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h2&gt;

&lt;p&gt;If this article saved you hours of debugging:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Buy me a coffee:&lt;/strong&gt; &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;https://buymeacoffee.com/safdarali&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Subscribe to my YouTube channel:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;https://www.youtube.com/@safdarali_?sub_confirmation=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I regularly publish content on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Frontend Performance&lt;/li&gt;
&lt;li&gt;AI Developer Workflows&lt;/li&gt;
&lt;li&gt;Modern Web Engineering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>How I Use Cursor + Claude to Ship React Code 3x Faster</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sun, 24 May 2026 13:10:06 +0000</pubDate>
      <link>https://dev.to/safdarali25/how-i-use-cursor-claude-to-ship-react-code-3x-faster-31fj</link>
      <guid>https://dev.to/safdarali25/how-i-use-cursor-claude-to-ship-react-code-3x-faster-31fj</guid>
      <description>&lt;p&gt;I'm &lt;a href="https://safdarali.in/" rel="noopener noreferrer"&gt;Safdar Ali&lt;/a&gt;. I build React and Next.js for a living — client work on the side, and this portfolio you're reading on safdarali.in.&lt;/p&gt;

&lt;p&gt;For the last year, my editor has been &lt;strong&gt;Cursor&lt;/strong&gt; with &lt;strong&gt;Claude&lt;/strong&gt; as the model behind Agent mode.&lt;/p&gt;

&lt;p&gt;Not because AI writes perfect code (it doesn't), but because when I treat it like a fast junior who reads the whole repo first, I ship features in a third of the time it used to take me to context-switch, grep, and boilerplate alone.&lt;/p&gt;

&lt;p&gt;This isn't a "10 prompts that will change your life" thread.&lt;/p&gt;

&lt;p&gt;It's the exact &lt;strong&gt;Cursor AI React&lt;/strong&gt; workflow I run every day — how I open a task, what I refuse to let the agent touch, and how I review output so it matches how teams at serious product companies ship.&lt;/p&gt;

&lt;p&gt;If you're searching for a real &lt;strong&gt;cursor ai react&lt;/strong&gt; setup instead of another Copilot vs Cursor comparison, this is it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Cursor + Claude (and not just autocomplete)
&lt;/h2&gt;

&lt;p&gt;Autocomplete saves keystrokes.&lt;/p&gt;

&lt;p&gt;Agent mode saves &lt;em&gt;hours&lt;/em&gt; — when you use it correctly.&lt;/p&gt;

&lt;p&gt;Cursor indexes your workspace, runs terminal commands, edits multiple files, and follows instructions across a feature branch.&lt;/p&gt;

&lt;p&gt;Claude (Sonnet / Opus depending on the task) is what I use for reasoning-heavy work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refactors&lt;/li&gt;
&lt;li&gt;boundary decisions&lt;/li&gt;
&lt;li&gt;“find every place this breaks”&lt;/li&gt;
&lt;li&gt;long-form implementation plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tab completion&lt;/strong&gt; — inline JSX, Tailwind classes, repetitive TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat (Cmd+L)&lt;/strong&gt; — “Explain this hook,” “Why is this hydrating wrong?”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent (Cmd+I)&lt;/strong&gt; — multi-file features, audits, refactors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the 3× speed lives.&lt;/p&gt;

&lt;p&gt;I don't bounce between five tools.&lt;/p&gt;

&lt;p&gt;One repo.&lt;br&gt;
One editor.&lt;br&gt;
One model family I've learned to review critically.&lt;/p&gt;

&lt;p&gt;That consistency matters more than whichever model scored 2% higher on a benchmark last Tuesday.&lt;/p&gt;


&lt;h2&gt;
  
  
  My Daily Loop — From Ticket to PR
&lt;/h2&gt;

&lt;p&gt;Every feature follows the same rhythm.&lt;/p&gt;

&lt;p&gt;Boring on purpose — boring scales.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Scope in human words first
&lt;/h3&gt;

&lt;p&gt;Before I touch Agent, I write a one-paragraph goal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user outcome&lt;/li&gt;
&lt;li&gt;affected files&lt;/li&gt;
&lt;li&gt;“done” criteria&lt;/li&gt;
&lt;li&gt;constraints (SEO, dark mode, mobile)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vague prompts produce vague diffs.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Make the projects page faster”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Convert app/projects/page.jsx to a server component; move data to data/; keep interactive cards client-only; run build after.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  2. Agent reads before it writes
&lt;/h3&gt;

&lt;p&gt;My first agent message is almost never:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Implement X”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze this codebase for [feature/bug].
Return:
- affected files
- existing patterns to follow
- risks (SEO, hydration, bundle)

Do not edit yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On this portfolio, that's how a full audit found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a 404 typo (&lt;code&gt;wf-ull&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;duplicate tsparticles IDs&lt;/li&gt;
&lt;li&gt;a 400-line client-only projects page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before a single line changed.&lt;/p&gt;

&lt;p&gt;Reading first prevents the classic AI failure mode:&lt;/p&gt;

&lt;p&gt;A clean-looking patch that ignores your conventions.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. One bounded implementation pass
&lt;/h3&gt;

&lt;p&gt;Second message:&lt;/p&gt;

&lt;p&gt;Implement with constraints.&lt;/p&gt;

&lt;p&gt;I always include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Match existing naming and folder structure&lt;/li&gt;
&lt;li&gt;Minimal diff only&lt;/li&gt;
&lt;li&gt;Preserve metadata and structured data&lt;/li&gt;
&lt;li&gt;Run build after implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;boilerplate&lt;/li&gt;
&lt;li&gt;data extraction&lt;/li&gt;
&lt;li&gt;repetitive refactors&lt;/li&gt;
&lt;li&gt;wiring boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I keep my attention for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UX decisions&lt;/li&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;API design&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. My review gate (non-negotiable)
&lt;/h3&gt;

&lt;p&gt;I read every changed file.&lt;/p&gt;

&lt;p&gt;Not skim.&lt;br&gt;
Read.&lt;/p&gt;

&lt;p&gt;Checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Correctness&lt;/strong&gt; — does it compile?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boundaries&lt;/strong&gt; — are client/server components clean?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — no secrets or unsafe rendering?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO&lt;/strong&gt; — canonical tags, metadata, crawlability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taste&lt;/strong&gt; — would I merge this from a junior dev?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If something fails:&lt;/p&gt;

&lt;p&gt;I don't blindly patch forward.&lt;/p&gt;

&lt;p&gt;I tell the agent exactly what failed.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You used index keys in a sorted list. Use stable IDs instead.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Small corrections improve future output dramatically.&lt;/p&gt;


&lt;h2&gt;
  
  
  React Rules That Keep AI Output Production-Grade
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Server first, client leaves
&lt;/h3&gt;

&lt;p&gt;New pages default to server components.&lt;/p&gt;

&lt;p&gt;Only isolate client components when state/effects/events require them.&lt;/p&gt;

&lt;p&gt;This keeps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bundle sizes smaller&lt;/li&gt;
&lt;li&gt;hydration cleaner&lt;/li&gt;
&lt;li&gt;SEO stronger&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Point at patterns, not abstractions
&lt;/h3&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Follow best practices”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Follow the same structure as app/blog/example/page.tsx:
- metadata export
- structured data
- prose layout
- existing animation wrappers

Do not invent a new layout system.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reference files beat vague instructions every time.&lt;/p&gt;




&lt;h3&gt;
  
  
  Performance prompts I reuse
&lt;/h3&gt;

&lt;p&gt;I constantly reuse prompts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Defer anything hurting LCP”&lt;/li&gt;
&lt;li&gt;“Use next/image”&lt;/li&gt;
&lt;li&gt;“Avoid unnecessary client components”&lt;/li&gt;
&lt;li&gt;“Compare build output after refactor”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI implements the checklist.&lt;/p&gt;

&lt;p&gt;I verify Lighthouse and real-device feel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Example — Full Portfolio Audit in One Session
&lt;/h2&gt;

&lt;p&gt;One Agent session found and fixed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;404 typo&lt;/td&gt;
&lt;td&gt;wf-ull → w-full&lt;/td&gt;
&lt;td&gt;Broken layout fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Projects page all-client&lt;/td&gt;
&lt;td&gt;Server page + data modules&lt;/td&gt;
&lt;td&gt;Smaller JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate particle IDs&lt;/td&gt;
&lt;td&gt;Unique IDs&lt;/td&gt;
&lt;td&gt;Runtime stability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Theme toggle flash&lt;/td&gt;
&lt;td&gt;Wait for mount&lt;/td&gt;
&lt;td&gt;Better hydration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unused deps&lt;/td&gt;
&lt;td&gt;Cleanup&lt;/td&gt;
&lt;td&gt;Cleaner installs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Manual estimate:&lt;/p&gt;

&lt;p&gt;Half a day.&lt;/p&gt;

&lt;p&gt;With Agent:&lt;/p&gt;

&lt;p&gt;~45 minutes including review.&lt;/p&gt;

&lt;p&gt;That's the real 3× gain.&lt;/p&gt;

&lt;p&gt;Not “AI built my app.”&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI removed friction.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  When AI Slows You Down
&lt;/h2&gt;

&lt;p&gt;I stop the agent when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it loops repeatedly&lt;/li&gt;
&lt;li&gt;it over-engineers&lt;/li&gt;
&lt;li&gt;it hallucinates APIs&lt;/li&gt;
&lt;li&gt;the task needs product taste&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is incredible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structure&lt;/li&gt;
&lt;li&gt;speed&lt;/li&gt;
&lt;li&gt;repetition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But judgment still matters.&lt;/p&gt;

&lt;p&gt;A lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cursor Setup I Actually Use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Small &lt;code&gt;.cursor/rules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;One logical commit per task&lt;/li&gt;
&lt;li&gt;Sonnet for daily work&lt;/li&gt;
&lt;li&gt;Opus for deep debugging/refactors&lt;/li&gt;
&lt;li&gt;Let Agent run build/lint in terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't maintain 50 prompts.&lt;/p&gt;

&lt;p&gt;I maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;constraints&lt;/li&gt;
&lt;li&gt;reference files&lt;/li&gt;
&lt;li&gt;conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That scales much better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the “3× Faster” Comes From
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;With Cursor + Claude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRUD screen&lt;/td&gt;
&lt;td&gt;4–6 hrs&lt;/td&gt;
&lt;td&gt;1.5–2 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server component refactor&lt;/td&gt;
&lt;td&gt;3–4 hrs&lt;/td&gt;
&lt;td&gt;~1 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codebase audit&lt;/td&gt;
&lt;td&gt;Full day&lt;/td&gt;
&lt;td&gt;1–2 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog draft&lt;/td&gt;
&lt;td&gt;5–6 hrs&lt;/td&gt;
&lt;td&gt;~2 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gains are biggest on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;audits&lt;/li&gt;
&lt;li&gt;migrations&lt;/li&gt;
&lt;li&gt;repetitive architecture work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not on deep product thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR — Copy My Workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Write clear scope + constraints&lt;/li&gt;
&lt;li&gt;First pass = analysis only&lt;/li&gt;
&lt;li&gt;Second pass = implementation&lt;/li&gt;
&lt;li&gt;Review every changed file&lt;/li&gt;
&lt;li&gt;Reference existing repo patterns&lt;/li&gt;
&lt;li&gt;Narrow scope when Agent loops&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;&lt;strong&gt;Cursor AI React&lt;/strong&gt; development isn't about replacing engineers.&lt;/p&gt;

&lt;p&gt;It's about removing the tax on work that was never the hard part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;renaming files&lt;/li&gt;
&lt;li&gt;fixing repetitive bugs&lt;/li&gt;
&lt;li&gt;extracting modules&lt;/li&gt;
&lt;li&gt;boilerplate implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;review&lt;/li&gt;
&lt;li&gt;production decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow above is simply how I ship faster without shipping garbage.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☕ If This Helped You
&lt;/h2&gt;

&lt;p&gt;I publish free tutorials and write-ups like this regularly.&lt;/p&gt;

&lt;p&gt;If this article saved you time:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Buy me a coffee:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;https://buymeacoffee.com/safdarali&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Subscribe to my YouTube channel (free):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;https://www.youtube.com/@safdarali_?sub_confirmation=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React tutorials&lt;/li&gt;
&lt;li&gt;Next.js optimization&lt;/li&gt;
&lt;li&gt;AI workflows&lt;/li&gt;
&lt;li&gt;frontend engineering deep dives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your support genuinely helps me keep publishing more content like this 🚀&lt;/p&gt;

</description>
      <category>react</category>
      <category>ai</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>React Server Components vs Client Components — When to Use Which</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Wed, 20 May 2026 06:31:52 +0000</pubDate>
      <link>https://dev.to/safdarali25/react-server-components-vs-client-components-when-to-use-which-58kj</link>
      <guid>https://dev.to/safdarali25/react-server-components-vs-client-components-when-to-use-which-58kj</guid>
      <description>&lt;p&gt;I'm &lt;a href="https://safdarali.in/about" rel="noopener noreferrer"&gt;Safdar Ali&lt;/a&gt;. Roughly three quarters of professional React developers now ship on Next.js — which means most of us are living inside the App Router and its default: &lt;strong&gt;React Server Components (RSC)&lt;/strong&gt;. The docs explain what server and client components &lt;em&gt;are&lt;/em&gt;. They rarely tell you &lt;em&gt;which file gets which directive on Tuesday afternoon&lt;/em&gt; when a PM wants a filterable table by Friday.&lt;/p&gt;

&lt;p&gt;In production, I've split dashboards, onboarding flows, and marketing shells between server and client boundaries more times than I can count. The pattern that saved us wasn't memorizing rules — it was a short decision tree, small client islands, and refusing to put &lt;code&gt;"use client"&lt;/code&gt; on a parent just because one child needed a click handler. This guide is that tree, three real patterns from our repo, mistakes we actually made, and the bundle numbers that convinced our team to stop debating theory.&lt;/p&gt;




&lt;h2&gt;
  
  
  The mental model in sixty seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Server components&lt;/strong&gt; run once on the server (or at build time). They can await databases and secrets. They render to HTML and a lightweight serializable payload — not a React bundle the browser has to execute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client components&lt;/strong&gt; are the React you already know: they ship JavaScript, hydrate, and can use &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, browser APIs, and event listeners.&lt;/p&gt;

&lt;p&gt;In the App Router, every file is a server component &lt;em&gt;until&lt;/em&gt; you add &lt;code&gt;"use client"&lt;/code&gt; at the top. That default is the whole game: &lt;strong&gt;stay server until the UI proves it needs the client.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Decision flowchart — server or client?
&lt;/h2&gt;

&lt;p&gt;Walk this top to bottom for any component. If you reach "Server Component," stop — do not add &lt;code&gt;"use client"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START: New component for App Router
│
├─ Needs useState, useEffect, useReducer, useContext?
│     └─ YES → Client Component ("use client")
│
├─ Needs onClick, onChange, onSubmit, or other DOM events?
│     └─ YES → Client Component
│
├─ Needs window, document, localStorage, or browser-only APIs?
│     └─ YES → Client Component
│
├─ Uses a library that calls hooks internally (charts, maps, some UI kits)?
│     └─ YES → Client Component (or wrap in a thin client leaf)
│
├─ Only fetches data, renders markup, links, static images?
│     └─ YES → Server Component (default — no directive needed)
│
└─ Unsure?
      → Start as Server Component.
      → Extract the interactive leaf to a small client file later.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expensive mistake is the reverse: marking a layout or page &lt;code&gt;"use client"&lt;/code&gt; because a sidebar toggle lives somewhere underneath. Client boundaries are contagious downward — everything imported into a client file becomes part of the client graph unless you pass server children as &lt;code&gt;children&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three real patterns from production
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1 — Read-only dashboard shell (server)
&lt;/h3&gt;

&lt;p&gt;On one dashboard I shipped, the workspace overview showed org name, plan tier, last-sync time, and a grid of read-only metric cards. No interactivity on first paint — just data from our API. This belongs entirely on the server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/dashboard/page.tsx — Server Component (no directive)&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;getWorkspace&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;@/lib/api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DashboardPage&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;workspace&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;getWorkspace&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// secrets + DB stay on server&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Plan: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MetricsGrid&lt;/span&gt; &lt;span class="na"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero bytes of component JavaScript for this tree in the browser bundle. Users see real numbers in the first HTML response — not a spinner while &lt;code&gt;useEffect&lt;/code&gt; fires.&lt;/p&gt;




&lt;h3&gt;
  
  
  Pattern 2 — Filterable table (client island)
&lt;/h3&gt;

&lt;p&gt;The same dashboard needed a searchable, sortable project table. That requires local state and keyboard events — client only. We kept the page server-side and imported one client leaf.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/ProjectTable.tsx&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&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;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProjectTable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Project&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="kd"&gt;const&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="nx"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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;filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&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="nx"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&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;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&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="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;projects&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&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="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search…"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* rows from filtered */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// app/dashboard/projects/page.tsx — still a Server Component&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;ProjectsPage&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;projects&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;getProjects&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProjectTable&lt;/span&gt; &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;projects&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Data crosses the boundary as serializable props. The server fetches; the client filters. This is the pattern I reach for most often.&lt;/p&gt;




&lt;h3&gt;
  
  
  Pattern 3 — Modal inside a server layout (composition)
&lt;/h3&gt;

&lt;p&gt;A marketing site I worked on used a server layout with static copy, but the header had a mobile menu and a "Book demo" modal. We split: server layout wraps a client header; the modal is a separate client file so the rest of the page never hydrates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/(marketing)/layout.tsx — Server Component&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;SiteHeader&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;@/components/SiteHeader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MarketingLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&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="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SiteHeader&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// components/SiteHeader.tsx&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&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;react&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;DemoModal&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;./DemoModal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SiteHeader&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setOpen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setOpen&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="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Book demo
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;DemoModal&lt;/span&gt; &lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onClose&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setOpen&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="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only &lt;code&gt;SiteHeader&lt;/code&gt; and &lt;code&gt;DemoModal&lt;/code&gt; pay hydration cost — not the hero, footer, or case-study sections below.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common mistakes I've seen in production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. "use client" on the root layout.&lt;/strong&gt;&lt;br&gt;
One engineer added it for a theme toggle. Every page became a client entry. We moved the toggle to &lt;code&gt;ThemeProvider.tsx&lt;/code&gt; and kept &lt;code&gt;layout.tsx&lt;/code&gt; server-only. First-route JS dropped ~90KB parsed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fetching in useEffect what the server could fetch once.&lt;/strong&gt;&lt;br&gt;
Settings pages showed empty labels, then populated — bad UX and duplicate API load. Moving fetches into async server components fixed both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Importing server-only modules into client files.&lt;/strong&gt;&lt;br&gt;
Accidentally pulling &lt;code&gt;fs&lt;/code&gt; or env secrets into a client bundle fails the build (good) or leaks patterns (bad). Keep data access in &lt;code&gt;lib/&lt;/code&gt; server helpers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Giant client components.&lt;/strong&gt;&lt;br&gt;
A 400-line &lt;code&gt;Dashboard.tsx&lt;/code&gt; with one chart. Splitting static chrome back to the server cut Time to Interactive noticeably on mid-tier Android.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bundle size — before vs after boundaries
&lt;/h2&gt;

&lt;p&gt;I measured one dashboard route with &lt;code&gt;@next/bundle-analyzer&lt;/code&gt; after refactoring a page that had been fully client-rendered. Same features; different boundaries.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle (first load)&lt;/th&gt;
&lt;th&gt;Before (all client)&lt;/th&gt;
&lt;th&gt;After (RSC + islands)&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Route JS (parsed)&lt;/td&gt;
&lt;td&gt;412 KB&lt;/td&gt;
&lt;td&gt;255 KB&lt;/td&gt;
&lt;td&gt;−38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared vendor chunk&lt;/td&gt;
&lt;td&gt;198 KB&lt;/td&gt;
&lt;td&gt;198 KB&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hydrated component count&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;−75%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vendor stayed flat; the win was not shipping render logic for static UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance impact at a glance
&lt;/h2&gt;

&lt;p&gt;Lab numbers from the same refactor (Lighthouse mobile, throttled 4G, median of three runs):&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;All-client page&lt;/th&gt;
&lt;th&gt;RSC-first page&lt;/th&gt;
&lt;th&gt;Why it moved&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;3.4s&lt;/td&gt;
&lt;td&gt;2.0s&lt;/td&gt;
&lt;td&gt;HTML includes content; less JS before paint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTI&lt;/td&gt;
&lt;td&gt;5.2s&lt;/td&gt;
&lt;td&gt;3.1s&lt;/td&gt;
&lt;td&gt;Fewer components hydrating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse Performance&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;Smaller main-thread work on load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Contentful Paint&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;td&gt;1.3s&lt;/td&gt;
&lt;td&gt;Server HTML streams earlier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;RSC is not magic — slow APIs and unoptimized images still hurt. But choosing the right boundary is often the highest-leverage architectural decision on a Next.js app.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Default every new file to &lt;strong&gt;server&lt;/strong&gt; — no directive&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;"use client"&lt;/strong&gt; only on leaves that need state, effects, or events&lt;/li&gt;
&lt;li&gt;Fetch on the server; pass serializable props into client islands&lt;/li&gt;
&lt;li&gt;Never put &lt;strong&gt;"use client"&lt;/strong&gt; on root layout unless you have no alternative&lt;/li&gt;
&lt;li&gt;Run the bundle analyzer after any large feature — boundaries are invisible until you measure&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;The debate over server vs client components ends quickly in production: server for data and markup, client for interactivity, and a hard rule against lazy &lt;code&gt;"use client"&lt;/code&gt; on parents.&lt;/p&gt;

&lt;p&gt;For the full performance stack — images, fonts, caching, and RSC together — read my case study:&lt;br&gt;
👉 &lt;a href="https://safdarali.in/blog/nextjs-performance-60-percent" rel="noopener noreferrer"&gt;How I Cut Load Time by 60% Using Next.js App Router&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions or a Lighthouse export to review?&lt;br&gt;
👉 &lt;a href="https://safdarali.in/contact" rel="noopener noreferrer"&gt;safdarali.in/contact&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More about how I work: &lt;a href="https://safdarali.in/about" rel="noopener noreferrer"&gt;safdarali.in/about&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Projects and case studies: &lt;a href="https://safdarali.in/projects" rel="noopener noreferrer"&gt;safdarali.in/projects&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;YouTube tutorials: &lt;a href="https://youtube.com/@safdarali_" rel="noopener noreferrer"&gt;youtube.com/@safdarali_&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Talk is cheap. Show me the code. — Linus Torvalds&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Cut Load Time by 60% Using Next.js App Router</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Tue, 19 May 2026 08:06:35 +0000</pubDate>
      <link>https://dev.to/safdarali25/how-i-cut-load-time-by-60-using-nextjs-app-router-4od7</link>
      <guid>https://dev.to/safdarali25/how-i-cut-load-time-by-60-using-nextjs-app-router-4od7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://safdarali.in/blog/nextjs-performance-60-percent" rel="noopener noreferrer"&gt;safdarali.in&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm Safdar Ali. In early 2024 I was the frontend lead on a client marketing site at &lt;strong&gt;Adsclique Media&lt;/strong&gt;, a US digital agency. The stack was Next.js, but the site behaved like a 2019 SPA: heavy client bundles, hero images served as full-resolution PNGs, and fonts pulled in through &lt;code&gt;@import&lt;/code&gt; in global CSS. Lighthouse on production hovered around the mid-50s. Nobody cared until the client opened the site on hotel Wi-Fi before a board review and asked, bluntly, why the homepage took five seconds to become usable.&lt;/p&gt;

&lt;p&gt;That message landed in our Slack with a screen recording attached. My PM didn't want a roadmap — they wanted numbers by Friday. I had three days to move Core Web Vitals without rewriting the product. This post is the exact sequence I used: what was slow, what I changed in the repo, and the before/after metrics. No generic "use a CDN" advice. Just the diffs that mattered.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem — What Was Actually Slow
&lt;/h2&gt;

&lt;p&gt;I started with a reproducible baseline, not vibes. I ran Lighthouse in an incognito Chrome window against the production URL (throttled 4G, Moto G Power emulation) and saved the JSON. Then I opened DevTools → Performance, recorded a cold load with cache disabled, and exported the trace. The numbers were consistent across three runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Largest Contentful Paint (LCP):&lt;/strong&gt; 4.2s — the hero image and a client-side chart both competed for "largest" depending on run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cumulative Layout Shift (CLS):&lt;/strong&gt; 0.18 — web fonts swapping after paint and images without dimensions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time to Interactive (TTI):&lt;/strong&gt; 6.1s — too much JavaScript hydrating before the page felt ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The waterfall told the story. A 180KB vendor chunk downloaded before first paint because the root layout was a client component tree. Two Google Font families loaded via CSS &lt;code&gt;@import&lt;/code&gt;, each blocking render for ~400ms. The hero was a 2.1MB PNG with no &lt;code&gt;width&lt;/code&gt; / &lt;code&gt;height&lt;/code&gt;, so the layout jumped when it arrived. API calls for case-study cards fired in &lt;code&gt;useEffect&lt;/code&gt;, meaning users saw skeletons, then content, then more layout shift. Repeat visits were almost as slow as first visits because static assets had weak cache headers. The site wasn't "broken" — it was accidentally optimized for developer convenience, not user latency.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack Before My Changes
&lt;/h2&gt;

&lt;p&gt;The project shipped on &lt;strong&gt;Next.js 13 Pages Router&lt;/strong&gt;. Almost every page used &lt;code&gt;getServerSideProps&lt;/code&gt; or client fetching, but the UI layer was overwhelmingly client components: marketing sections, carousels, modals, analytics wrappers. &lt;code&gt;_app.tsx&lt;/code&gt; imported Framer Motion, a chart library, and a toast system globally — so every route paid for features only the homepage needed.&lt;/p&gt;

&lt;p&gt;Images were plain &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags pointing at S3 URLs. No WebP, no responsive &lt;code&gt;srcSet&lt;/code&gt;, no lazy loading below the fold. Typography used Inter and a display face via &lt;code&gt;@import url(...)&lt;/code&gt; inside &lt;code&gt;globals.css&lt;/code&gt;. There was no intentional code splitting beyond Next's defaults — and because so many entry components were marked &lt;code&gt;"use client"&lt;/code&gt;, the default boundaries didn't help much.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Changed — The Exact Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Migrated from Pages Router to App Router
&lt;/h3&gt;

&lt;p&gt;I didn't rewrite every screen at once. I created &lt;code&gt;app/&lt;/code&gt; alongside &lt;code&gt;pages/&lt;/code&gt;, moved the marketing homepage and shared layout first, and left admin routes on Pages until the end. The win was &lt;strong&gt;React Server Components (RSC)&lt;/strong&gt;: read-only sections render on the server and ship zero bytes of component JavaScript to the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/page.tsx — server component (default)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;HomePage&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;stats&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;getPublicStats&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// runs on server only&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Hero&lt;/span&gt; &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatsRow&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;stats&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// components/NewsletterForm.tsx&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;NewsletterForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// only this island hydrates&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the split, the main route's client bundle dropped by roughly &lt;strong&gt;35%&lt;/strong&gt; (340KB → 220KB parsed on the wire).&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Replaced all img tags with next/image
&lt;/h3&gt;

&lt;p&gt;Every marketing image went through &lt;code&gt;next/image&lt;/code&gt;. I set explicit &lt;code&gt;width&lt;/code&gt; / &lt;code&gt;height&lt;/code&gt; so the browser reserved space before decode. Below-the-fold images used default lazy loading; the hero got &lt;code&gt;priority&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.example.com/hero.png"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Campaign hero"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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;next/image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/hero.webp"&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Campaign hero"&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;630&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;priority&lt;/span&gt;
  &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 768px) 100vw, 1200px"&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;Next served WebP/AVIF variants automatically. &lt;strong&gt;LCP fell from 4.2s to 2.1s&lt;/strong&gt; on the first deploy — the single biggest visual win.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Used next/font instead of &lt;a class="mentioned-user" href="https://dev.to/import"&gt;@import&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I removed font &lt;code&gt;@import&lt;/code&gt; from CSS and loaded Inter through &lt;code&gt;next/font/google&lt;/code&gt; in the root layout. Fonts self-host at build time, use &lt;code&gt;display: swap&lt;/code&gt;, and apply via a CSS variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx&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;Inter&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;next/font/google&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;inter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Inter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;subsets&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;latin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;swap&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--font-inter&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variable&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CLS dropped from 0.18 to 0.04.&lt;/strong&gt; In hindsight this was the fastest fix per line of code — I should have done it on day one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Converted data-fetching to Server Components
&lt;/h3&gt;

&lt;p&gt;Case studies and testimonial lists previously fetched in client effects. I moved them to async server components with &lt;code&gt;fetch()&lt;/code&gt; in the RSC layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/work/page.tsx&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;CaseStudyGrid&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;res&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com/case-studies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;revalidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&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;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users received HTML with real content on first paint — no spinner parade.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Added proper caching headers via next.config.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.mjs&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/:all*(svg|jpg|jpeg|png|webp|avif|woff2)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public, max-age=31536000, immutable&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;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;After Vercel's CDN picked this up, repeat views felt near-instant.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results — Before vs After
&lt;/h2&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;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&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;4.2s&lt;/td&gt;
&lt;td&gt;1.7s&lt;/td&gt;
&lt;td&gt;−60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0.18&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;td&gt;−78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTI&lt;/td&gt;
&lt;td&gt;6.1s&lt;/td&gt;
&lt;td&gt;2.4s&lt;/td&gt;
&lt;td&gt;−61%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse Performance&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;+68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle size (main route)&lt;/td&gt;
&lt;td&gt;340kb&lt;/td&gt;
&lt;td&gt;187kb&lt;/td&gt;
&lt;td&gt;−45%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The client cared about LCP and the green Lighthouse badge. We kept monitoring in Vercel Analytics for two weeks — p75 LCP stayed under 2.5s on 4G.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;I would ship &lt;strong&gt;next/font first&lt;/strong&gt; — it took under an hour and fixed CLS immediately. I spent day one on App Router folder structure, which was necessary but invisible to the client until day three.&lt;/p&gt;

&lt;p&gt;Today I'd use &lt;strong&gt;Turbopack&lt;/strong&gt; in Next.js 15 for local dev. For diagnosing the waterfall, I leaned on Chrome DevTools plus &lt;strong&gt;Cursor and Claude&lt;/strong&gt; to spot render-blocking chains I'd missed. AI didn't write the config for me — it helped me ask better questions about the trace.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR — The 5-Minute Checklist
&lt;/h2&gt;

&lt;p&gt;Ranked by impact ÷ effort:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Swap &lt;a class="mentioned-user" href="https://dev.to/import"&gt;@import&lt;/a&gt; fonts for next/font&lt;/strong&gt; — ~1 hour, huge CLS win&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replace hero images with next/image + priority&lt;/strong&gt; — often halves LCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push read-only sections to Server Components&lt;/strong&gt; — cut client JS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move data fetching to the server&lt;/strong&gt; with &lt;code&gt;fetch(..., { next: { revalidate } })&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add long-cache headers for static assets&lt;/strong&gt; in &lt;code&gt;next.config&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Performance work is measurable persuasion. I teach this workflow on my YouTube channel (70+ tutorials on React, Next.js, and shipping real UI).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Portfolio: &lt;a href="https://safdarali.in" rel="noopener noreferrer"&gt;safdarali.in&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 Background: &lt;a href="https://safdarali.in/about" rel="noopener noreferrer"&gt;safdarali.in/about&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🛠 More builds: &lt;a href="https://safdarali.in/projects" rel="noopener noreferrer"&gt;safdarali.in/projects&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📩 Contact: &lt;a href="https://safdarali.in/contact" rel="noopener noreferrer"&gt;safdarali.in/contact&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your Next.js app is still serving 4-second LCP on marketing pages, reach out — happy to skim a Lighthouse export and tell you which of these five levers fits your repo first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Talk is cheap. Show me the code. — Linus Torvalds&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>Safdar Ali — Senior React &amp; Next.js Developer, Bengaluru India</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sat, 16 May 2026 18:40:54 +0000</pubDate>
      <link>https://dev.to/safdarali25/safdar-ali-senior-react-nextjs-developer-bengaluru-india-2lli</link>
      <guid>https://dev.to/safdarali25/safdar-ali-senior-react-nextjs-developer-bengaluru-india-2lli</guid>
      <description>&lt;p&gt;I'm Safdar Ali, a Senior Frontend Engineer based in &lt;br&gt;
Bengaluru, India. Currently building product UI at &lt;br&gt;
Cube — a Sequoia Capital-backed AI startup helping &lt;br&gt;
SMBs automate marketing with AI.&lt;/p&gt;

&lt;p&gt;I've been shipping production interfaces with React &lt;br&gt;
and Next.js for 4+ years — across startups, agencies, &lt;br&gt;
and US-based clients. I also run a YouTube channel &lt;br&gt;
with 70+ tutorials where I break down real engineering &lt;br&gt;
problems, not toy examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Core:&lt;/strong&gt; Next.js (App Router) · React 19 · TypeScript &lt;br&gt;
(Strict Mode) · JavaScript (ES6+)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS · ShadCN UI · Framer Motion · MUI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State:&lt;/strong&gt; Redux Toolkit · Zustand&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend/APIs:&lt;/strong&gt; Node.js · REST · GraphQL · Prisma · PostgreSQL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Git · Vercel · Docker · AWS · CI/CD · Jira&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Tools I use daily:&lt;/strong&gt; Cursor · Claude · v0 · &lt;br&gt;
GitHub Copilot — part of my workflow since 2024&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; Atomic Design · Micro-frontends · &lt;br&gt;
Design Systems · WCAG 2.2 Accessibility&lt;/p&gt;

&lt;h2&gt;
  
  
  Professional Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cube (Sequoia Capital-backed)&lt;/strong&gt; — Frontend Engineer&lt;br&gt;
Feb 2025 – Present · Bengaluru, India&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecting AI-native UIs with Next.js and RSC&lt;/li&gt;
&lt;li&gt;Led TypeScript-first migration reducing runtime 
errors by 40%&lt;/li&gt;
&lt;li&gt;Implemented WCAG 2.2 accessibility across platform&lt;/li&gt;
&lt;li&gt;Boosted support response rates by 25%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Adsclique Media&lt;/strong&gt; — Senior Frontend Developer&lt;br&gt;
Jun 2023 – Feb 2025 · Remote (Florida, USA)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Achieved 60% load time reduction with Next.js 
performance optimisation&lt;/li&gt;
&lt;li&gt;Drove 20% traffic growth through UI/UX revamp&lt;/li&gt;
&lt;li&gt;Converted 25+ designs into pixel-perfect, 
API-integrated web apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sujanix Private Limited&lt;/strong&gt; — Software Engineer&lt;br&gt;
Nov 2022 – May 2023 · Bengaluru&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built fintech app scaling to 5,000+ monthly active users&lt;/li&gt;
&lt;li&gt;Containerised with Docker, reducing deploy latency 30%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech Mahindra&lt;/strong&gt; — Associate&lt;br&gt;
Jun 2021 – Nov 2022 · Remote&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Flipkart production systems&lt;/li&gt;
&lt;li&gt;7 performance awards including 2x Associate of the Month&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Achievements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚡ 60% load time reduction in production at Adsclique&lt;/li&gt;
&lt;li&gt;🎥 70+ YouTube tutorials on React, Next.js, TypeScript&lt;/li&gt;
&lt;li&gt;🛠 30+ professional projects shipped across 4 years&lt;/li&gt;
&lt;li&gt;♿ WCAG 2.2 accessibility implemented at production scale&lt;/li&gt;
&lt;li&gt;📉 40% runtime error reduction via TypeScript migration&lt;/li&gt;
&lt;li&gt;🏆 5,000+ MAU fintech app built from scratch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Featured Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;M Salon Beverly Hills&lt;/strong&gt; — Custom WordPress theme for &lt;br&gt;
a premium Beverly Hills salon. Site credited in client's &lt;br&gt;
physical marketing. msalonbeverlyhills.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sommet Beauty&lt;/strong&gt; — Performance-tuned Shopify build for &lt;br&gt;
a luxury beauty brand. Achieved 90+ PageSpeed score.&lt;br&gt;
sommetbeauty.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WP Standard&lt;/strong&gt; — End-to-end Shopify build for a leather &lt;br&gt;
goods brand. Storytelling-first mobile UX.&lt;br&gt;
wpstandard.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalable Design System&lt;/strong&gt; — 40+ accessible React and &lt;br&gt;
Storybook components, open source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Education
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;B.E. Computer Science &amp;amp; Engineering&lt;/strong&gt;&lt;br&gt;
Visvesvaraya Technological University (VTU)&lt;br&gt;
CGPA: 8.6/10&lt;/p&gt;

&lt;h2&gt;
  
  
  YouTube Channel
&lt;/h2&gt;

&lt;p&gt;I publish weekly tutorials at youtube.com/@safdarali_ &lt;br&gt;
covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React and Next.js development&lt;/li&gt;
&lt;li&gt;TypeScript best practices
&lt;/li&gt;
&lt;li&gt;AI-assisted development workflows (Cursor, Claude, v0)&lt;/li&gt;
&lt;li&gt;Frontend performance optimisation&lt;/li&gt;
&lt;li&gt;Career advice for developers in India&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're learning React or Next.js — subscribe. &lt;br&gt;
I break down real problems, not hello-world examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Currently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;💼 Open to senior frontend roles in Bengaluru or remote&lt;/li&gt;
&lt;li&gt;🤝 Available for freelance projects and collaborations&lt;/li&gt;
&lt;li&gt;📧 Reach me at safdarali.in/contact&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Find Me Everywhere
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Portfolio: &lt;a href="https://safdarali.in" rel="noopener noreferrer"&gt;https://safdarali.in&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href="https://github.com/Safdar-Ali-India" rel="noopener noreferrer"&gt;https://github.com/Safdar-Ali-India&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 YouTube: &lt;a href="https://youtube.com/@safdarali_" rel="noopener noreferrer"&gt;https://youtube.com/@safdarali_&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💼 LinkedIn: &lt;a href="https://linkedin.com/in/safdarali25" rel="noopener noreferrer"&gt;https://linkedin.com/in/safdarali25&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐦 Twitter: &lt;a href="https://twitter.com/safdarali___" rel="noopener noreferrer"&gt;https://twitter.com/safdarali___&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 Medium: &lt;a href="https://medium.com/@safdaralii" rel="noopener noreferrer"&gt;https://medium.com/@safdaralii&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📷 Instagram: &lt;a href="https://instagram.com/codewithsafdar" rel="noopener noreferrer"&gt;https://instagram.com/codewithsafdar&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If potential collaborator — I'd love to connect. Drop me a message &lt;br&gt;
at safdarali.in or find me on LinkedIn.&lt;/p&gt;

&lt;p&gt;If you're a developer learning React or Next.js — &lt;br&gt;
check the YouTube channel. New tutorials every week.&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Is ChatGPT / OpenAi down?</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Fri, 08 May 2026 20:57:30 +0000</pubDate>
      <link>https://dev.to/safdarali25/is-ai-down-today-full-status-report-for-chatgpt-claude-gemini-more-1i4g</link>
      <guid>https://dev.to/safdarali25/is-ai-down-today-full-status-report-for-chatgpt-claude-gemini-more-1i4g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🟢 Short Answer:&lt;/strong&gt; Most major AI services are &lt;strong&gt;operational&lt;/strong&gt; as of May 9, 2026. Claude had a significant outage on May 8 that is now &lt;strong&gt;fully resolved&lt;/strong&gt;. Google Gemini / AI Studio still shows &lt;strong&gt;intermittent slow responses&lt;/strong&gt;. ChatGPT, Grok, and Character.ai are all green.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚡ Quick Status Dashboard — May 9, 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI Service&lt;/th&gt;
&lt;th&gt;Status Today&lt;/th&gt;
&lt;th&gt;Last Incident&lt;/th&gt;
&lt;th&gt;Resolved?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ChatGPT (OpenAI)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Operational&lt;/td&gt;
&lt;td&gt;May 8 — Transcription failures&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude (Anthropic)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Operational&lt;/td&gt;
&lt;td&gt;May 8 — File operation errors&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini / AI Studio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Intermittent&lt;/td&gt;
&lt;td&gt;May 7–8 — Hanging requests&lt;/td&gt;
&lt;td&gt;⚠️ Ongoing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grok (xAI)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Operational&lt;/td&gt;
&lt;td&gt;No recent incidents&lt;/td&gt;
&lt;td&gt;✅ N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Character.ai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Mostly Stable&lt;/td&gt;
&lt;td&gt;Occasional user spikes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔍 Why Is AI Down So Often in 2026?
&lt;/h2&gt;

&lt;p&gt;Before diving into each platform, here's context: the week of May 4–8, 2026 was one of the most incident-heavy weeks across AI platforms in recent months. Multiple services — ChatGPT, Claude, and Google — all reported outages within the same 5-day window.&lt;/p&gt;

&lt;p&gt;OpenAI's infrastructure is under heavy scaling pressure from surging demand for its large language models, with historical patterns showing 2–3 monthly incidents — and vulnerabilities exposed most visibly during the major April 20 global downtime.&lt;/p&gt;

&lt;p&gt;Claude has logged 208 incidents since October 2025, with incidents typically resolving within approximately 204 minutes.&lt;/p&gt;

&lt;p&gt;AI outages are increasingly common, not because the technology is unstable, but because &lt;strong&gt;hundreds of millions of users&lt;/strong&gt; are hammering these systems simultaneously. Understanding &lt;em&gt;why&lt;/em&gt; and &lt;em&gt;what to do&lt;/em&gt; is more useful than just knowing &lt;em&gt;if&lt;/em&gt; something is down.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 🤖 Is ChatGPT Down Today? — OpenAI Status
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Current Status: OPERATIONAL
&lt;/h3&gt;

&lt;p&gt;OpenAI's official status page shows the service is fully operational, with no issues currently affecting their systems. Over the past 90 days, their 12 core components have maintained approximately 99.83% uptime.&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Recent Incident History (May 2026)
&lt;/h3&gt;

&lt;p&gt;The most recent incidents — all now resolved — include elevated transcription failures affecting ChatGPT and Codex on May 8, an increased error rate with image generation in the API on May 7, partial disruption of ChatGPT Workspace Connector Write Actions on May 5, and an issue affecting some website pages on May 4.&lt;/p&gt;

&lt;p&gt;The most significant recent event was the &lt;strong&gt;April 20 global outage&lt;/strong&gt;. At peak, more than 8,700 users reported issues in the UK and over 1,900 in the US. OpenAI confirmed a "partial outage" for at least 90 minutes — affecting login, conversations, voice mode, and access to ChatGPT, Codex, and the API Platform. A fix was deployed and recovery was confirmed by 12:48 PM ET.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Monitor ChatGPT Status Live
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://status.openai.com" rel="noopener noreferrer"&gt;status.openai.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. 🧠 Is Claude Down Today? — Anthropic Status
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Current Status: OPERATIONAL (Resolved)
&lt;/h3&gt;

&lt;p&gt;Claude's most impactful outage of the week hit on &lt;strong&gt;Friday, May 8&lt;/strong&gt;, making headlines across tech media.&lt;/p&gt;

&lt;p&gt;Over 2,000 users reported problems on Downdetector as of 7:48 a.m. PT, with most reporting Claude Chat issues specifically.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏱️ Complete May 8 Incident Timeline
&lt;/h3&gt;

&lt;p&gt;The official Claude status page logged the sequence as follows: investigation began at 09:49 UTC; by 10:22 UTC, remaining impact was narrowed to Claude Opus 4.1 and Fast Mode for Claude Opus 4.6; cause was identified by 11:32 UTC with a fix rolling out; monitoring began at 11:40 UTC; and the incident was fully resolved by 14:12 UTC.&lt;/p&gt;

&lt;p&gt;The incident title was &lt;strong&gt;"Elevated Errors on File Operations"&lt;/strong&gt; — meaning users were primarily blocked from uploading images, PNG files, and documents.&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Full Week Incident Log (May 4–8)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;May 4&lt;/strong&gt; — Elevated errors on Claude Opus 4.5, Sonnet 4.5, and Opus 4.7 (all resolved)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;May 6&lt;/strong&gt; — Elevated errors across multiple models (resolved)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;May 7&lt;/strong&gt; — GitHub IP address change broke Claude Code remote sessions and GitHub Enterprise plugin syncing (resolved)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;May 8&lt;/strong&gt; — File operation errors + 2,000+ Downdetector reports (resolved)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IsDown has tracked 208 Claude incidents since October 2025. The typical resolution time is approximately 204 minutes — and the May 8 outage resolved in about 4.5 hours, slightly above average.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Monitor Claude Status Live
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://status.claude.com" rel="noopener noreferrer"&gt;status.claude.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. 🔵 Is Gemini / Google AI Studio Down Today?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚠️ Current Status: INTERMITTENT ISSUES
&lt;/h3&gt;

&lt;p&gt;Google AI Studio and the Gemini API are the &lt;strong&gt;one service still showing degraded performance&lt;/strong&gt; as of May 9. This isn't a new problem.&lt;/p&gt;

&lt;p&gt;StatusGator recorded the service as operational as of May 7, but noted 60 user-submitted outage reports in the prior 24 hours, with users describing prompts failing with "something went wrong" errors.&lt;/p&gt;

&lt;p&gt;The intermittent hanging requests and slow agent responses have been recurring since &lt;strong&gt;late February 2026&lt;/strong&gt;, with fresh spikes appearing again in early May. If Google AI Studio is timing out for you right now, you are not alone — and switching to a backup tool is the fastest fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Monitor Gemini Status Live
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://aistudio.google.com/status" rel="noopener noreferrer"&gt;aistudio.google.com/status&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. ⚡ Is Grok Down Today? — xAI Status
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Current Status: FULLY OPERATIONAL
&lt;/h3&gt;

&lt;p&gt;No incidents declared. xAI's status page is green across all components. Grok remained operational even during the April 20 multi-platform outage — notably, when ChatGPT, Claude, and Gemini all went down simultaneously, Grok was one of the few services that stayed up.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Monitor Grok Status Live
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://status.x.ai" rel="noopener noreferrer"&gt;status.x.ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. 💬 Is Character.ai Down Today?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Current Status: GENERALLY STABLE
&lt;/h3&gt;

&lt;p&gt;No major platform-wide incident has been officially declared. User-reported spikes on Downdetector do appear occasionally and tend to reflect localized or brief server hiccups rather than full outages.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Monitor Character.ai Status Live
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://downdetector.com/status/characterai" rel="noopener noreferrer"&gt;downdetector.com/status/characterai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ AI Not Working? Fix It in 5 Steps
&lt;/h2&gt;

&lt;p&gt;Even when status pages show green, you might still be experiencing issues. Work through this checklist before concluding it's a platform-wide problem:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Check the Official Status Page First
&lt;/h3&gt;

&lt;p&gt;Don't rely on social media reports or Downdetector alone. Go directly to the official status page (links at the bottom of this article). User reports often reflect individual connection issues, not real outages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Try Incognito / Private Mode
&lt;/h3&gt;

&lt;p&gt;Browser extensions — especially ad blockers, privacy tools, and VPN extensions — are the &lt;strong&gt;most common cause&lt;/strong&gt; of AI tool failures that aren't actually platform outages. Open a private browsing window. If it works there, the issue is your browser profile, not the service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Clear Your Cache and Cookies
&lt;/h3&gt;

&lt;p&gt;Stale session tokens cause authentication loops, stuck loading spinners, and "something went wrong" errors — especially in the hours right after a real outage has been resolved. Clear cache, log out completely, then log back in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Try a Different Device or Network
&lt;/h3&gt;

&lt;p&gt;Switch to mobile data instead of Wi-Fi, or try a different device entirely. This rules out local network filtering (common in corporate or university networks that block AI tools).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Check for Regional Outages
&lt;/h3&gt;

&lt;p&gt;Some outages are geographically limited. A platform can be fully operational in the US while users in Europe or Asia experience complete outages. Use &lt;strong&gt;&lt;a href="https://checkaistatus.com" rel="noopener noreferrer"&gt;checkaistatus.com&lt;/a&gt;&lt;/strong&gt; for regional breakdowns.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔴 Common Error Messages — What They Actually Mean
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Message&lt;/th&gt;
&lt;th&gt;Likely Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Hmm, something seems to have gone wrong"&lt;/td&gt;
&lt;td&gt;Temporary server glitch&lt;/td&gt;
&lt;td&gt;Wait 2–3 minutes, refresh, retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Network error"&lt;/td&gt;
&lt;td&gt;Connection dropped mid-stream&lt;/td&gt;
&lt;td&gt;Refresh page and resend your message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Too many requests" / "Rate limited"&lt;/td&gt;
&lt;td&gt;Usage limit hit&lt;/td&gt;
&lt;td&gt;Wait or upgrade your plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Service temporarily unavailable"&lt;/td&gt;
&lt;td&gt;Backend overload&lt;/td&gt;
&lt;td&gt;Usually self-resolves in 5–15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stuck loading spinner (no response)&lt;/td&gt;
&lt;td&gt;Session token expired&lt;/td&gt;
&lt;td&gt;Clear cookies → log out → log in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Unable to load conversation"&lt;/td&gt;
&lt;td&gt;Chat history sync issue&lt;/td&gt;
&lt;td&gt;Refresh; check status page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Claude is not available to new users"&lt;/td&gt;
&lt;td&gt;Regional access restriction&lt;/td&gt;
&lt;td&gt;Use a VPN or check availability in your region&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 Best Backup AI Tools When Your Main One Goes Down
&lt;/h2&gt;

&lt;p&gt;Having a backup plan matters. Here's what to use when each major platform goes offline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When ChatGPT is down:&lt;/strong&gt;&lt;br&gt;
→ &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt; (Anthropic) | &lt;a href="https://gemini.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; | &lt;a href="https://grok.x.ai" rel="noopener noreferrer"&gt;Grok&lt;/a&gt; | &lt;a href="https://perplexity.ai" rel="noopener noreferrer"&gt;Perplexity AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When Claude is down:&lt;/strong&gt;&lt;br&gt;
→ &lt;a href="https://chat.openai.com" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; | &lt;a href="https://grok.x.ai" rel="noopener noreferrer"&gt;Grok&lt;/a&gt; | &lt;a href="https://chat.mistral.ai" rel="noopener noreferrer"&gt;Mistral Le Chat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When both ChatGPT and Claude are slow:&lt;/strong&gt;&lt;br&gt;
→ &lt;a href="https://perplexity.ai" rel="noopener noreferrer"&gt;Perplexity AI&lt;/a&gt; and &lt;a href="https://chat.mistral.ai" rel="noopener noreferrer"&gt;Mistral Le Chat&lt;/a&gt; both have strong uptime records&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For developers whose AI API is down:&lt;/strong&gt;&lt;br&gt;
→ Switch provider via &lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt; — it routes to multiple model providers with a single API key&lt;/p&gt;




&lt;h2&gt;
  
  
  📡 Get Proactive Alerts — Never Be Caught Off Guard Again
&lt;/h2&gt;

&lt;p&gt;Stop finding out AI is down only when you're mid-task. These take under 2 minutes to set up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Free?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://status.claude.com" rel="noopener noreferrer"&gt;status.claude.com&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subscribe for email, SMS, Slack, or Teams alerts&lt;/td&gt;
&lt;td&gt;✅ Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://status.openai.com" rel="noopener noreferrer"&gt;status.openai.com&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same subscription options as above&lt;/td&gt;
&lt;td&gt;✅ Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://isdown.app" rel="noopener noreferrer"&gt;IsDown&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitor all AI services in one dashboard&lt;/td&gt;
&lt;td&gt;Free trial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://statusgator.com" rel="noopener noreferrer"&gt;StatusGator&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aggregator with early-warning detection&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://checkaistatus.com" rel="noopener noreferrer"&gt;checkaistatus.com&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI-specific tracker with regional breakdown&lt;/td&gt;
&lt;td&gt;✅ Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://uptimerobot.com" rel="noopener noreferrer"&gt;UptimeRobot&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom monitors with 5-min check intervals&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The single best thing you can do: &lt;strong&gt;subscribe to email alerts on your 1–2 primary AI tools&lt;/strong&gt;. It's free and takes 30 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 May 2026 Outage Summary — All Platforms
&lt;/h2&gt;

&lt;p&gt;Here's the full week at a glance for anyone who wants the complete picture:&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude (Anthropic) — May 4–9
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;May 4&lt;/td&gt;
&lt;td&gt;Errors on Opus 4.5, Sonnet 4.5, Opus 4.7&lt;/td&gt;
&lt;td&gt;~40 min each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 6&lt;/td&gt;
&lt;td&gt;Elevated errors, multiple models&lt;/td&gt;
&lt;td&gt;~87 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 7&lt;/td&gt;
&lt;td&gt;GitHub IP / Claude Code failures&lt;/td&gt;
&lt;td&gt;~35 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 8&lt;/td&gt;
&lt;td&gt;File operation errors (2,000+ reports)&lt;/td&gt;
&lt;td&gt;~4.5 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 9&lt;/td&gt;
&lt;td&gt;✅ No incidents&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  OpenAI / ChatGPT — May 1–9
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;May 1&lt;/td&gt;
&lt;td&gt;Responses API errors&lt;/td&gt;
&lt;td&gt;~45 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 1&lt;/td&gt;
&lt;td&gt;Image generation errors&lt;/td&gt;
&lt;td&gt;~65 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 1&lt;/td&gt;
&lt;td&gt;Europe-region chat errors&lt;/td&gt;
&lt;td&gt;Resolved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 4&lt;/td&gt;
&lt;td&gt;Website page issues&lt;/td&gt;
&lt;td&gt;~51 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 5&lt;/td&gt;
&lt;td&gt;Workspace Connector disruption&lt;/td&gt;
&lt;td&gt;Resolved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 7&lt;/td&gt;
&lt;td&gt;Image generation API errors&lt;/td&gt;
&lt;td&gt;Resolved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 8&lt;/td&gt;
&lt;td&gt;Transcription failures (ChatGPT + Codex)&lt;/td&gt;
&lt;td&gt;Resolved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 9&lt;/td&gt;
&lt;td&gt;✅ No incidents&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Official Status Links — All AI Services {#official-status-links}
&lt;/h2&gt;

&lt;p&gt;Bookmark these. Always check the official source first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔵 &lt;strong&gt;Claude&lt;/strong&gt; → &lt;a href="https://status.claude.com" rel="noopener noreferrer"&gt;status.claude.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🟢 &lt;strong&gt;OpenAI / ChatGPT&lt;/strong&gt; → &lt;a href="https://status.openai.com" rel="noopener noreferrer"&gt;status.openai.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔵 &lt;strong&gt;Google AI Studio / Gemini&lt;/strong&gt; → &lt;a href="https://aistudio.google.com/status" rel="noopener noreferrer"&gt;aistudio.google.com/status&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Grok / xAI&lt;/strong&gt; → &lt;a href="https://status.x.ai" rel="noopener noreferrer"&gt;status.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Character.ai&lt;/strong&gt; → &lt;a href="https://downdetector.com/status/characterai" rel="noopener noreferrer"&gt;downdetector.com/status/characterai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;All AI services aggregated&lt;/strong&gt; → &lt;a href="https://checkaistatus.com" rel="noopener noreferrer"&gt;checkaistatus.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Bottom Line for May 9, 2026
&lt;/h2&gt;

&lt;p&gt;The week of May 4–8 was unusually rough for AI reliability — Claude, ChatGPT, and Google all logged multiple incidents within the same 5-day window. As of today, &lt;strong&gt;the situation has fully stabilized for all services except Google AI Studio&lt;/strong&gt;, which continues to show intermittent issues for some users and regions.&lt;/p&gt;

&lt;p&gt;If something still isn't working for you personally: try incognito mode first, check the official status page, and give it 15 minutes. The vast majority of "AI is broken" moments are either already-resolved incidents, local browser issues, or regional hiccups — not permanent failures.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;🕐 This article reflects status as of May 9, 2026. AI service health changes constantly — always verify with the official status pages linked above for the most current information.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Found this useful?&lt;/strong&gt; Drop a comment with which AI tool you use as a backup when your main one goes down — curious to see what the community relies on.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h3&gt;

&lt;p&gt;If you found this breakdown helpful and want to support more content like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👉 &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe to my YouTube channel&lt;/a&gt;&lt;/strong&gt; (it's free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://safdarali.in/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I regularly share insights on AI, the open web, developer tools, and emerging tech trends. Your support motivates me to publish more deep-dive articles like this.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;




</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>claude</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Next.js 16.2 Just Changed AI Coding Forever</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Sun, 22 Mar 2026 01:05:26 +0000</pubDate>
      <link>https://dev.to/safdarali25/nextjs-162-just-changed-ai-coding-forever-17dl</link>
      <guid>https://dev.to/safdarali25/nextjs-162-just-changed-ai-coding-forever-17dl</guid>
      <description>&lt;p&gt;If you use &lt;strong&gt;Cursor&lt;/strong&gt;, &lt;strong&gt;Copilot&lt;/strong&gt;, &lt;strong&gt;Claude&lt;/strong&gt;, or any other AI coding assistant, your stack matters as much as your prompts. &lt;strong&gt;Next.js 16.2&lt;/strong&gt; is one of those releases that quietly redraws the map: it isn’t only faster—it’s built so &lt;strong&gt;AI agents can understand, debug, and extend your app&lt;/strong&gt; with less friction.&lt;/p&gt;

&lt;p&gt;This post breaks down what changed, why it matters for &lt;strong&gt;AI-assisted development&lt;/strong&gt;, and what you should do next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Release Feels Different
&lt;/h2&gt;

&lt;p&gt;For years, “AI coding” meant autocomplete in the editor. Today it means &lt;strong&gt;agents&lt;/strong&gt; that read your repo, run commands, propose diffs, and sometimes deploy. That only works when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The framework &lt;strong&gt;starts fast&lt;/strong&gt; and &lt;strong&gt;reloads predictably&lt;/strong&gt; (so agents don’t burn time waiting).&lt;/li&gt;
&lt;li&gt;Errors are &lt;strong&gt;clear and local&lt;/strong&gt; (so agents don’t hallucinate fixes).&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;machine-oriented context&lt;/strong&gt; bundled with the project (so agents don’t guess framework rules).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next.js 16.2 pushes hard on all three—especially the last one. That’s why people are saying it &lt;strong&gt;changes AI coding&lt;/strong&gt;: the framework is no longer assuming only humans read the docs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance: When Agents Run &lt;code&gt;next dev&lt;/code&gt;, Every Second Counts
&lt;/h2&gt;

&lt;p&gt;AI workflows often look like: generate code → run dev server → hit an error → read logs → patch → repeat. Slow dev servers train bad habits (skipping verification) or waste tokens (long waits, huge log dumps).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js 16.2&lt;/strong&gt; doubles down on &lt;strong&gt;Turbopack&lt;/strong&gt; and dev performance. Reported improvements include dramatically faster &lt;strong&gt;&lt;code&gt;next dev&lt;/code&gt; startup&lt;/strong&gt; compared to earlier 16.x lines, plus faster &lt;strong&gt;Server Component&lt;/strong&gt; work on the server—especially around &lt;strong&gt;payload handling and HTML rendering&lt;/strong&gt; paths that matter for real apps (dashboards, CMS-driven pages, large tables).&lt;/p&gt;

&lt;p&gt;Why this matters for AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shorter feedback loops&lt;/strong&gt; mean fewer “I’ll assume it works” moments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster refresh&lt;/strong&gt; after edits means agents can validate smaller steps, which usually means &lt;strong&gt;better patches&lt;/strong&gt; and fewer cascading mistakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re prompting an agent to “run the app and fix hydration,” a snappy dev server isn’t a luxury—it’s part of the &lt;strong&gt;reliability&lt;/strong&gt; of the whole loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Server Components &amp;amp; Rendering: Less Guesswork, Faster Truth
&lt;/h2&gt;

&lt;p&gt;React Server Components changed how Next apps ship HTML and data. When something is slow or wrong, AI tools need &lt;strong&gt;stable signals&lt;/strong&gt;: where work happens (server vs client), what serialized across the boundary, and what actually rendered.&lt;/p&gt;

&lt;p&gt;Next.js 16.2 continues to tighten that story with improvements aimed at &lt;strong&gt;faster server rendering paths&lt;/strong&gt; and clearer behavior around &lt;strong&gt;payloads and HTML generation&lt;/strong&gt;—the kind of detail that shows up when you’re building admin UIs, marketing sites with rich text, or anything with large component trees.&lt;/p&gt;

&lt;p&gt;For AI-assisted development, the win is simple: &lt;strong&gt;less mystery&lt;/strong&gt;. When the framework is predictable, the model spends fewer tokens inventing “maybe it’s a client component issue” explanations—and more tokens on the actual fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI Angle: &lt;code&gt;create-next-app&lt;/code&gt; and &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s the headline feature for &lt;strong&gt;AI coding&lt;/strong&gt;: new projects scaffolded with &lt;strong&gt;&lt;code&gt;create-next-app&lt;/code&gt;&lt;/strong&gt; can ship with &lt;strong&gt;framework documentation oriented toward agents&lt;/strong&gt;, often via an &lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/strong&gt; (or similar) file that bundles &lt;strong&gt;how Next.js expects routing, Server Actions, caching, and conventions to work&lt;/strong&gt; in &lt;em&gt;this&lt;/em&gt; repo.&lt;/p&gt;

&lt;p&gt;That might sound small. It isn’t.&lt;/p&gt;

&lt;p&gt;Most agent failures aren’t “the model is dumb.” They’re &lt;strong&gt;context failures&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The model doesn’t know your &lt;strong&gt;App Router&lt;/strong&gt; layout rules.&lt;/li&gt;
&lt;li&gt;It guesses wrong about &lt;strong&gt;server vs client&lt;/strong&gt; boundaries.&lt;/li&gt;
&lt;li&gt;It applies &lt;strong&gt;Pages Router&lt;/strong&gt; patterns in an &lt;strong&gt;App Router&lt;/strong&gt; project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bundling &lt;strong&gt;Next-specific, repo-local guidance&lt;/strong&gt; is like giving the agent a &lt;strong&gt;map&lt;/strong&gt; instead of asking it to memorize the entire internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical takeaway:&lt;/strong&gt; If you’re starting a greenfield Next app today, treat &lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; (or your team’s equivalent)&lt;/strong&gt; as a first-class file—update it when you adopt conventions (fetch caching, &lt;code&gt;loading.tsx&lt;/code&gt;, Server Actions patterns, etc.). Your future self (and your agent) will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging That Actually Helps Agents (Not Just Humans)
&lt;/h2&gt;

&lt;p&gt;Next.js 16.2 also improves the &lt;strong&gt;developer error surface&lt;/strong&gt; in ways that map cleanly to agent workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clearer hydration mismatch signals&lt;/strong&gt; (server vs client) reduce the classic “works on server, breaks on client” confusion—exactly the class of bugs agents struggle with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better forwarding of browser logs to the terminal&lt;/strong&gt; means an agent working in a headless or terminal-first flow can still “see” what the browser would show—without you manually copying console output into chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More actionable dev-server errors&lt;/strong&gt; (for example, when something else is already bound to the port) cut down circular debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents are only as good as the &lt;strong&gt;observability&lt;/strong&gt; you give them. These changes are observability upgrades.&lt;/p&gt;




&lt;h2&gt;
  
  
  Turbopack &amp;amp; Tooling: Fewer Sharp Edges for Automated Workflows
&lt;/h2&gt;

&lt;p&gt;Behind the scenes, &lt;strong&gt;Turbopack&lt;/strong&gt; keeps maturing—more fixes, better edge-case handling, and improvements that matter when your project isn’t a hello-world (PostCSS setups, workers, dynamic imports, integrity features, etc.).&lt;/p&gt;

&lt;p&gt;For AI coding, “fewer sharp edges” translates to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer mysterious build failures mid-refactor,&lt;/li&gt;
&lt;li&gt;fewer “works on my machine” detours,&lt;/li&gt;
&lt;li&gt;more time spent on product logic instead of toolchain archaeology.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What You Should Do This Week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade intentionally&lt;/strong&gt; — Read the official &lt;strong&gt;Next.js 16.2&lt;/strong&gt; release notes and migration notes for your exact stack (hosting, monorepo, experimental flags).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adopt agent-oriented docs&lt;/strong&gt; — If you get &lt;code&gt;AGENTS.md&lt;/code&gt; from &lt;code&gt;create-next-app&lt;/code&gt;, customize it for &lt;em&gt;your&lt;/em&gt; standards (testing, env vars, API patterns).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tighten prompts around boundaries&lt;/strong&gt; — Teach your agent: “Server Component by default; &lt;code&gt;'use client'&lt;/code&gt; only when needed.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure dev feedback loops&lt;/strong&gt; — Time &lt;code&gt;next dev&lt;/code&gt; cold start before/after upgrade; share the win with your team—it’s real productivity.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Before vs After: What AI Coding Feels Like
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Old friction&lt;/th&gt;
&lt;th&gt;After 16.2-style improvements&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slow cold starts; agents time out or skip verification&lt;/td&gt;
&lt;td&gt;Faster startup and refresh; more reliable “run and check” loops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hydration bugs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cryptic mismatches; lots of back-and-forth&lt;/td&gt;
&lt;td&gt;Clearer server vs client signals in the overlay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent guesses App Router vs Pages, cache rules, etc.&lt;/td&gt;
&lt;td&gt;Repo-local &lt;code&gt;AGENTS.md&lt;/code&gt;-style guidance reduces wrong patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser-only errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You copy-paste console logs into chat&lt;/td&gt;
&lt;td&gt;Logs forward to terminal; agents can read them in one place&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This isn’t magic—it’s &lt;strong&gt;signal quality&lt;/strong&gt;. Better signals mean fewer wasted tokens and fewer “fixes” that break something else.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prompt Patterns That Pair Well With Next.js 16.2
&lt;/h2&gt;

&lt;p&gt;Try structuring agent sessions like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;“Show the route tree and where &lt;code&gt;'use client'&lt;/code&gt; is required”&lt;/strong&gt; before generating a big feature—so the agent doesn’t paint you into a client-bundle corner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Run the dev server and paste only the first error”&lt;/strong&gt;—with faster refresh, iterative single-error fixing works better than bulk edits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Update AGENTS.md to match our Server Actions and env conventions”&lt;/strong&gt;—treat docs as code; agents follow files they can see.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your team uses a &lt;strong&gt;design system&lt;/strong&gt; or &lt;strong&gt;internal UI kit&lt;/strong&gt;, add a short section to the same doc so the model doesn’t import random components from memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Benefits Most?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo developers&lt;/strong&gt; shipping with AI daily — you get speed without as much framework whiplash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams&lt;/strong&gt; with mixed Next experience — conventions in-repo beat tribal knowledge in Slack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agencies&lt;/strong&gt; spinning many similar apps — scaffolding that includes agent-oriented docs scales across projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re still on &lt;strong&gt;older majors&lt;/strong&gt;, upgrading for AI alone isn’t always worth skipping a proper migration plan—but if you’re already on &lt;strong&gt;Next 16.x&lt;/strong&gt;, &lt;strong&gt;16.2&lt;/strong&gt; is the kind of minor that’s worth prioritizing.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Next.js 16.2&lt;/strong&gt; won’t replace good architecture or code review—but it &lt;strong&gt;meets AI coding where it actually happens&lt;/strong&gt;: fast iteration, clear errors, and &lt;strong&gt;context that fits in the repo&lt;/strong&gt;. That combination is why this release is bigger than a changelog: it’s a bet that &lt;strong&gt;frameworks should be agent-aware&lt;/strong&gt;, not just human-friendly.&lt;/p&gt;

&lt;p&gt;If you’re building in Next and using AI daily, this is the kind of upgrade that pays for itself in &lt;strong&gt;fewer bad patches&lt;/strong&gt; and &lt;strong&gt;shorter “fix the fix” sessions&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h3&gt;

&lt;p&gt;If you found this breakdown helpful and want to support more content like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👉 &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe to my YouTube channel&lt;/a&gt;&lt;/strong&gt; (it's free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I regularly share insights on AI, the open web, developer tools, and emerging tech trends. Your support motivates me to publish more deep-dive articles like this.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Are you on Next.js 16.2 yet? What changed for your AI workflow? Drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Next Big Trend in AI: Tool-Using Agents</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Fri, 20 Mar 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/safdarali25/the-next-big-trend-in-ai-tool-using-agents-5157</link>
      <guid>https://dev.to/safdarali25/the-next-big-trend-in-ai-tool-using-agents-5157</guid>
      <description>&lt;p&gt;Chatbots were only the beginning. The real revolution is &lt;strong&gt;tool-using AI agents&lt;/strong&gt;—systems that don’t just talk, they &lt;em&gt;do&lt;/em&gt;. They call APIs, run code, retrieve data, and automate tasks end to end. If you’re a developer, this is the trend to watch.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Tool-Using Agents?
&lt;/h2&gt;

&lt;p&gt;Tool-using agents are AI systems that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Call APIs&lt;/strong&gt; — Book a room, send an email, or query a database through structured endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run code&lt;/strong&gt; — Execute snippets, run scripts, or trigger pipelines in a sandboxed or production environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve data&lt;/strong&gt; — Pull real-time or historical data from your systems, docs, or the web to inform the next step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate tasks&lt;/strong&gt; — Chain multiple steps (reason → call tool → interpret result → repeat) until the job is done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference from a chatbot: the agent has &lt;strong&gt;tools&lt;/strong&gt; and &lt;strong&gt;permission to use them&lt;/strong&gt;. It’s the difference between “I can suggest a command” and “I ran the command and here’s the result.”&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI is moving from conversation to execution.&lt;/strong&gt; Tool-using agents are how we get there.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why This Is Powerful
&lt;/h2&gt;

&lt;p&gt;Instead of only answering questions, agents can &lt;strong&gt;complete work&lt;/strong&gt;. They can reserve a table, summarize a repo, deploy a branch, or generate a report—all from a natural-language request. That shifts AI from assistant to actor, and it changes how we build software.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Examples
&lt;/h2&gt;

&lt;p&gt;Today, agents are already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Booking meetings&lt;/strong&gt; — Integrating with calendars, finding slots, and sending invites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzing data&lt;/strong&gt; — Querying databases or spreadsheets and returning insights or visualizations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generating reports&lt;/strong&gt; — Pulling from multiple sources, structuring the output, and exporting to PDF or docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploying software&lt;/strong&gt; — Running CI/CD, triggering builds, and updating environments based on instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is the same: the user states a goal; the agent plans, calls tools, and delivers an outcome.&lt;/p&gt;




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

&lt;p&gt;AI is moving from &lt;strong&gt;conversation&lt;/strong&gt; to &lt;strong&gt;execution&lt;/strong&gt;. Tool-using agents are the bridge. As a developer, designing your APIs and workflows so they can be invoked by agents—with clear inputs, outputs, and safety boundaries—will put you ahead of the curve.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The next wave of AI isn’t smarter chat—it’s agents that get things done.&lt;/strong&gt; Build for it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h3&gt;

&lt;p&gt;If you found this breakdown helpful and want to support more content like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👉 &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe to my YouTube channel&lt;/a&gt;&lt;/strong&gt; (it's free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I regularly share insights on AI, the open web, developer tools, and emerging tech trends. Your support motivates me to publish more deep-dive articles like this.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What’s the first task you’d hand to a tool-using agent? Share in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>developers</category>
      <category>automation</category>
    </item>
    <item>
      <title>The Future of Websites: From Pages to Intelligent Systems</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Thu, 19 Mar 2026 23:05:00 +0000</pubDate>
      <link>https://dev.to/safdarali25/the-future-of-websites-from-pages-to-intelligent-systems-5ah5</link>
      <guid>https://dev.to/safdarali25/the-future-of-websites-from-pages-to-intelligent-systems-5ah5</guid>
      <description>&lt;p&gt;Websites used to be static pages. Then they became dynamic applications. Now they are becoming &lt;strong&gt;intelligent systems&lt;/strong&gt;—sites that integrate AI, automate workflows, and interact with external systems. For web developers, that’s the next evolution to plan for.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Changing
&lt;/h2&gt;

&lt;p&gt;Modern websites can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrate AI&lt;/strong&gt; — Chat, search, recommendations, and content generation are moving from third-party widgets to core product features. The site doesn’t just display data; it reasons about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate workflows&lt;/strong&gt; — Trigger actions (notifications, approvals, updates) based on events, schedules, or user behavior. The site becomes an orchestration layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interact with external systems&lt;/strong&gt; — APIs, webhooks, and agents can call into your site and use it as a tool. The boundary between “your site” and “the rest of the stack” blurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: a website is less a destination and more a &lt;strong&gt;node&lt;/strong&gt; in a larger system—one that both humans and agents use.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From pages to apps to systems: the next web is intelligent by default.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Developers must think beyond UI. The next generation of sites will include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automation layers&lt;/strong&gt; — Background jobs, event handlers, and workflows that run without a user on the page. Design for triggers, idempotency, and observability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI integrations&lt;/strong&gt; — Embedding, tool calling, or agent loops that make the site smarter. Expose clear interfaces so models and agents can use your capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured APIs&lt;/strong&gt; — Machine-readable endpoints and schemas so other systems (and agents) can discover and invoke what your site does. Think “capabilities as API.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skills that matter are shifting: APIs, event-driven design, and agent-friendly interfaces are as important as layout and interactivity.&lt;/p&gt;




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

&lt;p&gt;Web development is evolving again. Sites that are only pages or only apps will still exist—but the most valuable ones will be &lt;strong&gt;intelligent systems&lt;/strong&gt;: findable, automatable, and built for both humans and the tools that work alongside them. Start with structured APIs and clear automation boundaries; the rest will follow.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The future of the web isn’t just pretty—it’s purposeful.&lt;/strong&gt; Build systems, not just screens.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h3&gt;

&lt;p&gt;If you found this breakdown helpful and want to support more content like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👉 &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe to my YouTube channel&lt;/a&gt;&lt;/strong&gt; (it's free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I regularly share insights on AI, the open web, developer tools, and emerging tech trends. Your support motivates me to publish more deep-dive articles like this.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How are you making your sites more intelligent? Share in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AI Agents vs Traditional Apps: The Next Software Shift</title>
      <dc:creator>Safdar Ali</dc:creator>
      <pubDate>Wed, 18 Mar 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/safdarali25/ai-agents-vs-traditional-apps-the-next-software-shift-3k1l</link>
      <guid>https://dev.to/safdarali25/ai-agents-vs-traditional-apps-the-next-software-shift-3k1l</guid>
      <description>&lt;p&gt;Most software today follows a simple model: &lt;strong&gt;User → Interface → Backend → Database.&lt;/strong&gt; The user clicks; the app responds. AI agents introduce a different paradigm—one where the system can make decisions, call tools, plan steps, and execute tasks with minimal human intervention. That’s the next software shift, and it changes how we design.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Agents Work
&lt;/h2&gt;

&lt;p&gt;Agents can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make decisions&lt;/strong&gt; — Choose which action to take next based on context, goals, and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call tools&lt;/strong&gt; — Invoke APIs, run code, or trigger workflows as part of a larger plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan steps&lt;/strong&gt; — Break a high-level goal into a sequence of actions and adjust when something fails or new information appears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute tasks&lt;/strong&gt; — Carry out multi-step work (research, book, deploy, report) without a human in the loop for every step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike a traditional app that waits for input, an agent &lt;strong&gt;drives&lt;/strong&gt; the flow. It’s the difference between a form and a colleague who fills it out for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From forms to agents: the next era of software is about delegation, not just interaction.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why This Changes Software Design
&lt;/h2&gt;

&lt;p&gt;Developers must design systems that support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent loops&lt;/strong&gt; — Reason → act → observe → reason again. Your APIs and services need to be composable and observable so agents can iterate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; — Short- and long-term context so the agent knows what happened before and what the user wants. That means state, history, and retrieval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool access&lt;/strong&gt; — Clear, secure, and well-documented tools (APIs, functions) that agents can discover and call. Structured inputs and outputs matter more than ever.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture shifts from “one request, one response” to “ongoing loop with tools and state.”&lt;/p&gt;




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

&lt;p&gt;We are entering a new era of software architecture. Apps won’t disappear—but they’ll increasingly be used &lt;em&gt;by&lt;/em&gt; agents as well as by humans. Designing for agent loops, memory, and tool access today will prepare you for the shift. The next generation of software isn’t just UI + API; it’s systems that can act on behalf of users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The best software will serve both humans and the agents they send.&lt;/strong&gt; Design for both.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ☕ Enjoyed This Article?
&lt;/h3&gt;

&lt;p&gt;If you found this breakdown helpful and want to support more content like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👉 &lt;a href="https://buymeacoffee.com/safdarali" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://www.youtube.com/@safdarali_?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe to my YouTube channel&lt;/a&gt;&lt;/strong&gt; (it's free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I regularly share insights on AI, the open web, developer tools, and emerging tech trends. Your support motivates me to publish more deep-dive articles like this.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How are you designing for agents today? Share in the comments.&lt;/em&gt;&lt;/p&gt;

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