<?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>Forem: Muhammad Hamid Raza</title>
    <description>The latest articles on Forem by Muhammad Hamid Raza (@hamidrazadev).</description>
    <link>https://forem.com/hamidrazadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3131979%2F8333e423-4d9b-4851-ab42-f268ef4993c4.png</url>
      <title>Forem: Muhammad Hamid Raza</title>
      <link>https://forem.com/hamidrazadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hamidrazadev"/>
    <language>en</language>
    <item>
      <title>The Vercel Security Breach of April 2026: What Happened and What You Should Do Right Now</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:12:22 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/the-vercel-security-breach-of-april-2026-what-happened-and-what-you-should-do-right-now-2an3</link>
      <guid>https://forem.com/hamidrazadev/the-vercel-security-breach-of-april-2026-what-happened-and-what-you-should-do-right-now-2an3</guid>
      <description>&lt;p&gt;Every developer's worst nightmare? Waking up to find out the platform you trust with your production secrets just had a security incident. 😬&lt;/p&gt;

&lt;p&gt;That's exactly what happened in April 2026 — Vercel, one of the most widely-used deployment platforms in the frontend world, confirmed a real security breach. Not a rumor. Not a hypothetical. An actual attack by a sophisticated threat actor who got further than anyone would have liked.&lt;/p&gt;

&lt;p&gt;So what actually happened? Who was affected? And what should you do with your environment variables right now? Let's break it all down clearly — no panic, just facts and action steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is the Vercel April 2026 Security Incident?
&lt;/h2&gt;

&lt;p&gt;On April 19, 2026, Vercel's security team published a bulletin confirming that unauthorized parties had gained access to certain internal Vercel systems.&lt;/p&gt;

&lt;p&gt;The attack did not start with Vercel directly. It started with a third-party AI tool called &lt;strong&gt;Context.ai&lt;/strong&gt;, which was being used by a Vercel employee. The attacker compromised Context.ai's Google Workspace OAuth app, which then gave them access to that employee's Vercel Google Workspace account.&lt;/p&gt;

&lt;p&gt;From there, the attacker was able to access some Vercel environments and &lt;strong&gt;non-sensitive environment variables&lt;/strong&gt; — things like API keys, tokens, database credentials, and signing keys that were stored in plaintext.&lt;/p&gt;

&lt;p&gt;The short version: a third-party tool got compromised, and that became the entry point into Vercel's systems. Classic supply chain attack.&lt;/p&gt;




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

&lt;p&gt;You might be thinking, "I'm just a solo dev or a small team — this probably doesn't affect me." That's a fair first instinct, but let's think about it for a second.&lt;/p&gt;

&lt;p&gt;If you have ever stored an API key, a database URL, or a signing secret in Vercel as a non-sensitive environment variable, there is now a reason to audit that. The attacker was described by Vercel as "&lt;strong&gt;highly sophisticated&lt;/strong&gt;" based on their speed and detailed knowledge of Vercel's internal systems.&lt;/p&gt;

&lt;p&gt;This matters because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your production secrets may be more exposed than you think.&lt;/strong&gt; The attack targeted variables that decrypt to plaintext — exactly the kind most developers store without thinking twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain attacks are becoming the new normal.&lt;/strong&gt; The breach didn't start at Vercel. It started at a small third-party AI tool. That's the lesson here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't rely on "deleting your project" as a fix.&lt;/strong&gt; Vercel explicitly warned: deleting your project or account does NOT eliminate risk if the secrets were already exposed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This incident is a real-world reminder that security is everyone's job — not just the platform's.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Facts: What We Know So Far
&lt;/h2&gt;

&lt;p&gt;Here is what Vercel has confirmed as of April 21, 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Origin of the attack:&lt;/strong&gt; Compromise of Context.ai's Google Workspace OAuth app&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;What was accessed:&lt;/strong&gt; Non-sensitive environment variables (those stored in plaintext)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;What was NOT compromised:&lt;/strong&gt; Environment variables marked as "sensitive" (stored in a way that prevents them from being read)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;npm packages:&lt;/strong&gt; Confirmed safe — no Vercel npm packages were tampered with&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Ongoing investigation:&lt;/strong&gt; Vercel is working with Mandiant, GitHub, Microsoft, npm, Socket, and law enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The attacker gained access via a Google Workspace OAuth app with this identifier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are a Google Workspace admin, check your connected OAuth apps immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits of Acting Fast: What Rotation Buys You
&lt;/h2&gt;

&lt;p&gt;Look, no one enjoys rotating credentials. It's tedious. But here's why you should treat it like an emergency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stops active exploitation.&lt;/strong&gt; If a secret was accessed, rotating it immediately cuts off the attacker's access — even if they already have the old value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduces blast radius.&lt;/strong&gt; The fewer exposed secrets that remain active, the smaller the damage window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forces a good habit.&lt;/strong&gt; Most developers set secrets once and forget them. This incident is a forced spring cleaning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protects your users and customers.&lt;/strong&gt; If your API key connects to a payment processor, a database, or a third-party service — a leaked key puts real users at risk, not just your infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rotating credentials after a breach is not optional. It's damage control with a timer on it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sensitive vs Non-Sensitive Environment Variables
&lt;/h2&gt;

&lt;p&gt;This distinction is probably the biggest lesson from this incident.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Non-Sensitive Variable&lt;/th&gt;
&lt;th&gt;Sensitive Variable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stored as&lt;/td&gt;
&lt;td&gt;Plaintext (decryptable)&lt;/td&gt;
&lt;td&gt;Encrypted, unreadable after save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk if accessed&lt;/td&gt;
&lt;td&gt;High — value is exposed&lt;/td&gt;
&lt;td&gt;Low — value cannot be read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommended for&lt;/td&gt;
&lt;td&gt;Non-secret config values&lt;/td&gt;
&lt;td&gt;API keys, tokens, passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Was it affected?&lt;/td&gt;
&lt;td&gt;✅ Yes, potentially&lt;/td&gt;
&lt;td&gt;❌ No evidence of access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before this incident, many developers used non-sensitive variables for secrets simply because it was easier — you could go back and read the value if you forgot it. That convenience comes with a cost. &lt;strong&gt;Always mark real secrets as sensitive in Vercel.&lt;/strong&gt; You can't read them back afterward, but that's the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips and Immediate Action Steps 🔧
&lt;/h2&gt;

&lt;p&gt;Here is what Vercel recommends, and what you should do right now:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Rotate all non-sensitive environment variables immediately.&lt;/strong&gt; API keys, database URLs, tokens, signing keys — all of it. Treat them as compromised.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Enable Multi-Factor Authentication (MFA) on your Vercel account.&lt;/strong&gt; Use an authenticator app or set up a passkey.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Switch to sensitive environment variables&lt;/strong&gt; for all secrets going forward. Vercel has now updated the default — new variables will be marked sensitive by default.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Review your activity log&lt;/strong&gt; in the Vercel dashboard for anything suspicious.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Check recent deployments&lt;/strong&gt; for anything unexpected. Delete if in doubt.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;If you are a Google Workspace admin&lt;/strong&gt;, check for the OAuth app ID listed above and revoke it if present.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Don't just delete your project and call it done.&lt;/strong&gt; Exposed secrets still work after deletion.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Don't assume "I'm a small project so I wasn't targeted."&lt;/strong&gt; Automated attackers don't discriminate by project size.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Don't leave old credentials active&lt;/strong&gt; while you "get around to" rotating them. The window matters.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes Developers Make With Environment Variables
&lt;/h2&gt;

&lt;p&gt;This breach shines a light on habits that are surprisingly common in the developer community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Storing secrets as non-sensitive variables "for convenience"&lt;/strong&gt;&lt;br&gt;
The number one mistake. Developers want to be able to read a key back if they forget it. But convenience and security are often in conflict — and this incident is a perfect example of that trade-off going wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Not having MFA on deployment accounts&lt;/strong&gt;&lt;br&gt;
Your Vercel account has access to your production environment. If someone gets into your account without MFA, you have zero friction stopping them. Enable it today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Forgetting to rotate secrets after a team member leaves&lt;/strong&gt;&lt;br&gt;
Environment variables often outlive the person who set them. This is a good moment to audit who set what and when.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Assuming the platform handles everything&lt;/strong&gt;&lt;br&gt;
Vercel is a great platform. But security is a shared responsibility. The platform can only protect what you've told it to protect. Mark things as sensitive. Enable MFA. Review logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Not monitoring third-party OAuth app access&lt;/strong&gt;&lt;br&gt;
The attack originated from a third-party AI tool with Google Workspace OAuth access. Most developers and admins never review connected apps. Now is a great time to audit what has access to your workspace.&lt;/p&gt;




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

&lt;p&gt;The Vercel April 2026 security incident is a useful and important reminder: &lt;strong&gt;no platform is immune, and supply chain attacks are a real and growing threat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The breach didn't come through a Vercel vulnerability. It came through a third-party AI tool, through a Google Workspace OAuth connection, through one employee's account — and that chain was enough to reach production environment variables.&lt;/p&gt;

&lt;p&gt;The good news? Vercel responded quickly, transparently, and in collaboration with industry partners. npm packages are safe. Sensitive variables were not accessed. The team is actively shipping security improvements.&lt;/p&gt;

&lt;p&gt;Your job right now is simple: &lt;strong&gt;rotate your secrets, enable MFA, and mark everything sensitive going forward.&lt;/strong&gt; That's it. Three things. Do them today.&lt;/p&gt;

&lt;p&gt;If this article helped you understand what happened and what to do next, consider sharing it with your team or developer friends — it might save someone a stressful morning.&lt;/p&gt;

&lt;p&gt;For more practical developer content like this, head over to &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; — I write about real-world dev topics, tools, and security updates regularly. 🚀&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Make Your Next.js App Highly SEO Optimized: Metadata, LD+JSON, Google Search Console, Bing &amp; More</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sun, 19 Apr 2026 16:50:08 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/how-to-make-your-nextjs-app-highly-seo-optimized-metadata-ldjson-pro-tips-22ad</link>
      <guid>https://forem.com/hamidrazadev/how-to-make-your-nextjs-app-highly-seo-optimized-metadata-ldjson-pro-tips-22ad</guid>
      <description>&lt;p&gt;So you built a beautiful Next.js app. The UI is clean, the code is smooth, and you're genuinely proud of it. There's just one problem — Google has no idea it exists. 😅&lt;/p&gt;

&lt;p&gt;SEO is one of those things developers push to the end of the to-do list. And that's exactly where a lot of great projects quietly die. No traffic. No visibility. No love.&lt;/p&gt;

&lt;p&gt;The good news? Next.js is one of the most SEO-friendly frameworks out there. But "SEO-friendly" only means something if you set things up right. You need proper metadata, structured data (LD+JSON), a sitemap, a robots file — and then you need to actually tell Google and Bing your site exists.&lt;/p&gt;

&lt;p&gt;That last part is something most tutorials completely skip. Your site doesn't magically appear in search results the moment you deploy. You have to register it, verify ownership, and submit your sitemap. Let's cover everything from start to finish. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does "SEO Optimized" Actually Mean?
&lt;/h2&gt;

&lt;p&gt;SEO stands for Search Engine Optimization. At its core, it means making your website easy for search engines like Google to read, understand, and rank.&lt;/p&gt;

&lt;p&gt;Think of Google as a massive library and Googlebot as the librarian. The librarian crawls every webpage it finds, reads the content, and decides where to file it. SEO is how you help that librarian understand exactly what your page is about and why it deserves a good spot.&lt;/p&gt;

&lt;p&gt;For a Next.js app, this covers four areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical SEO&lt;/strong&gt; — server rendering, page speed, clean HTML structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-page SEO&lt;/strong&gt; — titles, descriptions, headings, canonical URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Data&lt;/strong&gt; — LD+JSON schemas that give Google extra context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovery&lt;/strong&gt; — telling Google and Bing your site exists via Search Console tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next.js handles the technical foundation well. Your job is to build on top of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Your Next.js App
&lt;/h2&gt;

&lt;p&gt;You can have the best product in the world, but if it doesn't appear in search results, it effectively doesn't exist for most users.&lt;/p&gt;

&lt;p&gt;Here's the practical reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organic traffic is free.&lt;/strong&gt; Unlike paid ads, a well-optimized page can bring consistent visitors for months or years at zero cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better rankings mean more trust.&lt;/strong&gt; Users instinctively trust pages that rank higher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO and good UX go hand in hand.&lt;/strong&gt; Fast pages, clean structure, and clear content help both users and crawlers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Career value.&lt;/strong&gt; Developers who understand SEO are significantly more valuable to any team building a public-facing product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building a portfolio, blog, SaaS, or tool — SEO matters from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Setting Up Metadata in Next.js (App Router)
&lt;/h2&gt;

&lt;p&gt;The App Router (Next.js 13+) introduced a clean Metadata API that replaces manually managing &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tags. This is the foundation of all on-page SEO.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Metadata
&lt;/h3&gt;

&lt;p&gt;Export a &lt;code&gt;metadata&lt;/code&gt; object from any &lt;code&gt;page.tsx&lt;/code&gt; or &lt;code&gt;layout.tsx&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;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Metadata&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&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;metadataBase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&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://hamidrazadev.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza — Frontend Developer &amp;amp; Blogger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tutorials, tips, and tools for modern web development.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;keywords&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;Next.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Frontend Development&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Web Dev Blog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&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://hamidrazadev.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="na"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;openGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza — Frontend Developer &amp;amp; Blogger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tutorials, tips, and tools for modern web development.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&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://hamidrazadev.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;siteName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza Dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;images&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;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/og-image.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;630&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza Developer Blog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en_US&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&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;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;summary_large_image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza — Frontend Developer &amp;amp; Blogger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tutorials, tips, and tools for modern web development.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;images&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;/og-image.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hamidrazadev&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;robots&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;follow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;canonical&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://hamidrazadev.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Important:&lt;/strong&gt; Always set &lt;code&gt;metadataBase&lt;/code&gt;. Without it, Next.js can't resolve relative image URLs for Open Graph, and your social previews will break silently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Dynamic Metadata for Blog Posts
&lt;/h3&gt;

&lt;p&gt;For pages like &lt;code&gt;/blog/[slug]&lt;/code&gt;, use &lt;code&gt;generateMetadata()&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;// app/blog/[slug]/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Metadata&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&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateMetadata&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&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;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; — Hamid Raza Dev Blog`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://hamidrazadev.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;openGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://hamidrazadev.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;article&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;publishedTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;authors&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;Hamid Raza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;630&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="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;Every post now gets unique, accurate metadata — automatically. ✅&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding the Google Verification Tag via Metadata
&lt;/h3&gt;

&lt;p&gt;When you verify your site with Google Search Console (covered later), one method is adding a verification meta tag. In Next.js App Router, you can do this directly in your root &lt;code&gt;layout.tsx&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;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...your other metadata&lt;/span&gt;
  &lt;span class="na"&gt;verification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_VERIFICATION_CODE_FROM_GOOGLE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates the &lt;code&gt;&amp;lt;meta name="google-site-verification" content="..."&amp;gt;&lt;/code&gt; tag in your &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; automatically. No manual HTML editing required.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; There's a known quirk in some Next.js versions where the &lt;code&gt;google&lt;/code&gt; property inside &lt;code&gt;verification&lt;/code&gt; doesn't render as expected. If you run into that, use the &lt;code&gt;other&lt;/code&gt; field instead:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;verification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;other&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;google-site-verification&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_VERIFICATION_CODE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both produce the exact same meta tag in your HTML.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Adding LD+JSON Structured Data
&lt;/h2&gt;

&lt;p&gt;Structured data (LD+JSON) is how you speak Google's language. It gives search engines extra context about your content in a machine-readable format — and it can unlock rich results in search: article previews, FAQ dropdowns, breadcrumbs, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reusable JsonLd Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/JsonLd.tsx&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;JsonLdProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;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;JsonLd&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;JsonLdProps&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;script&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;"application/ld+json"&lt;/span&gt;
      &lt;span class="na"&gt;dangerouslySetInnerHTML&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="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&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;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Blog Post Schema (BlogPosting)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/blog/[slug]/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;JsonLd&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/JsonLd&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;BlogPost&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;post&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;schema&lt;/span&gt; &lt;span class="o"&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;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BlogPosting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;datePublished&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dateModified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;author&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;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Person&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&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://hamidrazadev.com&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;publisher&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;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Organization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hamid Raza Dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;logo&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;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ImageObject&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;url&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://hamidrazadev.com/logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;mainEntityOfPage&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;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WebPage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://hamidrazadev.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="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;JsonLd&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;schema&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="cm"&gt;/* blog content */&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Person Schema (for Portfolio Sites)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Person"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hamid Raza"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://hamidrazadev.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Frontend Developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sameAs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://twitter.com/hamidrazadev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/hamidrazadev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://linkedin.com/in/hamidrazadev"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  FAQ Schema (Great for Organic Traffic)
