<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sohail SJ | TheZenLabs</title>
    <description>The latest articles on DEV Community by Sohail SJ | TheZenLabs (@thesohailjafri).</description>
    <link>https://dev.to/thesohailjafri</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%2F1059623%2F9a72e65c-7f28-4f9e-a4b5-33a8c2d614c0.png</url>
      <title>DEV Community: Sohail SJ | TheZenLabs</title>
      <link>https://dev.to/thesohailjafri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thesohailjafri"/>
    <language>en</language>
    <item>
      <title>n8n VPS Comparison: Hostinger vs Railway vs DigitalOcean vs Render</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Wed, 15 Oct 2025 08:33:42 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/n8n-vps-comparison-hostinger-vs-railway-vs-digitalocean-vs-render-3phn</link>
      <guid>https://dev.to/thesohailjafri/n8n-vps-comparison-hostinger-vs-railway-vs-digitalocean-vs-render-3phn</guid>
      <description>&lt;h2&gt;
  
  
  💡&lt;strong&gt;TL;DR: Quick Decision Guide&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't have time to read 2,500 words? Here's your 60-second decision:&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;Your Situation&lt;/th&gt;
&lt;th&gt;Choose This&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🆕 &lt;strong&gt;Never touched a server before&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;td&gt;$7/mo&lt;/td&gt;
&lt;td&gt;Click-and-done setup, &lt;a href="https://blog.thesohailjafri.me/run-n8n-for-free-in-production-step-by-step-guide" rel="noopener noreferrer"&gt;upgrade from free tier&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎓 &lt;strong&gt;CS student or can follow tutorials&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;Best balance of simplicity + value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💼 &lt;strong&gt;Agency owner or business builder&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$4/mo&lt;/td&gt;
&lt;td&gt;Enterprise-grade reliability, excellent docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💰 &lt;strong&gt;Developer who wants max resources&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;4GB RAM, 50GB storage, full control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Stop Paying 10x More Than You Need To
&lt;/h2&gt;

&lt;p&gt;Here's the reality of n8n pricing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;n8n Cloud:&lt;/strong&gt; $20-100/month with limited executions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;14-day trial ends, then:&lt;/strong&gt; Recurring charges kick in&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The alternative:&lt;/strong&gt; $4-7/month for unlimited workflows on your own server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You could run n8n for an entire year at the cost of one month of n8n Cloud.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After running my free Render instance for 4 months, I hit the wall:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Memory limits crashing complex workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execution delays costing me client trust&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed reliability without breaking the bank. Here's what I discovered: &lt;strong&gt;For as little as $4/month&lt;/strong&gt;, you can run production-ready n8n with 99.9% uptime, zero cold starts, and room to scale.&lt;/p&gt;

&lt;p&gt;I tested 4 different VPS providers over 3 months. Some were incredible value. Others had hidden gotchas that cost me hours of debugging.&lt;/p&gt;