&lt;/h3&gt;

&lt;p&gt;FAQ schemas can appear as expandable dropdowns directly in Google's search results, which dramatically improves click-through rate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FAQPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Question"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is Next.js?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Next.js is a React framework for production-grade web applications with built-in SSR and SSG support."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔧 Always test your structured data using &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google's Rich Results Test&lt;/a&gt; before publishing. A small syntax error can make Google ignore your entire schema silently.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 3: Sitemap and robots.txt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Auto-Generated Sitemap
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/sitemap.ts&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;MetadataRoute&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&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;sitemap&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MetadataRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Sitemap&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&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;getAllPosts&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;url&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://hamidrazadev.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="p"&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="na"&gt;changeFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;monthly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;posts&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;post&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;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://hamidrazadev.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="p"&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;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;changeFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weekly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&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;This auto-generates your sitemap at &lt;code&gt;/sitemap.xml&lt;/code&gt;. Every new post gets included automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  robots.txt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/robots.ts&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;MetadataRoute&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&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;robots&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;MetadataRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Robots&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="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;disallow&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;/api/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/admin/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard/&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;sitemap&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://hamidrazadev.com/sitemap.xml&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 4: Adding Your Site to Google Search Console
&lt;/h2&gt;

&lt;p&gt;This is the step most tutorials skip — and it's arguably the most important. Just having a sitemap isn't enough. You need to register your site with Google so it knows to crawl it, and so you can monitor performance, fix issues, and track which pages are indexed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Go to Google Search Console
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;search.google.com/search-console&lt;/a&gt; and sign in with your Google account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Add a Property
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;"Add Property"&lt;/strong&gt;. You'll see two options:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property Type&lt;/th&gt;
&lt;th&gt;What It Covers&lt;/th&gt;
&lt;th&gt;Verification Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All subdomains, HTTP + HTTPS (e.g., &lt;code&gt;hamidrazadev.com&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;DNS TXT record only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URL Prefix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One specific URL (e.g., &lt;code&gt;https://hamidrazadev.com&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Multiple methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Use the &lt;strong&gt;Domain&lt;/strong&gt; property type. It covers everything under your domain in one place — www, non-www, HTTP, HTTPS, and all subdomains. This gives you a complete picture in one dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Verify Ownership
&lt;/h3&gt;

&lt;p&gt;Google needs to confirm you actually own the site. There are five verification methods:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: DNS TXT Record (Recommended for Domain properties)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google gives you a TXT record that looks like this: &lt;code&gt;google-site-verification=XXXXXXXXXXXXXXX&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Log into your domain provider (Namecheap, GoDaddy, Hostinger, Cloudflare, etc.) and add this as a TXT DNS record. Leave the "Name/Host" field blank or set it to &lt;code&gt;@&lt;/code&gt;. The propagation usually takes a few minutes, but Google says it can sometimes take up to 24–48 hours.&lt;/p&gt;

&lt;p&gt;This is the most reliable method because it doesn't depend on any code in your app. It stays valid even if you rebuild or redeploy your site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: HTML Meta Tag (URL Prefix only)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google gives you a meta tag like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"google-site-verification"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_CODE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Next.js, add this via the &lt;code&gt;verification&lt;/code&gt; field in your root &lt;code&gt;layout.tsx&lt;/code&gt; as shown in Part 1. Google checks for this tag on your homepage and verifies your ownership quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 3: HTML File Upload&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download a small HTML file from Google and upload it to your Next.js &lt;code&gt;/public&lt;/code&gt; folder. The file becomes accessible at &lt;code&gt;https://yourdomain.com/google-site-verification.html&lt;/code&gt;. Google fetches it and verifies you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;/public/googleXXXXXXXXXXX.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 4: Google Analytics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already have Google Analytics 4 installed on your site (using the same Google account), you can verify via that. Google just checks that the GA tracking code is present on your homepage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 5: Google Tag Manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same concept — if GTM is active on your site and your Google account has access, GTM can be used for verification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 You can keep multiple verification methods active at the same time. Many developers use both DNS and the HTML meta tag for redundancy — if one breaks during a deployment, the other keeps verification active.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 4: Submit Your Sitemap
&lt;/h3&gt;

&lt;p&gt;Once verified, go to &lt;strong&gt;Indexing → Sitemaps&lt;/strong&gt; in the left menu. Enter your sitemap URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;https://hamidrazadev.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click &lt;strong&gt;Submit&lt;/strong&gt;. Google will start reading your sitemap and scheduling pages for crawling. You can check back in a day or two to see how many pages were discovered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Use the URL Inspection Tool
&lt;/h3&gt;

&lt;p&gt;This is one of the most useful tools in Google Search Console. You can paste any URL from your site and see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether it's indexed or not&lt;/li&gt;
&lt;li&gt;When Google last crawled it&lt;/li&gt;
&lt;li&gt;What the rendered HTML looks like (after JavaScript runs)&lt;/li&gt;
&lt;li&gt;Whether your structured data was detected correctly&lt;/li&gt;
&lt;li&gt;Any crawl or indexing errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a page isn't indexed yet and you want to speed things up, click &lt;strong&gt;"Request Indexing"&lt;/strong&gt; inside the URL Inspection tool. Google adds that URL to its priority crawl queue. This doesn't guarantee immediate indexing, but it usually cuts the wait from days down to hours for healthy pages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; There's a daily quota on indexing requests. Use it strategically — for new important pages, after major content updates, or after fixing a technical issue.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 5: Adding Your Site to Bing Webmaster Tools
&lt;/h2&gt;

&lt;p&gt;Bing is the world's second-largest search engine and powers searches across DuckDuckGo, Yahoo, and even some ChatGPT web queries. Ignoring Bing means ignoring a portion of your potential audience.&lt;/p&gt;

&lt;p&gt;The good news: if you've already set up Google Search Console, getting into Bing Webmaster Tools is extremely fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Go to Bing Webmaster Tools
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://www.bing.com/webmasters" rel="noopener noreferrer"&gt;bing.com/webmasters&lt;/a&gt; and sign in. You can use a Microsoft account, a Google account, or a Facebook account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Choose How to Add Your Site
&lt;/h3&gt;

&lt;p&gt;Bing gives you two paths right away:&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🚀 Fast Path: Import from Google Search Console&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is by far the easiest and fastest method. Since your site is already verified in GSC, Bing can import it directly — no separate verification needed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Import from Google Search Console"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Continue"&lt;/strong&gt; and sign in with the same Google account that has access to your GSC property&lt;/li&gt;
&lt;li&gt;Grant Bing permission to access your GSC data&lt;/li&gt;
&lt;li&gt;Select the sites you want to import and click &lt;strong&gt;"Import"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Your site is added and automatically verified. Bing also imports your existing sitemaps. It may take up to 48 hours for traffic data to start appearing in the dashboard.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Bing periodically validates your ownership by syncing with your GSC account. If you ever revoke GSC access, you'll need to re-verify using one of the manual methods below.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Manual Path: Add Site Manually&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you'd prefer not to connect your GSC account, you can add the site manually:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter your site URL under &lt;strong&gt;"Add your site manually"&lt;/strong&gt; and click &lt;strong&gt;"Add"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose a verification method&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bing's manual verification methods are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;How It Works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain Connect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bing automatically connects to supported DNS providers (GoDaddy, etc.) and verifies instantly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XML File Upload&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Download an XML file from Bing and upload it to your site's root directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTML Meta Tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add a Bing-specific meta tag to your homepage's &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS TXT / CNAME Record&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add a TXT or CNAME record to your domain's DNS settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The meta tag method is the most practical for Next.js developers. Bing gives you a tag like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"msvalidate.01"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_BING_VERIFICATION_CODE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Next.js, add it to your root &lt;code&gt;layout.tsx&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;verification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;other&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;msvalidate.01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_BING_VERIFICATION_CODE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy, then return to Bing Webmaster Tools and click &lt;strong&gt;"Verify"&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Submit Your Sitemap to Bing
&lt;/h3&gt;

&lt;p&gt;Even if you imported from GSC, it's worth manually confirming your sitemap in Bing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the left sidebar, go to &lt;strong&gt;Sitemaps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Submit sitemap"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your sitemap URL: &lt;code&gt;https://yourdomain.com/sitemap.xml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Submit&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bing will start crawling and indexing your pages from the sitemap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Use the URL Inspection Tool
&lt;/h3&gt;

&lt;p&gt;Just like GSC, Bing Webmaster Tools has a URL Inspection tool. You can check if a specific URL is indexed in Bing, see when it was last crawled, and spot any crawl errors. It also shows whether your page is blocked by robots.txt or has other issues preventing indexing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: IndexNow — Tell Bing About New Pages Instantly
&lt;/h2&gt;

&lt;p&gt;This is a bonus level that most developers don't know about. 👀&lt;/p&gt;

&lt;p&gt;IndexNow is an open protocol that lets you instantly notify search engines when you publish or update content. Instead of waiting for Bingbot to eventually crawl your site on its own schedule, you proactively send a ping saying "hey, this page just changed."&lt;/p&gt;

&lt;p&gt;Currently, IndexNow is supported by Bing, Yandex, DuckDuckGo (via Bing), Naver, Seznam, and Yep. When you submit to one, all participating engines get notified automatically. Google doesn't support IndexNow yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting It Up in Next.js
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Generate an API key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://www.bing.com/indexnow/getstarted" rel="noopener noreferrer"&gt;Bing's IndexNow page&lt;/a&gt; and generate a key. It's a random hex string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Host the key file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.txt&lt;/code&gt; file in your &lt;code&gt;/public&lt;/code&gt; folder named after your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/public/f34f184d10c049ef99aa7637cdc4ef04.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file contents should just be the key itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f34f184d10c049ef99aa7637cdc4ef04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the key accessible at &lt;code&gt;https://yourdomain.com/f34f184d10c049ef99aa7637cdc4ef04.txt&lt;/code&gt;, which proves you own the domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Create a submit utility&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/indexnow.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;INDEXNOW_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INDEXNOW_API_KEY&lt;/span&gt;&lt;span class="o"&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;HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://hamidrazadev.com&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitToIndexNow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.indexnow.org/indexnow&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HOST&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="nx"&gt;INDEXNOW_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;keyLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;INDEXNOW_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;urlList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IndexNow submission failed:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Call it when you publish content&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: after publishing a new blog post&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;submitToIndexNow&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://hamidrazadev.com/blog/my-new-post&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can submit up to 10,000 URLs per day per domain. For most blogs and apps, just calling this whenever you publish or update a page is more than enough.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Store your key in &lt;code&gt;.env.local&lt;/code&gt;&lt;/strong&gt; as &lt;code&gt;INDEXNOW_API_KEY&lt;/code&gt;. Never hardcode it directly in your source files.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 7: Core Web Vitals &amp;amp; Performance Tips
&lt;/h2&gt;

&lt;p&gt;Google uses Core Web Vitals as a direct ranking factor. Here's what matters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LCP (Largest Contentful Paint)&lt;/strong&gt; — how fast the main content loads.&lt;/p&gt;

&lt;p&gt;Always use &lt;code&gt;next/image&lt;/code&gt; and add &lt;code&gt;priority&lt;/code&gt; to your hero image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="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.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;"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="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt; — how much the layout jumps around.&lt;/p&gt;

&lt;p&gt;Always define &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; for images. Reserve space for dynamic content like ads or embeds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INP (Interaction to Next Paint)&lt;/strong&gt; — how quickly the page responds to user input.&lt;/p&gt;

&lt;p&gt;Minimize heavy client-side JavaScript. Use dynamic imports for non-critical components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dynamic&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/dynamic&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;HeavyComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/HeavyComponent&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;ssr&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="na"&gt;loading&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Loading...&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;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Font optimization:&lt;/strong&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;next/font&lt;/code&gt; self-hosts Google Fonts and eliminates render-blocking font requests.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Do: Use semantic HTML.&lt;/strong&gt; One &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; per page. Use &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; properly. Google reads your HTML structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do: Set canonical URLs on every page.&lt;/strong&gt; This prevents duplicate content penalties when your page is accessible via multiple URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do: Write unique titles and descriptions for every page.&lt;/strong&gt; Generic or duplicate metadata is one of the most common SEO mistakes and directly hurts rankings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do: Link internally.&lt;/strong&gt; Every blog post should link to 2–3 related pages on your site. It helps Google understand your content structure and passes authority between pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't: Forget &lt;code&gt;metadataBase&lt;/code&gt; in your root layout.&lt;/strong&gt; Without it, all relative Open Graph image URLs will break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't: Remove your DNS TXT record after verification.&lt;/strong&gt; Google requires it to stay in place permanently. Removing it will de-verify your property.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't: Lazy-load images that are visible on first load.&lt;/strong&gt; Only lazy-load content below the fold. Use &lt;code&gt;priority&lt;/code&gt; for anything above the fold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't: Block important pages in robots.txt by accident.&lt;/strong&gt; Always double-check your &lt;code&gt;disallow&lt;/code&gt; rules before deploying.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Not submitting the sitemap after adding GSC.&lt;/strong&gt;&lt;br&gt;
Verifying your site doesn't automatically tell Google which pages exist. You need to submit &lt;code&gt;/sitemap.xml&lt;/code&gt; separately in the Sitemaps section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using duplicate metadata across all pages.&lt;/strong&gt;&lt;br&gt;
Every page needs a unique title and description. Google can penalize or deprioritize pages with the same metadata as other pages on your site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting &lt;code&gt;metadataBase&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;
All relative Open Graph image paths break silently without it. This is the number one hidden bug in Next.js SEO setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not validating structured data.&lt;/strong&gt;&lt;br&gt;
A small typo in your LD+JSON schema will cause Google to silently ignore it. Always run it through the &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Rich Results Test&lt;/a&gt; before publishing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping Bing entirely.&lt;/strong&gt;&lt;br&gt;
Bing powers DuckDuckGo, Yahoo, and Microsoft Edge search. It also feeds some AI chatbot search results. It only takes five minutes to set up via the GSC import — don't skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requesting indexing too aggressively.&lt;/strong&gt;&lt;br&gt;
There's a daily quota on "Request Indexing" in Google Search Console. Use it for important pages, not every small update. For bulk updates, submit your sitemap instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying without testing verification methods.&lt;/strong&gt;&lt;br&gt;
After adding your Google/Bing verification meta tags to Next.js, deploy and check &lt;code&gt;view-source:yourdomain.com&lt;/code&gt; to confirm the tags are actually rendering in the HTML before you click "Verify" in either console.&lt;/p&gt;




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

&lt;p&gt;Getting your Next.js app properly set up for SEO is a multi-step process — but each step is straightforward when you know what you're doing.&lt;/p&gt;

&lt;p&gt;Here's the full checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Set up Metadata API with titles, descriptions, Open Graph, and Twitter cards&lt;/li&gt;
&lt;li&gt;✅ Add LD+JSON structured data for blog posts, FAQs, and site info&lt;/li&gt;
&lt;li&gt;✅ Generate a dynamic &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Verify your site in Google Search Console (DNS TXT is most reliable)&lt;/li&gt;
&lt;li&gt;✅ Submit your sitemap to Google&lt;/li&gt;
&lt;li&gt;✅ Add to Bing Webmaster Tools — import from GSC for instant setup&lt;/li&gt;
&lt;li&gt;✅ Submit sitemap to Bing too&lt;/li&gt;
&lt;li&gt;✅ Use URL Inspection to check indexing status and request indexing for key pages&lt;/li&gt;
&lt;li&gt;✅ Set up IndexNow to notify Bing about new content instantly&lt;/li&gt;
&lt;li&gt;✅ Optimize Core Web Vitals using &lt;code&gt;next/image&lt;/code&gt;, &lt;code&gt;next/font&lt;/code&gt;, and dynamic imports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is complicated on its own. The trick is doing all of it together. When everything is in place, Google and Bing can find your pages, understand them, and rank them — and that's when the real traffic starts flowing. 🚀&lt;/p&gt;

&lt;p&gt;Got questions or something that helped you? Drop a comment below. And if you want more practical guides like this one, there's a lot more waiting for you at &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — see you there. 😊&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>VS Code Tips and Tricks That Will Seriously Boost Your Developer Experience</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sat, 18 Apr 2026 17:05:31 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/vs-code-tips-and-tricks-that-will-seriously-boost-your-developer-experience-em5</link>
      <guid>https://forem.com/hamidrazadev/vs-code-tips-and-tricks-that-will-seriously-boost-your-developer-experience-em5</guid>
      <description>&lt;p&gt;You open VS Code, stare at your editor, and start typing. Same workflow, same shortcuts, same frustration when something takes longer than it should. Sound familiar? 😅&lt;/p&gt;

&lt;p&gt;VS Code is probably the most popular code editor on the planet right now — and for good reason. It's fast, flexible, and packed with features. But most developers only use maybe 20% of what it actually offers. The other 80%? It's just sitting there, waiting to save you hours every week.&lt;/p&gt;

&lt;p&gt;Whether you've been using VS Code for years or just installed it last week, there are always small tweaks and hidden features that make the experience feel smoother, faster, and honestly — a lot more enjoyable.&lt;/p&gt;

&lt;p&gt;So here's the question: what if your editor could work &lt;em&gt;for&lt;/em&gt; you instead of just being a window you type code into?&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is "Developer Experience" in VS Code?
&lt;/h2&gt;

&lt;p&gt;Developer experience (DX) is exactly what it sounds like — how enjoyable, efficient, and smooth your day-to-day coding feels.&lt;/p&gt;

&lt;p&gt;Think of it like a kitchen. A good kitchen has everything in the right place. Your tools are sharp, the layout makes sense, and you can cook without bumping into stuff. A bad kitchen? You're hunting for utensils, the stove is too far from the sink, and somehow you always burn the pasta.&lt;/p&gt;

&lt;p&gt;VS Code is your kitchen. The tips in this post help you organize it so everything is right where you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Everyday Development
&lt;/h2&gt;

&lt;p&gt;Bad DX kills momentum. When your editor slows you down — slow search, messy file navigation, no snippets, zero shortcuts — you break your flow constantly.&lt;/p&gt;

&lt;p&gt;And flow is everything in development. Once you lose it, getting it back takes time.&lt;/p&gt;

&lt;p&gt;Improving your VS Code setup is not about being fancy. It's about removing friction. When your editor feels natural and responsive, you write better code, debug faster, and ship more confidently.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tips and Tricks That Actually Help 🚀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Master the Command Palette
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;Ctrl + Shift + P&lt;/code&gt; (or &lt;code&gt;Cmd + Shift + P&lt;/code&gt; on Mac). That's it. That's your superpower.&lt;/p&gt;

&lt;p&gt;The Command Palette gives you access to literally every VS Code feature — without touching your mouse. You can open settings, install extensions, run tasks, change themes, and more. If you're not using this daily, you're leaving speed on the table.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Use Multi-Cursor Editing
&lt;/h3&gt;

&lt;p&gt;Need to rename the same variable in five places at once? Don't do it one by one like it's 2005.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Alt + Click&lt;/code&gt; (or &lt;code&gt;Option + Click&lt;/code&gt; on Mac) to place multiple cursors wherever you want.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + D&lt;/code&gt; to select the next occurrence of the highlighted word and edit them all at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This one trick alone can shave serious time off repetitive edits.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Open Files Instantly with Quick Open
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;Ctrl + P&lt;/code&gt; and start typing the filename. VS Code fuzzy-searches your project and opens it almost instantly.&lt;/p&gt;

&lt;p&gt;No folder-diving. No sidebar scrolling. Just type and go. ⚡&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Set Up a Good Font and Theme
&lt;/h3&gt;

&lt;p&gt;This sounds cosmetic, but it genuinely affects how long you can comfortably code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fira Code&lt;/strong&gt; and &lt;strong&gt;JetBrains Mono&lt;/strong&gt; are developer favorites with built-in ligatures (those little symbols where &lt;code&gt;=&amp;gt;&lt;/code&gt; and &lt;code&gt;!==&lt;/code&gt; look cleaner).&lt;/li&gt;
&lt;li&gt;A good dark theme like &lt;strong&gt;One Dark Pro&lt;/strong&gt;, &lt;strong&gt;Catppuccin&lt;/strong&gt;, or &lt;strong&gt;Dracula Official&lt;/strong&gt; reduces eye strain during long sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to settings and enable &lt;code&gt;"editor.fontLigatures": true&lt;/code&gt; if your font supports it.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Create and Use Code Snippets
&lt;/h3&gt;

&lt;p&gt;If you type the same boilerplate code every day, it's time to automate it.&lt;/p&gt;

&lt;p&gt;VS Code lets you create custom snippets. For example, you can type &lt;code&gt;rfc&lt;/code&gt; and have it expand into a full React functional component skeleton instantly.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;File → Preferences → Configure User Snippets&lt;/strong&gt;, pick your language, and add your own. It takes ten minutes to set up and saves you hours over time.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Split Editor and Work in Parallel
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;Ctrl + \&lt;/code&gt; to split your editor into two panels. Now you can have your component file on the left and its CSS on the right. Or your frontend code and API response side by side.&lt;/p&gt;

&lt;p&gt;This is one of those things that sounds small until you actually start using it every day. 👀&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Use the Integrated Terminal Properly
&lt;/h3&gt;

&lt;p&gt;You don't need to leave VS Code to run your commands. Press &lt;code&gt;Ctrl + `&lt;/code&gt; to open the integrated terminal.&lt;/p&gt;

&lt;p&gt;Better yet — you can open &lt;strong&gt;multiple terminals&lt;/strong&gt; at once using the &lt;code&gt;+&lt;/code&gt; button in the terminal panel. One for your dev server, one for Git, one for npm commands. No more Alt-Tabbing between windows.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Enable Auto Save
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;File → Auto Save&lt;/strong&gt; and turn it on. Done.&lt;/p&gt;

&lt;p&gt;You will never again lose changes because you forgot to hit &lt;code&gt;Ctrl + S&lt;/code&gt;. It's one of the simplest but most underrated quality-of-life improvements in VS Code.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Use Peek Definition Instead of Jumping Around
&lt;/h3&gt;

&lt;p&gt;Instead of opening a new file to check a function definition, press &lt;code&gt;Alt + F12&lt;/code&gt;. VS Code shows the definition right inline without leaving your current file.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;F12&lt;/code&gt; if you actually want to navigate to it. Use &lt;code&gt;Ctrl + Click&lt;/code&gt; for the same. But Peek is perfect when you just want a quick look.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. Customize Keyboard Shortcuts
&lt;/h3&gt;

&lt;p&gt;VS Code lets you remap any shortcut to whatever feels natural to you.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;File → Preferences → Keyboard Shortcuts&lt;/strong&gt; and search for any action. If the default shortcut feels awkward, change it. Your setup should match &lt;em&gt;you&lt;/em&gt;, not the other way around.&lt;/p&gt;




&lt;h3&gt;
  
  
  11. Use GitLens Extension for Better Git Workflows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitLens&lt;/strong&gt; is a free extension that supercharges the built-in Git features. It shows you who changed a line and when — right inside the editor, inline.&lt;/p&gt;

&lt;p&gt;No more guessing who wrote that mysterious block of code. You'll know exactly when it was added and why (if the commit message was decent 😄).&lt;/p&gt;




&lt;h3&gt;
  
  
  12. Turn on Bracket Pair Colorization
&lt;/h3&gt;

&lt;p&gt;Deeply nested code is hard to read. VS Code has a built-in feature that colors matching brackets differently so you can instantly see which bracket belongs to which block.&lt;/p&gt;

&lt;p&gt;Enable it in settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"editor.bracketPairColorization.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's a small visual tweak that makes a real difference in readability.&lt;/p&gt;




&lt;h3&gt;
  
  
  13. Use Workspaces for Multi-Project Work
&lt;/h3&gt;

&lt;p&gt;If you're working on multiple related repos, a VS Code Workspace lets you open all of them together in one window with shared settings.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;File → Save Workspace As&lt;/strong&gt; and configure your folders. It keeps everything organized without opening a dozen separate windows.&lt;/p&gt;




&lt;h3&gt;
  
  
  14. Zen Mode for Deep Focus
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;Ctrl + K Z&lt;/code&gt; to enter Zen Mode. Everything disappears — sidebar, status bar, tabs. Just you and your code.&lt;/p&gt;

&lt;p&gt;When you need to focus on a tricky problem without distractions, this mode is genuinely helpful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison: Without vs. With These Tips
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Without the Tips&lt;/th&gt;
&lt;th&gt;With the Tips&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opening a file&lt;/td&gt;
&lt;td&gt;Clicking through the sidebar&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl + P&lt;/code&gt; and done in 1 second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renaming a variable in 10 places&lt;/td&gt;
&lt;td&gt;Edit one by one&lt;/td&gt;
&lt;td&gt;Multi-cursor in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running terminal commands&lt;/td&gt;
&lt;td&gt;Alt-Tab to a separate terminal&lt;/td&gt;
&lt;td&gt;Integrated terminal in the same window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checking a function definition&lt;/td&gt;
&lt;td&gt;Navigating to a different file&lt;/td&gt;
&lt;td&gt;Peek Definition inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracking code changes&lt;/td&gt;
&lt;td&gt;Guessing or checking Git log&lt;/td&gt;
&lt;td&gt;GitLens shows it inline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

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

&lt;ul&gt;
&lt;li&gt;Take 10 minutes to set up custom snippets for your most-used code patterns.&lt;/li&gt;
&lt;li&gt;Learn at least five keyboard shortcuts this week. Just five.&lt;/li&gt;
&lt;li&gt;Install only the extensions you actually need. Don't hoard them.&lt;/li&gt;
&lt;li&gt;Use the Command Palette when you don't know a shortcut — it teaches you shortcuts over time.&lt;/li&gt;
&lt;li&gt;Keep your settings synced across machines using VS Code's built-in Settings Sync.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Don't install 30 extensions and wonder why VS Code is slow.&lt;/li&gt;
&lt;li&gt;Don't ignore the built-in features just because you haven't explored them.&lt;/li&gt;
&lt;li&gt;Don't use your mouse for things a shortcut can do in one keystroke.&lt;/li&gt;
&lt;li&gt;Don't skip font and theme setup — your eyes will thank you during late-night sessions.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Installing too many extensions&lt;/strong&gt;&lt;br&gt;
This is the number one performance killer. Every extension adds a little overhead. Install only what you use regularly. Review and uninstall the ones you haven't touched in months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never touching the settings&lt;/strong&gt;&lt;br&gt;
VS Code's default settings are okay, but they're not optimized for you. Spending 15 minutes in &lt;code&gt;settings.json&lt;/code&gt; can dramatically improve your experience. Things like tab size, word wrap, format on save — these matter daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring keyboard shortcuts&lt;/strong&gt;&lt;br&gt;
Developers who rely entirely on their mouse spend significantly more time on repetitive tasks. You don't need to memorize every shortcut. Start with the ten most useful ones and build from there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not using version control inside VS Code&lt;/strong&gt;&lt;br&gt;
The built-in Source Control panel is actually great. Many beginners jump out to a separate Git client when VS Code already handles staging, committing, and branching quite well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not syncing settings across devices&lt;/strong&gt;&lt;br&gt;
If you work on multiple machines and you're not using Settings Sync, you're setting up VS Code from scratch every time. Turn it on under &lt;strong&gt;Accounts → Settings Sync&lt;/strong&gt; and save yourself the hassle.&lt;/p&gt;




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

&lt;p&gt;VS Code is already a great editor. But with the right setup, it becomes &lt;em&gt;your&lt;/em&gt; editor — one that matches how you think and work.&lt;/p&gt;

&lt;p&gt;You don't need to implement all of these today. Pick three things from this list, try them for a week, and see how they feel. Then add more when you're ready.&lt;/p&gt;

&lt;p&gt;The goal isn't to become a VS Code power user overnight. The goal is to slowly remove the little friction points that interrupt your flow — until coding feels genuinely smooth and enjoyable.&lt;/p&gt;

&lt;p&gt;Because when your tools feel good, your work feels good too.&lt;/p&gt;




&lt;p&gt;If you found this helpful, there's a lot more where this came from. Check out more dev tips, tools breakdowns, and tutorials at &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — a blog built specifically for developers who want to keep leveling up.&lt;/p&gt;

&lt;p&gt;Share this post with a developer friend who's still clicking through their sidebar one folder at a time 😄. And if you've got a VS Code tip that changed your workflow, drop it in the comments — let's build the list together.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vscode</category>
      <category>productivity</category>
      <category>coding</category>
    </item>
    <item>
      <title>From BSOD to Dev Workstation: How I Rebuilt My PC the Right Way (And Learned a Ton Doing It)</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Fri, 17 Apr 2026 04:53:22 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/from-bsod-to-dev-workstation-how-i-rebuilt-my-pc-the-right-way-and-learned-a-ton-doing-it-52lp</link>
      <guid>https://forem.com/hamidrazadev/from-bsod-to-dev-workstation-how-i-rebuilt-my-pc-the-right-way-and-learned-a-ton-doing-it-52lp</guid>
      <description>&lt;p&gt;You know that feeling when your computer is stuck in a loop, crashing over and over, and you're sitting there thinking &lt;em&gt;"why does this exist"&lt;/em&gt;? 😤&lt;/p&gt;

&lt;p&gt;Yeah. That was me. Blue screen. Reboot. Blue screen. Reboot. A cycle of pure suffering.&lt;/p&gt;

&lt;p&gt;But here's the thing — that disaster turned into one of the best learning experiences I've had as a developer. I went from crying over a broken machine to understanding system architecture, disk management, and package management like a proper engineer.&lt;/p&gt;

&lt;p&gt;If you've ever been in that situation — or if you just want to know how to set up a clean, resilient developer workstation from scratch — this one's for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Happened (Phase 1: The Patched Nightmare)
&lt;/h2&gt;

&lt;p&gt;My HP Compaq was stuck in a BSOD loop. The culprit? A "patched" version of Windows 11 that someone had modified to bypass hardware checks.&lt;/p&gt;

&lt;p&gt;It seemed smart at the time. Skip the TPM requirements, skip the Secure Boot checks, save time. Right?&lt;/p&gt;

&lt;p&gt;Wrong.&lt;/p&gt;

&lt;p&gt;Every install attempt crashed with &lt;code&gt;ACPI.sys&lt;/code&gt; errors. Then came the real gut punch: &lt;strong&gt;error 0x80070570&lt;/strong&gt; — which basically means the install files themselves were corrupt. The "shortcut" version of Windows was actually a ticking time bomb.&lt;/p&gt;

&lt;p&gt;Here's the lesson I didn't know I needed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Patched or modified Windows installers are not shortcuts. They are the longest, most painful road to failure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The files are corrupt. The registry gets messy. Drivers behave weirdly. And you will spend 10x more time debugging than you would have spent just doing it right from the start.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Turning Point (Phase 2: The Senior Dev Rebuild)
&lt;/h2&gt;

&lt;p&gt;We stopped chasing quick fixes and decided to do it properly. This is where things actually started moving forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Get a legitimate Windows ISO&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Downloaded a clean Windows 11 ISO directly from Microsoft. No torrents. No "activator" versions. Just the real thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Use Rufus the right way&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rufus.ie/" rel="noopener noreferrer"&gt;Rufus&lt;/a&gt; is a free tool that creates bootable USB drives. But the real magic? It can &lt;strong&gt;bypass TPM 2.0 and Secure Boot requirements&lt;/strong&gt; for older machines — legally and cleanly, without touching the installer itself.&lt;/p&gt;

&lt;p&gt;For older hardware like HP Compaq machines, this is a lifesaver. Rufus handles the bypass at the image level, so the installed Windows stays clean and stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: The nuclear option — diskpart&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the most important step. Before installing Windows, I booted into the installer, opened Command Prompt with &lt;code&gt;Shift + F10&lt;/code&gt;, and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diskpart
list disk
&lt;span class="k"&gt;select &lt;/span&gt;disk 0
clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;clean&lt;/code&gt; command wiped everything off the SSD. Every partition. Every trace of the patched version.&lt;/p&gt;

&lt;p&gt;Starting with a completely clean disk meant no leftover corrupt files, no ghost partitions, no weird driver conflicts. It felt scary at first, but it was exactly the right call.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a Clean Install Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;A lot of people upgrade Windows over an existing install, or they let a patched version "update" itself. Here's why that's a problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corrupt files carry over.&lt;/strong&gt; Old errors don't disappear — they just hide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Driver conflicts build up.&lt;/strong&gt; Especially on HP machines with specific hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The registry becomes a mess.&lt;/strong&gt; Unused entries stack up and slow everything down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security holes stay open.&lt;/strong&gt; Patched installs often disable Windows Defender and other protections silently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clean slate isn't just about speed. It's about having a system you can actually trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  Victory and Optimization (Phase 3: Building the Dev Setup)
&lt;/h2&gt;

&lt;p&gt;Once Windows was installed cleanly, the real work began. A fresh Windows install is just a starting point — not a workstation.&lt;/p&gt;

&lt;h3&gt;
  
  
  🖥️ Drivers: Do It Manually
&lt;/h3&gt;

&lt;p&gt;The first instinct after a fresh install is to grab something like Driver Booster and let it "auto-install everything." Don't.&lt;/p&gt;

&lt;p&gt;Third-party driver tools are notorious for installing outdated or generic drivers that cause more problems than they solve. Instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find your exact hardware model (HP Compaq with Intel HD Graphics 2500 in this case).&lt;/li&gt;
&lt;li&gt;Go to Intel's official website or the HP support page.&lt;/li&gt;
&lt;li&gt;Download the exact driver for your hardware and Windows version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After installing the correct Intel HD Graphics 2500 driver manually, the GPU correctly recognized &lt;strong&gt;1.7GB of shared memory&lt;/strong&gt; — which matters a lot for design work and running modern web UIs smoothly.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ PowerShell 7 + Chocolatey
&lt;/h3&gt;

&lt;p&gt;This is where things got genuinely fun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PowerShell 7&lt;/strong&gt; is a massive upgrade from the default Windows PowerShell. It's cross-platform, faster, and far more capable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chocolatey&lt;/strong&gt; (&lt;code&gt;choco&lt;/code&gt;) is a package manager for Windows — think of it like &lt;code&gt;apt&lt;/code&gt; on Linux or &lt;code&gt;brew&lt;/code&gt; on macOS. Instead of clicking through installer wizards, you install software with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nodejs-lts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vscode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. Clean. No random checkboxes offering you browser toolbars. No manual updates. Just software installed the way developers like it.&lt;/p&gt;

&lt;p&gt;This is one of those tools that, once you start using it, you wonder how you ever lived without it.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Official Installs Only
&lt;/h3&gt;

&lt;p&gt;VS Code and Chrome were installed through their official installers (or Chocolatey), not through sketchy third-party sites. This keeps the Windows registry clean and ensures you're getting the actual software without bundled garbage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Recovery Plan: Lahore-Proofing Your Machine 🛡️
&lt;/h2&gt;

&lt;p&gt;Here's something nobody talks about in Western developer tutorials: &lt;strong&gt;load shedding is real&lt;/strong&gt;, and it will corrupt your Windows install if you're not careful.&lt;/p&gt;

&lt;p&gt;A sudden power cut during a Windows update, a driver install, or even just heavy disk activity can corrupt system files. I've seen it happen. So we built a three-layer protection plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: System Restore Point
&lt;/h3&gt;

&lt;p&gt;A System Restore Point is your "Undo" button. If something breaks after a driver install or a Windows update, you can roll back to this exact moment without losing your files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to create one:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for "Create a restore point" in the Start menu.&lt;/li&gt;
&lt;li&gt;Select your C: drive and click "Configure" → "Turn on system protection."&lt;/li&gt;
&lt;li&gt;Click "Create" and give it a name like "Fresh Setup - Clean Install."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do this right after every major change to your system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: System Image Backup
&lt;/h3&gt;

&lt;p&gt;A System Restore Point is great for small issues. But if your SSD completely fails or gets corrupted beyond repair, you need a full backup.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;System Image&lt;/strong&gt; copies your entire C: drive — Windows, drivers, installed software, settings — onto another drive. Think of it as your "Insurance Policy."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to create one:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Control Panel → Backup and Restore (Windows 7).&lt;/li&gt;
&lt;li&gt;Click "Create a system image."&lt;/li&gt;
&lt;li&gt;Save it to your 250GB HDD (external or secondary drive).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If disaster strikes, you can restore the entire system from this image in minutes instead of hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: Cloud and GitHub Sync
&lt;/h3&gt;

&lt;p&gt;No matter how good your local backups are, they're useless if the whole machine is stolen, flooded, or physically destroyed.&lt;/p&gt;

&lt;p&gt;For a Next.js developer with active projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; for all code. Push regularly. Use private repos for sensitive projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Drive or OneDrive&lt;/strong&gt; for ICS notes, PDFs, and documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code Settings Sync&lt;/strong&gt; (built-in) to back up your extensions and editor config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These three layers mean you can lose the entire machine and be back to full productivity within an hour.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Lessons That Actually Stick
&lt;/h2&gt;

&lt;p&gt;Let's be honest — the best lessons come from the worst experiences. Here's what this whole journey taught me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Shortcuts usually cost you more time, not less.&lt;/strong&gt; The patched Windows was supposed to save 20 minutes. It cost days of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Clean installs are non-negotiable.&lt;/strong&gt; If something is deeply broken, wipe it and start fresh. Fighting corrupt systems is a losing battle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Manual driver installs beat auto-driver tools.&lt;/strong&gt; Know your hardware. Install only what you need, from the official source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Package managers are a superpower.&lt;/strong&gt; Once you start managing software through Chocolatey (or &lt;code&gt;winget&lt;/code&gt;), you'll never go back to clicking through wizard installers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Backups are not optional.&lt;/strong&gt; Especially if you're working in an area with unstable power. One bad outage can ruin weeks of work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 The "right way" isn't the hard way.&lt;/strong&gt; It just feels harder at the start because it's unfamiliar. But it saves you from exponentially bigger problems later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make During Windows Setup
&lt;/h2&gt;

&lt;p&gt;These are the traps that catch most beginners — and some experienced people too:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Using modified or "lite" Windows ISOs.&lt;/strong&gt; They corrupt easily, disable security features, and cause random driver issues. Always use official ISOs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Skipping the disk clean before install.&lt;/strong&gt; Leftover partitions and old files cause weird conflicts. Use &lt;code&gt;diskpart clean&lt;/code&gt; for a true fresh start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Installing every driver with Driver Booster or similar tools.&lt;/strong&gt; These tools inject outdated and generic drivers. Install manually from official sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Skipping system backups because "nothing has gone wrong yet."&lt;/strong&gt; That's exactly when disasters happen — before you're prepared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Installing random software from unverified sites.&lt;/strong&gt; Your registry fills up, startup times increase, and security risks multiply. Use Chocolatey, &lt;code&gt;winget&lt;/code&gt;, or official sites only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Not setting up cloud sync for active projects.&lt;/strong&gt; Local backups are great, but they don't protect against hardware failure or theft. GitHub is free. Use it.&lt;/p&gt;




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

&lt;p&gt;What started as a total disaster — a BSOD loop, corrupt files, and a lot of frustrated emojis — turned into a genuinely valuable learning experience.&lt;/p&gt;

&lt;p&gt;The machine that once couldn't even boot is now a clean, fast, developer-ready workstation. It has proper drivers, a modern terminal, a package manager, and three layers of backup protection built specifically for the power grid realities of Lahore.&lt;/p&gt;

&lt;p&gt;More importantly, the process taught something that no tutorial can rush: &lt;strong&gt;understanding &lt;em&gt;why&lt;/em&gt; each step matters, not just following instructions blindly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your machine is acting up, or if you just want to set up a clean developer environment from scratch, follow the process above. It's not glamorous, but it works — and you'll understand your own system far better for it. 🔧&lt;/p&gt;

&lt;p&gt;Want more practical, no-fluff developer content? Check out &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for more posts like this. And if this helped you, feel free to share it — there's definitely another developer out there stuck in a BSOD loop who needs it. 🚀&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>OpenRouter vs Hugging Face: Which One Should You Actually Use?</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Mon, 13 Apr 2026 07:53:31 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/openrouter-vs-hugging-face-which-one-should-you-actually-use-3o24</link>
      <guid>https://forem.com/hamidrazadev/openrouter-vs-hugging-face-which-one-should-you-actually-use-3o24</guid>
      <description>&lt;p&gt;So you've been exploring AI tools, and now you're staring at two names that keep showing up everywhere — &lt;strong&gt;OpenRouter&lt;/strong&gt; and &lt;strong&gt;Hugging Face&lt;/strong&gt;. Both sound important. Both involve AI models. And both have enough features to make your head spin if you try to compare them too fast.&lt;/p&gt;

&lt;p&gt;Here's the thing though: asking "which one is better" is like asking whether a highway is better than a factory. They're not really competing — they're doing different jobs. But once you understand what each one does, the choice becomes obvious. 😊&lt;/p&gt;

&lt;p&gt;Let's break it all down.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is OpenRouter?
&lt;/h2&gt;

&lt;p&gt;OpenRouter is essentially a &lt;strong&gt;universal API gateway for AI models&lt;/strong&gt;. Think of it like a single remote control that works with every TV in the house.&lt;/p&gt;

&lt;p&gt;Instead of signing up for OpenAI, then Anthropic, then Google, then managing three different API keys, three billing dashboards, and three different code setups — you just use OpenRouter. One API key. One endpoint. Access to models from all of them.&lt;/p&gt;

&lt;p&gt;It uses an OpenAI-compatible API format, which means if you've already written code for GPT-4, switching to Claude or Gemini is just a one-line change.&lt;/p&gt;

&lt;p&gt;It also has a handy &lt;strong&gt;Playground&lt;/strong&gt; where you can send the same prompt to multiple models at once and compare their responses side by side in real time. That alone saves hours of manual testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Hugging Face?
&lt;/h2&gt;

&lt;p&gt;Hugging Face is something much bigger — it's the &lt;strong&gt;GitHub of AI models&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It hosts hundreds of thousands of pre-trained models for text, images, audio, and more. It has community discussions, leaderboards, trending models, research papers, and even compute options for running your own models. It's where developers go to find, explore, test, and download AI models.&lt;/p&gt;

&lt;p&gt;It also provides tools like the &lt;strong&gt;Transformers&lt;/strong&gt; library (one of the most popular ML libraries in the world), datasets, model training notebooks, and infrastructure for deploying your own models.&lt;/p&gt;

&lt;p&gt;If you want to explore the open-source AI ecosystem — Llama variants, Qwen, DeepSeek, fine-tuned niche models — Hugging Face is where you go first.&lt;/p&gt;




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

&lt;p&gt;If you're a developer building an AI-powered app, this decision affects three things directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How fast you ship&lt;/strong&gt; — Managing multiple API integrations slows you down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much you spend&lt;/strong&gt; — Model costs vary wildly across providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much control you have&lt;/strong&gt; — Some use cases need open-source models you can self-host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting this right early saves you from painful refactors later. 🔧&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Differences: OpenRouter vs Hugging Face
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenRouter&lt;/th&gt;
&lt;th&gt;Hugging Face&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary purpose&lt;/td&gt;
&lt;td&gt;Multi-model API gateway&lt;/td&gt;
&lt;td&gt;Model hub &amp;amp; ML ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model access&lt;/td&gt;
&lt;td&gt;Frontier models (GPT, Claude, Gemini, etc.)&lt;/td&gt;
&lt;td&gt;Open-source &amp;amp; community models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API support&lt;/td&gt;
&lt;td&gt;Yes, OpenAI-compatible&lt;/td&gt;
&lt;td&gt;Yes, Inference API + Endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Yes (limited credits)&lt;/td&gt;
&lt;td&gt;Yes (free Inference API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (download &amp;amp; run locally)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community &amp;amp; research&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Very active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;App developers, API users&lt;/td&gt;
&lt;td&gt;Researchers, ML engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;&lt;strong&gt;✅ OpenRouter — Great for App Developers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One API for everything&lt;/strong&gt; — Building a chatbot? You can start with a free open-source model, then upgrade to Claude or GPT-4 for production, all without touching your codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost optimization&lt;/strong&gt; — OpenRouter lets you route to the cheapest provider that meets your latency requirements. Great when you're running thousands of API calls per day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side-by-side model testing&lt;/strong&gt; — Use the Playground to compare Claude 3 vs Gemini 1.5 vs Mistral on your exact use case before committing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal setup&lt;/strong&gt; — If you already know the OpenAI SDK, you're basically already set up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✅ Hugging Face — Great for ML Engineers &amp;amp; Researchers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model discovery&lt;/strong&gt; — Need a small, fast embedding model? A specialized medical NLP model? There are thousands of community-trained models waiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source freedom&lt;/strong&gt; — Download the model, run it on your own server, modify it, fine-tune it. Full control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformers library&lt;/strong&gt; — One of the most used libraries in ML. Works with PyTorch and TensorFlow. Makes loading and running models simple.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference Endpoints&lt;/strong&gt; — Don't want to manage GPU servers yourself? Hugging Face lets you deploy a model with dedicated compute, priced per hour.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  OpenRouter vs Hugging Face: When to Use Which
&lt;/h2&gt;

&lt;p&gt;Here's the honest, practical breakdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use OpenRouter when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building an app and need quick, flexible access to frontier models&lt;/li&gt;
&lt;li&gt;You want to switch between GPT, Claude, Gemini, and others without code changes&lt;/li&gt;
&lt;li&gt;You want cost routing and don't want to manage multiple billing accounts&lt;/li&gt;
&lt;li&gt;You just need a reliable API and don't care about the underlying infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Hugging Face when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to explore or download open-source models&lt;/li&gt;
&lt;li&gt;You're doing ML research or model fine-tuning&lt;/li&gt;
&lt;li&gt;You need a specialized model (text classification, image captioning, speech-to-text, etc.)&lt;/li&gt;
&lt;li&gt;You want full control over the model and your data&lt;/li&gt;
&lt;li&gt;You're building ML pipelines using the Transformers or Datasets libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use both when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to browse and pick a model on Hugging Face, then deploy it via an Inference Endpoint or run it locally with Ollama — while also using OpenRouter to access frontier models in the same app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is actually a very common setup in 2026. They complement each other well.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips for Making the Right Choice
&lt;/h2&gt;

&lt;p&gt;💡 &lt;strong&gt;Start with your use case, not the tool.&lt;/strong&gt; Are you calling AI for text generation in an app? OpenRouter. Training or exploring models? Hugging Face.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Don't overcomplicate early on.&lt;/strong&gt; If you're building your first AI feature, OpenRouter's simplicity wins. Get the app working first.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Check the free tiers first.&lt;/strong&gt; Both platforms have free usage. Test before you commit money.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Think about data privacy.&lt;/strong&gt; If your data is sensitive, open-source models on Hugging Face (run locally) keep data off third-party servers. OpenRouter routes through provider APIs, so understand the data policies of each model.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Use the Playground.&lt;/strong&gt; OpenRouter's side-by-side model testing is genuinely useful when you're trying to pick the right model for a task.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;❌ Treating them as direct competitors&lt;/strong&gt;&lt;br&gt;
They're not. One is an API layer, the other is a model ecosystem. You can absolutely use both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Using Hugging Face's free Inference API in production&lt;/strong&gt;&lt;br&gt;
The free API tier on Hugging Face is for testing, not production workloads. It has rate limits and no uptime guarantees. If you're shipping a product, use Inference Endpoints or a proper provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Assuming OpenRouter hosts its own models&lt;/strong&gt;&lt;br&gt;
It doesn't. OpenRouter is a routing layer — it sends your requests to the actual model providers (OpenAI, Anthropic, Google, etc.). The performance and output you get is from those underlying providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Ignoring costs&lt;/strong&gt;&lt;br&gt;
Model pricing varies a lot across providers. OpenRouter makes this visible and comparable, which is genuinely useful. Always check the pricing page before picking a model for a high-volume use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Not reading the model card on Hugging Face&lt;/strong&gt;&lt;br&gt;
Every model on Hugging Face has a model card explaining its intended use, limitations, and training data. Skipping it is a mistake, especially if you're picking a model for a specific industry or sensitive use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;p&gt;So — which is better?&lt;/p&gt;

&lt;p&gt;Neither. And both. It depends entirely on what you're trying to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt; is your best friend if you're a developer who wants fast, flexible, low-maintenance access to top AI models through a single API. It's clean, practical, and built for shipping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hugging Face&lt;/strong&gt; is your best friend if you want to explore, experiment, research, or run open-source models with full control. It's the world's largest AI model community, and there's nothing else quite like it.&lt;/p&gt;

&lt;p&gt;Most experienced developers end up using both — OpenRouter for production API calls, Hugging Face for model discovery and open-source experimentation.&lt;/p&gt;

&lt;p&gt;Start with the one that fits your current project. You'll probably end up using both eventually. 🚀&lt;/p&gt;




&lt;p&gt;If this helped you think more clearly about your AI tooling setup, check out more practical developer guides at &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt;. There's always something useful brewing there. 😊&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to Use Claude Code with OpenRouter — Run Any AI Model for Free or Cheap 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sun, 12 Apr 2026 07:37:25 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/how-to-use-claude-code-with-openrouter-run-any-ai-model-for-free-or-cheap-3bif</link>
      <guid>https://forem.com/hamidrazadev/how-to-use-claude-code-with-openrouter-run-any-ai-model-for-free-or-cheap-3bif</guid>
      <description>&lt;p&gt;Ever wished you could use Claude Code with models other than just the official Anthropic ones? Maybe you want to try a powerful free model, cut costs, or experiment with something new like NVIDIA's Nemotron?&lt;/p&gt;

&lt;p&gt;Good news — it's totally possible. Claude Code supports custom API base URLs, which means you can point it to &lt;strong&gt;OpenRouter&lt;/strong&gt; and instantly unlock access to dozens of AI models, including free ones. 💡&lt;/p&gt;

&lt;p&gt;In this guide, I'll walk you through the complete setup on &lt;strong&gt;Windows, macOS, and Linux&lt;/strong&gt; — step by step, no fluff.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is OpenRouter?
&lt;/h2&gt;

&lt;p&gt;OpenRouter is a unified API gateway that gives you access to many AI models — from OpenAI and Anthropic to Google, Meta, Mistral, NVIDIA, and more — all through a single API endpoint.&lt;/p&gt;

&lt;p&gt;Think of it like a TV remote that controls every streaming platform. Instead of managing separate API keys for each provider, you get one key that works everywhere.&lt;/p&gt;

&lt;p&gt;Some models on OpenRouter are &lt;strong&gt;completely free&lt;/strong&gt;. Others cost a fraction of what you'd pay directly. It's a great way to experiment without burning through credits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Use Claude Code with OpenRouter?
&lt;/h2&gt;

&lt;p&gt;Claude Code is a powerful AI coding assistant that runs in your terminal. By default, it talks directly to Anthropic's API. But since it supports environment variable overrides, you can redirect it to any OpenAI-compatible endpoint — including OpenRouter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasons you might want to do this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💸 You want to use a &lt;strong&gt;free model&lt;/strong&gt; to save money&lt;/li&gt;
&lt;li&gt;🧪 You want to &lt;strong&gt;experiment&lt;/strong&gt; with different models for different tasks&lt;/li&gt;
&lt;li&gt;🌐 You already have OpenRouter credits and don't want to maintain two separate accounts&lt;/li&gt;
&lt;li&gt;⚡ You want to try newer open-source models like NVIDIA Nemotron, Llama, Qwen, etc.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;p&gt;Before we start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Claude Code installed&lt;/strong&gt; — via &lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;An OpenRouter account&lt;/strong&gt; — sign up free at &lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Your OpenRouter API key&lt;/strong&gt; — get it from the OpenRouter dashboard under "API Keys"&lt;/li&gt;
&lt;li&gt;✅ A model name from OpenRouter you want to use (e.g., &lt;code&gt;nvidia/nemotron-3-super-120b-a12b:free&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where Is the Settings File?
&lt;/h2&gt;

&lt;p&gt;Claude Code reads its configuration from a &lt;code&gt;settings.json&lt;/code&gt; file. Here's where to find it depending on your OS:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operating System&lt;/th&gt;
&lt;th&gt;Settings File Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;C:\Users\&amp;lt;YourUsername&amp;gt;\.claude\settings.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the file doesn't exist yet, just create it. Claude Code will pick it up automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🪟 Windows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Open File Explorer and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;C&lt;/span&gt;:\Users\&amp;lt;YourUsername&amp;gt;\.claude\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;YourUsername&amp;gt;&lt;/code&gt; with your actual Windows username.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; If the &lt;code&gt;.claude&lt;/code&gt; folder doesn't exist, create it manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Inside that folder, open or create &lt;code&gt;settings.json&lt;/code&gt; using Notepad or VS Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Paste the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-openrouter-api-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nvidia/nemotron-3-super-120b-a12b:free"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Replace &lt;code&gt;your-openrouter-api-key-here&lt;/code&gt; with your actual OpenRouter API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Save the file and open a new terminal. Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're done! 🎉&lt;/p&gt;




&lt;h3&gt;
  
  
  🍎 macOS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Open Terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Navigate to the &lt;code&gt;.claude&lt;/code&gt; folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it doesn't exist yet, create it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Open or create the settings file using your preferred editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.claude/settings.json
&lt;span class="c"&gt;# or&lt;/span&gt;
code ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Paste this configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-openrouter-api-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nvidia/nemotron-3-super-120b-a12b:free"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Replace &lt;code&gt;your-openrouter-api-key-here&lt;/code&gt; with your real key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Save and close. Then open a new terminal window and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it for macOS! 🍏&lt;/p&gt;




&lt;h3&gt;
  
  
  🐧 Linux
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Open your terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Navigate to (or create) the &lt;code&gt;.claude&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.claude &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/.claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Create or edit the settings file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.claude/settings.json
&lt;span class="c"&gt;# or&lt;/span&gt;
vim ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Paste the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-openrouter-api-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nvidia/nemotron-3-super-120b-a12b:free"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Replace the API key placeholder with your real OpenRouter key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Save the file. Open a fresh terminal session and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux users, you're set! 🐧&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Configuration Fields
&lt;/h2&gt;

&lt;p&gt;Here's what each field in the config actually does:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tells Claude Code to use OpenRouter's API instead of Anthropic's&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your OpenRouter API key used for authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left empty intentionally — OpenRouter handles auth via the token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The model you want Claude Code to use by default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt; field is where the magic happens. Change this to any model ID from OpenRouter's model list and Claude Code will use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Find Model IDs on OpenRouter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://openrouter.ai/models" rel="noopener noreferrer"&gt;openrouter.ai/models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Browse or search for the model you want&lt;/li&gt;
&lt;li&gt;Click on it to see the model ID&lt;/li&gt;
&lt;li&gt;Copy the full model string (e.g., &lt;code&gt;meta-llama/llama-3.3-70b-instruct:free&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Paste it as the value of &lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Models with &lt;code&gt;:free&lt;/code&gt; at the end are completely free to use — no credits needed. 👀&lt;/p&gt;




&lt;h2&gt;
  
  
  Pros and Cons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Advantages of Using Claude Code with OpenRouter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Access to free models — great for learning and experimenting&lt;/li&gt;
&lt;li&gt;One API key for many models&lt;/li&gt;
&lt;li&gt;Flexibility to switch models without reinstalling anything&lt;/li&gt;
&lt;li&gt;Works with open-source models that Anthropic doesn't offer&lt;/li&gt;
&lt;li&gt;Useful if you're on a budget but still want powerful coding assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Things to Be Aware Of
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not every OpenRouter model is as capable as Claude Sonnet or Opus&lt;/li&gt;
&lt;li&gt;Free models sometimes have rate limits or slower response times&lt;/li&gt;
&lt;li&gt;Some models may not follow Claude Code's system prompts as precisely&lt;/li&gt;
&lt;li&gt;If the model doesn't support tool use well, Claude Code's agentic features may behave unexpectedly&lt;/li&gt;
&lt;/ul&gt;




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

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

&lt;ul&gt;
&lt;li&gt;Always test your setup with a simple prompt first before using it on a real project&lt;/li&gt;
&lt;li&gt;Use free models for low-stakes tasks like drafting, explaining code, or answering questions&lt;/li&gt;
&lt;li&gt;Keep your API key private — never commit &lt;code&gt;settings.json&lt;/code&gt; to a public Git repo&lt;/li&gt;
&lt;li&gt;Check the OpenRouter model card for context window size before using a model on large codebases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;❌ Avoid this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't leave your real API key in shared machines or public repositories&lt;/li&gt;
&lt;li&gt;Don't assume every model will behave exactly like Claude — each model has its own strengths and quirks&lt;/li&gt;
&lt;li&gt;Don't set &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; to your actual Anthropic key when using OpenRouter — it's not needed and might cause confusion&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;1. Wrong API base URL format&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some people accidentally set the URL to &lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;. The correct value is &lt;code&gt;https://openrouter.ai/api&lt;/code&gt; — Claude Code appends &lt;code&gt;/v1/messages&lt;/code&gt; automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Leaving the model name blank or wrong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt; is missing or has a typo, Claude Code may fall back to an unexpected default or throw an error. Always double-check the model ID from OpenRouter's model list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Using an expired or invalid API key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenRouter keys are easy to rotate. If Claude Code starts returning auth errors, go to your OpenRouter dashboard and create a fresh API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Not restarting the terminal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Settings are read when Claude Code starts. If you edit &lt;code&gt;settings.json&lt;/code&gt; while Claude Code is running, the changes won't apply until you restart your terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Committing the settings file to Git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one hurts. Your &lt;code&gt;settings.json&lt;/code&gt; contains your API key. Add &lt;code&gt;.claude/&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; to avoid accidentally pushing it to a public repository.&lt;/p&gt;




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

&lt;p&gt;Setting up Claude Code with OpenRouter is genuinely simple once you know where the settings file lives. A few lines of JSON and you unlock access to a wide range of AI models — including free ones — all from your existing terminal workflow.&lt;/p&gt;

&lt;p&gt;Whether you're on Windows, macOS, or Linux, the process is essentially the same: find the settings file, drop in the config, and you're good to go. 🔧&lt;/p&gt;

&lt;p&gt;The best part? You can switch models anytime just by changing one line. That kind of flexibility is rare and genuinely useful for anyone who codes with AI tools regularly.&lt;/p&gt;

&lt;p&gt;If this guide helped you, I'd love it if you shared it with a fellow developer who's been curious about Claude Code but didn't want to deal with API costs. And if you're looking for more practical dev guides like this, check out 👉 &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — there's a lot more where this came from.&lt;/p&gt;

&lt;p&gt;Happy coding! 😊&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WSL Explained: Why Windows Developers Are Obsessed With It 🐧</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:56:16 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/wsl-explained-why-windows-developers-are-obsessed-with-it-cm7</link>
      <guid>https://forem.com/hamidrazadev/wsl-explained-why-windows-developers-are-obsessed-with-it-cm7</guid>
      <description>&lt;p&gt;Have you ever been a Windows user who secretly envied Linux developers? You know — the ones who casually run a one-liner in the terminal and get everything working in seconds while you're still fighting with PATH variables and permission errors?&lt;/p&gt;

&lt;p&gt;That was the daily reality for a lot of Windows developers. Until WSL came along and changed everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WSL&lt;/strong&gt; — short for &lt;strong&gt;Windows Subsystem for Linux&lt;/strong&gt; — is one of the most genuinely useful tools Microsoft has shipped in years. It lets you run a full Linux environment directly inside Windows, no dual-boot, no virtual machine, no hassle.&lt;/p&gt;

&lt;p&gt;So what exactly is it? Why should you care? And is it really as helpful as people say?&lt;/p&gt;

&lt;p&gt;Let's find out. 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is WSL?
&lt;/h2&gt;

&lt;p&gt;Think of WSL as a translation layer built into Windows. It lets your Windows machine speak "Linux" fluently.&lt;/p&gt;

&lt;p&gt;Here's a simple way to think about it: imagine you're in an English-speaking office, but your best collaborator speaks French. Instead of flying to France or hiring a full-time translator (that's a VM), you install a small translation app on your computer (that's WSL). Now you can communicate instantly without switching desks.&lt;/p&gt;

&lt;p&gt;WSL does the same thing for your system. You can open a terminal, type Linux commands, run Linux tools, and work with Linux file systems — all without leaving Windows.&lt;/p&gt;

&lt;p&gt;There are two versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WSL 1&lt;/strong&gt; — the original, which translates Linux calls into Windows calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WSL 2&lt;/strong&gt; — the current version, which runs a real Linux kernel inside a lightweight virtual machine. It's faster, more compatible, and what most people use today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can install popular distros like Ubuntu, Debian, Kali Linux, or Fedora directly from the Microsoft Store.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why WSL Matters for Developers
&lt;/h2&gt;

&lt;p&gt;Here's a real situation many Windows developers have faced:&lt;/p&gt;

&lt;p&gt;You're following a tutorial. The instructor is on macOS or Linux. They run a command. It works perfectly. You try the same command on Windows. Error. You try the Windows equivalent. Different error. You spend 45 minutes on Stack Overflow. You feel like giving up.&lt;/p&gt;

&lt;p&gt;WSL fixes that.&lt;/p&gt;

&lt;p&gt;Most open-source tools, frameworks, and documentation are written with Linux/macOS in mind. Bash scripts, package managers like &lt;code&gt;apt&lt;/code&gt;, native Node.js and Python setups, Docker, and backend development workflows all behave much more smoothly on Linux.&lt;/p&gt;

&lt;p&gt;With WSL, you get that same smooth experience without leaving Windows. Your files, apps, and everything else stay exactly where they are.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  ✅ Run Linux Commands on Windows
&lt;/h3&gt;

&lt;p&gt;Before WSL, running &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, or shell scripts on Windows required workarounds or third-party tools. Now you just open your Ubuntu terminal in WSL and type them directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A developer automating file renaming across hundreds of files uses a simple Bash one-liner that would take a full PowerShell script to replicate.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ No Dual-Boot Headaches
&lt;/h3&gt;

&lt;p&gt;Setting up dual boot is time-consuming, risky, and annoying to manage. You have to restart your machine every time you want to switch. WSL eliminates that entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A student learning Linux commands for a university course uses WSL on their Windows laptop without ever partitioning their hard drive.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Use Linux Dev Tools Natively
&lt;/h3&gt;

&lt;p&gt;Tools like &lt;code&gt;make&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;vim&lt;/code&gt;, and dozens of others work out of the box in WSL. No emulation, no compatibility layer workarounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A backend developer compiles a C++ project using &lt;code&gt;g++&lt;/code&gt; inside WSL the same way it would work on a Linux server in production.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Faster and Lighter Than a Virtual Machine
&lt;/h3&gt;

&lt;p&gt;Running a full VM like VirtualBox or VMware takes a lot of RAM and CPU. WSL 2 uses a lightweight virtual machine that starts in seconds and uses a fraction of the resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A developer on a mid-range laptop who previously crashed their VM regularly now runs WSL without any performance issues.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Seamless File Access Between Windows and Linux
&lt;/h3&gt;

&lt;p&gt;With WSL, you can access your Windows files from Linux and your Linux files from Windows Explorer. Both systems talk to each other comfortably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You write code in VS Code on Windows, and that code lives in your Linux file system via WSL. Both sides see it perfectly.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Works Great With VS Code
&lt;/h3&gt;

&lt;p&gt;With the &lt;strong&gt;Remote - WSL&lt;/strong&gt; extension in VS Code, you can open a WSL folder in VS Code as if it were a native Linux environment. The editor runs on Windows but the code runs in Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A full-stack developer uses VS Code on Windows with a Node.js project inside WSL. It feels exactly like working on a Linux machine.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Docker Integration
&lt;/h3&gt;

&lt;p&gt;Docker Desktop on Windows integrates directly with WSL 2. This means containers run faster and more reliably compared to the old Hyper-V backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A developer running a multi-container app with Docker Compose sees noticeably faster build times after switching to the WSL 2 backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  WSL vs Full Virtual Machine — What's the Difference?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;WSL 2&lt;/th&gt;
&lt;th&gt;Full VM (VirtualBox / VMware)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup time&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM usage&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File access&lt;/td&gt;
&lt;td&gt;Shared with Windows&lt;/td&gt;
&lt;td&gt;Separate disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installation&lt;/td&gt;
&lt;td&gt;Simple (one command)&lt;/td&gt;
&lt;td&gt;Manual setup needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Near-native&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI support&lt;/td&gt;
&lt;td&gt;Supported (WSLg)&lt;/td&gt;
&lt;td&gt;Full GUI always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Dev work, CLI tools&lt;/td&gt;
&lt;td&gt;Full isolated environments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most developers doing everyday development work, WSL 2 wins easily. A full VM is still useful when you need a completely isolated environment, but for coding, scripts, and tools, WSL is the better choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips for Using WSL
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;💡 Use WSL 2, not WSL 1.&lt;/strong&gt; WSL 2 has better file I/O performance, full system call compatibility, and Docker support. Always prefer it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Store your project files inside the Linux file system.&lt;/strong&gt; When you keep files at &lt;code&gt;/home/yourname/projects&lt;/code&gt; instead of &lt;code&gt;/mnt/c/Users/...&lt;/code&gt;, file operations are significantly faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Install the VS Code Remote - WSL extension.&lt;/strong&gt; It makes working inside WSL feel completely native and comfortable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Use Windows Terminal.&lt;/strong&gt; It's clean, fast, and supports multiple tabs including WSL sessions alongside PowerShell and CMD.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Learn basic Bash.&lt;/strong&gt; Even a small amount of Bash knowledge unlocks a lot of productivity inside WSL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Do:&lt;/strong&gt; Run your dev servers, scripts, and build tools inside WSL for better compatibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚫 Don't:&lt;/strong&gt; Edit files stored in WSL using Windows Explorer directly. Use a proper editor with WSL integration to avoid permission issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚫 Don't:&lt;/strong&gt; Install WSL 1 unless you have a very specific reason. WSL 2 is almost always the better option.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. Storing project files on the Windows side
&lt;/h3&gt;

&lt;p&gt;Many beginners put their projects in &lt;code&gt;C:\Users\...&lt;/code&gt; and then access them from WSL via &lt;code&gt;/mnt/c/...&lt;/code&gt;. This works, but it's slow. The cross-filesystem access between Windows and Linux has overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Move your projects into the Linux file system (&lt;code&gt;/home/username/&lt;/code&gt;) for much better performance.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Forgetting to set WSL 2 as default
&lt;/h3&gt;

&lt;p&gt;After installing WSL, some people skip setting the default version to WSL 2 and end up running WSL 1 without realizing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Run this command once after installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--set-default-version&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Running GUI-heavy workflows without WSLg
&lt;/h3&gt;

&lt;p&gt;Before WSLg (the GUI support layer), Linux GUI apps didn't work inside WSL. Some people still expect this limitation and miss out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; WSL 2 on recent versions of Windows 11 supports GUI Linux apps natively via WSLg. Just make sure your Windows is up to date.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Not using Windows Terminal
&lt;/h3&gt;

&lt;p&gt;Opening WSL through the old Command Prompt window is not a great experience. Some users stick with it and wonder why things feel clunky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Install Windows Terminal from the Microsoft Store. It is free, fast, and makes the whole experience far more enjoyable.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Treating WSL like a toy
&lt;/h3&gt;

&lt;p&gt;Some people install WSL, run a few commands, and then forget about it. They miss the real value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Actually build something with it. Run a server, set up a project, use Docker. Once you feel the difference in your actual workflow, you won't go back.&lt;/p&gt;




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

&lt;p&gt;WSL is one of the best tools a Windows developer can have in their setup today. It closes the gap between Windows and Linux development without making you choose between them.&lt;/p&gt;

&lt;p&gt;You get Linux tools, Linux compatibility, and Linux performance — right inside your Windows machine. No dual boot. No heavy VM. No excuses.&lt;/p&gt;

&lt;p&gt;Whether you're a student learning Linux basics, a frontend developer following tutorials, or a backend engineer running servers locally, WSL makes your workflow smoother, faster, and a lot less frustrating.&lt;/p&gt;

&lt;p&gt;If you haven't tried it yet, give it a shot. You might be surprised how quickly it becomes part of your daily routine. 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want more developer tips and tools explained clearly?&lt;/strong&gt;&lt;br&gt;
Visit &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for more practical blog posts on frontend development, developer productivity, and web tools.&lt;/p&gt;

&lt;p&gt;If this helped you, share it with a fellow developer who's still fighting Windows terminal issues. 😊&lt;/p&gt;

</description>
      <category>linux</category>
      <category>windows</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>VS Code 1.115: The Update That Makes Your Dev Workflow Feel Like Magic 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:12:56 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/vs-code-1115-the-update-that-makes-your-dev-workflow-feel-like-magic-2d03</link>
      <guid>https://forem.com/hamidrazadev/vs-code-1115-the-update-that-makes-your-dev-workflow-feel-like-magic-2d03</guid>
      <description>&lt;p&gt;Ever updated VS Code, glanced at the release notes, and thought &lt;em&gt;"okay that's cool"&lt;/em&gt; — but then kept coding without really digging in? Same. Most of us miss genuinely useful features because the changelog can feel like a wall of text.&lt;/p&gt;

&lt;p&gt;So let's fix that.&lt;/p&gt;

&lt;p&gt;VS Code 1.115 dropped on April 3, 2026, and this one has some really solid improvements — especially if you're working with AI agents, terminals, or remote machines. Whether you're a solo dev or part of a team, there's something in here worth knowing about.&lt;/p&gt;

&lt;p&gt;Let's break it all down in plain English. 👀&lt;/p&gt;




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

&lt;p&gt;VS Code releases updates in rolling cycles, and version 1.115 covers changes made between &lt;strong&gt;March 31 and April 2, 2026&lt;/strong&gt;. These aren't massive rewrites — they're focused, practical improvements that smooth out real developer pain points.&lt;/p&gt;

&lt;p&gt;This release touches four main areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminal improvements&lt;/li&gt;
&lt;li&gt;Agent and chat session upgrades&lt;/li&gt;
&lt;li&gt;Remote SSH support&lt;/li&gt;
&lt;li&gt;UI and browser polish&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;If you're using VS Code's built-in AI agent features, background terminals, or SSH remotes, this update directly improves how you work. The team at Microsoft is clearly doubling down on making AI-assisted development feel less clunky and more natural.&lt;/p&gt;

&lt;p&gt;Even if you're not deep into agents yet, the terminal paste fix alone is worth noting. How many times have you needed to paste an image into a terminal and had to find a workaround? No more.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New in VS Code 1.115
&lt;/h2&gt;

&lt;p&gt;Let's go through each update, grouped by day.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗓️ April 2, 2026
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Test coverage in the minimap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can now enable test coverage indicators directly in the minimap. This is a subtle but useful addition for anyone doing TDD or trying to get a quick visual sense of how well their codebase is covered — without needing to open a separate panel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paste files into the terminal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can now paste files — including images — into the integrated terminal using &lt;code&gt;Ctrl+V&lt;/code&gt;, drag-and-drop, or right-click paste. This is one of those small things that makes a big difference when you're trying to move fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background terminal improvements for agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is big for AI agent workflows. Background terminals now &lt;strong&gt;automatically notify the agent&lt;/strong&gt; when a command finishes, including the exit code and output. Even better — if a background terminal is waiting for user input, VS Code detects that and surfaces it to you.&lt;/p&gt;

&lt;p&gt;Before this, agents could kick off a terminal command and then just... not know what happened. Now there's a proper feedback loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pinch-to-zoom in the integrated browser (Mac)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mac users can now use pinch-to-zoom gestures inside the integrated browser. A small quality-of-life upgrade, but it brings the built-in browser experience closer to a real browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;code serve-web&lt;/code&gt; CLI updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;code serve-web&lt;/code&gt; command now supports three new options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--disable-telemetry&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--default-folder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--default-workspace&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful for teams running VS Code in a web/server context who want more control over the default experience.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗓️ April 1, 2026
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot session entitlements and usage info&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Copilot status bar now shows entitlement and usage information inside &lt;strong&gt;Sessions&lt;/strong&gt;. If you've ever wondered how much of your Copilot quota you've used mid-session, this gives you visibility without leaving your editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH remote support with automatic CLI setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a genuinely useful addition. VS Code can now connect to remote machines over SSH and &lt;strong&gt;automatically install the CLI&lt;/strong&gt; and start it in &lt;strong&gt;agent host mode&lt;/strong&gt;. Previously, you'd need to set things up manually on the remote side. Now it handles it for you.&lt;/p&gt;

&lt;p&gt;For anyone doing remote development — whether on a server, a cloud VM, or a colleague's machine — this removes a real friction point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File edit tracking and restoration in agent sessions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents can now &lt;strong&gt;track and restore file edits&lt;/strong&gt; made during a session. This means you get proper diffs, undo/redo, and state restoration for any changes an agent made.&lt;/p&gt;

&lt;p&gt;This is important. AI-assisted editing is only as trustworthy as your ability to review and reverse it. Now you have the tools to do both.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗓️ March 31, 2026
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Chat can track and link open browser tabs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chat sessions can now track browser tabs that were opened or interacted with during a session. Agents can reference those open pages directly. If you asked an agent to open docs and then want it to pull info from them, this makes that flow work properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;send_to_terminal&lt;/code&gt; tool for agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A new &lt;code&gt;send_to_terminal&lt;/code&gt; tool lets agents send commands to background terminals — with user confirmation. This fixes a known issue where &lt;code&gt;run_in_terminal&lt;/code&gt; with a timeout would push terminals to the background and make them read-only. Now that scenario is handled cleanly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rename agent sessions from the client side&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can now rename agent sessions directly from the client, thanks to a new rename capability in the Agent Host Protocol. Helpful when you're juggling multiple sessions and need to stay organized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Favicons in Go to File quick pick&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open web pages now display their favicons in the &lt;strong&gt;Go to File&lt;/strong&gt; quick pick list. A small visual improvement that makes it easier to identify browser tabs at a glance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison: Before vs. After — Agent Terminal Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Before 1.115&lt;/th&gt;
&lt;th&gt;After 1.115&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent runs background command&lt;/td&gt;
&lt;td&gt;No notification when done&lt;/td&gt;
&lt;td&gt;Agent gets exit code + output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background terminal needs input&lt;/td&gt;
&lt;td&gt;Silently blocked&lt;/td&gt;
&lt;td&gt;Detected and surfaced to user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent sends command to terminal&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;run_in_terminal&lt;/code&gt; timeout issues&lt;/td&gt;
&lt;td&gt;Clean &lt;code&gt;send_to_terminal&lt;/code&gt; with confirmation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH remote setup&lt;/td&gt;
&lt;td&gt;Manual CLI install required&lt;/td&gt;
&lt;td&gt;Auto-installs CLI + starts agent host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you work with agents regularly, this table basically summarizes why 1.115 is a meaningful release.&lt;/p&gt;




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

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

&lt;ul&gt;
&lt;li&gt;Enable test coverage in the minimap if you're writing tests — it's a fast visual cue&lt;/li&gt;
&lt;li&gt;Try the SSH auto-install feature on your next remote dev session instead of setting things up manually&lt;/li&gt;
&lt;li&gt;Review agent session diffs before accepting them — the new restoration feature makes this easier than ever&lt;/li&gt;
&lt;li&gt;Rename your agent sessions so you can find them later&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Ignore background terminal notifications — they're telling you something important&lt;/li&gt;
&lt;li&gt;Skip reviewing file edits made by agents just because undo is now available&lt;/li&gt;
&lt;li&gt;Forget to check your Copilot usage in the Sessions panel if you're on a limited plan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make After a VS Code Update
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skipping the release notes entirely&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most developers install the update and move on. The result? They miss features that could save them hours. You don't need to read everything — but skimming the highlights takes three minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not testing new agent features with real workflows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's easy to read about a feature and think "cool" without actually using it. The background terminal improvements in 1.115 are genuinely useful — but you'll only feel that benefit if you try them in an actual agent session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming remote SSH setup is still manual&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Habits are hard to break. If you've been setting up VS Code CLI manually on every remote machine, you might keep doing it out of muscle memory. The auto-install feature is now available — use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overlooking small UI changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The favicon display in Go to File and the minimap coverage indicators seem minor. But they add up. A cleaner visual workspace means fewer context switches and less cognitive load over a full workday.&lt;/p&gt;




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

&lt;p&gt;VS Code 1.115 is a focused, practical update. It doesn't reinvent the editor — it makes the things you already do smoother, faster, and more reliable.&lt;/p&gt;

&lt;p&gt;The biggest wins here are for developers working with AI agents and remote machines. The background terminal improvements, file edit tracking, and SSH auto-setup are all genuinely useful additions that remove real friction from real workflows.&lt;/p&gt;

&lt;p&gt;If you haven't updated yet, do it. And actually read through the release notes — even just once. You'll find at least one feature that makes you think &lt;em&gt;"wait, that was always the problem I had."&lt;/em&gt; 💡&lt;/p&gt;

&lt;p&gt;For more practical dev content, check out &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — new posts every week on tools, tips, and web development.&lt;/p&gt;

&lt;p&gt;If this post helped you, share it with a developer friend who might be sleeping on these updates. Drop a comment if you found a feature in 1.115 that I didn't cover! 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vscode</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Intersection Observer in JavaScript: Detect When Elements Enter the Screen (Without Breaking a Sweat)</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Tue, 07 Apr 2026 13:14:50 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/intersection-observer-in-javascript-detect-when-elements-enter-the-screen-without-breaking-a-1ilp</link>
      <guid>https://forem.com/hamidrazadev/intersection-observer-in-javascript-detect-when-elements-enter-the-screen-without-breaking-a-1ilp</guid>
      <description>&lt;p&gt;Ever built a webpage and thought, &lt;em&gt;"Wouldn't it be cool if this animation only triggered when the user actually scrolls to it?"&lt;/em&gt; Or maybe you've seen lazy-loaded images on big websites and wondered how they know exactly when to load? 🤔&lt;/p&gt;

&lt;p&gt;That magic has a name: the &lt;strong&gt;Intersection Observer API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you've ever tried to detect element visibility using scroll events and &lt;code&gt;getBoundingClientRect()&lt;/code&gt;, you already know the pain. It works — until your page starts lagging because the browser is calculating positions on every single scroll tick. Not fun.&lt;/p&gt;

&lt;p&gt;Intersection Observer was built to solve exactly that problem. It's clean, efficient, and honestly pretty satisfying to use once it clicks. Let's break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is the Intersection Observer API?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Intersection Observer API&lt;/strong&gt; is a built-in JavaScript browser API that lets you watch when an element enters or exits the viewport (or any scrollable container) — without using scroll events.&lt;/p&gt;

&lt;p&gt;Think of it like a security guard standing at the entrance of a room. Instead of you constantly running to the door to check if someone arrived, the guard simply calls you the moment someone walks in. You don't have to do anything. You just wait for the call.&lt;/p&gt;

&lt;p&gt;In code terms: you tell the browser &lt;em&gt;"hey, watch this element for me"&lt;/em&gt;, and the browser notifies you the moment it becomes visible or hidden. No polling. No performance headaches. Just a clean callback.&lt;/p&gt;




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

&lt;p&gt;Before Intersection Observer existed, developers used scroll event listeners combined with &lt;code&gt;getBoundingClientRect()&lt;/code&gt; to track element positions. It worked, but it had real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt; — scroll events fire extremely fast, dozens of times per second. Running calculations inside them tanks performance on complex pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced reflows&lt;/strong&gt; — calling &lt;code&gt;getBoundingClientRect()&lt;/code&gt; forces the browser to recalculate layout, which is expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messy code&lt;/strong&gt; — handling debouncing, cleanup, and edge cases made the code complicated fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intersection Observer solves all of this. The browser handles the detection natively and efficiently, and your callback only runs when something actually changes. It's the right tool for the job.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lazy loading images&lt;/strong&gt; — Instead of loading all 80 product images on a page at once, you load them only when they're about to appear on screen. Faster initial load, less wasted bandwidth. ⚡&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scroll-triggered animations&lt;/strong&gt; — Cards, text, or UI sections animate in only when the user scrolls to them. Feels polished, costs almost nothing extra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infinite scroll&lt;/strong&gt; — When the last list item enters the viewport, trigger the next page fetch. This is exactly how Twitter and Instagram feeds work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sticky headers and nav highlights&lt;/strong&gt; — Track which section is currently visible and highlight the matching navigation link automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics and ad visibility tracking&lt;/strong&gt; — Know whether a user actually &lt;em&gt;saw&lt;/em&gt; an ad or section, not just whether the page loaded.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these used to require messy scroll handlers. Now they're clean, readable, and fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use It: Basic Syntax
&lt;/h2&gt;

&lt;p&gt;Here's the simplest form of Intersection Observer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Element is visible!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;entry&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="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="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.my-element&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it for the basics. Let's understand what each part does.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Callback
&lt;/h3&gt;

&lt;p&gt;The callback receives an array of &lt;code&gt;entries&lt;/code&gt;. Each entry represents an observed element and includes useful properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;entry.isIntersecting&lt;/code&gt; — &lt;code&gt;true&lt;/code&gt; if the element is currently visible in the viewport.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;entry.target&lt;/code&gt; — the actual DOM element being observed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;entry.intersectionRatio&lt;/code&gt; — how much of the element is visible, from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;entry.boundingClientRect&lt;/code&gt; — the element's size and position.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Options Object
&lt;/h3&gt;

&lt;p&gt;You can pass an options object as the second argument to control behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// null = viewport; or pass a scrollable element&lt;/span&gt;
  &lt;span class="na"&gt;rootMargin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// expand or shrink the detection area&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;      &lt;span class="c1"&gt;// trigger when 50% of the element is visible&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;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;root&lt;/code&gt;&lt;/strong&gt; — The container to check against. &lt;code&gt;null&lt;/code&gt; means the browser viewport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;rootMargin&lt;/code&gt;&lt;/strong&gt; — Like CSS margin, it expands or shrinks the detection zone. &lt;code&gt;"100px"&lt;/code&gt; would trigger 100px before the element actually enters the viewport — great for preloading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;threshold&lt;/code&gt;&lt;/strong&gt; — A value (or array of values) between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt; defining when the callback fires. &lt;code&gt;0&lt;/code&gt; = any pixel visible, &lt;code&gt;1&lt;/code&gt; = fully visible.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Practical Example: Scroll-Triggered Animation
&lt;/h2&gt;

&lt;p&gt;Here's a real, working example you can drop into any project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card fade-in"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello, I animate in! 👋&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card fade-in"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;So do I!&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card fade-in"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Me too!&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.fade-in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.6s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;0.6s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.fade-in.visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JavaScript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;entry&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;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unobserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&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="c1"&gt;// stop watching after animation&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.fade-in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&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;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;observer.unobserve()&lt;/code&gt; call on line 5 is key — once the animation fires, there's no reason to keep watching that element. This keeps things clean and memory-efficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison: Scroll Event vs Intersection Observer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Scroll Event + getBoundingClientRect&lt;/th&gt;
&lt;th&gt;Intersection Observer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Poor on complex pages&lt;/td&gt;
&lt;td&gt;Excellent, native browser optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ease of use&lt;/td&gt;
&lt;td&gt;Complex, lots of boilerplate&lt;/td&gt;
&lt;td&gt;Clean and minimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debouncing needed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Viewport detection&lt;/td&gt;
&lt;td&gt;Manual calculation&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple elements&lt;/td&gt;
&lt;td&gt;Gets messy fast&lt;/td&gt;
&lt;td&gt;Observe as many as you need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser support&lt;/td&gt;
&lt;td&gt;Universal&lt;/td&gt;
&lt;td&gt;All modern browsers ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The scroll event approach isn't &lt;em&gt;wrong&lt;/em&gt; — but for visibility tracking, Intersection Observer is almost always the better choice.&lt;/p&gt;




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

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

&lt;ul&gt;
&lt;li&gt;Always call &lt;code&gt;observer.unobserve(entry.target)&lt;/code&gt; after a one-time action (like triggering an animation) to free up resources.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;rootMargin&lt;/code&gt; for preloading — trigger things slightly before they enter the viewport for a smoother user experience.&lt;/li&gt;
&lt;li&gt;Pass an array of thresholds like &lt;code&gt;[0, 0.25, 0.5, 0.75, 1]&lt;/code&gt; if you need to track how much of an element is visible at different stages.&lt;/li&gt;
&lt;li&gt;Store your observer in a variable so you can call &lt;code&gt;observer.disconnect()&lt;/code&gt; when the component unmounts (especially important in React).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Don't use it for detecting &lt;em&gt;exact pixel positions&lt;/em&gt; in real time — that's still scroll events territory.&lt;/li&gt;
&lt;li&gt;Don't forget to call &lt;code&gt;observer.disconnect()&lt;/code&gt; when you're done. Leaving observers running indefinitely wastes memory.&lt;/li&gt;
&lt;li&gt;Don't set &lt;code&gt;threshold: 1&lt;/code&gt; for large elements that might never be 100% visible on small screens. Your callback will never fire.&lt;/li&gt;
&lt;li&gt;Don't create a new observer instance for each element. One observer can watch many elements at once.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;1. Forgetting to unobserve or disconnect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most common mistake. If you observe 50 elements on a page and never stop watching them, you're holding references and running callbacks unnecessarily. Always clean up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Using threshold: 1 on tall elements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your element is taller than the viewport, it will never be 100% visible — so a threshold of &lt;code&gt;1&lt;/code&gt; means your callback never fires. Use &lt;code&gt;0.1&lt;/code&gt; or &lt;code&gt;0.2&lt;/code&gt; for tall sections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Creating one observer per element&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Wrong way&lt;/span&gt;
&lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Right way&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&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;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One observer, many targets. Cleaner and more efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Not checking &lt;code&gt;isIntersecting&lt;/code&gt; inside the callback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The callback fires both when elements &lt;em&gt;enter&lt;/em&gt; and &lt;em&gt;exit&lt;/em&gt; the viewport. If you don't check &lt;code&gt;entry.isIntersecting&lt;/code&gt;, your logic runs in both cases — which often causes bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Relying on it for critical layout logic without a fallback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern browser support is excellent, but if you're building something that needs to work in very old environments, check &lt;a href="https://caniuse.com/intersectionobserver" rel="noopener noreferrer"&gt;caniuse.com&lt;/a&gt; and consider a polyfill.&lt;/p&gt;




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

&lt;p&gt;The Intersection Observer API is one of those browser features that once you learn, you start seeing use cases everywhere. Lazy loading, animations, infinite scroll, analytics — it handles them all cleanly and efficiently.&lt;/p&gt;

&lt;p&gt;It replaces a whole category of scroll-event spaghetti with just a few lines of readable code. Your users get a smoother experience, your codebase stays clean, and your browser stops crying. Everyone wins. 🚀&lt;/p&gt;

&lt;p&gt;The next time you need to detect element visibility on a page, reach for Intersection Observer first. It was literally built for this.&lt;/p&gt;




&lt;p&gt;Want more practical JavaScript and frontend tips like this? Head over to &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for more posts, tutorials, and guides. If this helped you, share it with a fellow developer — they'll thank you for it. 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Google Stitch: The AI Design Tool Developers Need to Know About in 2026</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Mon, 06 Apr 2026 12:22:39 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/google-stitch-the-ai-design-tool-developers-need-to-know-about-in-2026-2j7m</link>
      <guid>https://forem.com/hamidrazadev/google-stitch-the-ai-design-tool-developers-need-to-know-about-in-2026-2j7m</guid>
      <description>&lt;p&gt;You have an app idea. You know what it should do. You even know roughly what it should look like.&lt;/p&gt;

&lt;p&gt;But then you open a blank Figma file and... &lt;strong&gt;nothing.&lt;/strong&gt; The blank canvas paralysis hits. You spend two hours pushing boxes around, and the result still looks like a college assignment from 2009.&lt;/p&gt;

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

&lt;p&gt;That is exactly the problem &lt;strong&gt;Google Stitch&lt;/strong&gt; was built to fix. It is a free AI-powered UI design tool from Google Labs that lets you describe your interface in plain English—and it generates a polished, production-ready design for you in seconds, complete with real frontend code.&lt;/p&gt;

&lt;p&gt;Whether you are a developer who struggles with design, a designer who wants to move faster, or a founder who needs to prototype an idea without hiring an agency—Stitch might just become your new favorite tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Google Stitch?
&lt;/h2&gt;

&lt;p&gt;Google Stitch is an AI-powered UI design tool developed by Google Labs that transforms text prompts or uploaded wireframes into mobile and web user interface designs. &lt;/p&gt;

&lt;p&gt;It leverages the multimodal power of &lt;strong&gt;Gemini 3 Flash&lt;/strong&gt; and &lt;strong&gt;Gemini 3 Pro&lt;/strong&gt; to create a fluid, integrated workflow between design and development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three Tools in One:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Generator:&lt;/strong&gt; Describe your UI and it creates it visually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Exporter:&lt;/strong&gt; Get clean HTML, CSS, or React (TypeScript) code instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma Bridge:&lt;/strong&gt; Paste your design directly into Figma for further polish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? It’s fully web-based. All you need is a Google account—no installations or environment setup required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Google Stitch Matters for Developers
&lt;/h2&gt;

&lt;p&gt;Most developers are not designers. And that is completely fine—except when you need to ship a product fast and there is no designer on the team. &lt;/p&gt;

&lt;p&gt;Stitch allows anyone to turn natural language into high-fidelity UI designs. For a solo dev, this means going from "I need a dashboard" to a functional layout in under five minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Impact:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero to Hero:&lt;/strong&gt; No Figma expertise? No problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Handoff:&lt;/strong&gt; The "design" is already code. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Massive Speed:&lt;/strong&gt; Cuts design time from days to minutes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Features &amp;amp; Real-Life Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Turn Plain English into Full UI
&lt;/h3&gt;

&lt;p&gt;Describe your application including details like color palettes or user experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;em&gt;"A dark-themed mobile dashboard for a crypto tracking app with a navbar, portfolio card, and price chart using #0a0a0a and #22d3ee accents."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Upload Sketches and Wireframes
&lt;/h3&gt;

&lt;p&gt;Have a whiteboard sketch or a rough screenshot? Upload it. Stitch processes the image to produce a corresponding digital UI, bridging the gap between a napkin sketch and a functional design.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Production-Ready Code
&lt;/h3&gt;

&lt;p&gt;Stitch doesn't just "draw" boxes; it writes them. You can export:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS + React&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard HTML/CSS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript components&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The "Wildcard" Variant Engine
&lt;/h3&gt;

&lt;p&gt;Design is iterative. Use Stitch to generate multiple variants of a single screen instantly. Experiment with layouts, components, and styles without manual dragging and dropping.&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Stitch vs. Traditional Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Google Stitch (AI)&lt;/th&gt;
&lt;th&gt;Traditional Figma Workflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Design Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds (Prompt-based)&lt;/td&gt;
&lt;td&gt;Hours (Manual placement)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skill Floor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (English proficiency)&lt;/td&gt;
&lt;td&gt;High (Design principles/Figma)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev Handoff&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in (Code ready)&lt;/td&gt;
&lt;td&gt;Manual (Inspection/Export)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (Labs)&lt;/td&gt;
&lt;td&gt;Paid (Professional tiers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prototyping, Solo Devs&lt;/td&gt;
&lt;td&gt;Full Design Systems, Large Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Use Google Stitch: Step-by-Step
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Sign In:&lt;/strong&gt; Visit &lt;a href="https://stitch.withgoogle.com" rel="noopener noreferrer"&gt;stitch.withgoogle.com&lt;/a&gt; and log in with your Google account.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Pick Your Mode:&lt;/strong&gt; * &lt;strong&gt;Standard (Gemini 3 Flash):&lt;/strong&gt; Fast, lightweight exploration.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Experimental (Gemini 3 Pro):&lt;/strong&gt; High-fidelity, detailed complex designs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Write a Clear Prompt:&lt;/strong&gt; Include platform (Web/Mobile), core components (Navbar/Cards), and visual style (Minimal/Dark Mode).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Refine &amp;amp; Iterate:&lt;/strong&gt; Use follow-up prompts to change one or two things at a time.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Export:&lt;/strong&gt; Choose between "Paste to Figma" or "Download Code."&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Best Tips for Success 💡
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Be Specific:&lt;/strong&gt; Vague prompts give vague results. Use hex codes and component names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The One-Change Rule:&lt;/strong&gt; Don't ask for a complete overhaul in one prompt. Change the navbar first, then the font, then the colors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use DESIGN.md:&lt;/strong&gt; Export your design system as a &lt;code&gt;.md&lt;/code&gt; file to keep branding consistent across multiple projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Standalone:&lt;/strong&gt; Always run the exported code in a local browser before integrating it into a complex app.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Google Stitch genuinely changes how fast you can go from idea to interface. It’s a game-changer for developers who want to design without becoming a full-time designer.&lt;/p&gt;

&lt;p&gt;It is free, browser-based, and integrates with the tools you already use. There is no reason not to give it a spin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it today:&lt;/strong&gt; &lt;a href="https://stitch.withgoogle.com" rel="noopener noreferrer"&gt;stitch.withgoogle.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this guide was helpful, share it with a dev friend! For more practical tools and frontend guides, head over to &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>uidesign</category>
    </item>
    <item>
      <title>CSS Flexbox Explained: The Layout Superpower Every Developer Needs</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sun, 05 Apr 2026 11:48:13 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/css-flexbox-explained-the-layout-superpower-every-developer-needs-10l</link>
      <guid>https://forem.com/hamidrazadev/css-flexbox-explained-the-layout-superpower-every-developer-needs-10l</guid>
      <description>&lt;p&gt;If you've ever tried to center a div and ended up Googling it for the fifth time this week — welcome, you're in the right place. 😄&lt;/p&gt;

&lt;p&gt;CSS layouts used to be a bit of a nightmare. Floats, clearfixes, &lt;code&gt;position: absolute&lt;/code&gt; hacks — developers had to jump through all sorts of hoops just to align a few boxes. Then Flexbox came along and changed everything.&lt;/p&gt;

&lt;p&gt;Flexbox, short for Flexible Box Layout, is one of the most useful tools in modern CSS. Once you actually &lt;em&gt;understand&lt;/em&gt; it — not just copy-paste it — layouts start feeling almost fun. So let's break it down from scratch and make it click.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Flexbox?
&lt;/h2&gt;

&lt;p&gt;Flexbox is a CSS layout model that helps you arrange elements inside a container — horizontally, vertically, or both — with much less effort than older methods.&lt;/p&gt;

&lt;p&gt;Think of it like a shelf organizer. You have a shelf (the &lt;strong&gt;flex container&lt;/strong&gt;), and you're placing books on it (the &lt;strong&gt;flex items&lt;/strong&gt;). Flexbox lets you decide how those books are spaced out, aligned, and sized — all with a few CSS properties.&lt;/p&gt;

&lt;p&gt;You activate Flexbox with one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The moment you write that, every direct child of &lt;code&gt;.container&lt;/code&gt; becomes a flex item, and Flexbox starts managing them.&lt;/p&gt;




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

&lt;p&gt;Before Flexbox, centering something vertically in CSS was genuinely painful. Developers used margins, transforms, and table-cell tricks just to get a div in the middle of the page.&lt;/p&gt;

&lt;p&gt;Flexbox solved that. It also solved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making equal-height columns without JavaScript&lt;/li&gt;
&lt;li&gt;Building responsive navigation bars&lt;/li&gt;
&lt;li&gt;Distributing space evenly between elements&lt;/li&gt;
&lt;li&gt;Reordering elements without touching the HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, Flexbox is supported in all modern browsers. It's a core skill for frontend developers, and you'll use it in almost every project you build.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;1. Centering made easy ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Centering a div — both horizontally and vertically — used to be a meme in the dev community. With Flexbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's genuinely all you need. Three lines and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Responsive navbars without pain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building a navigation bar that spreads links across the full width? Flexbox handles it naturally with &lt;code&gt;justify-content: space-between&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Equal-height cards automatically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a blog or product listing, cards in the same row have equal height by default when using Flexbox — no extra CSS or JavaScript needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Control direction easily&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Want items stacked vertically? Just change one property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;flex-direction&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;column&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is incredibly useful for mobile layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Reorder items without changing HTML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;order&lt;/code&gt; property lets you visually reorder flex items without touching the markup. Great for responsive design where you want a different layout on mobile vs desktop.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Flexbox Properties You Need to Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  On the Container (Parent)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;display: flex&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Activates Flexbox on the container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex-direction&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Controls which direction items flow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;row&lt;/code&gt; (default) — left to right&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;column&lt;/code&gt; — top to bottom&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;row-reverse&lt;/code&gt; and &lt;code&gt;column-reverse&lt;/code&gt; — reversed directions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;justify-content&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Aligns items along the &lt;strong&gt;main axis&lt;/strong&gt; (horizontal by default).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flex-start&lt;/code&gt; — all items pushed to the start&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flex-end&lt;/code&gt; — all items pushed to the end&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;center&lt;/code&gt; — items centered&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;space-between&lt;/code&gt; — equal space between items, none on edges&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;space-around&lt;/code&gt; — equal space around each item&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;space-evenly&lt;/code&gt; — truly equal space everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;align-items&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Aligns items along the &lt;strong&gt;cross axis&lt;/strong&gt; (vertical by default).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt; — same idea, but vertical&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stretch&lt;/code&gt; (default) — items stretch to fill the container height&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;baseline&lt;/code&gt; — items align by their text baseline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex-wrap&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
By default, flex items stay in one row even if they overflow. &lt;code&gt;flex-wrap: wrap&lt;/code&gt; allows them to jump to the next line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;gap&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Adds space between flex items. Much cleaner than using margins on each item.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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;
  
  
  On the Items (Children)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex-grow&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Defines how much a flex item should grow relative to others if there's extra space. A value of &lt;code&gt;1&lt;/code&gt; means it will grow to fill available space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex-shrink&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Controls how much an item shrinks when there's not enough space. Default is &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex-basis&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Sets the initial size of a flex item before growing or shrinking. Think of it as the "starting width."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;flex&lt;/code&gt; (shorthand)&lt;/strong&gt;&lt;br&gt;
The shorthand for &lt;code&gt;flex-grow&lt;/code&gt;, &lt;code&gt;flex-shrink&lt;/code&gt;, and &lt;code&gt;flex-basis&lt;/code&gt; combined.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* grow: 1, shrink: 1, basis: 0% */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using &lt;code&gt;flex: 1&lt;/code&gt; on all items makes them equal width — super useful for grid-like layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;align-self&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Overrides &lt;code&gt;align-items&lt;/code&gt; for a single item. Want one card to align differently from the rest? This is your property.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;order&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Changes the visual order of a flex item. Default is &lt;code&gt;0&lt;/code&gt;. Lower values appear first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Main Axis vs Cross Axis — The Key Concept
&lt;/h2&gt;

&lt;p&gt;This is where many people get confused, and it's worth taking a moment here.&lt;/p&gt;

&lt;p&gt;Flexbox has two axes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;main axis&lt;/strong&gt; runs in the direction of &lt;code&gt;flex-direction&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;cross axis&lt;/strong&gt; runs perpendicular to it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;flex-direction&lt;/code&gt; is &lt;code&gt;row&lt;/code&gt; (default), the main axis is &lt;strong&gt;horizontal&lt;/strong&gt; and the cross axis is &lt;strong&gt;vertical&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;justify-content&lt;/code&gt; always controls the &lt;strong&gt;main axis&lt;/strong&gt;.&lt;br&gt;
&lt;code&gt;align-items&lt;/code&gt; always controls the &lt;strong&gt;cross axis&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you internalize this, the whole system makes sense. It's not about "horizontal" or "vertical" in absolute terms — it's about &lt;strong&gt;main&lt;/strong&gt; and &lt;strong&gt;cross&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Flexbox vs CSS Grid — Which Should You Use?
&lt;/h2&gt;

&lt;p&gt;This is a common question and the answer is: &lt;strong&gt;they complement each other, not compete&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;Feature&lt;/th&gt;
&lt;th&gt;Flexbox&lt;/th&gt;
&lt;th&gt;CSS Grid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;One-dimensional layouts (row OR column)&lt;/td&gt;
&lt;td&gt;Two-dimensional layouts (rows AND columns)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Navbars, card rows, centering&lt;/td&gt;
&lt;td&gt;Full page layouts, complex grids&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser support&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Simpler to start with&lt;/td&gt;
&lt;td&gt;More powerful for complex layouts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A practical rule: use &lt;strong&gt;Flexbox&lt;/strong&gt; when you're working in one direction. Use &lt;strong&gt;CSS Grid&lt;/strong&gt; when you need rows and columns at the same time. Often you'll use both on the same page.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips for Using Flexbox
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Use &lt;code&gt;gap&lt;/code&gt; instead of margins between items&lt;/strong&gt;&lt;br&gt;
It's cleaner, easier to manage, and doesn't create edge-case spacing issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Remember that &lt;code&gt;justify-content&lt;/code&gt; and &lt;code&gt;align-items&lt;/code&gt; depend on &lt;code&gt;flex-direction&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
When you switch to &lt;code&gt;flex-direction: column&lt;/code&gt;, the axes flip. Many beginners forget this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use &lt;code&gt;flex: 1&lt;/code&gt; for equal-width items&lt;/strong&gt;&lt;br&gt;
Adding &lt;code&gt;flex: 1&lt;/code&gt; to all children in a flex container makes them share space equally — a quick way to create column layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use &lt;code&gt;flex-wrap: wrap&lt;/code&gt; for responsive layouts&lt;/strong&gt;&lt;br&gt;
Without it, items will squish or overflow on small screens. Adding &lt;code&gt;wrap&lt;/code&gt; lets them flow naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Use browser DevTools to debug&lt;/strong&gt;&lt;br&gt;
Chrome and Firefox both have Flexbox inspector tools. They visualize your layout in real time and save a lot of guessing.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;❌ Applying flex properties to the wrong element&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;justify-content&lt;/code&gt; and &lt;code&gt;align-items&lt;/code&gt; go on the &lt;strong&gt;container&lt;/strong&gt;, not the items. Beginners often add them to the wrong element and wonder why nothing changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Forgetting that axes flip with &lt;code&gt;flex-direction: column&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you switch to column direction, &lt;code&gt;justify-content&lt;/code&gt; controls vertical alignment and &lt;code&gt;align-items&lt;/code&gt; controls horizontal. This is the most common source of confusion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Using &lt;code&gt;width: 100%&lt;/code&gt; on flex items unnecessarily&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you set &lt;code&gt;flex: 1&lt;/code&gt; or use &lt;code&gt;flex-grow&lt;/code&gt;, adding &lt;code&gt;width: 100%&lt;/code&gt; can actually break the layout. Trust Flexbox to handle sizing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Overusing Flexbox for two-dimensional layouts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're fighting Flexbox to build a grid layout, CSS Grid is probably the better tool. Don't force a one-dimensional system to do two-dimensional work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❌ Not using &lt;code&gt;flex-wrap&lt;/code&gt; on responsive containers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A common issue — items overflow on mobile because &lt;code&gt;flex-wrap&lt;/code&gt; wasn't set. Always consider wrapping when building for different screen sizes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference Cheat Sheet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Container */&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;row-reverse&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;column-reverse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;flex-end&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;space-between&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;space-around&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;space-evenly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;flex-end&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stretch&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;wrap&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;wrap-reverse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Items */&lt;/span&gt;
&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;              &lt;span class="c"&gt;/* grow, shrink, basis shorthand */&lt;/span&gt;
  &lt;span class="nl"&gt;flex-grow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-basis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Flexbox is one of those tools that feels tricky for the first hour and then becomes second nature forever. The moment it clicks — especially the main axis vs cross axis concept — you'll start seeing layouts differently.&lt;/p&gt;

&lt;p&gt;Once you understand that &lt;code&gt;display: flex&lt;/code&gt; on the parent, &lt;code&gt;justify-content&lt;/code&gt; for the main axis, and &lt;code&gt;align-items&lt;/code&gt; for the cross axis are the three core pillars, the rest falls into place naturally. Everything else is just extra control on top of that foundation.&lt;/p&gt;

&lt;p&gt;Start small. Build a centered card. Then try a navbar. Then a card row that wraps on mobile. Each one teaches you something new.&lt;/p&gt;

&lt;p&gt;And when you're ready to go deeper into CSS, React, Next.js, and modern frontend development, head over to &lt;strong&gt;&lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt;&lt;/strong&gt; — there's a lot more waiting for you there. 🚀&lt;/p&gt;

&lt;p&gt;If this helped you finally understand Flexbox, share it with a dev friend who's still cursing at their layout. They'll thank you later. 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Kali Linux 2026.1 Is Here — And It Brought a Time Machine 🚀</title>
      <dc:creator>Muhammad Hamid Raza</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:27:34 +0000</pubDate>
      <link>https://forem.com/hamidrazadev/kali-linux-20261-is-here-and-it-brought-a-time-machine-4aen</link>
      <guid>https://forem.com/hamidrazadev/kali-linux-20261-is-here-and-it-brought-a-time-machine-4aen</guid>
      <description>&lt;p&gt;Have you ever wished your terminal could look cooler &lt;em&gt;and&lt;/em&gt; feel nostalgic at the same time? Kali Linux just made that happen.&lt;/p&gt;

&lt;p&gt;Kali Linux 2026.1 has officially dropped, and this release is more exciting than your average quarterly update. We are talking a full visual overhaul, a nostalgic surprise for longtime fans, brand new tools, kernel upgrades, and some serious NetHunter improvements.&lt;/p&gt;

&lt;p&gt;Whether you are a penetration tester, a cybersecurity student, or just someone who loves watching their Kali boot screen with a coffee in hand — this release has something for you. So let's break it all down. 👀&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Kali Linux 2026.1?
&lt;/h2&gt;

&lt;p&gt;If you are new here: Kali Linux is a Debian-based Linux distribution built specifically for penetration testing, ethical hacking, digital forensics, and security research. It is maintained by OffSec and is one of the most widely used platforms in the cybersecurity world.&lt;/p&gt;

&lt;p&gt;Every year, the Kali team drops a &lt;strong&gt;xx.1 release&lt;/strong&gt; with a fresh visual theme, new tools, and improvements across the board. The 2026.1 release follows that same tradition — but this time, it comes with a very special birthday gift.&lt;/p&gt;

&lt;p&gt;Kali Linux just turned 13. And BackTrack Linux, Kali's legendary predecessor, just turned 20.&lt;/p&gt;

&lt;p&gt;That is a lot of anniversaries to celebrate. And the team absolutely delivered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Kali Linux 2026.1 Matters
&lt;/h2&gt;

&lt;p&gt;You might be thinking: "It is just a theme update and a few new tools. Why should I care?"&lt;/p&gt;

&lt;p&gt;Fair question. But this release is more than cosmetic.&lt;/p&gt;

&lt;p&gt;Here is why it matters for developers and security professionals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;kernel has been bumped to 6.18&lt;/strong&gt;, bringing better hardware support and performance improvements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8 new tools&lt;/strong&gt; have been added to the repositories — covering areas from XSS scanning to post-exploitation frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NetHunter improvements&lt;/strong&gt; mean mobile pentesting just got more capable on more devices.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;BackTrack Mode&lt;/strong&gt; is not just nostalgia — it shows how far the ecosystem has come and gives veteran users a reason to smile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;183 package updates&lt;/strong&gt; and 25 new packages keep the toolset sharp and current.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are actively using Kali for security work, these are meaningful improvements worth upgrading for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features and What They Actually Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎨 2026 Theme Refresh
&lt;/h3&gt;

&lt;p&gt;Every &lt;code&gt;.1&lt;/code&gt; release comes with a theme refresh, and 2026 is no exception.&lt;/p&gt;

&lt;p&gt;The new theme touches everything: the boot animation, the GRUB menu, the graphical installer, the login screen, and the desktop wallpaper. Kali Purple also gets a matching refresh for those who prefer the purple variant.&lt;/p&gt;

&lt;p&gt;One small but appreciated fix? The boot animation used to get stuck at the tail on live images. That is now fixed, and it loops smoothly if the boot process takes longer than expected. Not a major thing — but anyone who has stared at a frozen boot animation knows the relief.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕹️ BackTrack Mode for Kali-Undercover
&lt;/h3&gt;

&lt;p&gt;This is the most interesting addition in this release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kali-Undercover&lt;/strong&gt; is an existing feature that makes your Kali desktop look like a regular Windows setup — great for working in public without drawing attention.&lt;/p&gt;

&lt;p&gt;Now, Kali-Undercover has a new &lt;strong&gt;BackTrack Mode&lt;/strong&gt; that transforms the desktop to look like &lt;strong&gt;BackTrack 5&lt;/strong&gt; — complete with the original wallpaper, colors, and window theme.&lt;/p&gt;

&lt;p&gt;For those who do not know: BackTrack Linux was the go-to hacking distribution before Kali took over in 2013. It was legendary. Running BackTrack Mode in 2026 is like putting on a retro jersey — functional, stylish, and deeply nostalgic.&lt;/p&gt;

&lt;p&gt;To activate it, you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kali-undercover &lt;span class="nt"&gt;--backtrack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it again to switch back. Simple and clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ 8 New Tools Added
&lt;/h3&gt;

&lt;p&gt;Here is a quick look at what is new in the repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AdaptixC2&lt;/strong&gt; — An extensible post-exploitation and adversarial emulation framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic-Operator&lt;/strong&gt; — Runs Atomic Red Team tests across multiple operating systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fluxion&lt;/strong&gt; — A security auditing and social-engineering research tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GEF&lt;/strong&gt; — A modern GDB experience with advanced debugging capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MetasploitMCP&lt;/strong&gt; — An MCP server for Metasploit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSTImap&lt;/strong&gt; — Automatic SSTI detection with an interactive interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WPProbe&lt;/strong&gt; — Fast WordPress plugin enumeration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XSStrike&lt;/strong&gt; — An advanced XSS scanner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you are testing web apps, running red team exercises, or debugging exploits, these additions cover a wide range of real security scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  📱 Kali NetHunter Updates
&lt;/h3&gt;

&lt;p&gt;Mobile pentesting is alive and well. This release brings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bug fixes including the WPS scan issue, HID permission check, and the back button problem&lt;/li&gt;
&lt;li&gt;A new kernel for &lt;strong&gt;Redmi Note 8 (Ginkgo)&lt;/strong&gt; supporting Android 16&lt;/li&gt;
&lt;li&gt;A libnexmon patch for &lt;strong&gt;Samsung S10 series&lt;/strong&gt; that finally gets reaver, bully, and kismet working properly&lt;/li&gt;
&lt;li&gt;The first working &lt;strong&gt;QCACLD v3.0 injection patch&lt;/strong&gt; — which could potentially unlock wireless injection on a huge number of Qualcomm-based phones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is significant. If you have ever tried to do wireless testing on a Qualcomm phone and hit a wall, this is the patch you have been waiting for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pros and Cons of Upgrading to Kali 2026.1
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅ Pros&lt;/th&gt;
&lt;th&gt;⚠️ Things to Know&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fresh theme and UI across the board&lt;/td&gt;
&lt;td&gt;SDR tools (gr-air-modes, gqrx-sdr) are known to be broken in this release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel 6.18 for better hardware support&lt;/td&gt;
&lt;td&gt;The fix is expected in the next release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 new tools added&lt;/td&gt;
&lt;td&gt;Some packages removed (9 total)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BackTrack Mode for nostalgia fans&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Significant NetHunter improvements&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;183 package updates&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The main known issue is with the &lt;strong&gt;kali-tools-sdr&lt;/strong&gt; metapackage. If you work with Software Defined Radio tools, it might be worth waiting for the next release or using workarounds in the meantime. The team has acknowledged it and expects a fix soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Tips for This Release
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update cleanly.&lt;/strong&gt; If you are on an existing install, use the full upgrade command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; full-upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy the skel config&lt;/strong&gt; after upgrading:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-vrbi&lt;/span&gt; /etc/skel/. ~/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your kernel version&lt;/strong&gt; after upgrading to confirm you are on 6.18.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try BackTrack Mode&lt;/strong&gt; — even if just for the experience. It is a fun piece of cybersecurity history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore the new tools&lt;/strong&gt; — especially XSStrike and SSTImap if you do web security testing.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't use the SDR metapackage&lt;/strong&gt; if you depend on gqrx-sdr or gr-air-modes right now. Wait for the fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't report bugs on social media.&lt;/strong&gt; The team specifically asks that bug reports go through the official bug tracker, not Twitter or Instagram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't skip the skel copy step&lt;/strong&gt; — it updates your config files to match the new theme properly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes People Make When Updating Kali
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Skipping the full-upgrade in favor of just upgrade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt upgrade&lt;/code&gt; and &lt;code&gt;apt full-upgrade&lt;/code&gt; are different. On Kali, you almost always want &lt;code&gt;full-upgrade&lt;/code&gt; because it handles package replacements and removals. Skipping it can leave your system in a mixed state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Not checking for broken packages after upgrading&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After any major upgrade, running &lt;code&gt;apt --fix-broken install&lt;/code&gt; is a good habit. It catches issues before they turn into bigger problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Forgetting to copy the skel files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step updates your terminal profile, desktop config, and theme settings. Skipping it means your desktop might not reflect the new 2026 theme properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Expecting SDR tools to work in this release&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The team was upfront about the GNU Radio ecosystem issue. If you depend on those tools, stay on 2025.4 for now or use a workaround. Patience here saves a lot of frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Using weekly builds as if they are stable releases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Weekly builds are automated. They are great for getting the latest packages fast, but they skip the QA process that standard releases go through. Use them knowing that.&lt;/p&gt;




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

&lt;p&gt;Kali Linux 2026.1 is a solid release that mixes polish with practicality. The 2026 theme refresh keeps the interface modern. The BackTrack Mode is a well-deserved nod to where it all started. The new tools expand the already impressive Kali arsenal. And the NetHunter updates push mobile pentesting forward in meaningful ways.&lt;/p&gt;

&lt;p&gt;Yes, there is a known SDR issue. But the team was honest about it, and a fix is already expected in the next release. That kind of transparency is worth appreciating.&lt;/p&gt;

&lt;p&gt;If you are a Kali user, update when you are ready. If you are new to the platform, this is a great time to start exploring.&lt;/p&gt;

&lt;p&gt;Happy hacking. Stay ethical. And as always — learn something new today. 💡&lt;/p&gt;




&lt;p&gt;👉 &lt;strong&gt;Want more content like this?&lt;/strong&gt; Check out my developer blog at &lt;a href="https://hamidrazadev.com" rel="noopener noreferrer"&gt;hamidrazadev.com&lt;/a&gt; for practical articles on tools, frameworks, and everything developers love to talk about. Share this post with a fellow security enthusiast if it helped you!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cybersecurity</category>
      <category>news</category>
      <category>security</category>
    </item>
  </channel>
</rss>