&lt;p&gt;This is your complete guide to choosing the right &lt;strong&gt;$5/month VPS&lt;/strong&gt; for n8n— with honest pros/cons, setup complexity ratings, and when to choose each option.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run n8n for $5/Month — Complete VPS Comparison
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The economics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.thesohailjafri.me/run-n8n-for-free-in-production-step-by-step-guide" rel="noopener noreferrer"&gt;n8n on Free tier&lt;/a&gt; limitations (recap quickly)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;n8n Cloud costs $20-100/month for limited projects (after 14-day trial)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;$5 VPS sweet spot: Reliable + affordable + unlimited&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Growing solopreneurs (5-50 workflows)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Agencies managing multiple clients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Businesses where uptime matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ NOT for: Massive scale (100+ workflows) or mission-critical enterprise&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Comparison Matrix (Arranged by Ease of Use)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Setup Difficulty&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Render&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$7/mo&lt;/td&gt;
&lt;td&gt;0.5GB&lt;/td&gt;
&lt;td&gt;10GB&lt;/td&gt;
&lt;td&gt;⭐ Beginner&lt;/td&gt;
&lt;td&gt;Never touched a server&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Railway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;0.5GB&lt;/td&gt;
&lt;td&gt;⭐⭐ Comfortable&lt;/td&gt;
&lt;td&gt;CS students, tutorial followers&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DigitalOcean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$4/mo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.5GB&lt;/td&gt;
&lt;td&gt;10GB&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ Intermediate&lt;/td&gt;
&lt;td&gt;Working developers, business owners&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hostinger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;td&gt;50GB&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐ Advanced&lt;/td&gt;
&lt;td&gt;Senior devs, DevOps experience&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &amp;lt;mark&amp;gt;Prices as of October 2025&amp;lt;/mark&amp;gt;. Check current pricing before committing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Provider Deeper Dives (Easiest to Most Advanced)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Option 1: Render ($7/month)&lt;/strong&gt; — Zero Server Experience Required
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://render.com/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;Price:&lt;/strong&gt; $7/month (Starter tier)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; 512MB RAM, 0.1 CPU, 10GB storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Time:&lt;/strong&gt; 15 minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; ⭐ Beginner-friendly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who This Is For:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📊 &lt;strong&gt;Marketing managers&lt;/strong&gt; who need automation but aren't developers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🎨 &lt;strong&gt;Designers/creators&lt;/strong&gt; comfortable with no-code tools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🆕 &lt;strong&gt;Complete beginners&lt;/strong&gt; who've never used command line&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💼 &lt;strong&gt;Business owners&lt;/strong&gt; who want to test n8n before scaling&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Render Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;One-click n8n deployment&lt;/strong&gt; (uses official template)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Automatic SSL certificates&lt;/strong&gt; (HTTPS out of the box)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Managed PostgreSQL&lt;/strong&gt; database included&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Easy environment variable management&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Auto-deploys from Git&lt;/strong&gt; (GitOps workflow)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;No billing details needed for trial&lt;/strong&gt; (Credit/Payment Card for paid setup)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Free tier available&lt;/strong&gt; (upgrade path from previous article)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Render Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Most expensive&lt;/strong&gt; option at $7/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Limited resources&lt;/strong&gt; (512MB RAM can be tight)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;No SSH access&lt;/strong&gt; (can't customize server)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Vendor lock-in&lt;/strong&gt; (harder to migrate later)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Handles 15-25 concurrent workflows smoothly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Starts struggling with memory-intensive operations (large CSV processing, AI models)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment speed: ~3-5 minutes for updates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://blog.thesohailjafri.me/run-n8n-for-free-in-production-step-by-step-guide" rel="noopener noreferrer"&gt;&lt;strong&gt;Full Render n8n Setup Guide →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Option 2: Railway ($5/month)&lt;/strong&gt; — For Tutorial Followers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://railway.com/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;Price:&lt;/strong&gt; $5/month (Hobby tier)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to 1GB RAM (shared)&lt;/li&gt;
&lt;li&gt;0.5GB storage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Time:&lt;/strong&gt; 20 minutes&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; ⭐⭐ Moderate (follow step-by-step guides)&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who This Is For:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🎓 &lt;strong&gt;CS students&lt;/strong&gt; or bootcamp grads with basic coding knowledge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;👨‍💻 &lt;strong&gt;Junior developers&lt;/strong&gt; who've worked with deployment before&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 &lt;strong&gt;Self-learners&lt;/strong&gt; comfortable following documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛠️ &lt;strong&gt;Makers/hobbyists&lt;/strong&gt; who've dabbled with Docker or GitHub&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Railway Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Cheapest true platform&lt;/strong&gt; option at $5/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Docker-native&lt;/strong&gt; (run any custom configuration)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Generous free trial&lt;/strong&gt; ($5 credit to test)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Beautiful dashboard&lt;/strong&gt; (best UI of all options)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Built-in PostgreSQL&lt;/strong&gt; with automatic backups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Custom domains&lt;/strong&gt; with free SSL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Environment variable templates&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Railway Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Resource limits can be unclear&lt;/strong&gt; (shared compute)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Billing can be confusing&lt;/strong&gt; (usage-based on top of base $5)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;No SSH access&lt;/strong&gt; to container&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Limited documentation&lt;/strong&gt; for n8n specifically&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Handles 20-30 workflows comfortably&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better resource allocation than Render in my testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cold starts eliminated with always-on instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment speed: ~2-3 minutes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://railway.com/deploy/n8n" rel="noopener noreferrer"&gt;&lt;strong&gt;Full Railway n8n Setup Guide →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Option 3: DigitalOcean ($4/month)&lt;/strong&gt; — For Working Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.digitalocean.com/pricing/droplets" rel="noopener noreferrer"&gt;&lt;strong&gt;Price:&lt;/strong&gt; &lt;strong&gt;$4/month&lt;/strong&gt; (Basic Droplet)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0.5GB RAM&lt;/li&gt;
&lt;li&gt;1 vCPU&lt;/li&gt;
&lt;li&gt;10GB SSD&lt;/li&gt;
&lt;li&gt;500GB Bandwidth&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Time:&lt;/strong&gt; 45-60 minutes&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; ⭐⭐⭐ Intermediate (requires server setup skills)&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who This Is For:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;💼 &lt;strong&gt;Product managers&lt;/strong&gt; with development background&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;👔 &lt;strong&gt;Freelance developers&lt;/strong&gt; managing client projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🏢 &lt;strong&gt;Small business owners&lt;/strong&gt; building reliable infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔧 &lt;strong&gt;Mid-level developers&lt;/strong&gt; (2+ years experience) who've deployed web apps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Industry-standard platform&lt;/strong&gt; (trusted by enterprises)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Best documentation&lt;/strong&gt; (extensive tutorials)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Excellent performance&lt;/strong&gt; (fast SSD, reliable network)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Marketplace apps&lt;/strong&gt; (one-click Docker, monitoring)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Floating IPs&lt;/strong&gt; (easy migration between droplets)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Snapshots &amp;amp; backups&lt;/strong&gt; ($1-2/month) ✅ &lt;strong&gt;Monitoring included&lt;/strong&gt; (CPU, disk, bandwidth)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Huge community&lt;/strong&gt; (tons of n8n guides available)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Requires command line knowledge&lt;/strong&gt; (SSH, Linux basics)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Manual setup&lt;/strong&gt; (no managed n8n option)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Backups cost extra&lt;/strong&gt; (Daily at 30% of Droplet cost)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Billing complexity&lt;/strong&gt; (charges for snapshots, backups, bandwidth)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Learning curve for server management&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rock-solid reliability (99.99% uptime in my testing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blazing fast SSD storage (great for database operations)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handles 10+ workflows without breaking a sweat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Network performance is noticeably better than Hostinger&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.n8n.io/hosting/installation/server-setups/digital-ocean/" rel="noopener noreferrer"&gt;&lt;strong&gt;Full DigitalOcean Setup Guide →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Option 4: Hostinger VPS ($5/month)&lt;/strong&gt; — For Senior Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.hostinger.com/vps-hosting" rel="noopener noreferrer"&gt;&lt;strong&gt;Price:&lt;/strong&gt; $4.99/month (KVM 1 plan, with promo)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4GB RAM&lt;/li&gt;
&lt;li&gt;1 vCPU&lt;/li&gt;
&lt;li&gt;50GB storage&lt;/li&gt;
&lt;li&gt;10TB Bandwidth&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Time:&lt;/strong&gt; 45-60 minutes&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; ⭐⭐⭐⭐ Advanced (full server management required)&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who This Is For:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🎯 &lt;strong&gt;Senior developers&lt;/strong&gt; (5+ years) comfortable with Linux systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚙️ &lt;strong&gt;DevOps engineers&lt;/strong&gt; or those with infrastructure experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🏗️ &lt;strong&gt;System administrators&lt;/strong&gt; migrating from on-premise&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔥 &lt;strong&gt;Performance enthusiasts&lt;/strong&gt; who want maximum control and resources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hostinger Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Best resources&lt;/strong&gt; for the price (4GB RAM!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;50GB storage&lt;/strong&gt; (10x more than Railway/Render)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Full root SSH access&lt;/strong&gt; (complete control)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Traditional VPS&lt;/strong&gt; (install anything you want)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Weekly backups&lt;/strong&gt; included&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;cPanel option&lt;/strong&gt; available (easier management)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hostinger Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Manual setup required&lt;/strong&gt; (no one-click n8n)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;You manage everything&lt;/strong&gt; (OS updates, security, firewall, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Steeper learning curve&lt;/strong&gt; for beginners&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;No managed database&lt;/strong&gt; (you install PostgreSQL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ &lt;strong&gt;Promo pricing&lt;/strong&gt; (renews at $8-10/month after year 1)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Easily handles 40-60 workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full 4GB RAM makes a huge difference for complex automations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can run additional services (database, Redis, monitoring)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Great for growth (won't outgrow it quickly)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hidden Costs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;⚠️ Renewal pricing: $8-10/month after first year&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚠️ Time investment: 5-10 hours/month if you're learning Linux&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.hostinger.com/in/tutorials/how-to-install-n8n" rel="noopener noreferrer"&gt;&lt;strong&gt;Full Hostinger n8n Setup Guide →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Decision Framework: Which One Should YOU Pick?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;"I've never touched a server before"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Render&lt;/strong&gt; ($7/month)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Zero command line required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade smoothly from free tier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Worth the extra $2 for peace of mind&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;"I'm a CS student or can follow step-by-step tutorials"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Railway&lt;/strong&gt; ($5/month)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Best price-to-simplicity ratio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modern platform to learn on&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Great portfolio piece&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;"I'm building a business and need reliability"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;DigitalOcean&lt;/strong&gt; ($4/month)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enterprise-grade infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scales with your needs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;"I want maximum resources and know my way around servers"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;→ &lt;strong&gt;Hostinger&lt;/strong&gt; ($5/month)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;4x the RAM of alternatives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Most bang for buck&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;You don't need expensive n8n Cloud subscriptions to run reliable automation. For $5-7/month, you can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Production-ready infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ 99.9%+ uptime&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Room to scale to 50+ workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Full control over your setup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My personal choice:&lt;/strong&gt; I run DigitalOcean for client work (reliability matters) and Hostinger for personal projects as I purchased 2 years KVM 2 plan from them in July 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your choice&lt;/strong&gt; depends on your experience level and specific needs.&lt;/p&gt;

&lt;p&gt;The best part? You can always start with one provider and migrate later. These aren't life sentences—they're stepping stones in your automation journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop paying 10x more than you need to.&lt;/strong&gt; Pick a provider, follow the guide, and get your $5/month n8n instance running this week.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Coming Soon:&lt;/strong&gt; "Common Issues with Self-Hosting n8n (And How to Avoid Them)"&lt;/p&gt;

&lt;p&gt;In the next article, I'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Webhook configuration pitfalls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL certificate setup mistakes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory management strategies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backup and disaster recovery&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security hardening steps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe to get notified when it drops.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Join the Skool Community&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Want to learn more about n8n fundamentals and pro tricks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my &lt;strong&gt;Skool community&lt;/strong&gt;, you'll get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Advanced n8n architecture templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Pre-built error handling patterns for production workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Cost optimization strategies for when you scale beyond free tiers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Weekly workflow teardowns and automation case studies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Direct access to ask questions and get feedback on your setups&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;500+ automation engineers are already inside. Join them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://link.thesohailjafri.me/join-skool" rel="noopener noreferrer"&gt;&lt;strong&gt;Join the Community (Free) →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Author Bio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sohail Jafri&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Developer &amp;amp; automation enthusiast with 6+ years building production workflows.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>n8nbrightdatachallenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Run n8n for Free in Production - Full Guide</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Sun, 12 Oct 2025 11:45:34 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/run-n8n-for-free-in-production-full-guide-58lg</link>
      <guid>https://dev.to/thesohailjafri/run-n8n-for-free-in-production-full-guide-58lg</guid>
      <description>&lt;p&gt;&lt;strong&gt;💡 TL;DR Quick Answer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You can run n8n for free in production using Render’s free tier and a cron-job to prevent cold starts. This setup supports 5–50 workflows reliably and costs $0/month. Setups take 5-10 mins max.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who This Guide Is For
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let's make sure this is right for you:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Solopreneurs and indie hackers&lt;/strong&gt; watching every dollar&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Developers comfortable with self-hosting&lt;/strong&gt; (you don't need to be an expert, just willing to learn)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Those running 5-50 workflows&lt;/strong&gt; (not enterprise scale... yet)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Someone who is just starting out and ain’t ready to invest yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;NOT for:&lt;/strong&gt; businesses requiring 99.99% uptime SLAs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality check:&lt;/strong&gt; Free doesn't mean zero effort. You're trading money for setup time and technical ownership. But if you're reading this, you're probably fine with that trade-off.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Free n8n Stack Architecture
&lt;/h2&gt;

&lt;p&gt;Here's what we're building:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compute &amp;amp; Database:&lt;/strong&gt; &lt;a href="https://render.com/" rel="noopener noreferrer"&gt;Render.com&lt;/a&gt; (free tier)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep-Alive Service:&lt;/strong&gt; &lt;a href="http://cron-job.org/" rel="noopener noreferrer"&gt;Cron-job.org&lt;/a&gt; (free tier)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Render for Servers?
&lt;/h3&gt;

&lt;p&gt;Render provides a &lt;strong&gt;one-click setup&lt;/strong&gt; for n8n server and includes both free compute and a free PostgreSQL database. No credit card required to get started, and this free self-hosted n8n setup is surprisingly straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Do We Need a Cron Job Service?
&lt;/h3&gt;

&lt;p&gt;Here's the catch with Render's free tier: &lt;strong&gt;the server spins down after 15 minutes of inactivity&lt;/strong&gt;. When a request comes in, it takes 30-60 seconds to spin back up. This means:&lt;/p&gt;

&lt;p&gt;❌ Scheduled workflows might miss their execution window&lt;br&gt;&lt;br&gt;
❌ Webhook responses will be delayed on the first hit&lt;br&gt;&lt;br&gt;
❌ User experience suffers during cold starts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A cron job that pings your server every 10 minutes to keep it warm and running.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="https://cron-job.org/en/" rel="noopener noreferrer"&gt;cron-job.org&lt;/a&gt; because it's dead simple and reliable, but any of these will work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternative cron services you can use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cron-job.org" rel="noopener noreferrer"&gt;EasyCron&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;U&lt;a href="https://cron-job.org" rel="noopener noreferrer"&gt;ptimeRobot&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cron-job.org" rel="noopener noreferrer"&gt;SetCronJo&lt;/a&gt;b&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://Healthchecks.io" rel="noopener noreferrer"&gt;Healthchecks.io&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Let's Start Building!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Setup Your n8n Server on Render
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Sign Up for a Free Render Account for n8n
&lt;/h4&gt;

&lt;p&gt;Navigate to &lt;a href="https://dashboard.render.com/register" rel="noopener noreferrer"&gt;https://dashboard.render.com/register&lt;/a&gt; and sign up for a free account.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Create Your n8n Repository
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the official n8n Render template: &lt;a href="https://github.com/render-examples/n8n" rel="noopener noreferrer"&gt;https://github.com/render-examples/n8n&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;"Use this template"&lt;/strong&gt; → &lt;strong&gt;"Create a new repository"&lt;/strong&gt; in the top right (you need &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;github account&lt;/a&gt; for this)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the form that appears, configure your new repository:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Give it a name (e.g., &lt;code&gt;my-free-n8n-instance&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Public or Private (your preference)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;"Create repository"&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 3: Deploy to Render
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Head back to your Render dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;"New"&lt;/strong&gt; → &lt;strong&gt;"Blueprint"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx900jicxw180kpbrizwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx900jicxw180kpbrizwn.png" width="301" height="484"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under "Connect a repository," click the &lt;strong&gt;"Connect"&lt;/strong&gt; button for the repo you just created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Grant Render access to your GitHub repository if prompted&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 4: Configure Your Blueprint
&lt;/h4&gt;

&lt;p&gt;This opens a Blueprint creation form that lists the resources Render will create from your &lt;code&gt;render.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web Service:&lt;/strong&gt; Your n8n instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PostgreSQL Database:&lt;/strong&gt; For storing workflow data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Provide a &lt;strong&gt;Blueprint Name&lt;/strong&gt; (e.g., "n8n Production")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm you're pulling the correct &lt;strong&gt;Branch&lt;/strong&gt; (usually &lt;code&gt;main&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiobmz8gkv3g82gcsrdec.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiobmz8gkv3g82gcsrdec.webp" width="800" height="954"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;"Deploy Blueprint"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy6u2i5yez1x3no7ktmk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy6u2i5yez1x3no7ktmk.webp" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 5: Wait for Deployment
&lt;/h4&gt;

&lt;p&gt;Render will now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Spin up a PostgreSQL database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy your n8n instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect them automatically&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This takes about 3-5 minutes. You'll see status updates in real-time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 6: Access Your n8n Instance
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Once both resources show as "Available," navigate to your web service's page in the Render Dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your &lt;code&gt;onrender.com&lt;/code&gt; URL appears at the top (e.g., &lt;code&gt;https://your-n8n-abc123.onrender.com&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4yle9nqfe7fj65axlxc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4yle9nqfe7fj65axlxc.webp" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Click this URL&lt;/strong&gt; to access your n8n instance for the first time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Completed the setup and &lt;strong&gt;add free license key&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🎉 &lt;strong&gt;Congratulations!&lt;/strong&gt; You now have a fully functional n8n instance running for free.&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 2: Prevent n8n Server Cold Starts with &lt;a href="http://Cron-job.org" rel="noopener noreferrer"&gt;Cron-job.org&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Now let's prevent your server from going to sleep.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create Your Cron-Job.org Account
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://cron-job.org/" rel="noopener noreferrer"&gt;https://cron-job.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;"Sign up"&lt;/strong&gt; and create a free account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify your email address&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 2: Create Your Keep-Alive Job
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After logging in, click &lt;strong&gt;"Cronjobs"&lt;/strong&gt; → &lt;strong&gt;"Create Cronjob"&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill in the configuration:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Basic Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; &lt;code&gt;n8n Keep Alive&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; Your n8n Render instance URL (e.g., &lt;code&gt;https://your-n8n-abc123.onrender.com&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Schedule Configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Schedule:&lt;/strong&gt; Every 10 minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the cron expression: &lt;code&gt;*/10 * * * *&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or use their visual scheduler to select "Every 10 minutes”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkplhh5kl4rfdnwfi1z4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkplhh5kl4rfdnwfi1z4.png" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;"Create Cronjob"&lt;/strong&gt; → &lt;strong&gt;Done ✅&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Want to learn more?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No fluff. Just battle-tested automation strategies from 6 years of building production systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://link.thesohailjafri.me/join-skool" rel="noopener noreferrer"&gt;&lt;strong&gt;Join the Community →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I run n8n free forever?
&lt;/h3&gt;

&lt;p&gt;Yes, for small to medium workloads within Render free tier limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many workflows can I run on Render free tier?
&lt;/h3&gt;

&lt;p&gt;Approximately 5–50, depending on workflow complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a VPS for production?
&lt;/h3&gt;

&lt;p&gt;Only if your workflows exceed free tier limits or need higher uptime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verification &amp;amp; Testing
&lt;/h2&gt;

&lt;p&gt;Now let's make sure everything works:&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Your n8n Instance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Visit your n8n URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a test workflow with a simple webhook&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trigger it manually&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check that it executes successfully&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Monitor Your Cron Job
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go back to cron-job.org dashboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After 10 minutes, check the "Last execution" status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should see a successful ping (green checkmark)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If it fails, double-check your URL is correct&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Check Server Uptime
&lt;/h3&gt;

&lt;p&gt;Over the next few hours, periodically visit your n8n instance. It should respond quickly without cold start delays.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You've Just Built
&lt;/h2&gt;

&lt;p&gt;Let's recap what you now have:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Production-ready n8n instance&lt;/strong&gt; with PostgreSQL database&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Zero monthly costs&lt;/strong&gt; (completely free)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Unlimited projects/workflow executions&lt;/strong&gt; (within Render's compute limits)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Automated keep-alive system&lt;/strong&gt; to prevent cold starts&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Full control&lt;/strong&gt; over your automation infrastructure&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trade-Offs (Let's Be Honest)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What you're giving up vs n8n Cloud:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;No managed updates&lt;/strong&gt; – You'll need to manually update your n8n version&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;You own uptime&lt;/strong&gt; – If Render has issues, you'll need to troubleshoot&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Free tier compute limits&lt;/strong&gt; – Heavy workflows might hit memory constraints&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Cold starts still possible&lt;/strong&gt; – If the cron job fails, your server sleeps&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you're gaining:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;$564/year saved&lt;/strong&gt; (vs $47/month n8n Cloud for 3 projects)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Unlimited projects&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Unlimited operations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Full technical control&lt;/strong&gt; and learning opportunity&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Easy to upgrade&lt;/strong&gt; when you need more power&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Upgrade to Paid?
&lt;/h2&gt;

&lt;p&gt;You'll know it's time to graduate from the free tier when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[ ] You're running 50+ workflows consistently&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Execution delays start impacting your business&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] You need advanced features like SSO or audit logs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Downtime costs you more than $50/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] You're spending 2+ hours/month on maintenance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, consider either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Upgrading to n8n Cloud&lt;/strong&gt; ($20-100/month) for managed service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Moving to a paid VPS&lt;/strong&gt; ($5-20/month) like &lt;a href="https://www.hostinger.com/" rel="noopener noreferrer"&gt;hostinger&lt;/a&gt; or &lt;a href="http://digitalocean.com/" rel="noopener noreferrer"&gt;digital ocean&lt;/a&gt; for more control with better resources&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Running n8n for free isn't just about saving money—it's about understanding your infrastructure, owning your tools, experimenting and learning what works for your specific use case.&lt;/p&gt;

&lt;p&gt;You now have a production-ready automation setup that costs nothing and gives you complete control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small:&lt;/strong&gt; Migrate one workflow at a time. Test thoroughly. Then scale up as you gain confidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Join the Community
&lt;/h2&gt;

&lt;p&gt;This guide gives you the foundation. In my &lt;strong&gt;Skool community&lt;/strong&gt;, I share:&lt;/p&gt;

&lt;p&gt;✅ Advanced n8n architecture templates&lt;br&gt;&lt;br&gt;
✅ Pre-built error handling patterns for production workflows&lt;br&gt;&lt;br&gt;
✅ Cost optimization strategies for when you scale beyond free tiers&lt;br&gt;&lt;br&gt;
✅ Weekly workflow teardowns and automation case studies&lt;br&gt;&lt;br&gt;
✅ Direct access to ask questions and get feedback on your setups&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No fluff. Just battle-tested automation strategies from 6 years of building production systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://link.thesohailjafri.me/join-skool" rel="noopener noreferrer"&gt;&lt;strong&gt;Join the Community →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions? Stuck on setup?&lt;/strong&gt; Drop a comment below or join the &lt;a href="https://link.thesohailjafri.me/join-skool" rel="noopener noreferrer"&gt;Skool community&lt;/a&gt;—I respond to every question within 24 hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Author Bio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sohail Jafri&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Developer &amp;amp; automation enthusiast with 6+ years building production workflows.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Brutal Truths About Freelancing: Income, Struggles and Relationships</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Mon, 06 Jan 2025 14:43:23 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/brutal-truths-about-freelancing-bhg</link>
      <guid>https://dev.to/thesohailjafri/brutal-truths-about-freelancing-bhg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;: Retro’ing and Debugging 2024.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hey Dev,&lt;/p&gt;

&lt;p&gt;So 2024 was my first year as a freelancer, and let me tell you, it was a rollercoaster ride. I had always dreamed of being my own boss, setting my own hours, and working on projects I was passionate about.&lt;/p&gt;

&lt;p&gt;But the reality of freelancing was far more brutal than I had imagined. From the feast-or-famine income to the isolation struggles, I faced some hard truths about the freelance life.&lt;/p&gt;

&lt;p&gt;But through it all, I learned valuable lessons that have shaped me as a professional and as a person. Lets dive into some of my learnings from the past year.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Freelance Journey in 2024
&lt;/h2&gt;




&lt;h3&gt;
  
  
  The Rollercoaster of Income 🎢💸
&lt;/h3&gt;

&lt;p&gt;Im grateful for the income I earned as a freelancer, as I started earning in college when I was 19. So when college ended, I had a good confidence in my skills and was able to get clients. But the income was never consistent. Some months I was rolling in cash, while others I was scraping by.&lt;/p&gt;

&lt;h4&gt;
  
  
  Few things I learned about managing finances as a freelancer:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Have 2 bank accounts, one for savings and one for expenses.&lt;/li&gt;
&lt;li&gt;Allocate a fixed amount for expenses every month, rest all goes to savings.&lt;/li&gt;
&lt;li&gt;Diversify income streams to reduce the impact of slow months. This could be through different types of projects, passive income streams, or part-time work.&lt;/li&gt;
&lt;li&gt;Plan your expenses in advance.&lt;/li&gt;
&lt;li&gt;Have a emergency fund ready like 6 months of expenses.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Isolation Struggle 🤝🏠
&lt;/h3&gt;

&lt;p&gt;Freelancing can be a lonely profession. I spent hours working alone in my home office, with no one to talk to or bounce ideas off of. It was isolating, especially during busy periods when I was working long hours to meet deadlines.&lt;/p&gt;

&lt;p&gt;But Im grateful for the close friends I have who are in the same field. We would often work together on weekends, share our struggles and successes, and provide support when needed.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to combat loneliness as a freelancer:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Hit GYM or go for a walk.&lt;/li&gt;
&lt;li&gt;Join a co-working space.&lt;/li&gt;
&lt;li&gt;Attend meetups or networking events.&lt;/li&gt;
&lt;li&gt;Opt for in-person meetings with clients.&lt;/li&gt;
&lt;li&gt;Join online communities or forums for freelancers, Btw &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt;
and &lt;a href="https://x.com" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt; are great for this. Say Hi on X &lt;a href="https://x.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Client Relationships and Challenges 🤝⚡
&lt;/h3&gt;

&lt;p&gt;I had my fair share of difficult clients in 2024. Some were demanding, others were slow to pay, and a few were just out t milk every penny out of me. But these experiences taught me valuable lessons about setting boundaries, communicating effectively, and standing up for myself.&lt;/p&gt;

&lt;p&gt;On the flip side, I also had some amazing clients who were a joy to work with. They appreciated my work, paid on time, and treated me with respect.&lt;/p&gt;

&lt;p&gt;These positive experiences made the tough moments worthwhile and reminded me why I chose to freelance in the first place.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to deal with difficult clients:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Set clear expectations from the start.&lt;/li&gt;
&lt;li&gt;Highlight your boundaries and communicate them clearly and assertively.&lt;/li&gt;
&lt;li&gt;Dont be rude, but be firm when necessary when dealing with difficult clients.&lt;/li&gt;
&lt;li&gt;Know when to walk away from a toxic client.&lt;/li&gt;
&lt;li&gt;Keep client in the loop about the progress of the project. Dont ghost them.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Work-Life Balance is a Myth 🏡⚖️
&lt;/h3&gt;

&lt;p&gt;One of the biggest challenges I faced as a freelancer was maintaining a healthy work-life balance.&lt;/p&gt;

&lt;p&gt;When your office is in your home, You work from the same place you relax. It can be hard to switch off at the end of the day and take time for yourself.&lt;/p&gt;

&lt;p&gt;But I learned the importance of setting boundaries and establishing a routine that works for me. I started setting strict work hours, taking regular breaks, and making time for hobbies and self-care.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tips for maintaining work-life balance:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Set a schedule and stick to it.&lt;/li&gt;
&lt;li&gt;Create a dedicated workspace that is separate from your living area.&lt;/li&gt;
&lt;li&gt;Take regular breaks throughout the day. 4hr work, 1hr break.&lt;/li&gt;
&lt;li&gt;Take time off when you need it. You are not AI agent.&lt;/li&gt;
&lt;li&gt;Touch base with friends and family regularly/weekly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Skill Development and Growth 📚🚀
&lt;/h3&gt;

&lt;p&gt;Well this one is constant. I learned a lot of new skills in 2024, from web development to SEO to project management to content creation. I also grew as a person, becoming more confident in my abilities and more resilient in the face of challenges.&lt;/p&gt;

&lt;p&gt;I like to invest my time in learning new things, so I took a few courses from mosh and worked one some open-source projects. I also read a lot of books on freelancing, business, and personal development.&lt;/p&gt;

&lt;h4&gt;
  
  
  Projects I have worked on:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="//https:chakraframer.com"&gt;ChakraFramer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://withsam.in" rel="noopener noreferrer"&gt;With Sam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://asahiramen.in" rel="noopener noreferrer"&gt;Asahi Ramen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mymusicpiechart.com" rel="noopener noreferrer"&gt;My Music Pie Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://monkeyninja.co" rel="noopener noreferrer"&gt;Monkey Ninja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gpacalculate.com" rel="noopener noreferrer"&gt;GPA Calculate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2 Native iOS and Android Apps&lt;/li&gt;
&lt;li&gt;3 CRMs&lt;/li&gt;
&lt;li&gt;and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Best books I read in 2024:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Never Split the Difference by Chris Voss&lt;/li&gt;
&lt;li&gt;Psychology of Money by Morgan Housel&lt;/li&gt;
&lt;li&gt;48 Laws of Power by Robert Greene&lt;/li&gt;
&lt;li&gt;Surrounded by Idiots by Thomas Erikson&lt;/li&gt;
&lt;li&gt;The $100 Startup by Chris Guillebeau&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Looking Ahead to 2025 🎯✨
&lt;/h3&gt;

&lt;p&gt;In 2025, I hope to continue growing my web development agency &lt;a href="https://thezenlabs.in" rel="noopener noreferrer"&gt;TheZenLabs&lt;/a&gt; and growing me personal brand on &lt;a href="https://dev.to/thesohailjafri"&gt;Dev.to&lt;/a&gt;, &lt;a href="https://youtube.com/thesohailjafri" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://instagram.com/thesohailjafri" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; and &lt;a href="https://x.com/thesohailjafri" rel="noopener noreferrer"&gt;X&lt;/a&gt;. I also want to focus on building passive income streams and expanding my network of clients and collaborators.&lt;/p&gt;

&lt;p&gt;Also I would be to expand my skillset by including &lt;code&gt;React-Native&lt;/code&gt; and &lt;code&gt;Docker+Kubernetes&lt;/code&gt; as these will highly compliment my current skillset and make me a whole software development agency itself 😆.&lt;/p&gt;

&lt;p&gt;But most importantly, I want to continue learning, growing, and challenging myself in the year ahead. Freelancing is not easy, but its worth it for the freedom and flexibility it offers.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;2024 was a year of growth, challenges, and hard truths. But through it all, I learned valuable lessons that have shaped me as a professional and as a person. I hope my experiences can help other freelancers navigate the ups and downs of the freelance life.&lt;/p&gt;

&lt;p&gt;If you are a freelancer, I would love to hear about your experiences in 2024. What were your biggest challenges? What were your proudest achievements? Lets share our stories and support each other as we continue on this freelance journey together.&lt;/p&gt;

&lt;p&gt;Thanks for reading and happy freelancing in 2025! 😊&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>newyearchallenge</category>
      <category>career</category>
      <category>careerdevelopment</category>
    </item>
    <item>
      <title>Don't Make This Mistake: Choosing the Wrong Database Could Cost You!</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Thu, 02 Jan 2025 16:37:32 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/dont-make-this-mistake-choosing-the-wrong-database-could-cost-you-30gi</link>
      <guid>https://dev.to/thesohailjafri/dont-make-this-mistake-choosing-the-wrong-database-could-cost-you-30gi</guid>
      <description>&lt;p&gt;So, consider you're building a startup, and it’s time to decide where all that precious data is going to live. Is it SQL or NoSQL? Relax, it’s not as intimidating as it sounds. Let’s break it down, startup-style. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Your Database Choice Matters
&lt;/h2&gt;

&lt;p&gt;Your database is the backbone of your application. Here’s why it’s a big deal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Can it handle your next big growth spurt? 📈&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; How quickly can you fetch and update data? ⚡&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; Does it adapt to your app’s ever-changing needs? 🤹&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Is it startup-friendly? 💸&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive into the key contenders: SQL and NoSQL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SQL Databases: The Old-School Dependable&lt;/li&gt;
&lt;li&gt;NoSQL Databases: The Cool New Kid&lt;/li&gt;
&lt;li&gt;SQL vs NoSQL: A Quick Comparison&lt;/li&gt;
&lt;li&gt;How to Decide&lt;/li&gt;
&lt;li&gt;The Sweet Spot: Why Not Both?&lt;/li&gt;
&lt;li&gt;TL;DR: SQL or NoSQL?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  SQL Databases: The Old-School Dependable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Origin Story:
&lt;/h3&gt;

&lt;p&gt;SQL's journey began in 1974 with IBM's System R project, which aimed to showcase the relational model's potential. By the 1980s, SQL became the standard for relational database management systems (RDBMS), with Oracle being one of the first to commercialize it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured Data:&lt;/strong&gt; Perfect if you’re working with well-defined data (think rows and columns).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACID Compliance:&lt;/strong&gt; Your data’s integrity is rock solid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proven Reliability:&lt;/strong&gt; Think of giants like MySQL, PostgreSQL, and Microsoft SQL Server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Queries:&lt;/strong&gt; Handle complex relationships with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling Ecosystem:&lt;/strong&gt; Extensive tooling like SQL Server Management Studio (SSMS), pgAdmin, and ORMs like Sequelize and Hibernate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unique Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Joins and Relationships:&lt;/strong&gt; Efficiently handle complex relationships across tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stored Procedures:&lt;/strong&gt; Encapsulate business logic within the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Financial applications 💰&lt;/li&gt;
&lt;li&gt;E-commerce sites 🛍️&lt;/li&gt;
&lt;li&gt;Healthcare systems 🏥&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Watch Out For:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Vertical scaling (buying bigger servers) can get expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rigidity:&lt;/strong&gt; Adding new data types or relationships can be a hassle.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  NoSQL Databases: The Cool New Kid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Origin Story:
&lt;/h3&gt;

&lt;p&gt;NoSQL's roots lie in the need for scalability and flexibility that traditional RDBMS couldn’t provide. Early implementations, like Google’s Bigtable (2004) and Amazon’s Dynamo (2007), inspired modern NoSQL solutions such as MongoDB, Cassandra, and Redis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; Works great for unstructured or semi-structured data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal Scaling:&lt;/strong&gt; Add more servers instead of bigger ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; Optimized for high-speed read and write operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variety:&lt;/strong&gt; Choose the type that fits your needs: document (MongoDB), key-value (Redis), column-family (Cassandra), or graph (Neo4j).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling Ecosystem:&lt;/strong&gt; Tools like Compass (MongoDB), RedisInsight, and cloud-native solutions like AWS DynamoDB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unique Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Schemas:&lt;/strong&gt; No need to predefine your schema; adapt as your app evolves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geospatial Queries:&lt;/strong&gt; Built-in support for location-based queries in some databases like MongoDB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time apps (chat apps, gaming leaderboards) ⏱️&lt;/li&gt;
&lt;li&gt;Content management systems 📚&lt;/li&gt;
&lt;li&gt;Internet of Things (IoT) devices 🤖&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Watch Out For:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; Some NoSQL databases sacrifice consistency for scalability (eventual consistency).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Curve:&lt;/strong&gt; Can be tricky to pick the right one and set it up.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  SQL vs NoSQL: A Quick Comparison
&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;SQL&lt;/th&gt;
&lt;th&gt;NoSQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Definition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational, table-based&lt;/td&gt;
&lt;td&gt;Non-relational, flexible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Year of Origin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1970s&lt;/td&gt;
&lt;td&gt;Late 2000s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured (tables)&lt;/td&gt;
&lt;td&gt;Flexible (JSON, key-value, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vertical&lt;/td&gt;
&lt;td&gt;Horizontal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tooling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mature and extensive&lt;/td&gt;
&lt;td&gt;Emerging but innovative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unique Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Joins, ACID compliance&lt;/td&gt;
&lt;td&gt;Dynamic schemas, geospatial queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex queries, transactions&lt;/td&gt;
&lt;td&gt;High-speed, unstructured data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Decide
&lt;/h2&gt;

&lt;p&gt;Still on the fence? Here are some tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with Your Data:&lt;/strong&gt; Is it structured or unstructured? 🧐&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think About Growth:&lt;/strong&gt; Will you scale up quickly? 📈&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know Your App:&lt;/strong&gt; What kind of queries and speed do you need? 🛠️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test It Out:&lt;/strong&gt; Try small-scale implementations of both. 🧪&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Sweet Spot: Why Not Both?
&lt;/h2&gt;

&lt;p&gt;Who says you have to choose? Many startups use a hybrid approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL for Core Data:&lt;/strong&gt; Use SQL for transactional and critical data. 🗂️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NoSQL for Flexibility:&lt;/strong&gt; Use NoSQL for high-speed and scalable operations. ⚡&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prisma for Integration:&lt;/strong&gt; Tools like &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt; act as a unified layer, allowing you to handle multiple databases (SQL and NoSQL) seamlessly. This adds a layer of abstraction, making it easier to manage and query data from diverse sources. 🤝&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  TL;DR: SQL or NoSQL?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL&lt;/strong&gt;: Go for it if your data is structured and relationships are crucial. 🏛️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NoSQL&lt;/strong&gt;: Your best bet for fast, flexible, and scalable needs. 🌐&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both?&lt;/strong&gt; Why not leverage the strengths of both? 🤹&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of the day, your choice should align with your app’s needs, your team’s expertise, and your growth ambitions. Choose wisely, and watch your startup soar! Happy Coding!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get in touch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>mongodb</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Do check these tips for SEO Boost</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Sun, 29 Dec 2024 08:39:23 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/do-check-these-tips-for-seo-boost-3ag1</link>
      <guid>https://dev.to/thesohailjafri/do-check-these-tips-for-seo-boost-3ag1</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/thesohailjafri" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1059623%2F9a72e65c-7f28-4f9e-a4b5-33a8c2d614c0.png" alt="thesohailjafri"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/thesohailjafri/the-must-have-seo-checklist-for-developers-192i" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Must-Have SEO Checklist for Developers For 2025&lt;/h2&gt;
      &lt;h3&gt;Sohail SJ | TheZenLabs ・ Dec 29 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>marketing</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The Must-Have SEO Checklist for Developers For 2025</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Sun, 29 Dec 2024 08:38:22 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/the-must-have-seo-checklist-for-developers-192i</link>
      <guid>https://dev.to/thesohailjafri/the-must-have-seo-checklist-for-developers-192i</guid>
      <description>&lt;p&gt;Hey, Devs!&lt;/p&gt;

&lt;p&gt;So I have been working on a few SEO Focused projects lately and I thought I would share some of the best practices and strategies I have learned along the way for Next.js developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next.js SEO Checklist For 2025
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimize Metadata&lt;/li&gt;
&lt;li&gt;URL Structure and Routing&lt;/li&gt;
&lt;li&gt;Content Optimization&lt;/li&gt;
&lt;li&gt;Page Speed and Core Web Vitals&lt;/li&gt;
&lt;li&gt;Image Optimization&lt;/li&gt;
&lt;li&gt;Mobile-Friendliness&lt;/li&gt;
&lt;li&gt;&lt;a href="//#7-sitemap-robots.txt-and-favicons"&gt;Sitemap, Robots.txt and Favicons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Internal Linking&lt;/li&gt;
&lt;li&gt;Server-Side Rendering (SSR) and Static Site Generation (SSG)&lt;/li&gt;
&lt;li&gt;Schema Markup&lt;/li&gt;
&lt;li&gt;Canonical Tags and Avoiding Duplicates&lt;/li&gt;
&lt;li&gt;Open Graph and Twitter Cards&lt;/li&gt;
&lt;li&gt;Error Handling&lt;/li&gt;
&lt;li&gt;Semantic HTML&lt;/li&gt;
&lt;li&gt;Performance Optimization&lt;/li&gt;
&lt;li&gt;Analytics and Monitoring&lt;/li&gt;
&lt;li&gt;General Best SEO Practices for 2025&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. Optimize Metadata
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;next/head&lt;/code&gt; component to include metadata like titles, descriptions, and canonical tags (&lt;a href="https://nextjs.org/docs/api-reference/next/head" rel="noopener noreferrer"&gt;Next.js Head Documentation&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Optimizing metadata is crucial for SEO as it improves click-through rates, provides search engines with context about the page, and helps rank relevant content higher in search results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pages Router&lt;/strong&gt; Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Head&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/head&lt;/span&gt;&lt;span class="dl"&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;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="nx"&gt;Title&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Page Description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canonical&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;href&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://example.com/page&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Head&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Page Router approach is straightforward and easy to implement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App Router&lt;/strong&gt; Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;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="o"&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="s1"&gt;Page Title&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="s1"&gt;Page Description&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;The App Router approach we use the &lt;code&gt;metadata&lt;/code&gt; property in the layout or page file (&lt;a href="https://nextjs.org/docs/app/building-your-application/optimizing/metadata" rel="noopener noreferrer"&gt;Next.js Metadata API&lt;/a&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  2. URL Structure and Routing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement clean, descriptive, and hierarchical URLs (e.g., &lt;code&gt;/blog/seo-checklist&lt;/code&gt; instead of &lt;code&gt;/blog?id=123&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Clean URLs improve user experience by making them easier to read and remember, and they help search engines understand the site’s structure more effectively, enhancing discoverability.&lt;/li&gt;
&lt;li&gt;Use Next.js dynamic routing for better URL control (&lt;a href="https://nextjs.org/docs/routing/dynamic-routes" rel="noopener noreferrer"&gt;Dynamic Routing Guide&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Avoid deep nesting in URLs to keep them user-friendly.
&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="c"&gt;# Good URL Structure&lt;/span&gt;
| root
|--- app
|------ blog
|--------- seo-checklist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad URL Structure&lt;/span&gt;
| root
|--- app
|------ blog
|--------- 2022
|------------ 01
|--------------- 01
|------------------ seo-checklist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Content Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Research keywords and include them naturally in content (&lt;a href="https://ads.google.com/home/tools/keyword-planner/" rel="noopener noreferrer"&gt;Google Keyword Planner&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Avoid keyword stuffing; focus on providing value. Keep keywords in a range of &lt;strong&gt;1-3%&lt;/strong&gt; of the total content.&lt;/li&gt;
&lt;li&gt;Regularly update content to keep it fresh and relevant.&lt;/li&gt;
&lt;li&gt;Related Refs: &lt;a href="https://www.youngurbanproject.com/types-of-keywords-in-seo/" rel="noopener noreferrer"&gt;Types of Keywords in SEO&lt;/a&gt;, &lt;a href="https://www.seoreviewtools.com/keyword-density-checker/" rel="noopener noreferrer"&gt;Keyword Density Checker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Page Speed and Core Web Vitals
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monitor and improve metrics like LCP, FID, and CLS using tools like Lighthouse or PageSpeed Insights (&lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;Google PageSpeed Insights&lt;/a&gt;).
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1btn0z39stw1aokbmy3h.png" alt="Google PageSpeed Insights Image" width="800" height="333"&gt;
&lt;/li&gt;
&lt;li&gt;Optimize fonts, use preloading, and avoid large layout shifts. Read more about &lt;a href="https://nextjs.org/learn/dashboard-app/optimizing-fonts-images" rel="noopener noreferrer"&gt;Optimizing Fonts and Images&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use tools like &lt;a href="https://www.webpagetest.org/" rel="noopener noreferrer"&gt;WebPageTest&lt;/a&gt; to analyze performance and identify bottlenecks.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Image Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the Next.js &lt;code&gt;Image&lt;/code&gt; component for automatic image optimization (&lt;a href="https://nextjs.org/docs/api-reference/next/image" rel="noopener noreferrer"&gt;Image Component Documentation&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Serve responsive images with appropriate &lt;code&gt;sizes&lt;/code&gt; and &lt;code&gt;srcSet&lt;/code&gt; attributes.&lt;/li&gt;
&lt;li&gt;Include descriptive &lt;code&gt;alt&lt;/code&gt; text for accessibility and image SEO (&lt;a href="https://www.w3.org/WAI/tutorials/images/alt/" rel="noopener noreferrer"&gt;W3C Accessibility Guidelines&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Mobile-Friendliness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use responsive design principles ie &lt;a href="https://blog.froont.com/9-basic-principles-of-responsive-web-design/" rel="noopener noreferrer"&gt;Responsive Web Design&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test pages with Google’s Mobile-Friendly Test tool (&lt;a href="https://search.google.com/test/mobile-friendly" rel="noopener noreferrer"&gt;Mobile-Friendly Test&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Ensure content is easily accessible and readable on &lt;em&gt;mobile devices&lt;/em&gt; as more 70% traffic from mobile devices on an avg.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. Sitemap, Robots.txt and Favicons
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Sitemap
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A sitemap is a file that lists all the URLs on your site. It helps search engines discover and index your content more efficiently.&lt;/li&gt;
&lt;li&gt;Create an XML sitemap and submit it to search engines like Google (&lt;a href="https://support.google.com/webmasters/answer/183668?hl=en" rel="noopener noreferrer"&gt;Google Search Console Sitemap Submission&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video on Generate Sitemap Via &lt;code&gt;next-sitemap&lt;/code&gt; NPM Package&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/-C_dLFcYGu4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh282p75pyfgfik3fvkn6.jpg" alt="Sitemap Generation" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video on Generate Dynamic Sitemap For CMS/DB Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/8tn8w-UR5N8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflxy3icf0iz7vtrk3vrn.jpg" alt="Sitemap Generation" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Robots.txt
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;robots.txt&lt;/code&gt; file tells search engine crawlers which pages or files they can or cannot request from your site. It is important to have a well-structured &lt;code&gt;robots.txt&lt;/code&gt; file to guide search engine crawlers.&lt;/li&gt;
&lt;li&gt;Configure a &lt;code&gt;robots.txt&lt;/code&gt; file to guide search engine crawlers (&lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/create-robots-txt" rel="noopener noreferrer"&gt;Robots.txt Guide&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Favicons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You must have seen favicons in the browser tab, bookmarks, and mobile apps. They are website icons that help users identify your site.&lt;/li&gt;
&lt;li&gt;Include Favicons for better user experience and branding. Use tool like &lt;a href="https://favicon.io/" rel="noopener noreferrer"&gt;Favicon IO&lt;/a&gt;, &lt;a href="https://realfavicongenerator.net/favicon-generator/nextjs" rel="noopener noreferrer"&gt;Real Favicon Generator&lt;/a&gt; to generate favicons. This great tool as it provides favicons in different sizes and formats as well as &lt;code&gt;manifest.json&lt;/code&gt; file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;# Example of favicon
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"apple-touch-icon"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"180x180"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/apple-touch-icon.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/png"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"32x32"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/favicon-32x32.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/png"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"16x16"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/favicon-16x16.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"manifest"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/site.webmanifest"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;ul&gt;
&lt;li&gt;Use meaningful anchor text for internal links.&lt;/li&gt;
&lt;li&gt;Avoid broken links by regularly auditing your site (&lt;a href="https://www.deadlinkchecker.com/" rel="noopener noreferrer"&gt;Broken Link Checker Tool&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Implement breadcrumbs for better navigation and SEO (&lt;a href="https://schema.org/BreadcrumbList" rel="noopener noreferrer"&gt;Breadcrumb Schema Guide&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro Advice&lt;/strong&gt; I use linkMap to manage internal links in my projects. It is a simple key value pair object that I use to manage all the internal links in my project. This way I can easily update the links in one place and it will reflect across the entire project.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// linkMap.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;linkMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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;about&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/contact&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;h3&gt;
  
  
  9. Server-Side Rendering (SSR) and Static Site Generation (SSG)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Choose the appropriate rendering method (&lt;code&gt;getServerSideProps&lt;/code&gt;, &lt;code&gt;getStaticProps&lt;/code&gt;, or &lt;code&gt;ISR&lt;/code&gt;) based on content requirements (&lt;a href="https://nextjs.org/docs/basic-features/data-fetching" rel="noopener noreferrer"&gt;Next.js Data Fetching&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Use SSR for dynamic content that changes frequently.&lt;/li&gt;
&lt;li&gt;Use SSG or ISR for pages with static or semi-static content for better performance and SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video on App Router SSR and SSG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/vlJjjMnRxTA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq6sbi52zaiegvjihui9.jpg" alt="App Router SSR and SSG" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video on Page Router SSR and SSG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/KNjayAp6yn4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7lskv25gjt92cjxsnzt.jpg" alt="Page Router SSR and SSG" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  10. Schema Markup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add structured data using JSON-LD format for rich results (&lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google’s Structured Data Testing Tool&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Include schema types like &lt;code&gt;Breadcrumb&lt;/code&gt;, &lt;code&gt;Article&lt;/code&gt;, &lt;code&gt;Product&lt;/code&gt;, or &lt;code&gt;FAQ&lt;/code&gt; depending on your content (&lt;a href="https://schema.org/" rel="noopener noreferrer"&gt;Schema.org Documentation&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;NPM&lt;/code&gt; Packages like &lt;code&gt;next-seo&lt;/code&gt; or &lt;code&gt;schema-dts&lt;/code&gt; for easy schema implementation. Read more about &lt;a href="https://www.npmjs.com/package/next-seo" rel="noopener noreferrer"&gt;Next-SEO&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/schema-dts" rel="noopener noreferrer"&gt;Schema DTS&lt;/a&gt; for JSON-LD schema.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  11. Canonical Tags and Avoiding Duplicates
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is a canonical tag? A canonical tag is a meta tag that tells search engines which version of a URL you want to be treated as the primary version. This helps prevent duplicate content issues.&lt;/li&gt;
&lt;li&gt;Like your home page can be accessed from multiple URLs like &lt;code&gt;https://example.com&lt;/code&gt;, &lt;code&gt;https://example.com/index.html&lt;/code&gt;, &lt;code&gt;https://example.com/home&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;You can use a canonical tag to tell search engines that &lt;code&gt;https://example.com&lt;/code&gt; is the primary URL. Read more about &lt;a href="https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;Canonical URL Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dynamically set canonical URLs in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section based on the current route.
&lt;/li&gt;
&lt;/ul&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;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/page"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  12. Open Graph and Twitter Cards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add Open Graph tags (&lt;code&gt;og:title&lt;/code&gt;, &lt;code&gt;og:description&lt;/code&gt;, &lt;code&gt;og:image&lt;/code&gt;) for social sharing (&lt;a href="https://ogp.me/" rel="noopener noreferrer"&gt;Open Graph Protocol&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pages Router Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Head&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/head&lt;/span&gt;&lt;span class="dl"&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;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;og:title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Page Title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;og:description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Page Description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;og:image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&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://example.com/image.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;og:type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&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="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;og:url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&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://example.com/page&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;twitter:card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&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="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Head&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  App Router Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&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;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="s1"&gt;Page Title&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="s1"&gt;Page Description&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="s1"&gt;https://example.com/image.jpg&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;800&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;600&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="s1"&gt;Image description&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;website&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="s1"&gt;https://example.com/page&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="s1"&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="s1"&gt;Page Title&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="s1"&gt;Page Description&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="s1"&gt;https://example.com/image.jpg&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;ul&gt;
&lt;li&gt;Include Twitter Card metadata for better link previews on Twitter (&lt;a href="https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary" rel="noopener noreferrer"&gt;Twitter Cards Documentation&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  13. Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create custom 404 and 500 pages using &lt;code&gt;pages/404.js&lt;/code&gt; and &lt;code&gt;pages/500.js&lt;/code&gt; (&lt;a href="https://nextjs.org/docs/advanced-features/custom-error-page" rel="noopener noreferrer"&gt;Next.js Error Pages Documentation&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Ensure they are informative and guide users back to functional pages.&lt;/li&gt;
&lt;li&gt;Also checkout this awesome &lt;a href="https://www.awwwards.com/awwwards/collections/404-error-page/" rel="noopener noreferrer"&gt;Not Found Page Collection By Awwwards&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// pages/404.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Custom404&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="nx"&gt;Not&lt;/span&gt; &lt;span class="nx"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// pages/500.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Custom500&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Side&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  14. Semantic HTML
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use semantic HTML elements like &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; for better accessibility and SEO.&lt;/li&gt;
&lt;li&gt;Check all available HTML elements at &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Semantic HTML helps search engines understand the structure of your content and improves accessibility for users with disabilities.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Bad Example of Semantic HTML --&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;"header"&lt;/span&gt;&lt;span class="nt"&gt;&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;"nav"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/services"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Services&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Good Example of Semantic HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/services"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Services&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  15. Performance Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use CDN for serving static files (&lt;a href="https://vercel.com/features/infrastructure" rel="noopener noreferrer"&gt;Vercel Edge Network&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Minimize and bundle JavaScript with code-splitting and tree-shaking (&lt;a href="https://webpack.js.org/guides/optimization/" rel="noopener noreferrer"&gt;Webpack Optimization Guide&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Implement lazy loading for images and components.&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;next.config.js&lt;/code&gt; settings like &lt;code&gt;compression&lt;/code&gt; and &lt;code&gt;reactStrictMode&lt;/code&gt; (&lt;a href="https://nextjs.org/docs/api-reference/next.config.js/introduction" rel="noopener noreferrer"&gt;Next.js Configuration&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;These settings contribute to faster page loads and better user experiences.&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Example Configuration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;reactStrictMode&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;compress&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;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;domains&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="s1"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Add domains for optimized images&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;
  
  
  16. Analytics and Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate Google Analytics or other tracking tools (&lt;a href="https://nextjs.org/docs/advanced-features/analytics" rel="noopener noreferrer"&gt;Next.js Analytics Integration&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Use Google Search Console to monitor indexing, search performance, and errors (&lt;a href="https://search.google.com/search-console/about" rel="noopener noreferrer"&gt;Search Console Guide&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;These tools help monitor user behavior and identify potential areas for SEO improvement, such as high bounce rates or underperforming pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you want a lite setup use these&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://umami.is/" rel="noopener noreferrer"&gt;UMAMI&lt;/a&gt; - A simple, easy-to-use, self-hosted web analytics tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.google.com/webmasters/tools/home" rel="noopener noreferrer"&gt;Google Web Master Tools&lt;/a&gt; - Google Search Console is a free service offered by Google that helps you monitor and maintain your site's presence in Google Search results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I prefer using Umami + Google Web Master Tools for my personal projects such (&lt;a href="https://chakraframer.com/" rel="noopener noreferrer"&gt;Chakra Framer&lt;/a&gt;)&lt;/p&gt;




&lt;h3&gt;
  
  
  17. General Best SEO Practices for 2025
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus on Search Intent&lt;/strong&gt;: Understand and address the user’s needs and queries. Align your content with the questions and needs your audience is searching for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Search Optimization&lt;/strong&gt;: Optimize for long-tail, conversational queries by incorporating &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/faqpage" rel="noopener noreferrer"&gt;structured FAQs&lt;/a&gt; and direct answers on pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B Testing for SEO&lt;/strong&gt;: Regularly &lt;a href="https://posthog.com/tutorials/nextjs-ab-tests" rel="noopener noreferrer"&gt;A/B test&lt;/a&gt; meta descriptions, titles, or content variations to identify what resonates with users and drives traffic.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I hope these tips help you build your next Billion Dollar App. Happy Coding!&lt;/p&gt;




&lt;h2&gt;
  
  
  Get in touch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>How to Create Fully Customized Sitemap in NextJS using Custom Postbuild Script</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Tue, 10 Dec 2024 17:54:28 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/how-to-create-fully-customized-sitemap-in-nextjs-using-custom-postbuild-script-1549</link>
      <guid>https://dev.to/thesohailjafri/how-to-create-fully-customized-sitemap-in-nextjs-using-custom-postbuild-script-1549</guid>
      <description>&lt;p&gt;In last two blogs, I explained how to create a sitemap for a website in your NextJS project using the &lt;a href="https://dev.to/thesohailjafri/how-to-create-sitemap-in-nextjs-using-package-next-sitemap-2g6a"&gt;next-sitemap package&lt;/a&gt; and &lt;a href="https://dev.to/thesohailjafri/no-traffic-on-your-website-learn-how-to-create-sitemaps-in-nextjs-57lk"&gt;manually&lt;/a&gt;. In this blog, I will explain how you can create a fully customized sitemap for your website in NextJS using a custom postbuild script.&lt;/p&gt;

&lt;p&gt;But if you are rocking a static website, you can use the &lt;a href="https://dev.to/thesohailjafri/how-to-create-sitemap-in-nextjs-using-package-next-sitemap-2g6a"&gt;next-sitemap package&lt;/a&gt; to create a sitemap as it will be much easier and faster. But if you are looking to create a fully customized sitemap, you can use the custom postbuild script approach.&lt;/p&gt;

&lt;p&gt;Why this technique is important? Because sometimes you need to create a sitemap with a specific requirement like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each year/folder/collection etc will have its own sitemap&lt;/li&gt;
&lt;li&gt;Exclude some pages from the sitemap&lt;/li&gt;
&lt;li&gt;Add custom priority, changefreq, and lastmod for each page&lt;/li&gt;
&lt;li&gt;Add custom tags for each page
and many more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But unlike our first article in series, we will do it manually. This is will fully automated and you can customize it as per your requirements. So brew a coffee and lets get started 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Complementary Video Tutorial&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you prefer a visual walkthrough, check out this helpful video that complements the steps in this blog:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-C_dLFcYGu4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Click the above player or &lt;a href="https://www.youtube.com/watch?v=-C_dLFcYGu4" rel="noopener noreferrer"&gt;here&lt;/a&gt; to watch the video on YouTube."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of NextJS&lt;/li&gt;
&lt;li&gt;Basic knowledge of JavaScript&lt;/li&gt;
&lt;li&gt;Basic knowledge of XML&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Table of Content
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Step 1: Create a custom postbuild script&lt;/li&gt;
&lt;li&gt;Step 2: Install globby package&lt;/li&gt;
&lt;li&gt;Step 3: Add the following code in the &lt;code&gt;generate-sitemap.mjs&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Step 4: Add the following script in your &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Step 5: Run the build command&lt;/li&gt;
&lt;li&gt;Step 6: Check the sitemap.xml file in the public folder of your project&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Get in touch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Create a custom postbuild script
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;scripts&lt;/code&gt; folder in the root of your project and add a &lt;code&gt;generate-sitemap.mjs&lt;/code&gt; file in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install globby package
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Wait a minute, what is globby? and why we need it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Globby is a package that helps you to match files using the patterns the shell uses, like stars and stuff. We will use it to get all the pages from project build folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add the following code in the &lt;code&gt;generate-sitemap.mjs&lt;/code&gt; file
&lt;/h2&gt;

&lt;p&gt;Before I share whole code, I would like to explain few key points in the code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;siteUrl&lt;/strong&gt;: Base URL of your website&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fullUrl&lt;/strong&gt;: Function that will return the full URL of the page ie &lt;code&gt;siteUrl + path&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;defaultConfig&lt;/strong&gt;: Default configuration for each page in the sitemap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;homeConfig&lt;/strong&gt;: Configuration for the home page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nextApproach&lt;/strong&gt;: Approach you are using for the your NextJS project, it can be &lt;code&gt;app&lt;/code&gt; or &lt;code&gt;pages&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;nextApproach is important because the build path for NextJS pages router is &lt;code&gt;.next/server/pages&lt;/code&gt; and for NextJS app router is &lt;code&gt;.next/server/app&lt;/code&gt;. So depending on the approach you are using, you need to change the path in the code.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;writeFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;globby&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;siteUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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;siteUrl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weekly&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastmod&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="nf"&gt;toISOString&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;homeConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastmod&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;nextApproach&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// app or pages&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serverPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`.next/server/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nextApproach&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateSitemap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Grub Pages from build&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildPages&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;globby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Include ***&lt;/span&gt;
    &lt;span class="c1"&gt;// include all html files and nested html files&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/*.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/**/*.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Exclude ***&lt;/span&gt;
    &lt;span class="c1"&gt;// /index.html is same as / so we will exclude it, along with 404, 500 and _not-found pages, cool right?&lt;/span&gt;
    &lt;span class="s2"&gt;`!&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/index.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/404.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/_not-found.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/500.html`&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;sitemapStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
            &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/priority&amp;gt;
            &amp;lt;/url&amp;gt;
            &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;buildPages&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;page&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.html&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="p"&gt;)&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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;lastmod&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;
          &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&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;path&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Higher priority for the index products page&lt;/span&gt;
            &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;daily&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Higher priority for the slug products page&lt;/span&gt;
            &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;daily&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;url&amp;gt;
                                &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                                &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                                &amp;lt;changefreq&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/changefreq&amp;gt;
                                &amp;lt;priority&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/priority&amp;gt;
                        &amp;lt;/url&amp;gt;
                    `&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
    &amp;lt;/urlset&amp;gt;
    `&lt;/span&gt;

  &lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`public/sitemap.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sitemapStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generateSitemap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will produce a single sitemap.xml file in the public folder of your project.&lt;/p&gt;

&lt;p&gt;But if you want to create multiple sitemaps, you create a multiple globby configurations and write multiple sitemap files in the public folder.&lt;/p&gt;

&lt;p&gt;Continue reading to learn how to create multiple sitemaps or skip to next step if you only want to create a single sitemap.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Very Important Point below if you going to have multiple sitemaps in your project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;First Point: Include all the sitemaps in the &lt;code&gt;robots.txt&lt;/code&gt; file, so that search engines can find all the sitemaps.&lt;/li&gt;
&lt;li&gt;Second Point: Create a &lt;a href="https://www.semrush.com/blog/sitemap-examples/" rel="noopener noreferrer"&gt;Index sitemap&lt;/a&gt; file that will include all the sitemaps links.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Side Quest: How to create multiple sitemaps
&lt;/h3&gt;

&lt;p&gt;To create multiple sitemaps, you can create multiple globby configurations and write multiple sitemap files in the public folder.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;writeFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;globby&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;siteUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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;siteUrl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weekly&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastmod&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="nf"&gt;toISOString&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;homeConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastmod&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;nextApproach&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// app or pages&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serverPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`.next/server/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nextApproach&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateSitemap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Grub Pages from build for products&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;productPages&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;globby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Include ***&lt;/span&gt;
    &lt;span class="c1"&gt;// include all html products files and nested html files&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products/*.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products/**/*.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Exclude ***&lt;/span&gt;
    &lt;span class="c1"&gt;// /index.html is same as / so we will exclude it&lt;/span&gt;
    &lt;span class="s2"&gt;`!&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products/index.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="c1"&gt;// Create multiple sitemaps&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;productSitemapStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
            &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;&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="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;0.9&amp;lt;/priority&amp;gt;
            &amp;lt;/url&amp;gt;
            &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;productPages&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;page&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.html&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="p"&gt;)&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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;lastmod&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;daily&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;url&amp;gt;
                                &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                                &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                                &amp;lt;changefreq&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/changefreq&amp;gt;
                                &amp;lt;priority&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/priority&amp;gt;
                        &amp;lt;/url&amp;gt;
                    `&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
    &amp;lt;/urlset&amp;gt;
    `&lt;/span&gt;

  &lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`public/product-sitemap.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;productSitemapStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// You can do the same for other sitemaps. But lets move on to the next step.&lt;/span&gt;

  &lt;span class="c1"&gt;// lets create a sitemap for rest of the pages&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;restPages&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;globby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Include ***&lt;/span&gt;
    &lt;span class="c1"&gt;// include all html files and nested html files&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/*.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/**/*.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// *** Exclude ***&lt;/span&gt;
    &lt;span class="c1"&gt;// /index.html is same as / so we will exclude it, along with 404, 500 and _not-found pages, cool right?&lt;/span&gt;
    &lt;span class="s2"&gt;`!&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/index.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/404.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/_not-found.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/500.html`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Exclude products pages&lt;/span&gt;
    &lt;span class="s2"&gt;`!&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products/*.html`&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;serverPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/products/**/*.html`&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;restSitemapStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
            &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/priority&amp;gt;
            &amp;lt;/url&amp;gt;
            &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;restPages&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;page&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.html&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="p"&gt;)&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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;lastmod&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;
          &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;

          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;url&amp;gt;
                                &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
                                &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
                                &amp;lt;changefreq&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/changefreq&amp;gt;
                                &amp;lt;priority&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/priority&amp;gt;
                        &amp;lt;/url&amp;gt;
                    `&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
    &amp;lt;/urlset&amp;gt;
    `&lt;/span&gt;

  &lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`public/rest-sitemap.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;restSitemapStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Create a index sitemap file&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;indexSitemapStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
        &amp;lt;sitemap&amp;gt;
            &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/product-sitemap.xml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
            &amp;lt;lastmod&amp;gt;&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="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
        &amp;lt;/sitemap&amp;gt;
        &amp;lt;sitemap&amp;gt;
            &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/rest-sitemap.xml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
            &amp;lt;lastmod&amp;gt;&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="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
        &amp;lt;/sitemap&amp;gt;
    &amp;lt;/sitemapindex&amp;gt;
    `&lt;/span&gt;

  &lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`public/sitemap.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indexSitemapStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generateSitemap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will produce multiple sitemap files in the public folder of your project. You can create as many sitemaps as you want by creating multiple globby configurations and writing multiple sitemap files in the public folder.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Include all the sitemaps in the &lt;code&gt;robots.txt&lt;/code&gt; file, so that search engines can find all the sitemaps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: Add the following script in your &lt;code&gt;package.json&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&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;"build"&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 build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postbuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node ./scripts/generate-sitemap.mjs"&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;h2&gt;
  
  
  Step 5: Run the build command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Check the sitemap.xml file in the public folder of your project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;| app
    | /pages
    | /public
        | /sitemap.xml
        | /product-sitemap.xml // &lt;span class="k"&gt;if &lt;/span&gt;you created multiple sitemaps
        | /rest-sitemap.xml // &lt;span class="k"&gt;if &lt;/span&gt;you created multiple sitemaps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on successful build, you will see a &lt;code&gt;sitemap.xml&lt;/code&gt; file in the public folder of your project. If you created multiple sitemaps, you will see multiple sitemap files in the public folder.&lt;/p&gt;

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

&lt;p&gt;With this approach, you can create a fully customized sitemap for your website in NextJS. You can create multiple sitemaps with specific requirements like each year/folder/collection etc will have its own sitemap, exclude some pages from the sitemap, add custom priority, changefreq, and lastmod for each page, add custom tags for each page, and many more.&lt;/p&gt;

&lt;p&gt;But what if you have a dynamic website and data changes frequently? In the next blog, I will explain how you can extend this approach to create a include dynamic data in the sitemap.&lt;/p&gt;

&lt;p&gt;Till then, Happy Coding 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Get in touch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>nextjs</category>
      <category>sitemap</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Boost Your Side Project Traffic By Adding a simple Sitemap!</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Tue, 10 Dec 2024 09:35:30 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/boost-your-side-project-traffic-by-adding-a-simple-sitemap-56e9</link>
      <guid>https://dev.to/thesohailjafri/boost-your-side-project-traffic-by-adding-a-simple-sitemap-56e9</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/thesohailjafri" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1059623%2F9a72e65c-7f28-4f9e-a4b5-33a8c2d614c0.png" alt="thesohailjafri"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/thesohailjafri/how-to-create-sitemap-in-nextjs-using-package-next-sitemap-2g6a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Create Sitemap in NextJS using package next-sitemap&lt;/h2&gt;
      &lt;h3&gt;Sohail SJ | TheZenLabs ・ Dec 9 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#sitemap&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#seo&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to Create Sitemap in NextJS using package next-sitemap</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Mon, 09 Dec 2024 17:45:58 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/how-to-create-sitemap-in-nextjs-using-package-next-sitemap-2g6a</link>
      <guid>https://dev.to/thesohailjafri/how-to-create-sitemap-in-nextjs-using-package-next-sitemap-2g6a</guid>
      <description>&lt;p&gt;I last wrote about how to create a sitemap for a website in your NextJS project. In this blog, I will explain how you can automate the process of creating a sitemap using the &lt;code&gt;next-sitemap&lt;/code&gt; package.&lt;/p&gt;

&lt;p&gt;In previous blog, we created a sitemap manually by writing the XML code for the sitemap. But this article will focus on automating the process of creating a sitemap.&lt;/p&gt;

&lt;p&gt;Link to the previous blog: &lt;a href="https://dev.to/thesohailjafri/no-traffic-on-your-website-learn-how-to-create-sitemaps-in-nextjs-57lk"&gt;Create Sitemaps in NextJS in 2mins&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About &lt;code&gt;next-sitemap&lt;/code&gt; NPM Package📦
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;next-sitemap&lt;/code&gt; is a package created and maintained by &lt;a href="https://twitter.com/iamvishnusankar" rel="noopener noreferrer"&gt;Vishnu Sankar&lt;/a&gt; and its the most popular package for generating sitemaps in NextJS with over 3.4k stars on &lt;a href="https://github.com/iamvishnusankar/next-sitemap" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Purpose of this package is fairly simple, but very important if you are looking to improve the SEO of your website. check below the self defined purpose of the package.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sitemap generator for next.js. Generate sitemap(s) and robots.txt for all static/pre-rendered/dynamic/server-side pages.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Lets get started🚀

&lt;ul&gt;
&lt;li&gt;Step 1: Install the package&lt;/li&gt;
&lt;li&gt;Step 2: Create config file&lt;/li&gt;
&lt;li&gt;Step 3: Configure your &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Step 4: Run the build&lt;/li&gt;
&lt;li&gt;Step 5: Check the results&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pro Developer Configurations😎&lt;/li&gt;

&lt;li&gt;Conclusion&lt;/li&gt;

&lt;li&gt;Get in touch&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lets get started🚀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install the package
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;next-sitemap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create a &lt;code&gt;next-sitemap.config.js&lt;/code&gt; file in the root of your project
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep name of the file &lt;code&gt;next-sitemap.config.js&lt;/code&gt; as it is, otherwise it will not work.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('next-sitemap').IConfig} */&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.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;generateRobotsTxt&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="c1"&gt;// (optional)&lt;/span&gt;
  &lt;span class="c1"&gt;// ...other options&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Add the following script in your &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&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;"build"&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 build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postbuild"&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-sitemap"&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;Caution: When using &lt;code&gt;pnpm&lt;/code&gt; you need to create a .npmrc file in the root of your project if you want to use a postbuild step or else you just need define build as &lt;code&gt;build: "next build &amp;amp;&amp;amp; next-sitemap"&lt;/code&gt;, clear lets move on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 4: Run the build command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Check the sitemap.xml file in the root of your project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;| app
    | /pages
    | /public
        | /sitemap.xml
        | /robots.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on successful build, you will see a &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt; file in the root of your project. If you dont want robots.txt file, you can set &lt;code&gt;generateRobotsTxt: false&lt;/code&gt; in the &lt;code&gt;next-sitemap.config.js&lt;/code&gt; file. If you allow me I would like to explain customization can do with sitemap.xml with config file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pro Developer Configurations😎
&lt;/h2&gt;

&lt;p&gt;Welcome to the pro developer configurations, where you can customize the sitemap.xml file as per your requirements. Kudos for making it this far, lets get started.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to url configuration in sitemap.xml
&lt;/h3&gt;

&lt;p&gt;By default, the package will assign same priority to all pages, but I want priority of home page to be 1.0 and other pages to be 0.8. I can do that by adding the following code in the &lt;code&gt;next-sitemap.config.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.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;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;daily&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// here is the new code&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="na"&gt;sitemapSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;generateRobotsTxt&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;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;let&lt;/span&gt; &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;
    &lt;span class="c1"&gt;// Set higher priority for home and team pages&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;path&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="c1"&gt;// Highest priority for the homepage&lt;/span&gt;
      &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hourly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Change frequency for the homepage, hourly is just an example consult the sitemap documentation or your SEO expert&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;loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// =&amp;gt; this will be exported as http(s)://&amp;lt;config.siteUrl&amp;gt;/&amp;lt;path&amp;gt;&lt;/span&gt;
      &lt;span class="na"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&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="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Dynamic priority based on the page&lt;/span&gt;
      &lt;span class="na"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;autoLastmod&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="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;alternateRefs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateRefs&lt;/span&gt; &lt;span class="o"&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;h3&gt;
  
  
  How to exclude pages from sitemap.xml
&lt;/h3&gt;

&lt;p&gt;For example on &lt;a href="https://chakraframer.com" rel="noopener noreferrer"&gt;ChakraFramer&lt;/a&gt; website, I dont want to include the &lt;code&gt;/blank/*&lt;/code&gt; like &lt;a href="https://chakraframer.com/blank/components/hover-3d-card-multi-layer" rel="noopener noreferrer"&gt;this&lt;/a&gt; in the sitemap.xml file. I can do that by adding the following code in the &lt;code&gt;next-sitemap.config.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.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;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;daily&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="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sitemapSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;generateRobotsTxt&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;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;let&lt;/span&gt; &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&lt;/span&gt;
    &lt;span class="c1"&gt;// Set higher priority for home and team pages&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;path&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="c1"&gt;// Highest priority for the homepage&lt;/span&gt;
      &lt;span class="nx"&gt;changefreq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hourly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Change frequency for the homepage, hourly is just an example consult the sitemap documentation or your SEO expert&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;loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// =&amp;gt; this will be exported as http(s)://&amp;lt;config.siteUrl&amp;gt;/&amp;lt;path&amp;gt;&lt;/span&gt;
      &lt;span class="na"&gt;changefreq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changefreq&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="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Dynamic priority based on the page&lt;/span&gt;
      &lt;span class="na"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;autoLastmod&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="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;alternateRefs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateRefs&lt;/span&gt; &lt;span class="o"&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="c1"&gt;// here is the new code&lt;/span&gt;
  &lt;span class="na"&gt;exclude&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="s1"&gt;/blank/*&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;h3&gt;
  
  
  Full Configuration Options
&lt;/h3&gt;

&lt;p&gt;If you do like to see all the configuration options, you can check the &lt;a href="https://www.npmjs.com/package/next-sitemap#configuration-options" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;In this blog, I explained how to automate the process of creating a sitemap using the &lt;code&gt;next-sitemap&lt;/code&gt; package. I also explained how to customize the sitemap.xml file as per your requirements. I hope you found this blog helpful. But if next-sitemap does not allow you to customization you need, you can always create the sitemap manually as explained in the &lt;a href="https://dev.to/thesohailjafri/no-traffic-on-your-website-learn-how-to-create-sitemaps-in-nextjs-57lk"&gt;previous blog&lt;/a&gt; or my &lt;a href=""&gt;next blog&lt;/a&gt; on custom postbuild script.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get in touch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>nextjs</category>
      <category>sitemap</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Struggling with Website Traffic? Learn How to Create Sitemaps in NextJS Today!</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Sun, 08 Dec 2024 00:30:00 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/no-traffic-on-your-website-learn-how-to-create-sitemaps-in-nextjs-57lk</link>
      <guid>https://dev.to/thesohailjafri/no-traffic-on-your-website-learn-how-to-create-sitemaps-in-nextjs-57lk</guid>
      <description>&lt;p&gt;I used to think that once you make &lt;strong&gt;website connect a domain&lt;/strong&gt; and you are done, after a few weeks your site will &lt;strong&gt;get massive traffic and I will be rich&lt;/strong&gt; by AdSense.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjow47fm1x6aiw4kowzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjow47fm1x6aiw4kowzp.png" alt="after a few weeks your site will get massive traffic and you will be rich by AdSense" width="700" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that's not the case, you need to do a lot of things to get traffic to your website and one of the most important thing is SEO. And &lt;strong&gt;one of the most important part of SEO is sitemap&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So in this series, I will try to explain how to create sitemap for a website in your NextJS project. I will explain different approaches based on your requirements like static pages, dynamic pages, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is sitemap?&lt;/li&gt;
&lt;li&gt;Why do you need a sitemap?&lt;/li&gt;
&lt;li&gt;
How to create sitemap using NextJS?

&lt;ul&gt;
&lt;li&gt;For NextJS Page Router&lt;/li&gt;
&lt;li&gt;For NextJS App Router&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Get in touch&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is sitemap?
&lt;/h2&gt;

&lt;p&gt;A sitemap is a file where you provide information about the pages, videos, and other files on your site, and the relationships between them.&lt;/p&gt;

&lt;p&gt;Basically, it is a way to tell search engines about pages on your site they might not otherwise discover like a map with routes to all your pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why do you need a sitemap?
&lt;/h2&gt;

&lt;p&gt;A sitemap is important as it helps search engines to understand your website structure while crawling it which results in better indexing of your website and better indexing means better ranking in search results and better ranking means more traffic to your website. Simple, right?&lt;/p&gt;

&lt;p&gt;If sitemap is not provided, search engines will still crawl your website but it might take longer time to index your website and some pages might not be indexed at all.&lt;/p&gt;

&lt;p&gt;You can also share this important XML file to google search console to monitor the indexing status of your website and to see if there are any errors. Check example below for &lt;a href="https://chakraframer.com" rel="noopener noreferrer"&gt;ChakraFramer&lt;/a&gt; website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx44oldk3mf4djn8woafo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx44oldk3mf4djn8woafo.png" alt="Google Search Console For ChakraFramer" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to create sitemap using NextJS?
&lt;/h2&gt;

&lt;p&gt;To keep things simple, I will be creating a sitemap for general structure of a website like home, about, contact, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;| app/pages
    | /
    | /about
    | /contact
    | /sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  For NextJS Page Router
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a new folder &lt;code&gt;sitemap.xml&lt;/code&gt; with a &lt;code&gt;index.js&lt;/code&gt; file and add the following code if you using &lt;a href="https://nextjs.org/docs/pages" rel="noopener noreferrer"&gt;pages router&lt;/a&gt; in NextJS.&lt;/li&gt;
&lt;li&gt;We will be using &lt;code&gt;getServerSideProps&lt;/code&gt; to generate the sitemap.&lt;/li&gt;
&lt;li&gt;Then we will cache the sitemap for a certain period of time to avoid generating it on every request.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackblitz.com/edit/stackblitz-starters-9zx7qx?file=pages%2Fsitemap.xml%2Findex.tsx" rel="noopener noreferrer"&gt;View Code on Stackblitz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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;CACHE_DURATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="c1"&gt;// 24 hours in seconds&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LAST_MODIFIED&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toUTCString&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;getServerSideProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;res&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;sitemap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
        &amp;lt;url&amp;gt;
          &amp;lt;loc&amp;gt;https://example.com/&amp;lt;/loc&amp;gt;
          &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
          &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
          &amp;lt;priority&amp;gt;1.0&amp;lt;/priority&amp;gt;
        &amp;lt;/url&amp;gt;
        &amp;lt;url&amp;gt;
          &amp;lt;loc&amp;gt;https://example.com/about&amp;lt;/loc&amp;gt;
          &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
          &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
          &amp;lt;priority&amp;gt;0.8&amp;lt;/priority&amp;gt;
        &amp;lt;/url&amp;gt;
        &amp;lt;url&amp;gt;
          &amp;lt;loc&amp;gt;https://example.com/contact&amp;lt;/loc&amp;gt;
          &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
          &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
          &amp;lt;priority&amp;gt;0.8&amp;lt;/priority&amp;gt;
        &amp;lt;/url&amp;gt;
  &amp;lt;/urlset&amp;gt;
    `&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="s1"&gt;text/xml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`public, max-age=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;CACHE_DURATION&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="c1"&gt;// Cache for 24 hours&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Last-Modified&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LAST_MODIFIED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Send the sitemap to the user&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;props&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;Sitemap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="c1"&gt;// Return null as we are not rendering anything its just a server side code&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Sitemap&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  For NextJS App Router
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a new folder in &lt;code&gt;app&lt;/code&gt; folder &lt;code&gt;sitemap.xml&lt;/code&gt; with a &lt;code&gt;route.js&lt;/code&gt; file and add the following code if you using &lt;a href="https://nextjs.org/docs/app" rel="noopener noreferrer"&gt;app router&lt;/a&gt; in NextJS.&lt;/li&gt;
&lt;li&gt;We will be using &lt;code&gt;GET&lt;/code&gt; request to send the sitemap.&lt;/li&gt;
&lt;li&gt;Then we will cache the sitemap for a certain period of time to avoid generating it on every request.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackblitz.com/" rel="noopener noreferrer"&gt;View Code on Stackblitz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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;CACHE_DURATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="c1"&gt;// 24 hours in seconds&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LAST_MODIFIED&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toUTCString&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;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&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;sitemap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
                &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;https://example.com/&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;1.0&amp;lt;/priority&amp;gt;
                &amp;lt;/url&amp;gt;
                &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;https://example.com/about&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;0.8&amp;lt;/priority&amp;gt;
                &amp;lt;/url&amp;gt;
                &amp;lt;url&amp;gt;
                    &amp;lt;loc&amp;gt;https://example.com/contact&amp;lt;/loc&amp;gt;
                    &amp;lt;lastmod&amp;gt;2021-09-01&amp;lt;/lastmod&amp;gt;
                    &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
                    &amp;lt;priority&amp;gt;0.8&amp;lt;/priority&amp;gt;
                &amp;lt;/url&amp;gt;
    &amp;lt;/urlset&amp;gt;
    `&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&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="s1"&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="s1"&gt;text/xml&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="s1"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`public, max-age=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;CACHE_DURATION&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="c1"&gt;// Cache for 24 hours&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lats-Modified&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LAST_MODIFIED&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;ul&gt;
&lt;li&gt;Now, if you visit &lt;code&gt;https://example.com/sitemap.xml&lt;/code&gt; or &lt;code&gt;http://localhost:3000/sitemap.xml&lt;/code&gt; it will look like image below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3dw5e0o2lv0g1hehkv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3dw5e0o2lv0g1hehkv5.png" alt="Sitemap Example for NextJS" width="776" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next part, I will explain how to create sitemap for using npm package &lt;code&gt;next-sitemap&lt;/code&gt;. which eleminates the need to write the sitemap manually. automatically generates the sitemap for you. Stay tuned!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get in touch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>nextjs</category>
      <category>sitemap</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I never imagined that setting up authentication could be this easy and fast!</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Fri, 29 Nov 2024 15:17:06 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/i-never-imagined-that-setting-up-authentication-could-be-this-easy-and-fast-kah</link>
      <guid>https://dev.to/thesohailjafri/i-never-imagined-that-setting-up-authentication-could-be-this-easy-and-fast-kah</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/na1969na" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1486549%2Fa0af6448-e8eb-4bfc-8965-1a1b3674d63e.jpeg" alt="na1969na"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/na1969na/simplifying-authentication-in-react-applications-with-clerk-32db" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Simplifying Authentication in React Applications with Clerk&lt;/h2&gt;
      &lt;h3&gt;Nana Okamoto ・ Nov 29 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#clerk&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to handle Burnout, Imposter Syndrome &amp; More | What Junior Devs Really Experience🕵️‍♀️</title>
      <dc:creator>Sohail SJ | TheZenLabs</dc:creator>
      <pubDate>Thu, 28 Nov 2024 18:02:14 +0000</pubDate>
      <link>https://dev.to/thesohailjafri/burnout-imposter-syndrome-more-what-junior-devs-really-experience-6oe</link>
      <guid>https://dev.to/thesohailjafri/burnout-imposter-syndrome-more-what-junior-devs-really-experience-6oe</guid>
      <description>&lt;p&gt;Hey there, fellow devs! Moving up from a beginner to a junior developer brings its own unique set of challenges and opportunities for growth.&lt;/p&gt;

&lt;p&gt;After experiencing these firsthand and mentoring other juniors, I've compiled the most common hurdles we face at this exciting career stage and how to tackle them head-on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The Code Review Anxiety😰&lt;/li&gt;
&lt;li&gt;The Legacy Code Labyrinth🗺️&lt;/li&gt;
&lt;li&gt;The Estimation Enigma⏰&lt;/li&gt;
&lt;li&gt;The Production Paranoia🚨&lt;/li&gt;
&lt;li&gt;The Scope Creep Struggle🎯&lt;/li&gt;
&lt;li&gt;The Documentation Duty📝&lt;/li&gt;
&lt;li&gt;The Work-Life Balance War⚖️&lt;/li&gt;
&lt;li&gt;The Debugging Dilemma🐞&lt;/li&gt;
&lt;li&gt;The Communication Conundrum🗣️&lt;/li&gt;
&lt;li&gt;The Knowledge Gap🧠&lt;/li&gt;
&lt;li&gt;Bonus. The Imposter Syndrome 🎭&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Pro Tips&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. The Code Review Anxiety😰
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iopscx2o36wsaxx0ixw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iopscx2o36wsaxx0ixw.gif" alt="Image Code Review" width="460" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opening your first pull request at work feels like presenting your art project to the entire class.&lt;/p&gt;

&lt;p&gt;You've triple-checked everything, yet that notification of "25 comments" on your PR still makes your stomach drop like you're on a roller coaster.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to handle reviews like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Embrace feedback as a learning opportunity&lt;/li&gt;
&lt;li&gt;Document your code decisions&lt;/li&gt;
&lt;li&gt;Review others' code to learn different perspectives, this is the best way to learn for any junior or senior developer&lt;/li&gt;
&lt;li&gt;Ask questions and don't be afraid to ask for clarification and help&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember, code reviews are not about you - so dont take it personally. They're about improving the codebase and your skills. You'll get better with each review.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. The Legacy Code Labyrinth🗺️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro8kqa5gxqhyurzolsyx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro8kqa5gxqhyurzolsyx.gif" alt="Image Legacy Code" width="267" height="199"&gt;&lt;/a&gt;&lt;br&gt;
Onboarding onto new team or project means diving into a maze of code that looks like it was written in a foreign language.&lt;/p&gt;

&lt;p&gt;You're not sure where to start, and every change you make feels like a shot in the dark.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to get to know the codebase:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with small, isolated changes/modules&lt;/li&gt;
&lt;li&gt;Document what you learn and update outdated documentation (if any)&lt;/li&gt;
&lt;li&gt;Use debugging tools to trace code flow and console.log for quick insights&lt;/li&gt;
&lt;li&gt;Don't be afraid to ask for context from code maintainers&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember, every developer was once a newbie to the codebase. Take it one step at a time, and you'll soon find your way through the labyrinth.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  3. The Estimation Enigma⏰
&lt;/h2&gt;

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

&lt;p&gt;Most often, you'll be asked to estimate how long a task will take. And more often than not, you'll be wrong.&lt;/p&gt;

&lt;p&gt;Underestimating tasks can lead to missed deadlines, while overestimating can make you look slow.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to calculate estimates like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Break tasks into smaller chunks (story points)&lt;/li&gt;
&lt;li&gt;Add buffer time for unknowns (always add buffer time even if you think you don't need it)&lt;/li&gt;
&lt;li&gt;Learn from past estimates&lt;/li&gt;
&lt;li&gt;Track your time to improve future estimates&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Interesting story&lt;/strong&gt; I once estimated a project to take 3 months and it took 6 months, and I was so embarrassed but there were so many unknowns and changes in the project that I couldn't have predicted. So it is okay to be wrong, learn from it and move on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  4. The Production Paranoia🚨
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboz1d9dxdjq6rs6t318i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboz1d9dxdjq6rs6t318i.gif" alt="Image Production" width="500" height="243"&gt;&lt;/a&gt;&lt;br&gt;
Your first production deployment feels like performing surgery - one wrong move and everything flatlines.&lt;/p&gt;

&lt;p&gt;I still remember my first deployment, I was so nervous, I was checking the logs every 5 minutes, and I was so scared that I would break something and it did happen, I broke the website, but it was a good learning experience 😅.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to be better at deployment:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Practice deployment in staging environments (test environments)&lt;/li&gt;
&lt;li&gt;Automate deployment processes with CI/CD pipelines (I love GitHub Actions, it is so easy to use)&lt;/li&gt;
&lt;li&gt;Monitor logs and metrics for early detection of issues&lt;/li&gt;
&lt;li&gt;Have a rollback plan in case things go south&lt;/li&gt;
&lt;li&gt;Remember, mistakes happen, and that's how we learn&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Deployment anxiety is a common thing for all developers, I still break things in production, and I have been doing this for years so it is normal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  5. The Scope Creep Struggle🎯
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb96v29m3vj7ia71zv37f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb96v29m3vj7ia71zv37f.png" alt="Image Scope Creep Struggle" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What started as a "simple feature" somehow evolved into refactoring half the application. You're not sure how it happened, but now you're knee-deep in requirements that seem to multiply like rabbits.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to define scope like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Learn to identify red flags&lt;/li&gt;
&lt;li&gt;Practice scope definition and management (make those requirements clear)&lt;/li&gt;
&lt;li&gt;Communicate concerns early and often&lt;/li&gt;
&lt;li&gt;Document requirement changes and their impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like to keep a document of all the requirements and changes that happen during the project and email it to the client, so they know what is happening and what is changing, and they can approve it or not.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mostly I use it as a reference to show the client that they asked for this feature, and it is not included in the original scope, so they need to pay extra for it 😉💰&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  6. The Documentation Duty📝
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvz38iytn7zioc9v3zo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvz38iytn7zioc9v3zo0.png" alt="Image Documentation Duty📝" width="750" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing documentation feels like doing chores - but deep down, you know it's essential for your future self and your team.&lt;/p&gt;

&lt;p&gt;I know, I know documentation is boring, So use below tips to make it less boring and more fun.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to handle documentation like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Document as you code (I comment a sudo code before the actual code)&lt;/li&gt;
&lt;li&gt;Use clear naming conventions (My teammates used to hate it, now they are thankful for it)&lt;/li&gt;
&lt;li&gt;Create helpful README files&lt;/li&gt;
&lt;li&gt;Use Ai Copilot to write documentation (I use &lt;a href="https://copilot.github.com/" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Write meaningful commit messages&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Commit message hacks:
&lt;/h3&gt;

&lt;p&gt;I like to fit commit messages in types &lt;code&gt;FIX&lt;/code&gt;, &lt;code&gt;FEAT&lt;/code&gt;, &lt;code&gt;DOCS&lt;/code&gt;, &lt;code&gt;STYLE&lt;/code&gt;, &lt;code&gt;REFACTOR&lt;/code&gt;, &lt;code&gt;TEST&lt;/code&gt;, &lt;code&gt;CHORE&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FIX&lt;/code&gt; for bug fixes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FEAT&lt;/code&gt; for new features&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DOCS&lt;/code&gt; for documentation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;STYLE&lt;/code&gt; for code style changes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REFACTOR&lt;/code&gt; for refactoring code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TEST&lt;/code&gt; for adding tests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CHORE&lt;/code&gt; for updating build tasks, package manager configs, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  7. The Work-Life Balance War⚖️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0ahb5duobf50gmcxhyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0ahb5duobf50gmcxhyx.png" alt="Image Work-Life Balance War⚖️" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realizing that &lt;strong&gt;"just one more commit"&lt;/strong&gt; at 9 PM isn't sustainable, but the excitement of solving problems makes it hard to step away.&lt;/p&gt;

&lt;p&gt;I have been there, I have worked 12 hours a day, and I have worked on weekends, and it is not worth it if it affects your sleep cycle or health or relationships.&lt;/p&gt;

&lt;p&gt;I totally understand the excitement of solving a problem, finding a bug, or implementing a new feature, but you need to take care of yourself, and you need to have a life outside of coding.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to handle work-life balance like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set clear work boundaries&lt;/li&gt;
&lt;li&gt;Take regular breaks and stretch or take a walk&lt;/li&gt;
&lt;li&gt;Practice time management techniques&lt;/li&gt;
&lt;li&gt;Maintain hobbies outside coding&lt;/li&gt;
&lt;li&gt;Remember, you're more than your code you are a human not a robot, So kick back, relax, and enjoy your life.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;I personally like to go for a walk, ride a bicycle, or if mood strikes take my motorcycle for a spin 🏍️.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  8. The Debugging Dilemma🐞
&lt;/h2&gt;

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

&lt;p&gt;Debugging complex issues can feel like trying to find a needle in a haystack, especially when you're still learning the codebase.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to handle debug like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Develop a systematic debugging process&lt;/li&gt;
&lt;li&gt;Utilize logging and monitoring tools&lt;/li&gt;
&lt;li&gt;Break down problems into smaller steps&lt;/li&gt;
&lt;li&gt;Don't be afraid to ask for help&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Debugging is like detective work - it requires patience, attention to detail, and a methodical approach. You'll get better with practice. If you web dev check these &lt;a href="https://www.freecodecamp.org/news/console-logging-tips/" rel="noopener noreferrer"&gt;console log techniques&lt;/a&gt; to debug faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  9. The Communication Conundrum🗣️
&lt;/h2&gt;

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

&lt;p&gt;Transitioning from solo projects to working in a team can be daunting, as you navigate different communication styles and workflows.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to communicate like pro:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Practice active listening&lt;/li&gt;
&lt;li&gt;Seek feedback from teammates&lt;/li&gt;
&lt;li&gt;Contribute to team discussions and decisions (even if you are wrong, it is okay)&lt;/li&gt;
&lt;li&gt;Sometimes just talk about anything other than work, it helps to build a relationship with your teammates&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Communication is a two-way street, and the more you practice, the better you'll get at it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  10. The Knowledge Gap🧠
&lt;/h2&gt;

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

&lt;p&gt;Feeling like you're constantly playing catch-up as new technologies and best practices emerge can be overwhelming.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to manage knowledge gap like pro:
&lt;/h3&gt;

&lt;p&gt;Identify areas for improvement&lt;br&gt;
Allocate time for continuous learning&lt;br&gt;
Attend conferences and meetups&lt;br&gt;
Find a mentor to guide your growth&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The more you learn, the more you realize how much you don't know 😹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Bonus. The Imposter Syndrome 🎭
&lt;/h2&gt;

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

&lt;p&gt;Even as a senior developer, you may still experience self-doubt and feel like you don't belong.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to overcome imposter syndrome:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Celebrate your small wins&lt;/li&gt;
&lt;li&gt;Remind yourself of your progress&lt;/li&gt;
&lt;li&gt;Share your knowledge with others&lt;/li&gt;
&lt;li&gt;Surround yourself with supportive peers&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Imposter syndrome&lt;/strong&gt; is common among &lt;strong&gt;high achievers&lt;/strong&gt;, and it's a sign that you care about your work and want to do your best. Cheers to that!&lt;/p&gt;

&lt;p&gt;I do have imposter syndrome when it comes to ui design, people say I am good at it, but I feel like I am not good enough, but I keep learning and improving thats why I created &lt;a href="https://chakraframer.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chakra Framer&lt;/strong&gt;&lt;/a&gt; ui kit based on &lt;a href="https://chakra-ui.com/" rel="noopener noreferrer"&gt;chakra ui&lt;/a&gt; and &lt;a href="https://www.framer.com/motion/" rel="noopener noreferrer"&gt;framer motion&lt;/a&gt; to improve my design skills.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The junior developer phase is like learning to drive - you know the basics, but real-world traffic is a different game altogether. Remember that every senior developer went through these same challenges. Your growth during this phase sets the foundation for your entire career.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pro Tips:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Find a mentor&lt;/li&gt;
&lt;li&gt;Build your professional network (I prefer Twitter/X over LinkedIn)&lt;/li&gt;
&lt;li&gt;Keep learning consistently (Watch random video from fireship.io or Traversy Media)&lt;/li&gt;
&lt;li&gt;Document your achievements (on GitHub, personal blog or on Twitter)&lt;/li&gt;
&lt;li&gt;Practice self-advocacy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, being a junior developer isn't about knowing everything - it's about knowing how to find answers and grow from challenges. Your fresh perspective and eagerness to learn are valuable assets to any team.&lt;/p&gt;


&lt;h2&gt;
  
  
  Get In Touch
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://github.com/thesohailjafri" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F66732877%3Fv%3D4%3Fs%3D400" height="460" class="m-0" width="460"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer" class="c-link"&gt;
          thesohailjafri (Sohail Jafri) · GitHub
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          He is likely optimizing his old code, even though no one has requested it. - thesohailjafri
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
        github.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Youtube&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/@thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://twitter.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/thesohailjafri/" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Github&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/thesohailjafri" rel="noopener noreferrer"&gt;@thesohailjafri&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>career</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
